diff options
Diffstat (limited to 'offload/include')
| -rw-r--r-- | offload/include/Shared/Debug.h | 87 | ||||
| -rw-r--r-- | offload/include/omptarget.h | 4 |
2 files changed, 68 insertions, 23 deletions
diff --git a/offload/include/Shared/Debug.h b/offload/include/Shared/Debug.h index f1c3386..0f98a44 100644 --- a/offload/include/Shared/Debug.h +++ b/offload/include/Shared/Debug.h @@ -45,7 +45,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Format.h" -#include "llvm/Support/circular_raw_ostream.h" +#include "llvm/Support/raw_ostream.h" /// 32-Bit field data attributes controlling information presented to the user. enum OpenMPInfoType : uint32_t { @@ -142,7 +142,7 @@ inline uint32_t getInfoLevel() { return getInfoLevelInternal().load(); } #define INFO(_flags, _id, ...) \ do { \ if (::llvm::offload::debug::isDebugEnabled()) { \ - DP(__VA_ARGS__); \ + INFO_DEBUG_INT(_flags, _id, __VA_ARGS__); \ } else if (getInfoLevel() & _flags) { \ INFO_MESSAGE(_id, __VA_ARGS__); \ } \ @@ -174,6 +174,14 @@ private: bool ShouldEmitNewLineOnDestruction; bool NeedEndNewLine = false; + /// Buffer to reduce interference between different threads + /// writing at the same time to the underlying stream. + static constexpr size_t BufferSize = 256; + llvm::SmallString<BufferSize> Buffer; + + // Stream to write into Buffer. Its flushed to Os upon destruction. + llvm::raw_svector_ostream BufferStrm; + /// If the stream is muted, writes to it are ignored bool Muted = false; @@ -203,13 +211,13 @@ private: NeedEndNewLine = true; } } - void emitPrefix() { Os.write(Prefix.c_str(), Prefix.size()); } + void emitPrefix() { BufferStrm.write(Prefix.c_str(), Prefix.size()); } void writeWithPrefix(StringRef Str) { if (ShouldPrefixNextString) { emitPrefix(); ShouldPrefixNextString = false; } - Os.write(Str.data(), Str.size()); + BufferStrm.write(Str.data(), Str.size()); } public: @@ -218,26 +226,29 @@ public: bool ShouldEmitNewLineOnDestruction = true) : Prefix(std::move(Prefix)), Os(Os), BaseLevel(BaseLevel), ShouldPrefixNextString(ShouldPrefixNextString), - ShouldEmitNewLineOnDestruction(ShouldEmitNewLineOnDestruction) { + ShouldEmitNewLineOnDestruction(ShouldEmitNewLineOnDestruction), + BufferStrm(Buffer) { SetUnbuffered(); } ~odbg_ostream() final { if (ShouldEmitNewLineOnDestruction && NeedEndNewLine) - Os << '\n'; + BufferStrm << '\n'; + Os << BufferStrm.str(); } odbg_ostream(const odbg_ostream &) = delete; odbg_ostream &operator=(const odbg_ostream &) = delete; - odbg_ostream(odbg_ostream &&other) : Os(other.Os) { + odbg_ostream(odbg_ostream &&other) : Os(other.Os), BufferStrm(Buffer) { Prefix = std::move(other.Prefix); BaseLevel = other.BaseLevel; ShouldPrefixNextString = other.ShouldPrefixNextString; ShouldEmitNewLineOnDestruction = other.ShouldEmitNewLineOnDestruction; NeedEndNewLine = other.NeedEndNewLine; Muted = other.Muted; + BufferStrm << other.BufferStrm.str(); } /// Forward the current_pos method to the underlying stream. - uint64_t current_pos() const final { return Os.tell(); } + uint64_t current_pos() const final { return BufferStrm.tell(); } /// Some of the `<<` operators expect an lvalue, so we trick the type /// system. @@ -247,17 +258,8 @@ public: void shouldMute(const OnlyLevel Filter) { Muted = BaseLevel != Filter; } }; -/// dbgs - Return a circular-buffered debug stream. -[[maybe_unused]] static llvm::raw_ostream &dbgs() { - // Do one-time initialization in a thread-safe way. - static struct dbgstream { - llvm::circular_raw_ostream strm; - - dbgstream() : strm(llvm::errs(), "*** Debug Log Output ***\n", 0) {} - } thestrm; - - return thestrm.strm; -} +/// dbgs - Return the debug stream for offload debugging (just llvm::errs()). +[[maybe_unused]] static llvm::raw_ostream &dbgs() { return llvm::errs(); } #ifdef OMPTARGET_DEBUG @@ -306,8 +308,14 @@ struct DebugSettings { return; Settings.Enabled = true; - if (EnvRef.equals_insensitive("all")) - return; + + if (EnvRef.starts_with_insensitive("all")) { + auto Spec = parseDebugFilter(EnvRef); + if (Spec.Type.equals_insensitive("all")) { + Settings.DefaultLevel = Spec.Level; + return; + } + } if (!EnvRef.getAsInteger(10, Settings.DefaultLevel)) return; @@ -618,7 +626,38 @@ static inline odbg_ostream reportErrorStream() { #define FORMAT_TO_STR(Format, ...) \ ::llvm::omp::target::debug::formatToStr(Format __VA_OPT__(, ) __VA_ARGS__) -#define DP(...) ODBG() << FORMAT_TO_STR(__VA_ARGS__); +template <uint32_t InfoId> static constexpr const char *InfoIdToODT() { + constexpr auto getId = []() { + switch (InfoId) { + case OMP_INFOTYPE_KERNEL_ARGS: + return "KernelArgs"; + case OMP_INFOTYPE_MAPPING_EXISTS: + return "MappingExists"; + case OMP_INFOTYPE_DUMP_TABLE: + return "DumpTable"; + case OMP_INFOTYPE_MAPPING_CHANGED: + return "MappingChanged"; + case OMP_INFOTYPE_PLUGIN_KERNEL: + return "PluginKernel"; + case OMP_INFOTYPE_DATA_TRANSFER: + return "DataTransfer"; + case OMP_INFOTYPE_EMPTY_MAPPING: + return "EmptyMapping"; + case OMP_INFOTYPE_ALL: + return "Default"; + } + return static_cast<const char *>(nullptr); + }; + + constexpr const char *result = getId(); + static_assert(result != nullptr, "Unknown InfoId being used"); + return result; +} + +// Transform the INFO id to the corresponding debug type and print the message +#define INFO_DEBUG_INT(_flags, _id, ...) \ + ODBG(::llvm::omp::target::debug::InfoIdToODT<_flags>()) \ + << FORMAT_TO_STR(__VA_ARGS__); // Define default format for pointers static inline raw_ostream &operator<<(raw_ostream &Os, void *Ptr) { @@ -627,9 +666,11 @@ static inline raw_ostream &operator<<(raw_ostream &Os, void *Ptr) { } #else -#define DP(...) \ + +#define INFO_DEBUG_INT(_flags, _id, ...) \ { \ } + #endif // OMPTARGET_DEBUG // New REPORT macro in the same style as ODBG diff --git a/offload/include/omptarget.h b/offload/include/omptarget.h index fd458fa0..5dddd00 100644 --- a/offload/include/omptarget.h +++ b/offload/include/omptarget.h @@ -80,6 +80,10 @@ enum tgt_map_type { // Attach pointer and pointee, after processing all other maps. // Applicable to map-entering directives. Does not change ref-count. OMP_TGT_MAPTYPE_ATTACH = 0x4000, + // When a lookup fails, fall back to using null as the translated pointer, + // instead of preserving the original pointer's value. Currently only + // useful in conjunction with RETURN_PARAM. + OMP_TGT_MAPTYPE_FB_NULLIFY = 0x8000, // descriptor for non-contiguous target-update OMP_TGT_MAPTYPE_NON_CONTIG = 0x100000000000, // member of struct, member given by [16 MSBs] - 1 |
