diff --git a/bolt/include/bolt/Core/DebugData.h b/bolt/include/bolt/Core/DebugData.h index 585bafa088849..144433ac78a37 100644 --- a/bolt/include/bolt/Core/DebugData.h +++ b/bolt/include/bolt/Core/DebugData.h @@ -210,6 +210,15 @@ class DebugRangesSectionWriter { static bool classof(const DebugRangesSectionWriter *Writer) { return Writer->getKind() == RangesWriterKind::DebugRangesWriter; } + + /// Append a range to the main buffer. + void appendToRangeBuffer(const DebugBufferVector &CUBuffer); + + /// Sets Unit DIE to be updated for CU. + void setDie(DIE *Die) { this->Die = Die; } + + /// Returns Unit DIE to be updated for CU. + DIE *getDie() const { return Die; } /// Writes out range lists for a current CU being processed. void virtual finalizeSection(){}; @@ -232,6 +241,9 @@ class DebugRangesSectionWriter { static constexpr uint64_t EmptyRangesOffset{0}; private: + /// Stores Unit DIE to be updated for CU. + DIE *Die{0}; + RangesWriterKind Kind; }; diff --git a/bolt/include/bolt/Rewrite/DWARFRewriter.h b/bolt/include/bolt/Rewrite/DWARFRewriter.h index 8dec32de9008e..1776f9efd137f 100644 --- a/bolt/include/bolt/Rewrite/DWARFRewriter.h +++ b/bolt/include/bolt/Rewrite/DWARFRewriter.h @@ -89,6 +89,10 @@ class DWARFRewriter { /// Store Rangelists writer for each DWO CU. RangeListsDWOWriers RangeListsWritersByCU; + /// Stores ranges writer for each DWO CU. + std::unordered_map> + LegacyRangesWritersByCU; + std::mutex LocListDebugInfoPatchesMutex; /// Dwo id specific its RangesBase. diff --git a/bolt/lib/Core/DebugData.cpp b/bolt/lib/Core/DebugData.cpp index f502a50312470..08d4c45aac791 100644 --- a/bolt/lib/Core/DebugData.cpp +++ b/bolt/lib/Core/DebugData.cpp @@ -177,6 +177,12 @@ uint64_t DebugRangesSectionWriter::getSectionOffset() { return SectionOffset; } +void DebugRangesSectionWriter::appendToRangeBuffer( + const DebugBufferVector &CUBuffer) { + *RangesStream << CUBuffer; + SectionOffset = RangesBuffer->size(); +} + DebugAddrWriter *DebugRangeListsSectionWriter::AddrWriter = nullptr; uint64_t DebugRangeListsSectionWriter::addRanges( diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp index 8814ebbd10aa5..be7bab9359839 100644 --- a/bolt/lib/Rewrite/DWARFRewriter.cpp +++ b/bolt/lib/Rewrite/DWARFRewriter.cpp @@ -646,6 +646,15 @@ void DWARFRewriter::updateDebugInfo() { } else { LocListWritersByCU[CUIndex] = std::make_unique(); + if (std::optional DWOId = CU.getDWOId()) { + assert(LegacyRangesWritersByCU.count(*DWOId) == 0 && + "LegacyRangeLists writer for DWO unit already exists."); + auto LegacyRangesSectionWriterByCU = + std::make_unique(); + LegacyRangesSectionWriterByCU->initSection(CU); + LegacyRangesWritersByCU[*DWOId] = + std::move(LegacyRangesSectionWriterByCU); + } } return LocListWritersByCU[CUIndex++].get(); }; @@ -692,6 +701,7 @@ void DWARFRewriter::updateDebugInfo() { if (Unit->getVersion() >= 5) { TempRangesSectionWriter = RangeListsWritersByCU[*DWOId].get(); } else { + TempRangesSectionWriter = LegacyRangesWritersByCU[*DWOId].get(); RangesBase = RangesSectionWriter->getSectionOffset(); setDwoRangesBase(*DWOId, *RangesBase); } @@ -1270,9 +1280,17 @@ void DWARFRewriter::updateDWARFObjectAddressRanges( } if (RangesBaseInfo) { - DIEBldr.replaceValue(&Die, RangesBaseInfo.getAttribute(), - RangesBaseInfo.getForm(), - DIEInteger(static_cast(*RangesBase))); + if (RangesBaseInfo.getAttribute() == dwarf::DW_AT_GNU_ranges_base) { + auto RangesWriterIterator = + LegacyRangesWritersByCU.find(*Unit.getDWOId()); + assert(RangesWriterIterator != LegacyRangesWritersByCU.end() && + "RangesWriter does not exist for DWOId"); + RangesWriterIterator->second->setDie(&Die); + } else { + DIEBldr.replaceValue(&Die, RangesBaseInfo.getAttribute(), + RangesBaseInfo.getForm(), + DIEInteger(static_cast(*RangesBase))); + } RangesBase = std::nullopt; } } @@ -1290,20 +1308,12 @@ void DWARFRewriter::updateDWARFObjectAddressRanges( RangesAttrInfo.getForm() == dwarf::DW_FORM_sec_offset) NeedConverted = true; - uint64_t CurRangeBase = 0; - if (Unit.isDWOUnit()) { - if (std::optional DWOId = Unit.getDWOId()) - CurRangeBase = getDwoRangesBase(*DWOId); - else - errs() << "BOLT-WARNING: [internal-dwarf-error]: DWOId is not found " - "for DWO Unit."; - } if (NeedConverted || RangesAttrInfo.getForm() == dwarf::DW_FORM_rnglistx) DIEBldr.replaceValue(&Die, dwarf::DW_AT_ranges, dwarf::DW_FORM_rnglistx, DIEInteger(DebugRangesOffset)); else DIEBldr.replaceValue(&Die, dwarf::DW_AT_ranges, RangesAttrInfo.getForm(), - DIEInteger(DebugRangesOffset - CurRangeBase)); + DIEInteger(DebugRangesOffset)); if (!RangesBase) { if (LowPCAttrInfo && @@ -1320,15 +1330,21 @@ void DWARFRewriter::updateDWARFObjectAddressRanges( // If we are at this point we are in the CU/Skeleton CU, and // DW_AT_GNU_ranges_base or DW_AT_rnglists_base doesn't exist. - if (Unit.getVersion() <= 4) + if (Unit.getVersion() <= 4) { DIEBldr.addValue(&Die, dwarf::DW_AT_GNU_ranges_base, dwarf::DW_FORM_data4, - DIEInteger(*RangesBase)); - else if (Unit.getVersion() == 5) + DIEInteger(INT_MAX)); + auto RangesWriterIterator = + LegacyRangesWritersByCU.find(*Unit.getDWOId()); + assert(RangesWriterIterator != LegacyRangesWritersByCU.end() && + "RangesWriter does not exist for DWOId"); + RangesWriterIterator->second->setDie(&Die); + } else if (Unit.getVersion() == 5) { DIEBldr.addValue(&Die, dwarf::DW_AT_rnglists_base, dwarf::DW_FORM_sec_offset, DIEInteger(*RangesBase)); - else + } else { DIEBldr.addValue(&Die, dwarf::DW_AT_rnglists_base, dwarf::DW_FORM_sec_offset, DIEInteger(*RangesBase)); + } return; } @@ -1605,6 +1621,30 @@ void DWARFRewriter::finalizeCompileUnits(DIEBuilder &DIEBlder, DIEStreamer &Streamer, CUOffsetMap &CUMap, const std::list &CUs) { + for (DWARFUnit *CU : CUs) { + if (CU->getVersion() != 4) + continue; + std::optional DWOId = CU->getDWOId(); + if (!DWOId) + continue; + auto RangesWriterIterator = LegacyRangesWritersByCU.find(*DWOId); + assert(RangesWriterIterator != LegacyRangesWritersByCU.end() && + "RangesWriter does not exist for DWOId"); + std::unique_ptr &LegacyRangesWriter = + RangesWriterIterator->second; + std::optional Die = LegacyRangesWriter->getDie(); + if (!Die || !Die.value()) + continue; + DIEValue DvalGNUBase = + Die.value()->findAttribute(dwarf::DW_AT_GNU_ranges_base); + assert(DvalGNUBase && "GNU_ranges_base attribute does not exist for DWOId"); + DIEBlder.replaceValue( + Die.value(), dwarf::DW_AT_GNU_ranges_base, DvalGNUBase.getForm(), + DIEInteger(LegacyRangesSectionWriter->getSectionOffset())); + std::unique_ptr RangesWritersContents = + LegacyRangesWriter->releaseBuffer(); + LegacyRangesSectionWriter->appendToRangeBuffer(*RangesWritersContents); + } DIEBlder.generateAbbrevs(); DIEBlder.finish(); // generate debug_info and CUMap @@ -2263,7 +2303,6 @@ void DWARFRewriter::convertToRangesPatchDebugInfo( DWARFUnit &Unit, DIEBuilder &DIEBldr, DIE &Die, uint64_t RangesSectionOffset, DIEValue &LowPCAttrInfo, DIEValue &HighPCAttrInfo, std::optional RangesBase) { - uint32_t BaseOffset = 0; dwarf::Form LowForm = LowPCAttrInfo.getForm(); dwarf::Attribute RangeBaseAttribute = dwarf::DW_AT_GNU_ranges_base; dwarf::Form RangesForm = dwarf::DW_FORM_sec_offset; @@ -2278,45 +2317,40 @@ void DWARFRewriter::convertToRangesPatchDebugInfo( Die.getTag() == dwarf::DW_TAG_skeleton_unit; if (!IsUnitDie) DIEBldr.deleteValue(&Die, LowPCAttrInfo.getAttribute()); - // In DWARF4 for DW_AT_low_pc in binary DW_FORM_addr is used. In the DWO - // section DW_FORM_GNU_addr_index is used. So for if we are converting - // DW_AT_low_pc/DW_AT_high_pc and see DW_FORM_GNU_addr_index. We are - // converting in DWO section, and DW_AT_ranges [DW_FORM_sec_offset] is - // relative to DW_AT_GNU_ranges_base. - if (LowForm == dwarf::DW_FORM_GNU_addr_index) { - // Ranges are relative to DW_AT_GNU_ranges_base. - uint64_t CurRangeBase = 0; - if (std::optional DWOId = Unit.getDWOId()) { - CurRangeBase = getDwoRangesBase(*DWOId); - } - BaseOffset = CurRangeBase; - } else { - // In DWARF 5 we can have DW_AT_low_pc either as DW_FORM_addr, or - // DW_FORM_addrx. Former is when DW_AT_rnglists_base is present. Latter is - // when it's absent. - if (IsUnitDie) { - if (LowForm == dwarf::DW_FORM_addrx) { - const uint32_t Index = AddrWriter->getIndexFromAddress(0, Unit); - DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(), - LowPCAttrInfo.getForm(), DIEInteger(Index)); - } else { - DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(), - LowPCAttrInfo.getForm(), DIEInteger(0)); - } + + // In DWARF 5 we can have DW_AT_low_pc either as DW_FORM_addr, or + // DW_FORM_addrx. Former is when DW_AT_rnglists_base is present. Latter is + // when it's absent. + if (IsUnitDie) { + if (LowForm == dwarf::DW_FORM_addrx) { + const uint32_t Index = AddrWriter->getIndexFromAddress(0, Unit); + DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(), + LowPCAttrInfo.getForm(), DIEInteger(Index)); + } else { + DIEBldr.replaceValue(&Die, LowPCAttrInfo.getAttribute(), + LowPCAttrInfo.getForm(), DIEInteger(0)); } - // Original CU didn't have DW_AT_*_base. We converted it's children (or - // dwo), so need to insert it into CU. - if (RangesBase) + } + // Original CU didn't have DW_AT_*_base. We converted it's children (or + // dwo), so need to insert it into CU. + if (RangesBase) { + if (Unit.getVersion() >= 5) { DIEBldr.addValue(&Die, RangeBaseAttribute, dwarf::DW_FORM_sec_offset, DIEInteger(*RangesBase)); + } else { + DIEBldr.addValue(&Die, RangeBaseAttribute, dwarf::DW_FORM_sec_offset, + DIEInteger(INT_MAX)); + auto RangesWriterIterator = + LegacyRangesWritersByCU.find(*Unit.getDWOId()); + assert(RangesWriterIterator != LegacyRangesWritersByCU.end() && + "RangesWriter does not exist for DWOId"); + RangesWriterIterator->second->setDie(&Die); + } } - uint64_t RangeAttrVal = RangesSectionOffset - BaseOffset; - if (Unit.getVersion() >= 5) - RangeAttrVal = RangesSectionOffset; // HighPC was conveted into DW_AT_ranges. // For DWARF5 we only access ranges through index. DIEBldr.replaceValue(&Die, HighPCAttrInfo.getAttribute(), dwarf::DW_AT_ranges, - RangesForm, DIEInteger(RangeAttrVal)); + RangesForm, DIEInteger(RangesSectionOffset)); } diff --git a/bolt/test/X86/debug-fission-single-convert.s b/bolt/test/X86/debug-fission-single-convert.s index 28fcb6686e0a2..4cd881740b2f8 100644 --- a/bolt/test/X86/debug-fission-single-convert.s +++ b/bolt/test/X86/debug-fission-single-convert.s @@ -31,11 +31,11 @@ # CHECK-DWO-DWO: 00000010 # CHECK-DWO-DWO: 00000050 # CHECK-DWO-DWO: DW_TAG_subprogram -# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 # CHECK-DWO-DWO: DW_TAG_subprogram -# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000020 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000030 # CHECK-DWO-DWO: DW_TAG_subprogram -# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050 # CHECK-ADDR-SEC: .debug_addr contents: # CHECK-ADDR-SEC: 0x00000000: Addrs: [ diff --git a/bolt/test/X86/dwarf4-df-dualcu.test b/bolt/test/X86/dwarf4-df-dualcu.test index b690623b70d83..fb328eb1872e0 100644 --- a/bolt/test/X86/dwarf4-df-dualcu.test +++ b/bolt/test/X86/dwarf4-df-dualcu.test @@ -37,36 +37,38 @@ ; BOLT: .debug_ranges ; BOLT-NEXT: 00000000 -; BOLT-NEXT: 00000010 [[#%.16x,ADDR:]] [[#%.16x,ADDRB:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] ; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000030 [[#%.16x,ADDR1:]] [[#%.16x,ADDR1B:]] -; BOLT-NEXT: 00000030 -; BOLT-NEXT: 00000050 [[#%.16x,ADDR2:]] [[#%.16x,ADDR2B:]] -; BOLT-NEXT: 00000050 [[#%.16x,ADDR3:]] [[#%.16x,ADDR3B:]] +; BOLT-NEXT: 00000040 +; BOLT-NEXT: 00000050 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] ; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000080 [[#%.16x,ADDR4:]] [[#%.16x,ADDR4B:]] -; BOLT-NEXT: 00000080 -; BOLT-NEXT: 000000a0 [[#%.16x,ADDR5:]] [[#%.16x,ADDR5B:]] -; BOLT-NEXT: 000000a0 +; BOLT-NEXT: 00000070 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000070 +; BOLT-NEXT: 00000090 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 00000090 +; BOLT-NEXT: 000000b0 +; BOLT-NEXT: 000000c0 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 000000c0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000016] = "main.dwo.dwo") ; BOLT-NEXT: DW_AT_GNU_dwo_id ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050 -; BOLT-NEXT: [0x[[#ADDR2]], 0x[[#ADDR2B]]) -; BOLT-NEXT: [0x[[#ADDR3]], 0x[[#ADDR3B]])) +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 +; BOLT-NEXT: [0x[[#ADDR1]], 0x[[#ADDRB1]]) +; BOLT-NEXT: [0x[[#ADDR2]], 0x[[#ADDRB2]])) ; BOLT-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) -; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000010) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000040) ; BOLT-NEXT: Compile ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000023] = "helper.dwo.dwo") ; BOLT-NEXT: DW_AT_GNU_dwo_id ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x000000a0 -; BOLT-NEXT: [0x[[#ADDR5]], 0x[[#ADDR5B]]) +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000090 +; BOLT-NEXT: [0x[[#ADDR3]], 0x[[#ADDRB3]]) ; BOLT-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000010) -; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000080) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x000000b0) ; PRE-BOLT-DWO-MAIN: version = 0x0004 ; PRE-BOLT-DWO-MAIN: DW_TAG_compile_unit @@ -113,13 +115,13 @@ ; BOLT-DWO-MAIN-NEXT: DW_AT_decl_line ; BOLT-DWO-MAIN-NEXT: DW_AT_location [DW_FORM_exprloc] (DW_OP_GNU_addr_index 0x1) ; BOLT-DWO-MAIN: DW_TAG_subprogram [4] -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-DWO-MAIN-NEXT: ) ; BOLT-DWO-MAIN-NEXT: DW_AT_frame_base ; BOLT-DWO-MAIN-NEXT: DW_AT_linkage_name [DW_FORM_GNU_str_index] (indexed (00000003) string = "_Z3usePiS_") ; BOLT-DWO-MAIN-NEXT: DW_AT_name [DW_FORM_GNU_str_index] (indexed (00000004) string = "use") ; BOLT-DWO-MAIN: DW_TAG_subprogram [6] -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000020 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000030 ; BOLT-DWO-MAIN-NEXT: ) ; BOLT-DWO-MAIN-NEXT: DW_AT_frame_base [DW_FORM_exprloc] (DW_OP_reg6 RBP) ; BOLT-DWO-MAIN-NEXT: DW_AT_name [DW_FORM_GNU_str_index] (indexed (00000005) string = "main") @@ -160,4 +162,4 @@ ; BOLT-DWO-HELPER-NEXT: DW_AT_decl_line ; BOLT-DWO-HELPER-NEXT: DW_AT_location [DW_FORM_exprloc] (DW_OP_GNU_addr_index 0x1) ; BOLT-DWO-HELPER: DW_TAG_subprogram [4] -; BOLT-DWO-HELPER-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +; BOLT-DWO-HELPER-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 diff --git a/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test b/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test index c9abd02bbb7d9..cf9357d5f3c59 100644 --- a/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test +++ b/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test @@ -17,45 +17,47 @@ ; BOLT: .debug_ranges ; BOLT-NEXT: 00000000 -; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000010 +; BOLT-NEXT: 00000010 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR4:]] [[#%.16x,ADDRB4:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000090 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR4:]] [[#%.16x,ADDRB4:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000090 -; BOLT-NEXT: 00000110 -; BOLT-NEXT: 00000110 -; BOLT-NEXT: 00000110 -; BOLT-NEXT: 00000110 -; BOLT-NEXT: 00000150 -; BOLT-NEXT: 00000150 -; BOLT-NEXT: 00000150 -; BOLT-NEXT: 00000150 -; BOLT-NEXT: 00000190 [[#%.16x,ADDR8:]] [[#%.16x,ADDRB8:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR9:]] [[#%.16x,ADDRB9:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR10:]] [[#%.16x,ADDRB10:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR11:]] [[#%.16x,ADDRB11:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR12:]] [[#%.16x,ADDRB12:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR13:]] [[#%.16x,ADDRB13:]] -; BOLT-NEXT: 00000190 [[#%.16x,ADDR14:]] [[#%.16x,ADDRB14:]] -; BOLT-NEXT: 00000190 +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 000000a0 +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] +; BOLT-NEXT: 000000e0 +; BOLT-NEXT: 00000120 [[#%.16x,ADDR8:]] [[#%.16x,ADDRB8:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR9:]] [[#%.16x,ADDRB9:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR10:]] [[#%.16x,ADDRB10:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR11:]] [[#%.16x,ADDRB11:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR12:]] [[#%.16x,ADDRB12:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR13:]] [[#%.16x,ADDRB13:]] +; BOLT-NEXT: 00000120 [[#%.16x,ADDR14:]] [[#%.16x,ADDRB14:]] +; BOLT-NEXT: 00000120 +; BOLT-NEXT: 000001a0 +; BOLT-NEXT: 000001b0 [[#%.16x,ADDR8:]] [[#%.16x,ADDRB8:]] +; BOLT-NEXT: 000001b0 [[#%.16x,ADDR9:]] [[#%.16x,ADDRB9:]] +; BOLT-NEXT: 000001b0 [[#%.16x,ADDR10:]] [[#%.16x,ADDRB10:]] +; BOLT-NEXT: 000001b0 +; BOLT-NEXT: 000001f0 [[#%.16x,ADDR12:]] [[#%.16x,ADDRB12:]] +; BOLT-NEXT: 000001f0 [[#%.16x,ADDR13:]] [[#%.16x,ADDRB13:]] +; BOLT-NEXT: 000001f0 [[#%.16x,ADDR14:]] [[#%.16x,ADDRB14:]] +; BOLT-NEXT: 000001f0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "main.dwo.dwo") ; BOLT-NEXT: DW_AT_GNU_dwo_id -; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000010) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000090) ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000090 +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-NEXT: [0x[[#ADDR1]], 0x[[#ADDRB1]]) ; BOLT-NEXT: [0x[[#ADDR2]], 0x[[#ADDRB2]]) ; BOLT-NEXT: [0x[[#ADDR3]], 0x[[#ADDRB3]]) @@ -64,13 +66,14 @@ ; BOLT-NEXT: [0x[[#ADDR6]], 0x[[#ADDRB6]]) ; BOLT-NEXT: [0x[[#ADDR7]], 0x[[#ADDRB7]]) ; BOLT-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) +; BOLT-NEXT: Compile Unit ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "mainOther.dwo.dwo") ; BOLT-NEXT: DW_AT_GNU_dwo_id -; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000110) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x000001a0) ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000190 +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000120 ; BOLT-NEXT: [0x[[#ADDR8]], 0x[[#ADDRB8]]) ; BOLT-NEXT: [0x[[#ADDR9]], 0x[[#ADDRB9]]) ; BOLT-NEXT: [0x[[#ADDR10]], 0x[[#ADDRB10]]) @@ -79,19 +82,20 @@ ; BOLT-NEXT: [0x[[#ADDR13]], 0x[[#ADDRB13]]) ; BOLT-NEXT: [0x[[#ADDR14]], 0x[[#ADDRB14]]) ; BOLT-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000018) +; BOLT: {{^$}} ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050 ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050 diff --git a/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test b/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test index 276bea4ba0c1c..ab4353a282475 100644 --- a/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test +++ b/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test @@ -15,29 +15,30 @@ ; BOLT: .debug_ranges ; BOLT-NEXT: 00000000 -; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000010 +; BOLT-NEXT: 00000010 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR4:]] [[#%.16x,ADDRB4:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 00000010 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000010 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000050 -; BOLT-NEXT: 00000090 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR4:]] [[#%.16x,ADDRB4:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] -; BOLT-NEXT: 00000090 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000090 +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 000000a0 +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 000000e0 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] +; BOLT-NEXT: 000000e0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "main.dwo.dwo") ; BOLT-NEXT: DW_AT_GNU_dwo_id -; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000010) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000090) ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000090 +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-NEXT: [0x[[#ADDR1]], 0x[[#ADDRB1]]) ; BOLT-NEXT: [0x[[#ADDR2]], 0x[[#ADDRB2]]) ; BOLT-NEXT: [0x[[#ADDR3]], 0x[[#ADDRB3]]) @@ -48,9 +49,9 @@ ; BOLT-NEXT: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050