Index: llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h =================================================================== --- llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h +++ llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h @@ -78,6 +78,9 @@ /// Is ODR marking done? bool ODRMarkingDone : 1; + + /// Is this a reference to a DIE that hasn't been cloned yet? + bool UnclonedReference : 1; }; CompileUnit(DWARFUnit &OrigUnit, unsigned ID, bool CanUseODR, Index: llvm/lib/DWARFLinker/DWARFLinker.cpp =================================================================== --- llvm/lib/DWARFLinker/DWARFLinker.cpp +++ llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -935,9 +935,9 @@ } if (!RefInfo.Clone) { - assert(Ref > InputDIE.getOffset()); // We haven't cloned this DIE yet. Just create an empty one and // store it. It'll get really cloned when we process it. + RefInfo.UnclonedReference = true; RefInfo.Clone = DIE::get(DIEAlloc, dwarf::Tag(RefDie.getTag())); } NewRefDie = RefInfo.Clone; @@ -950,8 +950,8 @@ // FIXME: we should be able to design DIEEntry reliance on // DwarfDebug away. uint64_t Attr; - if (Ref < InputDIE.getOffset()) { - // We must have already cloned that DIE. + if (Ref < InputDIE.getOffset() && !RefInfo.UnclonedReference) { + // We have already cloned that DIE. uint32_t NewRefOffset = RefUnit->getStartOffset() + NewRefDie->getOffset(); Attr = NewRefOffset;