@@ -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