-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[DWARF] Teach getAttributeValueAsReferencedDie to resolve DW_FORM_ref… #101197
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
…_sig8 Splitting from llvm#99495. I've extended the type unit test case to feature more kinds of references, including the gcc-style DW_AT_type[DW_FORM_ref_sig8] reference, which this patch fixes.
@llvm/pr-subscribers-debuginfo Author: Pavel Labath (labath) Changes…_sig8 Splitting from #99495. I've extended the type unit test case to feature more kinds of references, including the gcc-style DW_AT_type[DW_FORM_ref_sig8] reference, which this patch fixes. Patch is 34.71 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/101197.diff 2 Files Affected:
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 72e7464b68971..5daa093ee8a1b 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -319,6 +319,10 @@ DWARFDie::getAttributeValueAsReferencedDie(const DWARFFormValue &V) const {
} else if (Offset = V.getAsDebugInfoReference(); Offset) {
if (DWARFUnit *SpecUnit = U->getUnitVector().getUnitForOffset(*Offset))
Result = SpecUnit->getDIEForOffset(*Offset);
+ } else if (std::optional<uint64_t> Sig = V.getAsSignatureReference()) {
+ if (DWARFTypeUnit *TU = U->getContext().getTypeUnitForHash(
+ U->getVersion(), *Sig, U->isDWOUnit()))
+ Result = TU->getDIEForOffset(TU->getTypeOffset() + TU->getOffset());
}
return Result;
}
diff --git a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units.s b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units.s
index aad748a301e6b..0893889dbc259 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units.s
@@ -1,403 +1,269 @@
# RUN: llvm-mc < %s -filetype obj -triple x86_64 -o - \
# RUN: | llvm-dwarfdump - | FileCheck %s
-# Significantly modified assembly generated from this source:
+# Hand-written assembly roughly equivalent to this source code:
#
# struct t1 { };
# struct t2 { };
# template<typename ...T>
-# void f1() { }
-# int main() {
-# f1<t1, t2>();
-# }
+# struct S {};
+# S<t1, t2, t1> s;
#
-# $ clang++-tot test.cpp -g -S -fdebug-types-section -gdwarf-5 -o test.5.s -fstandalone-debug
-#
-# I inserted a DWARFv4 copy of the first type unit ("t1") to replace the
-# DWARFv5 type unit - to test both v4 and v5 type unit support. This test
-# doesn't really need templates - two local variables would've sufficed
-# (anything that references the type units) but I was working on something else
-# and this seemed minimal enough.
+# To various scenarios, the test uses a mixture of DWARF v4 and v5 type units,
+# and of llvm and gcc styles of referring to them.
+
+# CHECK: DW_TAG_variable
+# CHECK-NEXT: DW_AT_name ("s")
+# CHECK-NEXT: DW_AT_type ({{.*}} "S<t1, t2, t1>")
+# CHECK: DW_TAG_template_type_parameter
+# CHECK-NEXT: DW_AT_type ({{.*}} "t1")
+# CHECK: DW_TAG_template_type_parameter
+# CHECK-NEXT: DW_AT_type ({{.*}} "t2")
+# CHECK: DW_TAG_template_type_parameter
+# CHECK-NEXT: DW_AT_type (0xdeadbeef00000001 "t1")
-# CHECK: DW_TAG_template_type_parameter
-# CHECK: DW_AT_type ({{.*}} "t1")
-# CHECK: DW_TAG_template_type_parameter
-# CHECK: DW_AT_type ({{.*}} "t2")
+.set S_sig, 0xdeadbeef00000000
+.set t1_sig, 0xdeadbeef00000001
+.set t2_sig, 0xdeadbeef00000002
- .text
- .file "test.cpp"
- .globl main # -- Begin function main
- .p2align 4, 0x90
- .type main,@function
-main: # @main
-.Lfunc_begin0:
- .file 0 "/usr/local/google/home/blaikie/dev/scratch" "test.cpp" md5 0xafee1e55f64a0b86063fa85c8c456dba
- .loc 0 5 0 # test.cpp:5:0
- .cfi_startproc
-# %bb.0: # %entry
- pushq %rbp
- .cfi_def_cfa_offset 16
- .cfi_offset %rbp, -16
- movq %rsp, %rbp
- .cfi_def_cfa_register %rbp
-.Ltmp0:
- .loc 0 6 3 prologue_end # test.cpp:6:3
- callq _Z2f1IJ2t12t2EEvv
- .loc 0 7 1 # test.cpp:7:1
- xorl %eax, %eax
- popq %rbp
- .cfi_def_cfa %rsp, 8
- retq
-.Ltmp1:
-.Lfunc_end0:
- .size main, .Lfunc_end0-main
- .cfi_endproc
- # -- End function
- .section .text._Z2f1IJ2t12t2EEvv,"axG",@progbits,_Z2f1IJ2t12t2EEvv,comdat
- .weak _Z2f1IJ2t12t2EEvv # -- Begin function _Z2f1IJ2t12t2EEvv
- .p2align 4, 0x90
- .type _Z2f1IJ2t12t2EEvv,@function
-_Z2f1IJ2t12t2EEvv: # @_Z2f1IJ2t12t2EEvv
-.Lfunc_begin1:
- .loc 0 4 0 # test.cpp:4:0
- .cfi_startproc
-# %bb.0: # %entry
- pushq %rbp
- .cfi_def_cfa_offset 16
- .cfi_offset %rbp, -16
- movq %rsp, %rbp
- .cfi_def_cfa_register %rbp
-.Ltmp2:
- .loc 0 4 13 prologue_end # test.cpp:4:13
- popq %rbp
- .cfi_def_cfa %rsp, 8
- retq
-.Ltmp3:
-.Lfunc_end1:
- .size _Z2f1IJ2t12t2EEvv, .Lfunc_end1-_Z2f1IJ2t12t2EEvv
- .cfi_endproc
- # -- End function
- .section .debug_types,"G",@progbits,14297044602779165170,comdat
- .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
+ .section .debug_types,"G",@progbits,t1_sig,comdat
+.Ltu_begin0:
+ .long .Ldebug_info_end0-.Ldebug_info_start0 # Length of Unit
.Ldebug_info_start0:
- .short 4 # DWARF version number
- .long .debug_abbrev # Offset Into Abbrev. Section
- .byte 8 # Address Size (in bytes)
- .quad -4149699470930386446 # Type Signature
- .long 30 # Type DIE Offset
- .byte 10 # Abbrev [1] 0x17:0x11 DW_TAG_type_unit
- .short 33 # DW_AT_language
- .long .Lline_table_start0 # DW_AT_stmt_list
- .byte 11 # Abbrev [2] 0x1e:0x9 DW_TAG_structure_type
- .byte 5 # DW_AT_calling_convention
- .long .Linfo_string6 # DW_AT_name
- .byte 1 # DW_AT_byte_size
- .byte 1 # DW_AT_decl_file
- .byte 1 # DW_AT_decl_line
- .byte 0 # End Of Children Mark
+ .short 4 # DWARF version number
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .byte 8 # Address Size (in bytes)
+ .quad t1_sig # Type Signature
+ .long .Lt1_def-.Ltu_begin0 # Type DIE Offset
+ .byte 10 # Abbrev [10] DW_TAG_type_unit
+ .short 33 # DW_AT_language
+.Lt1_def:
+ .byte 11 # Abbrev [11] DW_TAG_structure_type
+ .long .Linfo_string6 # DW_AT_name
+ .byte 1 # DW_AT_byte_size
+ .byte 0 # End Of Children Mark
.Ldebug_info_end0:
- .section .debug_info,"G",@progbits,5649318945901130368,comdat
- .long .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
+ .section .debug_info,"G",@progbits,t2_sig,comdat
+.Ltu_begin1:
+ .long .Ldebug_info_end1-.Ldebug_info_start1 # Length of Unit
.Ldebug_info_start1:
- .short 5 # DWARF version number
- .byte 2 # DWARF Unit Type
- .byte 8 # Address Size (in bytes)
- .long .debug_abbrev # Offset Into Abbrev. Section
- .quad 5649318945901130368 # Type Signature
- .long 35 # Type DIE Offset
- .byte 1 # Abbrev [1] 0x18:0x12 DW_TAG_type_unit
- .short 33 # DW_AT_language
- .long .Lline_table_start0 # DW_AT_stmt_list
- .long .Lstr_offsets_base0 # DW_AT_str_offsets_base
- .byte 2 # Abbrev [2] 0x23:0x6 DW_TAG_structure_type
- .byte 5 # DW_AT_calling_convention
- .byte 7 # DW_AT_name
- .byte 1 # DW_AT_byte_size
- .byte 0 # DW_AT_decl_file
- .byte 2 # DW_AT_decl_line
- .byte 0 # End Of Children Mark
+ .short 5 # DWARF version number
+ .byte 2 # DWARF Unit Type
+ .byte 8 # Address Size (in bytes)
+ .long .debug_abbrev # Offset Into Abbrev. Section
+ .quad t2_sig # Type Signature
+ .long .Lt2_def-.Ltu_begin1 # Type DIE Offset
+ .byte 1 # Abbrev [1] 0x18:0x12 DW_TAG_type_unit
+ .short 33 # DW_AT_language
+ .long .Lstr_offsets_base0 # DW_AT_str_offsets_base
+.Lt2_def:
+ .byte 2 # Abbrev [2] 0x23:0x6 DW_TAG_structure_type
+ .byte 7 # DW_AT_name
+ .byte 1 # DW_AT_byte_size
+ .byte 0 # End Of Children Mark
.Ldebug_info_end1:
- .section .debug_abbrev,"",@progbits
- .byte 1 # Abbreviation Code
- .byte 65 # DW_TAG_type_unit
- .byte 1 # DW_CHILDREN_yes
- .byte 19 # DW_AT_language
- .byte 5 # DW_FORM_data2
- .byte 16 # DW_AT_stmt_list
- .byte 23 # DW_FORM_sec_offset
- .byte 114 # DW_AT_str_offsets_base
- .byte 23 # DW_FORM_sec_offset
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 2 # Abbreviation Code
- .byte 19 # DW_TAG_structure_type
- .byte 0 # DW_CHILDREN_no
- .byte 54 # DW_AT_calling_convention
- .byte 11 # DW_FORM_data1
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 11 # DW_AT_byte_size
- .byte 11 # DW_FORM_data1
- .byte 58 # DW_AT_decl_file
- .byte 11 # DW_FORM_data1
- .byte 59 # DW_AT_decl_line
- .byte 11 # DW_FORM_data1
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 3 # Abbreviation Code
- .byte 17 # DW_TAG_compile_unit
- .byte 1 # DW_CHILDREN_yes
- .byte 37 # DW_AT_producer
- .byte 37 # DW_FORM_strx1
- .byte 19 # DW_AT_language
- .byte 5 # DW_FORM_data2
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 114 # DW_AT_str_offsets_base
- .byte 23 # DW_FORM_sec_offset
- .byte 16 # DW_AT_stmt_list
- .byte 23 # DW_FORM_sec_offset
- .byte 27 # DW_AT_comp_dir
- .byte 37 # DW_FORM_strx1
- .byte 17 # DW_AT_low_pc
- .byte 1 # DW_FORM_addr
- .byte 85 # DW_AT_ranges
- .byte 35 # DW_FORM_rnglistx
- .byte 115 # DW_AT_addr_base
- .byte 23 # DW_FORM_sec_offset
- .byte 116 # DW_AT_rnglists_base
- .byte 23 # DW_FORM_sec_offset
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 4 # Abbreviation Code
- .byte 46 # DW_TAG_subprogram
- .byte 0 # DW_CHILDREN_no
- .byte 17 # DW_AT_low_pc
- .byte 27 # DW_FORM_addrx
- .byte 18 # DW_AT_high_pc
- .byte 6 # DW_FORM_data4
- .byte 64 # DW_AT_frame_base
- .byte 24 # DW_FORM_exprloc
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 58 # DW_AT_decl_file
- .byte 11 # DW_FORM_data1
- .byte 59 # DW_AT_decl_line
- .byte 11 # DW_FORM_data1
- .byte 73 # DW_AT_type
- .byte 19 # DW_FORM_ref4
- .byte 63 # DW_AT_external
- .byte 25 # DW_FORM_flag_present
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 5 # Abbreviation Code
- .byte 46 # DW_TAG_subprogram
- .byte 1 # DW_CHILDREN_yes
- .byte 17 # DW_AT_low_pc
- .byte 27 # DW_FORM_addrx
- .byte 18 # DW_AT_high_pc
- .byte 6 # DW_FORM_data4
- .byte 64 # DW_AT_frame_base
- .byte 24 # DW_FORM_exprloc
- .byte 110 # DW_AT_linkage_name
- .byte 37 # DW_FORM_strx1
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 58 # DW_AT_decl_file
- .byte 11 # DW_FORM_data1
- .byte 59 # DW_AT_decl_line
- .byte 11 # DW_FORM_data1
- .byte 63 # DW_AT_external
- .byte 25 # DW_FORM_flag_present
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 6 # Abbreviation Code
- .ascii "\207\202\001" # DW_TAG_GNU_template_parameter_pack
- .byte 1 # DW_CHILDREN_yes
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 7 # Abbreviation Code
- .byte 47 # DW_TAG_template_type_parameter
- .byte 0 # DW_CHILDREN_no
- .byte 73 # DW_AT_type
- .byte 19 # DW_FORM_ref4
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 8 # Abbreviation Code
- .byte 36 # DW_TAG_base_type
- .byte 0 # DW_CHILDREN_no
- .byte 3 # DW_AT_name
- .byte 37 # DW_FORM_strx1
- .byte 62 # DW_AT_encoding
- .byte 11 # DW_FORM_data1
- .byte 11 # DW_AT_byte_size
- .byte 11 # DW_FORM_data1
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 9 # Abbreviation Code
- .byte 19 # DW_TAG_structure_type
- .byte 0 # DW_CHILDREN_no
- .byte 60 # DW_AT_declaration
- .byte 25 # DW_FORM_flag_present
- .byte 105 # DW_AT_signature
- .byte 32 # DW_FORM_ref_sig8
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 10 # Abbreviation Code
- .byte 65 # DW_TAG_type_unit
- .byte 1 # DW_CHILDREN_yes
- .byte 19 # DW_AT_language
- .byte 5 # DW_FORM_data2
- .byte 16 # DW_AT_stmt_list
- .byte 23 # DW_FORM_sec_offset
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 11 # Abbreviation Code
- .byte 19 # DW_TAG_structure_type
- .byte 0 # DW_CHILDREN_no
- .byte 54 # DW_AT_calling_convention
- .byte 11 # DW_FORM_data1
- .byte 3 # DW_AT_name
- .byte 14 # DW_FORM_strp
- .byte 11 # DW_AT_byte_size
- .byte 11 # DW_FORM_data1
- .byte 58 # DW_AT_decl_file
- .byte 11 # DW_FORM_data1
- .byte 59 # DW_AT_decl_line
- .byte 11 # DW_FORM_data1
- .byte 0 # EOM(1)
- .byte 0 # EOM(2)
- .byte 0 # EOM(3)
- .section .debug_info,"",@progbits
+ .section .debug_abbrev,"",@progbits
+ .byte 1 # Abbreviation Code
+ .byte 65 # DW_TAG_type_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 19 # DW_AT_language
+ .byte 5 # DW_FORM_data2
+ .byte 114 # DW_AT_str_offsets_base
+ .byte 23 # DW_FORM_sec_offset
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 2 # Abbreviation Code
+ .byte 19 # DW_TAG_structure_type
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 37 # DW_FORM_strx1
+ .byte 11 # DW_AT_byte_size
+ .byte 11 # DW_FORM_data1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 3 # Abbreviation Code
+ .byte 17 # DW_TAG_compile_unit
+ .byte 1 # DW_CHILDREN_yes
+ .byte 37 # DW_AT_producer
+ .byte 37 # DW_FORM_strx1
+ .byte 19 # DW_AT_language
+ .byte 5 # DW_FORM_data2
+ .byte 3 # DW_AT_name
+ .byte 37 # DW_FORM_strx1
+ .byte 114 # DW_AT_str_offsets_base
+ .byte 23 # DW_FORM_sec_offset
+ .byte 27 # DW_AT_comp_dir
+ .byte 37 # DW_FORM_strx1
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 4 # Abbreviation Code
+ .byte 52 # DW_TAG_variable
+ .byte 0 # DW_CHILDREN_no
+ .byte 3 # DW_AT_name
+ .byte 8 # DW_FORM_string
+ .byte 73 # DW_AT_type
+ .byte 19 # DW_FORM_ref4
+ .byte 0 # EOM(1)
+ .byte 0 # EOM(2)
+ .byte 6 # Abbreviation Code
+ .ascii "\207\202\001" # DW_TAG_GNU_template_parameter_pack
+ ...
[truncated]
|
dwblaikie
reviewed
Jul 31, 2024
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
…_sig8
Splitting from #99495.
I've extended the type unit test case to feature more kinds of references, including the gcc-style DW_AT_type[DW_FORM_ref_sig8] reference, which this patch fixes.