Skip to content

[JITLink][RISCV] Implement eh_frame handling #68253

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Oct 28, 2023
Merged

Conversation

hahnjo
Copy link
Member

@hahnjo hahnjo commented Oct 4, 2023

This requires adding a NegDelta32 edge kind that cannot be mapped to existing relocations.

@llvmbot
Copy link
Member

llvmbot commented Oct 4, 2023

@llvm/pr-subscribers-clang

@llvm/pr-subscribers-backend-risc-v

Changes

This requires adding a NegDelta32 edge kind that cannot be mapped to existing relocations.


This PR depends on #66707 and #68252; only the top-most commit should be reviewed here.


Patch is 29.96 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/68253.diff

11 Files Affected:

  • (modified) llvm/include/llvm/ExecutionEngine/JITLink/riscv.h (+6)
  • (modified) llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp (+80-103)
  • (modified) llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h (+12-10)
  • (modified) llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp (+16)
  • (modified) llvm/lib/ExecutionEngine/JITLink/riscv.cpp (+2)
  • (modified) llvm/test/ExecutionEngine/JITLink/AArch64/ELF_ehframe.s (+9-12)
  • (modified) llvm/test/ExecutionEngine/JITLink/AArch64/MachO_ehframe.s (+6-8)
  • (modified) llvm/test/ExecutionEngine/JITLink/LoongArch/ELF_loongarch64_ehframe.s (+9-12)
  • (added) llvm/test/ExecutionEngine/JITLink/RISCV/ELF_ehframe.s (+74)
  • (added) llvm/test/ExecutionEngine/JITLink/RISCV/ELF_ehframe.test (+104)
  • (modified) llvm/test/ExecutionEngine/JITLink/ppc64/ELF_ppc64_ehframe.s (+6-8)
diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h b/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h
index cb66289180880ce..a31f7d73b099f45 100644
--- a/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h
+++ b/llvm/include/llvm/ExecutionEngine/JITLink/riscv.h
@@ -214,6 +214,12 @@ enum EdgeKind_riscv : Edge::Kind {
   /// Linker relaxation will use this to ensure all code sequences are properly
   /// aligned and then remove these edges from the graph.
   AlignRelaxable,
+
+  /// 32-bit negative delta.
+  ///
+  /// Fixup expression:
+  ///   Fixup <- Fixup - Target + Addend
+  NegDelta32,
 };
 
 /// Returns a string name for the given riscv edge. For debugging purposes
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
index 86249591a9be053..f036445497cafd5 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
@@ -126,83 +126,71 @@ Error EHFrameEdgeFixer::processBlock(ParseContext &PC, Block &B) {
   }
 
   // Find the offsets of any existing edges from this block.
-  BlockEdgeMap BlockEdges;
+  BlockEdgesInfo BlockEdges;
   for (auto &E : B.edges())
     if (E.isRelocation()) {
-      if (BlockEdges.count(E.getOffset()))
-        return make_error<JITLinkError>(
-            "Multiple relocations at offset " +
-            formatv("{0:x16}", E.getOffset()) + " in " + EHFrameSectionName +
-            " block at address " + formatv("{0:x16}", B.getAddress()));
-
-      BlockEdges[E.getOffset()] = EdgeTarget(E);
+      // Check if we already saw more than one relocation at this offset.
+      if (BlockEdges.Multiple.contains(E.getOffset()))
+        continue;
+
+      // Otherwise check if we previously had exactly one relocation at this
+      // offset. If so, we now have a second one and move it from the TargetMap
+      // into the Multiple set.
+      auto It = BlockEdges.TargetMap.find(E.getOffset());
+      if (It != BlockEdges.TargetMap.end()) {
+        BlockEdges.TargetMap.erase(It);
+        BlockEdges.Multiple.insert(E.getOffset());
+      } else {
+        BlockEdges.TargetMap[E.getOffset()] = EdgeTarget(E);
+      }
     }
 
-  CIEInfosMap CIEInfos;
   BinaryStreamReader BlockReader(
       StringRef(B.getContent().data(), B.getContent().size()),
       PC.G.getEndianness());
-  while (!BlockReader.empty()) {
-    size_t RecordStartOffset = BlockReader.getOffset();
-
-    LLVM_DEBUG({
-      dbgs() << "    Processing CFI record at "
-             << (B.getAddress() + RecordStartOffset) << "\n";
-    });
-
-    // Get the record length.
-    Expected<size_t> RecordRemaining = readCFIRecordLength(B, BlockReader);
-    if (!RecordRemaining)
-      return RecordRemaining.takeError();
 
-    if (BlockReader.bytesRemaining() < *RecordRemaining)
-      return make_error<JITLinkError>(
-          "Incomplete CFI record at " +
-          formatv("{0:x16}", B.getAddress() + RecordStartOffset));
+  // Get the record length.
+  Expected<size_t> RecordRemaining = readCFIRecordLength(B, BlockReader);
+  if (!RecordRemaining)
+    return RecordRemaining.takeError();
+
+  // We expect DWARFRecordSectionSplitter to split each CFI record into its own
+  // block.
+  if (BlockReader.bytesRemaining() != *RecordRemaining)
+    return make_error<JITLinkError>("Incomplete CFI record at " +
+                                    formatv("{0:x16}", B.getAddress()));
+
+  // Read the CIE delta for this record.
+  uint64_t CIEDeltaFieldOffset = BlockReader.getOffset();
+  uint32_t CIEDelta;
+  if (auto Err = BlockReader.readInteger(CIEDelta))
+    return Err;
 
-    // Read the CIE delta for this record.
-    uint64_t CIEDeltaFieldOffset = BlockReader.getOffset() - RecordStartOffset;
-    uint32_t CIEDelta;
-    if (auto Err = BlockReader.readInteger(CIEDelta))
+  if (CIEDelta == 0) {
+    if (auto Err = processCIE(PC, B, CIEDeltaFieldOffset, BlockEdges))
+      return Err;
+  } else {
+    if (auto Err = processFDE(PC, B, CIEDeltaFieldOffset, CIEDelta, BlockEdges))
       return Err;
-
-    if (CIEDelta == 0) {
-      if (auto Err = processCIE(PC, B, RecordStartOffset,
-                                CIEDeltaFieldOffset + *RecordRemaining,
-                                CIEDeltaFieldOffset, BlockEdges))
-        return Err;
-    } else {
-      if (auto Err = processFDE(PC, B, RecordStartOffset,
-                                CIEDeltaFieldOffset + *RecordRemaining,
-                                CIEDeltaFieldOffset, CIEDelta, BlockEdges))
-        return Err;
-    }
-
-    // Move to the next record.
-    BlockReader.setOffset(RecordStartOffset + CIEDeltaFieldOffset +
-                          *RecordRemaining);
   }
 
   return Error::success();
 }
 
 Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
