[llvm] [Offload][OpenMP] Prettify error messages by "demangling" the kernel name (PR #101400)

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 31 15:33:05 PDT 2024


================
@@ -186,4 +192,55 @@ bool isCombinedConstruct(Directive D) {
   // Otherwise directive-name is a combined construct.
   return !getLeafConstructs(D).empty() && !isCompositeConstruct(D);
 }
+
+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 SkipAfterNext = [](StringRef S, char Tgt, int &Remaining) {
+    return S.drop_while([&](char C) {
+      if (!Remaining)
+        return false;
+      Remaining -= (C == Tgt);
+      return true;
+    });
+  };
+  auto PrettyName = KernelName.drop_front(
+      sizeof(TargetRegionEntryInfo::KernelNamePrefix) - /*'\0'*/ 1);
+  int Remaining = 3;
+  PrettyName = SkipAfterNext(PrettyName, '_', Remaining);
+  if (Remaining)
+    return "";
+
+  // Look for the last '_l<line>'.
+  size_t LineIdx = PrettyName.find("_l");
----------------
jdoerfert wrote:

I replace the loop after the find with rfind and added a test.

https://github.com/llvm/llvm-project/pull/101400


More information about the llvm-commits mailing list