Index: llvm/lib/DWARFLinker/DWARFLinker.cpp =================================================================== --- llvm/lib/DWARFLinker/DWARFLinker.cpp +++ llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -1070,15 +1070,19 @@ // it. Otherwise (when no relocations where applied) just use the // one we just decoded. Addr = (Info.OrigHighPc ? Info.OrigHighPc : Addr) + Info.PCOffset; - } else if (AttrSpec.Attr == dwarf::DW_AT_call_return_pc) { + } else if ((AttrSpec.Attr == dwarf::DW_AT_call_return_pc && + Die.getTag() == dwarf::DW_TAG_call_site) || + (AttrSpec.Attr == dwarf::DW_AT_low_pc && + Die.getTag() == dwarf::DW_TAG_GNU_call_site)) { // Relocate a return PC address within a call site entry. - if (Die.getTag() == dwarf::DW_TAG_call_site) - Addr = (Info.OrigCallReturnPc ? Info.OrigCallReturnPc : Addr) + - Info.PCOffset; - } else if (AttrSpec.Attr == dwarf::DW_AT_call_pc) { + Addr = + (Info.OrigCallReturnPc ? Info.OrigCallReturnPc : Addr) + Info.PCOffset; + } else if ((AttrSpec.Attr == dwarf::DW_AT_call_pc && + Die.getTag() == dwarf::DW_TAG_call_site) || + (AttrSpec.Attr == dwarf::DW_AT_low_pc && + Die.getTag() == dwarf::DW_TAG_GNU_call_site)) { // Relocate the address of a branch instruction within a call site entry. - if (Die.getTag() == dwarf::DW_TAG_call_site) - Addr = (Info.OrigCallPc ? Info.OrigCallPc : Addr) + Info.PCOffset; + Addr = (Info.OrigCallPc ? Info.OrigCallPc : Addr) + Info.PCOffset; } Die.addValue(DIEAlloc, static_cast(AttrSpec.Attr), @@ -1343,10 +1347,10 @@ // inlining function. AttrInfo.OrigLowPc = dwarf::toAddress(InputDIE.find(dwarf::DW_AT_low_pc), std::numeric_limits::max()); - AttrInfo.OrigCallReturnPc = - dwarf::toAddress(InputDIE.find(dwarf::DW_AT_call_return_pc), 0); - AttrInfo.OrigCallPc = - dwarf::toAddress(InputDIE.find(dwarf::DW_AT_call_pc), 0); + AttrInfo.OrigCallReturnPc = dwarf::toAddress( + InputDIE.find({dwarf::DW_AT_call_return_pc, dwarf::DW_AT_low_pc}), 0); + AttrInfo.OrigCallPc = dwarf::toAddress( + InputDIE.find({dwarf::DW_AT_call_pc, dwarf::DW_AT_low_pc}), 0); } // Reset the Offset to 0 as we will be working on the local copy of