From 7e10ad99adb7d586f3ba3c8a9459d0e4fcaa0e33 Mon Sep 17 00:00:00 2001 From: Sayhaan Siddiqui <49014204+sayhaan@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:35:40 -0700 Subject: [PATCH] [BOLT][DWARF] Cleanup buffer initialization for DWO range writer (#97843) Cleanup buffer initialization for DWO range writer instances to remove empty buffer at the beginning. --- bolt/include/bolt/Core/DebugData.h | 3 + bolt/lib/Core/DebugData.cpp | 7 ++- bolt/lib/Rewrite/DWARFRewriter.cpp | 5 +- bolt/test/X86/debug-fission-single-convert.s | 8 +-- bolt/test/X86/dwarf4-df-dualcu.test | 26 ++++---- .../X86/dwarf4-df-input-lowpc-ranges-cus.test | 60 +++++++++---------- .../X86/dwarf4-df-input-lowpc-ranges.test | 19 +++--- 7 files changed, 65 insertions(+), 63 deletions(-) diff --git a/bolt/include/bolt/Core/DebugData.h b/bolt/include/bolt/Core/DebugData.h index cdcc8cd61f4f..2324e577cc7c 100644 --- a/bolt/include/bolt/Core/DebugData.h +++ b/bolt/include/bolt/Core/DebugData.h @@ -226,6 +226,9 @@ public: /// Needs to be invoked before each \p CU is processed. void virtual initSection(DWARFUnit &CU){}; + /// Initializes Ranges section with empty list. + void initSection(); + protected: std::unique_ptr RangesBuffer; diff --git a/bolt/lib/Core/DebugData.cpp b/bolt/lib/Core/DebugData.cpp index 579af3bce4eb..76c3545c6308 100644 --- a/bolt/lib/Core/DebugData.cpp +++ b/bolt/lib/Core/DebugData.cpp @@ -137,11 +137,14 @@ DebugRangesSectionWriter::DebugRangesSectionWriter() { RangesBuffer = std::make_unique(); RangesStream = std::make_unique(*RangesBuffer); - // Add an empty range as the first entry; - writeAddressRanges(*RangesStream.get(), DebugAddressRangesVector{}); Kind = RangesWriterKind::DebugRangesWriter; } +void DebugRangesSectionWriter::initSection() { + // Adds an empty range to the buffer. + writeAddressRanges(*RangesStream.get(), DebugAddressRangesVector{}); +} + uint64_t DebugRangesSectionWriter::addRanges( DebugAddressRangesVector &&Ranges, std::map &CachedRanges) { diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp index f682fa2a6eef..89168b4bd559 100644 --- a/bolt/lib/Rewrite/DWARFRewriter.cpp +++ b/bolt/lib/Rewrite/DWARFRewriter.cpp @@ -620,8 +620,10 @@ void DWARFRewriter::updateDebugInfo() { AddrWriter = std::make_unique(&BC); } - if (BC.isDWARFLegacyUsed()) + if (BC.isDWARFLegacyUsed()) { LegacyRangesSectionWriter = std::make_unique(); + LegacyRangesSectionWriter->initSection(); + } DebugLoclistWriter::setAddressWriter(AddrWriter.get()); @@ -651,7 +653,6 @@ void DWARFRewriter::updateDebugInfo() { "LegacyRangeLists writer for DWO unit already exists."); auto LegacyRangesSectionWriterByCU = std::make_unique(); - LegacyRangesSectionWriterByCU->initSection(CU); LegacyRangesWritersByCU[*DWOId] = std::move(LegacyRangesSectionWriterByCU); } diff --git a/bolt/test/X86/debug-fission-single-convert.s b/bolt/test/X86/debug-fission-single-convert.s index 4cd881740b2f..5ea6eb8e353a 100644 --- a/bolt/test/X86/debug-fission-single-convert.s +++ b/bolt/test/X86/debug-fission-single-convert.s @@ -27,15 +27,15 @@ # CHECK-NOT: warning: DWARF unit from offset {{.*}} incl. to offset {{.*}} excl. tries to read DIEs at offset {{.*}} +# CHECK-DWO-DWO: 00000000 # CHECK-DWO-DWO: 00000010 # 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] (0x00000010 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 # CHECK-DWO-DWO: DW_TAG_subprogram -# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000030 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000020 # CHECK-DWO-DWO: DW_TAG_subprogram -# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000050 +# CHECK-DWO-DWO-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 # 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 fb328eb1872e..468c924de3a9 100644 --- a/bolt/test/X86/dwarf4-df-dualcu.test +++ b/bolt/test/X86/dwarf4-df-dualcu.test @@ -40,16 +40,14 @@ ; BOLT-NEXT: 00000010 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] ; BOLT-NEXT: 00000010 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] ; BOLT-NEXT: 00000010 +; BOLT-NEXT: 00000040 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] ; BOLT-NEXT: 00000040 -; BOLT-NEXT: 00000050 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] -; BOLT-NEXT: 00000050 -; 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-NEXT: 00000060 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000060 +; BOLT-NEXT: 00000080 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 00000080 +; BOLT-NEXT: 000000a0 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] +; BOLT-NEXT: 000000a0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000016] = "main.dwo.dwo") @@ -65,10 +63,10 @@ ; 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] (0x00000090 +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000080 ; 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] (0x000000b0) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x000000a0) ; PRE-BOLT-DWO-MAIN: version = 0x0004 ; PRE-BOLT-DWO-MAIN: DW_TAG_compile_unit @@ -115,13 +113,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] (0x00000010 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; 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] (0x00000030 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000020 ; 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") @@ -162,4 +160,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] (0x00000010 +; BOLT-DWO-HELPER-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 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 cf9357d5f3c5..a97377400eeb 100644 --- a/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test +++ b/bolt/test/X86/dwarf4-df-input-lowpc-ranges-cus.test @@ -25,32 +25,30 @@ ; BOLT-NEXT: 00000010 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] ; BOLT-NEXT: 00000010 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000010 +; BOLT-NEXT: 00000090 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 00000090 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000090 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] ; 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-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-NEXT: 000000d0 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 000000d0 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 000000d0 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] +; BOLT-NEXT: 000000d0 +; BOLT-NEXT: 00000110 [[#%.16x,ADDR8:]] [[#%.16x,ADDRB8:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR9:]] [[#%.16x,ADDRB9:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR10:]] [[#%.16x,ADDRB10:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR11:]] [[#%.16x,ADDRB11:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR12:]] [[#%.16x,ADDRB12:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR13:]] [[#%.16x,ADDRB13:]] +; BOLT-NEXT: 00000110 [[#%.16x,ADDR14:]] [[#%.16x,ADDRB14:]] +; BOLT-NEXT: 00000110 +; BOLT-NEXT: 00000190 [[#%.16x,ADDR8:]] [[#%.16x,ADDRB8:]] +; BOLT-NEXT: 00000190 [[#%.16x,ADDR9:]] [[#%.16x,ADDRB9:]] +; BOLT-NEXT: 00000190 [[#%.16x,ADDR10:]] [[#%.16x,ADDRB10:]] +; BOLT-NEXT: 00000190 +; BOLT-NEXT: 000001d0 [[#%.16x,ADDR12:]] [[#%.16x,ADDRB12:]] +; BOLT-NEXT: 000001d0 [[#%.16x,ADDR13:]] [[#%.16x,ADDRB13:]] +; BOLT-NEXT: 000001d0 [[#%.16x,ADDR14:]] [[#%.16x,ADDRB14:]] +; BOLT-NEXT: 000001d0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "main.dwo.dwo") @@ -71,9 +69,9 @@ ; 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] (0x000001a0) +; BOLT-NEXT: DW_AT_GNU_ranges_base [DW_FORM_sec_offset] (0x00000190) ; BOLT-NEXT: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) -; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000120 +; BOLT-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000110 ; BOLT-NEXT: [0x[[#ADDR8]], 0x[[#ADDRB8]]) ; BOLT-NEXT: [0x[[#ADDR9]], 0x[[#ADDRB9]]) ; BOLT-NEXT: [0x[[#ADDR10]], 0x[[#ADDRB10]]) @@ -85,17 +83,17 @@ ; BOLT: {{^$}} ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; 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] (0x00000050 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 ; BOLT-DWO-MAIN: DW_TAG_subprogram -; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000010 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; 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] (0x00000050 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040 diff --git a/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test b/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test index ab4353a28247..0cf8d433700c 100644 --- a/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test +++ b/bolt/test/X86/dwarf4-df-input-lowpc-ranges.test @@ -23,15 +23,14 @@ ; BOLT-NEXT: 00000010 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] ; BOLT-NEXT: 00000010 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] ; BOLT-NEXT: 00000010 +; BOLT-NEXT: 00000090 [[#%.16x,ADDR1:]] [[#%.16x,ADDRB1:]] +; BOLT-NEXT: 00000090 [[#%.16x,ADDR2:]] [[#%.16x,ADDRB2:]] +; BOLT-NEXT: 00000090 [[#%.16x,ADDR3:]] [[#%.16x,ADDRB3:]] ; 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-NEXT: 000000d0 [[#%.16x,ADDR5:]] [[#%.16x,ADDRB5:]] +; BOLT-NEXT: 000000d0 [[#%.16x,ADDR6:]] [[#%.16x,ADDRB6:]] +; BOLT-NEXT: 000000d0 [[#%.16x,ADDR7:]] [[#%.16x,ADDRB7:]] +; BOLT-NEXT: 000000d0 ; BOLT: DW_TAG_compile_unit ; BOLT: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x{{[0-9a-fA-F]+}}] = "main.dwo.dwo") @@ -49,9 +48,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] (0x00000010 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000 ; 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] (0x00000050 +; BOLT-DWO-MAIN-NEXT: DW_AT_ranges [DW_FORM_sec_offset] (0x00000040