-                                   size_t RecordOffset, size_t RecordLength,
                                    size_t CIEDeltaFieldOffset,
-                                   const BlockEdgeMap &BlockEdges) {
+                                   const BlockEdgesInfo &BlockEdges) {
 
-  LLVM_DEBUG(dbgs() << "      Record is CIE\n");
+  LLVM_DEBUG(dbgs() << "    Record is CIE\n");
 
-  auto RecordContent = B.getContent().slice(RecordOffset, RecordLength);
   BinaryStreamReader RecordReader(
-      StringRef(RecordContent.data(), RecordContent.size()),
+      StringRef(B.getContent().data(), B.getContent().size()),
       PC.G.getEndianness());
 
   // Skip past the CIE delta field: we've already processed this far.
   RecordReader.setOffset(CIEDeltaFieldOffset + 4);
 
-  auto &CIESymbol =
-      PC.G.addAnonymousSymbol(B, RecordOffset, RecordLength, false, false);
+  auto &CIESymbol = PC.G.addAnonymousSymbol(B, 0, B.getSize(), false, false);
   CIEInformation CIEInfo(CIESymbol);
 
   uint8_t Version = 0;
@@ -268,7 +256,7 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
         if (auto Err =
                 getOrCreateEncodedPointerEdge(
                     PC, BlockEdges, *PersonalityPointerEncoding, RecordReader,
-                    B, RecordOffset + RecordReader.getOffset(), "personality")
+                    B, RecordReader.getOffset(), "personality")
                     .takeError())
           return Err;
         break;
@@ -279,7 +267,7 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
           if (CIEInfo.AddressEncoding == dwarf::DW_EH_PE_omit)
             return make_error<JITLinkError>(
                 "Invalid address encoding DW_EH_PE_omit in CIE at " +
-                formatv("{0:x}", (B.getAddress() + RecordOffset).getValue()));
+                formatv("{0:x}", B.getAddress().getValue()));
         } else
           return PE.takeError();
         break;
@@ -302,69 +290,54 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
 }
 
 Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
-                                   size_t RecordOffset, size_t RecordLength,
                                    size_t CIEDeltaFieldOffset,
                                    uint32_t CIEDelta,
-                                   const BlockEdgeMap &BlockEdges) {
-  LLVM_DEBUG(dbgs() << "      Record is FDE\n");
+                                   const BlockEdgesInfo &BlockEdges) {
+  LLVM_DEBUG(dbgs() << "    Record is FDE\n");
 
-  orc::ExecutorAddr RecordAddress = B.getAddress() + RecordOffset;
+  orc::ExecutorAddr RecordAddress = B.getAddress();
 
-  auto RecordContent = B.getContent().slice(RecordOffset, RecordLength);
   BinaryStreamReader RecordReader(
-      StringRef(RecordContent.data(), RecordContent.size()),
+      StringRef(B.getContent().data(), B.getContent().size()),
       PC.G.getEndianness());
 
   // Skip past the CIE delta field: we've already read this far.
   RecordReader.setOffset(CIEDeltaFieldOffset + 4);
 
-  auto &FDESymbol =
-      PC.G.addAnonymousSymbol(B, RecordOffset, RecordLength, false, false);
+  auto &FDESymbol = PC.G.addAnonymousSymbol(B, 0, B.getSize(), false, false);
 
   CIEInformation *CIEInfo = nullptr;
 
   {
     // Process the CIE pointer field.
-    auto CIEEdgeItr = BlockEdges.find(RecordOffset + CIEDeltaFieldOffset);
+    auto CIEEdgeItr = BlockEdges.TargetMap.find(CIEDeltaFieldOffset);
+    if (CIEEdgeItr != BlockEdges.TargetMap.end())
+      return make_error<JITLinkError>(
+          "CIE pointer field already has edge at " +
+          formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset));
+    if (BlockEdges.Multiple.contains(CIEDeltaFieldOffset))
+      return make_error<JITLinkError>(
+          "CIE pointer field already has multiple edges at " +
+          formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset));
+
     orc::ExecutorAddr CIEAddress =
         RecordAddress + orc::ExecutorAddrDiff(CIEDeltaFieldOffset) -
         orc::ExecutorAddrDiff(CIEDelta);
