https://github.com/daniilavdeev updated https://github.com/llvm/llvm-project/pull/164813
>From f11530834eb375c8003e996ba1385089911170b2 Mon Sep 17 00:00:00 2001 From: Daniil Avdeev <[email protected]> Date: Thu, 18 Sep 2025 02:05:39 +0000 Subject: [PATCH 1/4] [dwarf] make dwarf fission compatible with RISCV relaxations 2/2 This patch makes DWARF fission compatible with RISC-V relaxations by using indirect addressing for the DW_AT_high_pc attribute. This eliminates the remaining relocations in .dwo files. --- .../CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 8 +-- llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll | 53 +++++++++++++------ 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 751d3735d3b2b..2e4a26ef70bc2 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -493,10 +493,12 @@ void DwarfCompileUnit::attachLowHighPC(DIE &D, const MCSymbol *Begin, assert(End->isDefined() && "Invalid end label"); addLabelAddress(D, dwarf::DW_AT_low_pc, Begin); - if (DD->getDwarfVersion() < 4) - addLabelAddress(D, dwarf::DW_AT_high_pc, End); - else + if (DD->getDwarfVersion() >= 4 && + (!isDwoUnit() || !llvm::isRangeRelaxable(Begin, End))) { addLabelDelta(D, dwarf::DW_AT_high_pc, End, Begin); + return; + } + addLabelAddress(D, dwarf::DW_AT_high_pc, End); } // Add info for Wasm-global-based relocation. diff --git a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll index ab76ce04dcdb0..40c7bcb6adab6 100644 --- a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll +++ b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll @@ -21,24 +21,30 @@ ; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF5 %s ; RUN: llvm-dwarfdump --debug-info %t.o 2> %t.txt -; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --implicit-check-not=warning: +; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --allow-empty --implicit-check-not=warning: +; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s ; RUN: llc -dwarf-version=4 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF4 %s ; RUN: llvm-dwarfdump --debug-info %t.o 2> %t.txt -; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --implicit-check-not=warning: +; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --allow-empty --implicit-check-not=warning: +; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s -; Currently, square() still uses an offset to represent the function's end address, -; which requires a relocation here. -; RELOCS: warning: unexpected relocations for dwo section '.debug_info.dwo' +; RELOCS-NOT: warning: unexpected relocations for dwo section '.debug_info.dwo' +; Make sure we don't produce any relocations in any .dwo section +; HDR-NOT: .rela.{{.*}}.dwo + +; Ensure that 'square()' function uses indexed start and end addresses ; DWARF5: .debug_info.dwo contents: ; DWARF5: DW_TAG_subprogram -; DWARF5-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000000000 ".text") -; DWARF5-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000000) -; DWARF5: DW_AT_name {{.*}} "square") +; DWARF5-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000000000 ".text") +; DWARF5-NEXT: DW_AT_high_pc [DW_FORM_addrx] (indexed (00000001) address = 0x0000000000000044 ".text") +; DWARF5: DW_AT_name {{.*}} "square") ; DWARF5: DW_TAG_formal_parameter +; HDR-NOT: .rela.{{.*}}.dwo + ; Ensure there is no unnecessary addresses in .o file ; DWARF5: .debug_addr contents: ; DWARF5: Addrs: [ @@ -48,6 +54,8 @@ ; DWARF5-NEXT: 0x000000000000006e ; DWARF5-NEXT: ] +; HDR-NOT: .rela.{{.*}}.dwo + ; Ensure that 'boo()' and 'main()' use DW_RLE_startx_length and DW_RLE_startx_endx ; entries respectively ; DWARF5: .debug_rnglists.dwo contents: @@ -55,24 +63,29 @@ ; DWARF5-NEXT: 0x00000014: [DW_RLE_startx_length]: 0x0000000000000001, 0x0000000000000012 => [0x000000000000002c, 0x000000000000003e) ; DWARF5-NEXT: 0x00000017: [DW_RLE_end_of_list ] ; DWARF5-NEXT: 0x00000018: [DW_RLE_startx_endx ]: 0x0000000000000002, 0x0000000000000003 => [0x000000000000003e, 0x000000000000006e) +; DWARF5-NEXT: 0x00000017: [DW_RLE_end_of_list ] ; DWARF5-NEXT: 0x0000001b: [DW_RLE_end_of_list ] ; DWARF5-EMPTY: +; HDR-NOT: .rela.{{.*}}.dwo + ; DWARF4: .debug_info.dwo contents: ; DWARF4: DW_TAG_subprogram -; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000000) address = 0x0000000000000000 ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000000) -; DWARF4: DW_AT_name {{.*}} "square") +; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000000) address = 0x0000000000000000 ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000001) address = 0x0000000000000044 ".text") +; DWARF4: DW_AT_name {{.*}} "square") ; DWARF4: DW_TAG_subprogram -; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000001) address = 0x000000000000002c ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000012) -; DWARF4: DW_AT_name {{.*}} "boo") +; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000002) address = 0x0000000000000046 ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000024) +; DWARF4: DW_AT_name {{.*}} "boo") ; DWARF4: DW_TAG_subprogram -; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000002) address = 0x000000000000003e ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000000) -; DWARF4: DW_AT_name {{.*}} "main") +; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000003) address = 0x000000000000006c ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000004) address = 0x00000000000000b0 ".text") +; DWARF4: DW_AT_name {{.*}} "main") + +; HDR-NOT: .rela.{{.*}}.dwo ; Ensure there is no unnecessary addresses in .o file ; DWARF4: .debug_addr contents: @@ -80,8 +93,14 @@ ; DWARF4-NEXT: 0x0000000000000000 ; DWARF4-NEXT: 0x000000000000002c ; DWARF4-NEXT: 0x000000000000003e +; DWARF4-NEXT: 0x0000000000000044 +; DWARF4-NEXT: 0x0000000000000046 +; DWARF4-NEXT: 0x000000000000006c +; DWARF4-NEXT: 0x00000000000000b0 ; DWARF4-NEXT: ] +; HDR-NOT: .rela.{{.*}}.dwo + #--- relax_dwo_ranges.cpp __attribute__((noinline)) int boo(); >From f6d211e78b8383b86c2d0c62974362476511b6b4 Mon Sep 17 00:00:00 2001 From: Daniil Avdeev <[email protected]> Date: Wed, 5 Nov 2025 23:17:46 +0000 Subject: [PATCH 2/4] fix --- llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll index 40c7bcb6adab6..a9486d45f107e 100644 --- a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll +++ b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll @@ -30,7 +30,7 @@ ; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --allow-empty --implicit-check-not=warning: ; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s -; RELOCS-NOT: warning: unexpected relocations for dwo section '.debug_info.dwo' +; RELOCS-NOT: warning: ; Make sure we don't produce any relocations in any .dwo section ; HDR-NOT: .rela.{{.*}}.dwo >From 11032d0ac258f19f774f82fc5fc205bb2d714920 Mon Sep 17 00:00:00 2001 From: Daniil Avdeev <[email protected]> Date: Fri, 21 Nov 2025 03:01:42 +0000 Subject: [PATCH 3/4] fix --- llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll index a9486d45f107e..f96e8b41798f3 100644 --- a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll +++ b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll @@ -20,18 +20,14 @@ ; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF5 %s -; RUN: llvm-dwarfdump --debug-info %t.o 2> %t.txt -; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --allow-empty --implicit-check-not=warning: +; RUN: llvm-dwarfdump --debug-info %t.o > /dev/null 2>&1 | count 0 ; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s ; RUN: llc -dwarf-version=4 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF4 %s -; RUN: llvm-dwarfdump --debug-info %t.o 2> %t.txt -; RUN: FileCheck --input-file=%t.txt %s --check-prefix=RELOCS --allow-empty --implicit-check-not=warning: +; RUN: llvm-dwarfdump --debug-info %t.o > /dev/null 2>&1 | count 0 ; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s -; RELOCS-NOT: warning: - ; Make sure we don't produce any relocations in any .dwo section ; HDR-NOT: .rela.{{.*}}.dwo >From 340616358547f7cb69154cd8b9c4f79638415f67 Mon Sep 17 00:00:00 2001 From: Daniil Avdeev <[email protected]> Date: Fri, 21 Nov 2025 10:44:52 +0000 Subject: [PATCH 4/4] add gen --- llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll index f96e8b41798f3..3916a205dd19c 100644 --- a/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll +++ b/llvm/test/DebugInfo/RISCV/relax_dwo_ranges.ll @@ -21,12 +21,12 @@ ; RUN: llc -dwarf-version=5 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF5 %s ; RUN: llvm-dwarfdump --debug-info %t.o > /dev/null 2>&1 | count 0 -; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s +; RUN: llvm-objdump -h %t.o | FileCheck --check-prefix=HDR %s ; RUN: llc -dwarf-version=4 -split-dwarf-file=foo.dwo -O0 -mtriple=riscv64-unknown-linux-gnu -filetype=obj relax_dwo_ranges.ll -o %t.o ; RUN: llvm-dwarfdump -v %t.o | FileCheck --check-prefix=DWARF4 %s ; RUN: llvm-dwarfdump --debug-info %t.o > /dev/null 2>&1 | count 0 -; RUN: llvm-objdump -h %t | FileCheck --check-prefix=HDR %s +; RUN: llvm-objdump -h %t.o | FileCheck --check-prefix=HDR %s ; Make sure we don't produce any relocations in any .dwo section ; HDR-NOT: .rela.{{.*}}.dwo @@ -35,7 +35,7 @@ ; DWARF5: .debug_info.dwo contents: ; DWARF5: DW_TAG_subprogram ; DWARF5-NEXT: DW_AT_low_pc [DW_FORM_addrx] (indexed (00000000) address = 0x0000000000000000 ".text") -; DWARF5-NEXT: DW_AT_high_pc [DW_FORM_addrx] (indexed (00000001) address = 0x0000000000000044 ".text") +; DWARF5-NEXT: DW_AT_high_pc [DW_FORM_addrx] (indexed (00000001) address = 0x000000000000002c ".text") ; DWARF5: DW_AT_name {{.*}} "square") ; DWARF5: DW_TAG_formal_parameter @@ -46,6 +46,7 @@ ; DWARF5: Addrs: [ ; DWARF5-NEXT: 0x0000000000000000 ; DWARF5-NEXT: 0x000000000000002c +; DWARF5-NEXT: 0x000000000000002c ; DWARF5-NEXT: 0x000000000000003e ; DWARF5-NEXT: 0x000000000000006e ; DWARF5-NEXT: ] @@ -56,10 +57,9 @@ ; entries respectively ; DWARF5: .debug_rnglists.dwo contents: ; DWARF5: ranges: -; DWARF5-NEXT: 0x00000014: [DW_RLE_startx_length]: 0x0000000000000001, 0x0000000000000012 => [0x000000000000002c, 0x000000000000003e) -; DWARF5-NEXT: 0x00000017: [DW_RLE_end_of_list ] -; DWARF5-NEXT: 0x00000018: [DW_RLE_startx_endx ]: 0x0000000000000002, 0x0000000000000003 => [0x000000000000003e, 0x000000000000006e) +; DWARF5-NEXT: 0x00000014: [DW_RLE_startx_length]: 0x0000000000000002, 0x0000000000000012 => [0x000000000000002c, 0x000000000000003e) ; DWARF5-NEXT: 0x00000017: [DW_RLE_end_of_list ] +; DWARF5-NEXT: 0x00000018: [DW_RLE_startx_endx ]: 0x0000000000000003, 0x0000000000000004 => [0x000000000000003e, 0x000000000000006e) ; DWARF5-NEXT: 0x0000001b: [DW_RLE_end_of_list ] ; DWARF5-EMPTY: @@ -68,17 +68,17 @@ ; DWARF4: .debug_info.dwo contents: ; DWARF4: DW_TAG_subprogram ; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000000) address = 0x0000000000000000 ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000001) address = 0x0000000000000044 ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000001) address = 0x000000000000002c ".text") ; DWARF4: DW_AT_name {{.*}} "square") ; DWARF4: DW_TAG_subprogram -; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000002) address = 0x0000000000000046 ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000024) +; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000002) address = 0x000000000000002c ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_data4] (0x00000012) ; DWARF4: DW_AT_name {{.*}} "boo") ; DWARF4: DW_TAG_subprogram -; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000003) address = 0x000000000000006c ".text") -; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000004) address = 0x00000000000000b0 ".text") +; DWARF4-NEXT: DW_AT_low_pc [DW_FORM_GNU_addr_index] (indexed (00000003) address = 0x000000000000003e ".text") +; DWARF4-NEXT: DW_AT_high_pc [DW_FORM_GNU_addr_index] (indexed (00000004) address = 0x000000000000006e ".text") ; DWARF4: DW_AT_name {{.*}} "main") ; HDR-NOT: .rela.{{.*}}.dwo @@ -88,11 +88,9 @@ ; DWARF4: Addrs: [ ; DWARF4-NEXT: 0x0000000000000000 ; DWARF4-NEXT: 0x000000000000002c +; DWARF4-NEXT: 0x000000000000002c ; DWARF4-NEXT: 0x000000000000003e -; DWARF4-NEXT: 0x0000000000000044 -; DWARF4-NEXT: 0x0000000000000046 -; DWARF4-NEXT: 0x000000000000006c -; DWARF4-NEXT: 0x00000000000000b0 +; DWARF4-NEXT: 0x000000000000006e ; DWARF4-NEXT: ] ; HDR-NOT: .rela.{{.*}}.dwo _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
