Skip to content

Commit 0d0f219

Browse files
committed
[JITLink] Allow pre-existing eh-frame CIE edges on FDEs.
This restores the pre-b9383a86b8f behavior. Most platforms / compilers don't add relocations for CIEs, however they're not prohibited and we want objects that contain them to remain loadable.
1 parent 80815df commit 0d0f219

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp

+29-14
Original file line numberDiff line numberDiff line change
@@ -304,24 +304,39 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
304304
{
305305
// Process the CIE pointer field.
306306
auto CIEEdgeItr = BlockEdges.find(CIEDeltaFieldOffset);
307-
if (CIEEdgeItr != BlockEdges.end())
308-
return make_error<JITLinkError>(
309-
"CIE pointer field already has edge at " +
310-
formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset));
311307

312308
orc::ExecutorAddr CIEAddress =
313309
RecordAddress + orc::ExecutorAddrDiff(CIEDeltaFieldOffset) -
314310
orc::ExecutorAddrDiff(CIEDelta);
315-
LLVM_DEBUG({
316-
dbgs() << " Adding edge at " << (RecordAddress + CIEDeltaFieldOffset)
317-
<< " to CIE at: " << CIEAddress << "\n";
318-
});
319-
if (auto CIEInfoOrErr = PC.findCIEInfo(CIEAddress))
320-
CIEInfo = *CIEInfoOrErr;
321-
else
322-
return CIEInfoOrErr.takeError();
323-
assert(CIEInfo->CIESymbol && "CIEInfo has no CIE symbol set");
324-
B.addEdge(NegDelta32, CIEDeltaFieldOffset, *CIEInfo->CIESymbol, 0);
311+
if (CIEEdgeItr == BlockEdges.end()) {
312+
LLVM_DEBUG({
313+
dbgs() << " Adding edge at "
314+
<< (RecordAddress + CIEDeltaFieldOffset)
315+
<< " to CIE at: " << CIEAddress << "\n";
316+
});
317+
if (auto CIEInfoOrErr = PC.findCIEInfo(CIEAddress))
318+
CIEInfo = *CIEInfoOrErr;
319+
else
320+
return CIEInfoOrErr.takeError();
321+
assert(CIEInfo->CIESymbol && "CIEInfo has no CIE symbol set");
322+
B.addEdge(NegDelta32, CIEDeltaFieldOffset, *CIEInfo->CIESymbol, 0);
323+
} else {
324+
LLVM_DEBUG({
325+
dbgs() << " Already has edge at "
326+
<< (RecordAddress + CIEDeltaFieldOffset) << " to CIE at "
327+
<< CIEAddress << "\n";
328+
});
329+
auto &EI = CIEEdgeItr->second;
330+
if (EI.Addend)
331+
return make_error<JITLinkError>(
332+
"CIE edge at " +
333+
formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset) +
334+
" has non-zero addend");
335+
if (auto CIEInfoOrErr = PC.findCIEInfo(EI.Target->getAddress()))
336+
CIEInfo = *CIEInfoOrErr;
337+
else
338+
return CIEInfoOrErr.takeError();
339+
}
325340
}
326341

327342
// Process the PC-Begin field.

0 commit comments

Comments
 (0)