From 928c2ba179665bb37dd6a800ea4c4427ad834ace Mon Sep 17 00:00:00 2001 From: Alexander Yermolovich Date: Fri, 19 Aug 2022 15:27:55 -0700 Subject: [PATCH] [DWARF][BOLT] Fix handling of converting range accesss from ofset to index. Wasn't handling correctly creating DW_AT_rnglists_base in UnitDie when converting access pattern for DW_AT_ranges from offset to index for DWARF5. Reviewed By: rafauler Differential Revision: https://reviews.llvm.org/D132087 --- bolt/lib/Rewrite/DWARFRewriter.cpp | 22 ++++++++++++---------- bolt/test/X86/dwarf5-rangeoffset-to-rangeindex.s | 5 +++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/bolt/lib/Rewrite/DWARFRewriter.cpp b/bolt/lib/Rewrite/DWARFRewriter.cpp index c47a581..d1fd2b6 100644 --- a/bolt/lib/Rewrite/DWARFRewriter.cpp +++ b/bolt/lib/Rewrite/DWARFRewriter.cpp @@ -858,18 +858,20 @@ void DWARFRewriter::updateDWARFObjectAddressRanges( return; } - // Convert DW_AT_low_pc into DW_AT_GNU_ranges_base. - if (!LowPCAttrInfo) { - errs() << "BOLT-ERROR: skeleton CU at 0x" - << Twine::utohexstr(DIE.getOffset()) - << " does not have DW_AT_GNU_ranges_base or DW_AT_low_pc to" - " convert to update ranges base\n"; + if (DIE.getOffset() != DIE.getDwarfUnit()->getUnitDIE().getOffset()) return; - } - AbbrevWriter.addAttribute(*DIE.getDwarfUnit(), AbbreviationDecl, - dwarf::DW_AT_GNU_ranges_base, - dwarf::DW_FORM_sec_offset); + // 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 (DIE.getDwarfUnit()->getVersion() >= 5) { + AbbrevWriter.addAttribute(*DIE.getDwarfUnit(), AbbreviationDecl, + dwarf::DW_AT_rnglists_base, + dwarf::DW_FORM_sec_offset); + } else { + AbbrevWriter.addAttribute(*DIE.getDwarfUnit(), AbbreviationDecl, + dwarf::DW_AT_GNU_ranges_base, + dwarf::DW_FORM_sec_offset); + } reinterpret_cast(DebugInfoPatcher) .insertNewEntry(DIE, *RangesBase); diff --git a/bolt/test/X86/dwarf5-rangeoffset-to-rangeindex.s b/bolt/test/X86/dwarf5-rangeoffset-to-rangeindex.s index 0b32a37..06b4819 100644 --- a/bolt/test/X86/dwarf5-rangeoffset-to-rangeindex.s +++ b/bolt/test/X86/dwarf5-rangeoffset-to-rangeindex.s @@ -21,6 +21,11 @@ # POSTCHECK-SAME: (indexed (0x0) rangelist = 0x00000018 # POSTCHECK-NEXT: [0x[[#ADDR]], 0x[[#ADDR + 11]] # POSTCHECK-NEXT: [0x[[#ADDR1]], 0x[[#ADDR1 + 11]] +# POSTCHECK-NEXT: DW_AT_low_pc [DW_FORM_addr] +# POSTCHECK-NEXT: DW_AT_stmt_list [DW_FORM_sec_offset] +# POSTCHECK-NEXT: DW_AT_rnglists_base [DW_FORM_sec_offset] (0x0000000c) +# POSTCHECK-NEXT: DW_AT_addr_base [DW_FORM_sec_offset] (0x00000008) + # int foo() { # return 3; -- 2.7.4