-    if (CIEEdgeItr == BlockEdges.end()) {
-
-      LLVM_DEBUG({
-        dbgs() << "        Adding edge at "
-               << (RecordAddress + CIEDeltaFieldOffset)
-               << " to CIE at: " << CIEAddress << "\n";
-      });
-      if (auto CIEInfoOrErr = PC.findCIEInfo(CIEAddress))
-        CIEInfo = *CIEInfoOrErr;
-      else
-        return CIEInfoOrErr.takeError();
-      assert(CIEInfo->CIESymbol && "CIEInfo has no CIE symbol set");
-      B.addEdge(NegDelta32, RecordOffset + CIEDeltaFieldOffset,
-                *CIEInfo->CIESymbol, 0);
-    } else {
-      LLVM_DEBUG({
-        dbgs() << "        Already has edge at "
-               << (RecordAddress + CIEDeltaFieldOffset) << " to CIE at "
-               << CIEAddress << "\n";
-      });
-      auto &EI = CIEEdgeItr->second;
-      if (EI.Addend)
-        return make_error<JITLinkError>(
-            "CIE edge at " +
-            formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset) +
-            " has non-zero addend");
-      if (auto CIEInfoOrErr = PC.findCIEInfo(EI.Target->getAddress()))
-        CIEInfo = *CIEInfoOrErr;
-      else
-        return CIEInfoOrErr.takeError();
-    }
+    LLVM_DEBUG({
+      dbgs() << "      Adding edge at " << (RecordAddress + CIEDeltaFieldOffset)
+             << " to CIE at: " << CIEAddress << "\n";
+    });
+    if (auto CIEInfoOrErr = PC.findCIEInfo(CIEAddress))
+      CIEInfo = *CIEInfoOrErr;
+    else
+      return CIEInfoOrErr.takeError();
+    assert(CIEInfo->CIESymbol && "CIEInfo has no CIE symbol set");
+    B.addEdge(NegDelta32, CIEDeltaFieldOffset, *CIEInfo->CIESymbol, 0);
   }
 
   // Process the PC-Begin field.
   LLVM_DEBUG({
-    dbgs() << "        Processing PC-begin at "
+    dbgs() << "      Processing PC-begin at "
            << (RecordAddress + RecordReader.getOffset()) << "\n";
   });
   if (auto PCBegin = getOrCreateEncodedPointerEdge(
@@ -375,14 +348,14 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
       // Add a keep-alive edge from the FDE target to the FDE to ensure that the
       // FDE is kept alive if its target is.
       LLVM_DEBUG({
-        dbgs() << "        Adding keep-alive edge from target at "
+        dbgs() << "      Adding keep-alive edge from target at "
                << (*PCBegin)->getBlock().getAddress() << " to FDE at "
                << RecordAddress << "\n";
       });
       (*PCBegin)->getBlock().addEdge(Edge::KeepAlive, 0, FDESymbol, 0);
     } else {
       LLVM_DEBUG({
-        dbgs() << "        WARNING: Not adding keep-alive edge to FDE at "
+        dbgs() << "      WARNING: Not adding keep-alive edge to FDE at "
                << RecordAddress << ", which points to "
                << ((*PCBegin)->isExternal() ? "external" : "absolute")
                << " symbol \"" << (*PCBegin)->getName()
@@ -409,7 +382,7 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
                          .takeError())
         return Err;
   } else {
-    LLVM_DEBUG(dbgs() << "        Record does not have LSDA field.\n");
+    LLVM_DEBUG(dbgs() << "      Record does not have LSDA field.\n");
   }
 
   return Error::success();
@@ -520,7 +493,7 @@ Error EHFrameEdgeFixer::skipEncodedPointer(uint8_t PointerEncoding,
 }
 
 Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
-    ParseContext &PC, const BlockEdgeMap &BlockEdges, uint8_t PointerEncoding,
+    ParseContext &PC, const BlockEdgesInfo &BlockEdges, uint8_t PointerEncoding,
     BinaryStreamReader &RecordReader, Block &BlockToFix,
     size_t PointerFieldOffset, const char *FieldName) {
   using namespace dwarf;
@@ -531,10 +504,10 @@ Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
   // If there's already an edge here then just skip the encoded pointer and
   // return the edge's target.
   {
-    auto EdgeI = BlockEdges.find(PointerFieldOffset);
-    if (EdgeI != BlockEdges.end()) {
+    auto EdgeI = BlockEdges.TargetMap.find(PointerFieldOffset);
+    if (EdgeI != BlockEdges.TargetMap.end()) {
       LLVM_DEBUG({
-        dbgs() << "        Existing edge at "
+        dbgs() << "      Existing edge at "
                << (BlockToFix.getAddress() + PointerFieldOffset) << " to "
                << FieldName << " at " << EdgeI->second.Target->getAddress();
         if (EdgeI->second.Target->hasName())
@@ -545,6 +518,10 @@ Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
         return std::move(Err);
       return EdgeI->second.Target;
     }
+
+    if (BlockEdges.Multiple.contains(PointerFieldOffset))
+      return make_error<JITLinkError>("Multiple relocations at offset " +
+                                      formatv("{0:x16}", PointerFieldOffset));
   }
 
   // Switch absptr to corresponding udata encoding.
@@ -596,7 +573,7 @@ Expected<Symbol *> EHFrameEdgeFixer::getOrCreateEncodedPointerEdge(
   BlockToFix.addEdge(PtrEdgeKind, PointerFieldOffset, *TargetSym, 0);
 
   LLVM_DEBUG({
-    dbgs() << "        Adding edge at "
+    dbgs() << "      Adding edge at "
            << (BlockToFix.getAddress() + PointerFieldOffset) << " to "
            << FieldName << " at " << TargetSym->getAddress();
     if (TargetSym->hasName())
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
index 55cf7fc63ee7957..49fbf650e7a775e 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
@@ -60,7 +60,11 @@ class EHFrameEdgeFixer {
     Edge::AddendT Addend = 0;
   };
 
-  using BlockEdgeMap = DenseMap<Edge::OffsetT, EdgeTarget>;
+  struct BlockEdgesInfo {
+    DenseMap<Edge::OffsetT, EdgeTarget> TargetMap;
+    DenseSet<Edge::OffsetT> Multiple;
+  };
+
   using CIEInfosMap = DenseMap<orc::ExecutorAddr, CIEInformation>;
 
   struct ParseContext {
@@ -81,12 +85,10 @@ class EHFrameEdgeFixer {
   };
 
   Error processBlock(ParseContext &PC, Block &B);
-  Error processCIE(ParseContext &PC, Block &B, size_t RecordOffset,
-                   size_t RecordLength, size_t CIEDeltaFieldOffset,
-                   const BlockEdgeMap &BlockEdges);
-  Error processFDE(ParseContext &PC, Block &B, size_t RecordOffset,
-                   size_t RecordLength, size_t CIEDeltaFieldOffset,
-                   uint32_t CIEDelta, const BlockEdgeMap &BlockEdges);
+  Error processCIE(ParseContext &PC, Block &B, size_t CIEDeltaFieldOffset,
+                   const BlockEdgesInfo &BlockEdges);
+  Error processFDE(ParseContext &PC, Block &B, size_t CIEDeltaFieldOffset,
+                   uint32_t CIEDelta, const BlockEdgesInfo &BlockEdges);
 
   Expected<AugmentationInfo>
   parseAugmentationString(BinaryStreamReader &RecordReader);
@@ -96,9 +98,9 @@ class EHFrameEdgeFixer {
   Error skipEncodedPointer(uint8_t PointerEncoding,
                            BinaryStreamReader &RecordReader);
   Expected<Symbol *> getOrCreateEncodedPointerEdge(
-      ParseContext &PC, const BlockEdgeMap &BlockEdges, uint8_t PointerEncoding,
-      BinaryStreamReader &RecordReader, Block &BlockToFix,
-      size_t PointerFieldOffset, const char *FieldName);
+      ParseContext &PC, const BlockEdgesInfo &BlockEdges,
+      uint8_t PointerEncoding, BinaryStreamReader &RecordReader,
+      Block &BlockToFix, size_t PointerFieldOffset, const char *FieldName);
 
   Expected<Symbol &> getOrCreateSymbol(ParseContext &PC,
                                        orc::ExecutorAddr Addr);
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
index 35816ea66cf9bc3..d0701ba08bd9194 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp
@@ -11,10 +11,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/ExecutionEngine/JITLink/ELF_riscv.h"
+#include "EHFrameSupportImpl.h"
 #include "ELFLinkGraphBuilder.h"
 #include "JITLinkGeneric.h"
 #include "PerGraphGOTAndPLTStubsBuilder.h"
 #include "llvm/BinaryFormat/ELF.h"
+#include "llvm/ExecutionEngine/JITLink/DWARFRecordSectionSplitter.h"
 #include "llvm/ExecutionEngine/JITLink/JITLink.h"
 #include "llvm/ExecutionEngine/JITLink/riscv.h"
 #include "llvm/Object/ELF.h"
@@ -456,6 +458,13 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
     case AlignRelaxable:
       // Ignore when the relaxation pass did not run
       break;
+    case NegDelta32: {
+      int64_t Value = FixupAddress - E.getTarget().getAddress() + E.getAddend();
+      if (LLVM_UNLIKELY(!isInRangeForImm(Value, 32)))
+        return makeTargetOutOfRangeError(G, B, E);
+      *(little32_t *)FixupPtr = static_cast<uint32_t>(Value);
+      break;
+    }
     }
     return Error::success();
   }
@@ -958,6 +967,13 @@ void link_ELF_riscv(std::unique_ptr<LinkGraph> G,
   PassConfiguration Config;
   const Triple &TT = G->getTargetTriple();
   if (Ctx->shouldAddDefaultTargetPasses(TT)) {
+
+    Config.PrePrunePasses.push_back(DWARFRecordSectionSplitter(".eh_frame"));
+    Config.PrePrunePasses.push_back(EHFrameEdgeFixer(
+        ".eh_frame", G->getPointerSize(), Edge::Invalid, Edge::Invalid,
+        Edge::Invalid, Edge::Invalid, NegDelta32));
+    Config.PrePrunePasses.push_back(EHFrameNullTerminator(".eh_frame"));
+
     if (auto MarkLive = Ctx->getMarkLivePass(TT))
       Config.PrePrunePasses.push_back(std::move(MarkLive));
     else
diff --git a/llvm/lib/ExecutionEngine/JITLink/riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/riscv.cpp
index a78843b1614795e..a4e4daef97fb5d6 100644
--- a/llvm/lib/ExecutionEngine/JITLink/riscv.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/riscv.cpp
@@ -82,6 +82,8 @@ const char *getEdgeKindName(Edge::Kind K) {
     return "CallRelaxable";
   case AlignRelaxable:
     return "AlignRelaxable";
+  case NegDelta32:
+    return "NegDelta32";
   }
   return getGenericEdgeKindName(K);
 }
diff --git a/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_ehframe.s b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_ehframe.s
index 770cd60a1d70d76..716c4e5abd3fb9d 100644
--- a/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_ehframe.s
+++ b/llvm/test/ExecutionEngine/JITLink/AArch64/ELF_ehframe.s
@@ -13,20 +13,17 @@
 # CHECK:      Extracted {{.*}} section = .eh_frame
 # CHECK: EHFrameEdgeFixer: Processing .eh_frame in "{{.*}}"...
 # CHECK:   Processing block at
-# CHECK:     Processing CFI record at
-# CHECK:       Record is CIE
+# CHECK:     Record is CIE
 # CHECK:   Processing block at
-# CHECK:     Processing CFI record at
-# CHECK:       Record is FDE
-# CHECK:         Adding edge at {{.*}} to CIE at: {{.*}}
-# CHECK:         Existing edge at {{.*}} to PC begin at {{.*}}
-# CHECK:         Adding keep-alive edge from target at {{.*}} to FDE at {{.*}}
+# CHECK:     Record is FDE
+# CHECK:       Adding edge at {{.*}} to CIE at: {{.*}}
+# CHECK:       Existing edge at {{.*}} to PC begin at {{.*}}
+# CHECK:       Adding keep-alive edge from target at {{.*}} to FDE at {{.*}}
 # CHECK:   Processing block at
-# CHECK:     Processing CFI record at
-# CHECK:       Record is FDE
-# CHECK:         Adding edge at {{.*}} to CIE at: {{.*}}
-# CHECK:         Existing edge at {{.*}} to PC begin at {{.*}}
-# CHECK:         Adding keep-alive edge from target at {{.*}} to FDE at {{.*}}
+# CHECK:     Record is FDE
+# CHECK:       Adding edge at {{.*}} to CIE at: {{.*}}
+# CHECK:       Existing edge at {{.*}} to PC begin at {{.*}}
+# CHECK:       Adding keep-alive edge from target at {{.*}} to FDE at {{.*}}
 
 	.text
 	.globl	mai...
[truncated]

@hahnjo
Copy link
Member Author

hahnjo commented Oct 4, 2023

@mtvec I took your range check and the tests from #66067 and added you as co-author. Let me know if this is fine for you, I'm not sure LLVM has guidelines how to handle this kind of case where two contributors independently came up with roughly the same change...

@mtvec
Copy link
Contributor

mtvec commented Oct 5, 2023

@mtvec I took your range check and the tests from #66067 and added you as co-author. Let me know if this is fine for you, I'm not sure LLVM has guidelines how to handle this kind of case where two contributors independently came up with roughly the same change...

I'm also not sure if there are any guidelines but for me this is definitely fine. Thanks!

hahnjo and others added 3 commits October 23, 2023 20:27
This requires adding a NegDelta32 edge kind that cannot be mapped to
existing relocations.

Co-authored-by: Job Noorman <[email protected]>
@llvmbot llvmbot added the clang Clang issues not falling into any other category label Oct 23, 2023
@hahnjo
Copy link
Member Author

hahnjo commented Oct 23, 2023

@mtvec @luxufan ping :)

@hahnjo hahnjo merged commit 4f6757c into llvm:main Oct 28, 2023
@hahnjo hahnjo deleted the riscv-eh-frame branch October 28, 2023 09:30
@kosarev
Copy link
Collaborator

kosarev commented Jan 10, 2024

It seems after this change we started to fail on LLVM :: ExecutionEngine/JITLink/RISCV/ELF_ehframe.s when using debug libgcxx.

Tagging #68594 and #73935.

/usr/include/c++/11/bits/stl_algo.h:2217:
In function:
    std::pair<_FIter, _FIter> std::equal_range(_FIter, _FIter, const _Tp&, 
    _Compare) [with _FIter = gnu_debug::_Safe_iterator<gnu_cxx::
    normal_iterator<const llvm::jitlink::Edge*, std::
    vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge> > >, 
    std::debug::vector<llvm::jitlink::Edge>, 
    std::random_access_iterator_tag>; _Tp = long unsigned int; _Compare = 
    llvm::jitlink::getRISCVPCRelHi20(const llvm::jitlink::Edge&)::Comp]

Error: elements in iterator range [first, last) are not partitioned by the 
predicate __comp and value __val.

Objects involved in the operation:
    iterator "first" @ 0x7ffccd5f47b0 {
      state = dereferenceable (start-of-sequence);
      references sequence @ 0x55c7976a5718
    }
    iterator "last" @ 0x7ffccd5f47e0 {
      state = past-the-end;
      references sequence @ 0x55c7976a5718
    }
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: /home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llvm-jitlink -noexec -phony-externals -debug-only=jitlink /home/kosarev/labs/llvm-project/build/debug+expensive_checks/test/ExecutionEngine/JITLink/RISCV/Output/ELF_ehframe.s.tmp.32.o
 #0 0x00007f95fe6db674 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:723:22
 #1 0x00007f95fe6dba95 PrintStackTraceSignalHandler(void*) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:798:1
 #2 0x00007f95fe6d8edd llvm::sys::RunSignalHandlers() /home/kosarev/labs/llvm-project/llvm/lib/Support/Signals.cpp:105:20
 #3 0x00007f95fe6daf0c SignalHandler(int) /home/kosarev/labs/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
 #4 0x00007f95fdf5c520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #5 0x00007f95fdfb09fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #6 0x00007f95fdfb09fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #7 0x00007f95fdfb09fc pthread_kill ./nptl/pthread_kill.c:89:10
 #8 0x00007f95fdf5c476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #9 0x00007f95fdf427f3 abort ./stdlib/abort.c:81:7
#10 0x00007f95fe1e71fb std::__throw_bad_exception() (/lib/x86_64-linux-gnu/libstdc++.so.6+0xa51fb)
#11 0x00007f95ff75fa4b std::pair<__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::jitlink::Edge const*, std::__cxx1998::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>>, std::__debug::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>, std::random_access_iterator_tag>, __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::jitlink::Edge const*, std::__cxx1998::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>>, std::__debug::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>, std::random_access_iterator_tag>> std::equal_range<__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::jitlink::Edge const*, std::__cxx1998::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>>, std::__debug::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>, std::random_access_iterator_tag>, unsigned long, llvm::jitlink::getRISCVPCRelHi20(llvm::jitlink::Edge const&)::Comp>(__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::jitlink::Edge const*, std::__cxx1998::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>>, std::__debug::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>, std::random_access_iterator_tag>, __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<llvm::jitlink::Edge const*, std::__cxx1998::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>>, std::__debug::vector<llvm::jitlink::Edge, std::allocator<llvm::jitlink::Edge>>, std::random_access_iterator_tag>, unsigned long const&, llvm::jitlink::getRISCVPCRelHi20(llvm::jitlink::Edge const&)::Comp) /usr/include/c++/11/bits/stl_algo.h:2219:7
#12 0x00007f95ff75cf94 llvm::jitlink::getRISCVPCRelHi20(llvm::jitlink::Edge const&) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp:157:74
#13 0x00007f95ff766692 llvm::jitlink::ELFJITLinker_riscv::applyFixup(llvm::jitlink::LinkGraph&, llvm::jitlink::Block&, llvm::jitlink::Edge const&) const /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp:273:12
#14 0x00007f95ff770ce5 llvm::jitlink::JITLinker<llvm::jitlink::ELFJITLinker_riscv>::fixUpBlocks(llvm::jitlink::LinkGraph&) const /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h:171:11
#15 0x00007f95ff67f0d7 llvm::jitlink::JITLinkerBase::linkPhase3(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>, llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp:163:33
#16 0x00007f95ff67e586 llvm::jitlink::JITLinkerBase::linkPhase2(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)::'lambda'(llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>)::operator()(llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp:130:39
#17 0x00007f95ff680f39 std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation, std::default_delete<llvm::jitlink::JITLinkAsyncLookupContinuation>> llvm::jitlink::createLookupContinuation<llvm::jitlink::JITLinkerBase::linkPhase2(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)::'lambda'(llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>)>(llvm::jitlink::JITLinkerBase::linkPhase2(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)::'lambda'(llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>))::Impl::run(llvm::Expected<llvm::DenseMap<llvm::StringRef, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::orc::ExecutorSymbolDef>>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h:1780:58
#18 0x00007f9601034f75 llvm::orc::ObjectLinkingLayerJITLinkContext::lookup(llvm::DenseMap<llvm::StringRef, llvm::jitlink::SymbolLookupFlags, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::jitlink::SymbolLookupFlags>> const&, std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation, std::default_delete<llvm::jitlink::JITLinkAsyncLookupContinuation>>)::'lambda0'(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>)::operator()(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp:215:32
#19 0x00007f9601043de2 void llvm::detail::UniqueFunctionBase<void, llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>>::CallImpl<llvm::orc::ObjectLinkingLayerJITLinkContext::lookup(llvm::DenseMap<llvm::StringRef, llvm::jitlink::SymbolLookupFlags, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::jitlink::SymbolLookupFlags>> const&, std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation, std::default_delete<llvm::jitlink::JITLinkAsyncLookupContinuation>>)::'lambda0'(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>)>(void*, llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#20 0x00007f9600e04635 llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>)>::operator()(llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#21 0x00007f9600dd9518 llvm::orc::AsynchronousSymbolQuery::handleComplete(llvm::orc::ExecutionSession&)::RunQueryCompleteTask::run() /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:204:41
#22 0x00007f9600dfe129 llvm::orc::ExecutionSession::runOnCurrentThread(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1712:71
#23 0x00007f9600e30d4b void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>>::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#24 0x00007f9600e03a77 llvm::unique_function<void (std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>::operator()(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#25 0x00007f9600dfe02e llvm::orc::ExecutionSession::dispatchTask(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1603:17
#26 0x00007f9600dd9649 llvm::orc::AsynchronousSymbolQuery::handleComplete(llvm::orc::ExecutionSession&) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:214:18
#27 0x00007f9600de0024 llvm::orc::JITDylib::resolve(llvm::orc::MaterializationResponsibility&, llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>> const&) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:1045:18
#28 0x00007f9600df11ff llvm::orc::ExecutionSession::OL_notifyResolved(llvm::orc::MaterializationResponsibility&, llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>> const&) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:3035:1
#29 0x00007f9600dfe2fe llvm::orc::MaterializationResponsibility::notifyResolved(llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>> const&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1966:1
#30 0x00007f9600dd9cd6 llvm::orc::AbsoluteSymbolsMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:274:44
#31 0x00007f9600de78bc llvm::orc::MaterializationTask::run() /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:1921:50
#32 0x00007f9600dfe129 llvm::orc::ExecutionSession::runOnCurrentThread(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1712:71
#33 0x00007f9600e30d4b void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>>::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#34 0x00007f9600e03a77 llvm::unique_function<void (std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>::operator()(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#35 0x00007f9600dfe02e llvm::orc::ExecutionSession::dispatchTask(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1603:17
#36 0x00007f9600deb3e6 llvm::orc::ExecutionSession::dispatchOutstandingMUs() /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2309:17
#37 0x00007f9600df02be llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>>> const&)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2920:1
#38 0x00007f9600dff33a llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:580:25
#39 0x00007f9600dee11d llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>, llvm::Error) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2675:19
#40 0x00007f9600de9e8f llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::__debug::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>>> const&, llvm::orc::SymbolLookupSet, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>)>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>>> const&)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2147:22
#41 0x00007f9601035456 llvm::orc::ObjectLinkingLayerJITLinkContext::lookup(llvm::DenseMap<llvm::StringRef, llvm::jitlink::SymbolLookupFlags, llvm::DenseMapInfo<llvm::StringRef, void>, llvm::detail::DenseMapPair<llvm::StringRef, llvm::jitlink::SymbolLookupFlags>> const&, std::unique_ptr<llvm::jitlink::JITLinkAsyncLookupContinuation, std::default_delete<llvm::jitlink::JITLinkAsyncLookupContinuation>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp:225:14
#42 0x00007f95ff67ec06 llvm::jitlink::JITLinkerBase::linkPhase2(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp:126:39
#43 0x00007f95ff67df11 llvm::jitlink::JITLinkerBase::linkPhase1(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>)::'lambda0'(llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)::operator()(llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp:66:28
#44 0x00007f95ff681720 void llvm::detail::UniqueFunctionBase<void, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>>::CallImpl<llvm::jitlink::JITLinkerBase::linkPhase1(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>)::'lambda0'(llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)>(void*, llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#45 0x00007f9600eb9721 llvm::unique_function<void (llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)>::operator()(llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#46 0x00007f9600ff2b33 llvm::orc::MapperJITLinkMemoryManager::allocate(llvm::jitlink::JITLinkDylib const*, llvm::jitlink::LinkGraph&, llvm::unique_function<void (llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)>)::'lambda'(llvm::Expected<llvm::orc::ExecutorAddrRange>)::operator()(llvm::Expected<llvm::orc::ExecutorAddrRange>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp:121:16
#47 0x00007f9600ff3ac7 void llvm::detail::UniqueFunctionBase<void, llvm::Expected<llvm::orc::ExecutorAddrRange>>::CallImpl<llvm::orc::MapperJITLinkMemoryManager::allocate(llvm::jitlink::JITLinkDylib const*, llvm::jitlink::LinkGraph&, llvm::unique_function<void (llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)>)::'lambda'(llvm::Expected<llvm::orc::ExecutorAddrRange>)>(void*, llvm::Expected<llvm::orc::ExecutorAddrRange>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#48 0x000055c795ec3daf llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>::operator()(llvm::Expected<llvm::orc::ExecutorAddrRange>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#49 0x000055c795eb5438 llvm::InProcessDeltaMapper::reserve(unsigned long, llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>)::'lambda'(llvm::Expected<llvm::orc::ExecutorAddrRange>)::operator()(llvm::Expected<llvm::orc::ExecutorAddrRange>) /home/kosarev/labs/llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp:501:21
#50 0x000055c795ef71ca void llvm::detail::UniqueFunctionBase<void, llvm::Expected<llvm::orc::ExecutorAddrRange>>::CallImpl<llvm::InProcessDeltaMapper::reserve(unsigned long, llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>)::'lambda'(llvm::Expected<llvm::orc::ExecutorAddrRange>)>(void*, llvm::Expected<llvm::orc::ExecutorAddrRange>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#51 0x00007f9601009533 llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>::operator()(llvm::Expected<llvm::orc::ExecutorAddrRange>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#52 0x00007f9601000a23 llvm::orc::InProcessMemoryMapper::reserve(unsigned long, llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/MemoryMapper.cpp:54:13
#53 0x000055c795eb5553 llvm::InProcessDeltaMapper::reserve(unsigned long, llvm::unique_function<void (llvm::Expected<llvm::orc::ExecutorAddrRange>)>) /home/kosarev/labs/llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp:489:35
#54 0x00007f9600ff302a llvm::orc::MapperJITLinkMemoryManager::allocate(llvm::jitlink::JITLinkDylib const*, llvm::jitlink::LinkGraph&, llvm::unique_function<void (llvm::Expected<std::unique_ptr<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc, std::default_delete<llvm::jitlink::JITLinkMemoryManager::InFlightAlloc>>>)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/MapperJITLinkMemoryManager.cpp:141:20
#55 0x00007f95ff67e4c6 llvm::jitlink::JITLinkerBase::linkPhase1(std::unique_ptr<llvm::jitlink::JITLinkerBase, std::default_delete<llvm::jitlink::JITLinkerBase>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp:59:35
#56 0x00007f95ff768e19 void llvm::jitlink::JITLinker<llvm::jitlink::ELFJITLinker_riscv>::link<std::unique_ptr<llvm::jitlink::JITLinkContext, std::default_delete<llvm::jitlink::JITLinkContext>>, std::unique_ptr<llvm::jitlink::LinkGraph, std::default_delete<llvm::jitlink::LinkGraph>>, llvm::jitlink::PassConfiguration>(std::unique_ptr<llvm::jitlink::JITLinkContext, std::default_delete<llvm::jitlink::JITLinkContext>>&&, std::unique_ptr<llvm::jitlink::LinkGraph, std::default_delete<llvm::jitlink::LinkGraph>>&&, llvm::jitlink::PassConfiguration&&) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.h:124:20
#57 0x00007f95ff75f403 llvm::jitlink::link_ELF_riscv(std::unique_ptr<llvm::jitlink::LinkGraph, std::default_delete<llvm::jitlink::LinkGraph>>, std::unique_ptr<llvm::jitlink::JITLinkContext, std::default_delete<llvm::jitlink::JITLinkContext>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp:989:1
#58 0x00007f95ff6f269a llvm::jitlink::link_ELF(std::unique_ptr<llvm::jitlink::LinkGraph, std::default_delete<llvm::jitlink::LinkGraph>>, std::unique_ptr<llvm::jitlink::JITLinkContext, std::default_delete<llvm::jitlink::JITLinkContext>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/ELF.cpp:137:19
#59 0x00007f95ff65e11b llvm::jitlink::link(std::unique_ptr<llvm::jitlink::LinkGraph, std::default_delete<llvm::jitlink::LinkGraph>>, std::unique_ptr<llvm::jitlink::JITLinkContext, std::default_delete<llvm::jitlink::JITLinkContext>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp:511:20
#60 0x00007f9601031157 llvm::orc::ObjectLinkingLayer::emit(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility>>, std::unique_ptr<llvm::MemoryBuffer, std::default_delete<llvm::MemoryBuffer>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp:678:9
#61 0x00007f9600f70683 llvm::orc::BasicObjectLayerMaterializationUnit::materialize(std::unique_ptr<llvm::orc::MaterializationResponsibility, std::default_delete<llvm::orc::MaterializationResponsibility>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Layer.cpp:220:9
#62 0x00007f9600de78bc llvm::orc::MaterializationTask::run() /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:1921:50
#63 0x00007f9600dfe129 llvm::orc::ExecutionSession::runOnCurrentThread(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1712:71
#64 0x00007f9600e30d4b void llvm::detail::UniqueFunctionBase<void, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>>::CallImpl<void (*)(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>(void*, std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>&) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:220:16
#65 0x00007f9600e03a77 llvm::unique_function<void (std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>)>::operator()(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ADT/FunctionExtras.h:382:62
#66 0x00007f9600dfe02e llvm::orc::ExecutionSession::dispatchTask(std::unique_ptr<llvm::orc::Task, std::default_delete<llvm::orc::Task>>) /home/kosarev/labs/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/Core.h:1603:17
#67 0x00007f9600deb3e6 llvm::orc::ExecutionSession::dispatchOutstandingMUs() /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2309:17
#68 0x00007f9600df02be llvm::orc::ExecutionSession::OL_completeLookup(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>, std::shared_ptr<llvm::orc::AsynchronousSymbolQuery>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>>> const&)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2920:1
#69 0x00007f9600dff33a llvm::orc::InProgressFullLookupState::complete(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:580:25
#70 0x00007f9600dee11d llvm::orc::ExecutionSession::OL_applyQueryPhase1(std::unique_ptr<llvm::orc::InProgressLookupState, std::default_delete<llvm::orc::InProgressLookupState>>, llvm::Error) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2675:19
#71 0x00007f9600de9e8f llvm::orc::ExecutionSession::lookup(llvm::orc::LookupKind, std::__debug::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>>> const&, llvm::orc::SymbolLookupSet, llvm::orc::SymbolState, llvm::unique_function<void (llvm::Expected<llvm::DenseMap<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>, llvm::detail::DenseMapPair<llvm::orc::SymbolStringPtr, llvm::orc::ExecutorSymbolDef>>>)>, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>>> const&)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2147:22
#72 0x00007f9600dea144 llvm::orc::ExecutionSession::lookup(std::__debug::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>>> const&, llvm::orc::SymbolLookupSet, llvm::orc::LookupKind, llvm::orc::SymbolState, std::function<void (llvm::DenseMap<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>, llvm::DenseMapInfo<llvm::orc::JITDylib*, void>, llvm::detail::DenseMapPair<llvm::orc::JITDylib*, llvm::DenseSet<llvm::orc::SymbolStringPtr, llvm::DenseMapInfo<llvm::orc::SymbolStringPtr, void>>>> const&)>) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2184:9
#73 0x00007f9600dea3a6 llvm::orc::ExecutionSession::lookup(std::__debug::vector<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>, std::allocator<std::pair<llvm::orc::JITDylib*, llvm::orc::JITDylibLookupFlags>>> const&, llvm::orc::SymbolStringPtr, llvm::orc::SymbolState) /home/kosarev/labs/llvm-project/llvm/lib/ExecutionEngine/Orc/Core.cpp:2210:70
#74 0x000055c795e95a16 getMainEntryPoint(llvm::Session&) /home/kosarev/labs/llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp:2024:50
#75 0x000055c795e95be6 getEntryPoint(llvm::Session&) /home/kosarev/labs/llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp:2039:37
#76 0x000055c795e965e2 main /home/kosarev/labs/llvm-project/llvm/tools/llvm-jitlink/llvm-jitlink.cpp:2131:34
#77 0x00007f95fdf43d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#78 0x00007f95fdf43e40 call_init ./csu/../csu/libc-start.c:128:20
#79 0x00007f95fdf43e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#80 0x000055c795e86f75 _start (/home/kosarev/labs/llvm-project/build/debug+expensive_checks/bin/llvm-jitlink+0x17f75)
Aborted (core dumped)

@hahnjo
Copy link
Member Author

hahnjo commented Jan 20, 2024

It seems after this change we started to fail on LLVM :: ExecutionEngine/JITLink/RISCV/ELF_ehframe.s when using debug libgcxx.

First, sorry for the slow response and breaking the builds with expensive checks in the first place. I believe the report is actually fully correct and we cannot assume the edges are ordered by their offset. The problem should be fixed by #78849.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:RISC-V clang Clang issues not falling into any other category jitlink
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants