@@ -304,24 +304,39 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
304
304
{
305
305
// Process the CIE pointer field.
306
306
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));
311
307
312
308
orc::ExecutorAddr CIEAddress =
313
309
RecordAddress + orc::ExecutorAddrDiff (CIEDeltaFieldOffset) -
314
310
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
+ }
325
340
}
326
341
327
342
// Process the PC-Begin field.
0 commit comments