diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2025-02-03 18:51:27 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2025-02-03 18:51:27 +0000 |
| commit | 32a711e1c447004eb1fd015925f305ed1d8426de (patch) | |
| tree | 6647b84917053748367f573f9bdc66e809cb17f5 /llvm/lib/Frontend/OpenMP/OMP.cpp | |
| parent | ac9a064cb179f3425b310fa2847f8764ac970a4d (diff) | |
Vendor import of llvm-project main llvmorg-20-init-19504-g8c2574832ed2,vendor/llvm-project/llvmorg-20-init-19504-g8c2574832ed2vendor/llvm-project/main
the last commit before the upstream release/20.x branch was created.
Diffstat (limited to 'llvm/lib/Frontend/OpenMP/OMP.cpp')
| -rw-r--r-- | llvm/lib/Frontend/OpenMP/OMP.cpp | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp index c1556ff3c74d..2792dc428101 100644 --- a/llvm/lib/Frontend/OpenMP/OMP.cpp +++ b/llvm/lib/Frontend/OpenMP/OMP.cpp @@ -9,14 +9,16 @@ #include "llvm/Frontend/OpenMP/OMP.h" #include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" -#include "llvm/ADT/StringSwitch.h" +#include "llvm/Demangle/Demangle.h" +#include "llvm/Frontend/OpenMP/OMPIRBuilder.h" #include "llvm/Support/ErrorHandling.h" #include <algorithm> +#include <cstdio> #include <iterator> +#include <string> #include <type_traits> using namespace llvm; @@ -77,7 +79,7 @@ namespace llvm::omp { ArrayRef<Directive> getLeafConstructs(Directive D) { auto Idx = static_cast<std::size_t>(D); if (Idx >= Directive_enumSize) - return std::nullopt; + return {}; const auto *Row = LeafConstructTable[LeafConstructTableOrdering[Idx]]; return ArrayRef(&Row[2], static_cast<int>(Row[1])); } @@ -186,4 +188,47 @@ bool isCombinedConstruct(Directive D) { // Otherwise directive-name is a combined construct. return !getLeafConstructs(D).empty() && !isCompositeConstruct(D); } + +ArrayRef<unsigned> getOpenMPVersions() { + static unsigned Versions[]{45, 50, 51, 52, 60}; + return Versions; +} + +std::string prettifyFunctionName(StringRef FunctionName) { + // Internalized functions have the right name, but simply a suffix. + if (FunctionName.ends_with(".internalized")) + return FunctionName.drop_back(sizeof("internalized")).str() + + " (internalized)"; + unsigned LineNo = 0; + auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo); + if (LineNo == 0) + return FunctionName.str(); + return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) + + " (" + FunctionName + ")") + .str(); +} + +std::string deconstructOpenMPKernelName(StringRef KernelName, + unsigned &LineNo) { + + // Only handle functions with an OpenMP kernel prefix for now. Naming scheme: + // __omp_offloading_<hex_hash1>_<hex_hash2>_<name>_l<line>_[<count>_]<suffix> + if (!KernelName.starts_with(TargetRegionEntryInfo::KernelNamePrefix)) + return ""; + + auto PrettyName = KernelName.drop_front( + sizeof(TargetRegionEntryInfo::KernelNamePrefix) - /*'\0'*/ 1); + for (int I = 0; I < 3; ++I) { + PrettyName = PrettyName.drop_while([](char c) { return c != '_'; }); + PrettyName = PrettyName.drop_front(); + } + + // Look for the last '_l<line>'. + size_t LineIdx = PrettyName.rfind("_l"); + if (LineIdx == StringRef::npos) + return ""; + if (PrettyName.drop_front(LineIdx + 2).consumeInteger(10, LineNo)) + return ""; + return demangle(PrettyName.take_front(LineIdx)); +} } // namespace llvm::omp |
