diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp index c095b13e8c30c..16665f422cb3c 100644 --- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp @@ -304,24 +304,39 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B, { // Process the CIE pointer field. auto CIEEdgeItr = BlockEdges.find(CIEDeltaFieldOffset); - if (CIEEdgeItr != BlockEdges.end()) - return make_error( - "CIE pointer field already has edge at " + - formatv("{0:x16}", RecordAddress + CIEDeltaFieldOffset)); orc::ExecutorAddr CIEAddress = RecordAddress + orc::ExecutorAddrDiff(CIEDeltaFieldOffset) - orc::ExecutorAddrDiff(CIEDelta); - 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); + 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, 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( + "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(); + } } // Process the PC-Begin field.