Skip to content

Commit 8bfc5d2

Browse files
Merge pull request #7783 from felipepiovezan/felipe/cherry_pick_tag_label_changes
[Cherry-pick][debug info] Add DW_TAG_label entries to the accelerator table
2 parents 71d9ae8 + 9f2a378 commit 8bfc5d2

File tree

5 files changed

+80
-18
lines changed

5 files changed

+80
-18
lines changed

llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,9 +1439,18 @@ void DwarfCompileUnit::finishEntityDefinition(const DbgEntity *Entity) {
14391439
llvm_unreachable("DbgEntity must be DbgVariable or DbgLabel.");
14401440
}
14411441

1442-
if (Label)
1443-
if (const auto *Sym = Label->getSymbol())
1444-
addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
1442+
if (!Label)
1443+
return;
1444+
1445+
const auto *Sym = Label->getSymbol();
1446+
if (!Sym)
1447+
return;
1448+
1449+
addLabelAddress(*Die, dwarf::DW_AT_low_pc, Sym);
1450+
1451+
// A TAG_label with a name and an AT_low_pc must be placed in debug_names.
1452+
if (StringRef Name = Label->getName(); !Name.empty())
1453+
getDwarfDebug().addAccelName(*CUNode, Name, *Die);
14451454
}
14461455

14471456
DbgEntity *DwarfCompileUnit::getExistingAbstractEntity(const DINode *Node) {

llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ std::optional<uint64_t> DWARFDebugNames::Entry::getCUOffset() const {
635635
}
636636

637637
void DWARFDebugNames::Entry::dump(ScopedPrinter &W) const {
638-
W.printHex("Abbrev", Abbr->Code);
638+
W.startLine() << formatv("Abbrev: {0:x}\n", Abbr->Code);
639639
W.startLine() << formatv("Tag: {0}\n", Abbr->Tag);
640640
assert(Abbr->Attributes.size() == Values.size());
641641
for (auto Tuple : zip_first(Abbr->Attributes, Values)) {

llvm/test/DebugInfo/X86/debug-names-dwarf64.ll

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
; CHECK-NEXT: DW_AT_name ("foo")
1111
; CHECK: [[TYPEDIE:.+]]: DW_TAG_base_type
1212
; CHECK-NEXT: DW_AT_name ("int")
13+
; CHECK: [[SPDIE:.+]]: DW_TAG_subprogram
14+
; CHECK: DW_AT_name ("func")
15+
; CHECK: [[LABELDIE:.+]]: DW_TAG_label
16+
; CHECK-NEXT: DW_AT_name ("MyLabel")
1317

1418
; CHECK: .debug_names contents:
1519
; CHECK-NEXT: Name Index @ 0x0 {
@@ -19,18 +23,26 @@
1923
; CHECK-NEXT: CU count: 1
2024
; CHECK-NEXT: Local TU count: 0
2125
; CHECK-NEXT: Foreign TU count: 0
22-
; CHECK-NEXT: Bucket count: 2
23-
; CHECK-NEXT: Name count: 2
26+
; CHECK-NEXT: Bucket count: 4
27+
; CHECK-NEXT: Name count: 4
2428
; CHECK: }
2529
; CHECK-NEXT: Compilation Unit offsets [
2630
; CHECK-NEXT: CU[0]: 0x00000000
2731
; CHECK-NEXT: ]
2832
; CHECK-NEXT: Abbreviations [
29-
; CHECK-NEXT: Abbreviation 0x34 {
33+
; CHECK-NEXT: Abbreviation [[ABBREV1:0x[0-9a-f]*]] {
3034
; CHECK-NEXT: Tag: DW_TAG_variable
3135
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
3236
; CHECK-NEXT: }
33-
; CHECK-NEXT: Abbreviation 0x24 {
37+
; CHECK-NEXT: Abbreviation [[ABBREV_SP:0x[0-9a-f]*]] {
38+
; CHECK-NEXT: Tag: DW_TAG_subprogram
39+
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
40+
; CHECK-NEXT: }
41+
; CHECK-NEXT: Abbreviation [[ABBREV_LABEL:0x[0-9a-f]*]] {
42+
; CHECK-NEXT: Tag: DW_TAG_label
43+
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
44+
; CHECK-NEXT: }
45+
; CHECK-NEXT: Abbreviation [[ABBREV:0x[0-9a-f]*]] {
3446
; CHECK-NEXT: Tag: DW_TAG_base_type
3547
; CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
3648
; CHECK-NEXT: }
@@ -40,7 +52,7 @@
4052
; CHECK-NEXT: Hash: 0xB888030
4153
; CHECK-NEXT: String: {{.+}} "int"
4254
; CHECK-NEXT: Entry @ {{.+}} {
43-
; CHECK-NEXT: Abbrev: 0x24
55+
; CHECK-NEXT: Abbrev: [[ABBREV]]
4456
; CHECK-NEXT: Tag: DW_TAG_base_type
4557
; CHECK-NEXT: DW_IDX_die_offset: [[TYPEDIE]]
4658
; CHECK-NEXT: }
@@ -51,11 +63,34 @@
5163
; CHECK-NEXT: Hash: 0xB887389
5264
; CHECK-NEXT: String: {{.+}} "foo"
5365
; CHECK-NEXT: Entry @ {{.+}} {
54-
; CHECK-NEXT: Abbrev: 0x34
66+
; CHECK-NEXT: Abbrev: [[ABBREV1]]
5567
; CHECK-NEXT: Tag: DW_TAG_variable
5668
; CHECK-NEXT: DW_IDX_die_offset: [[VARDIE]]
5769
; CHECK-NEXT: }
5870
; CHECK-NEXT: }
71+
; CHECK-NEXT: Name 3 {
72+
; CHECK-NEXT: Hash: 0x7C96FE71
73+
; CHECK-NEXT: String: {{.+}} "func"
74+
; CHECK-NEXT: Entry @ {{.+}} {
75+
; CHECK-NEXT: Abbrev: [[ABBREV_SP]]
76+
; CHECK-NEXT: Tag: DW_TAG_subprogram
77+
; CHECK-NEXT: DW_IDX_die_offset: [[SPDIE]]
78+
; CHECK-NEXT: }
79+
; CHECK-NEXT: }
80+
; CHECK-NEXT: ]
81+
; CHECK-NEXT: Bucket 2 [
82+
; CHECK-NEXT: EMPTY
83+
; CHECK-NEXT: ]
84+
; CHECK-NEXT: Bucket 3 [
85+
; CHECK-NEXT: Name 4 {
86+
; CHECK-NEXT: Hash: 0xEC64E52B
87+
; CHECK-NEXT: String: {{.+}} "MyLabel"
88+
; CHECK-NEXT: Entry @ {{.+}} {
89+
; CHECK-NEXT: Abbrev: [[ABBREV_LABEL]]
90+
; CHECK-NEXT: Tag: DW_TAG_label
91+
; CHECK-NEXT: DW_IDX_die_offset: [[LABELDIE]]
92+
; CHECK-NEXT: }
93+
; CHECK-NEXT: }
5994
; CHECK-NEXT: ]
6095
; CHECK-NEXT: }
6196

@@ -64,12 +99,25 @@
6499
; IR generated and reduced from:
65100
; $ cat foo.c
66101
; int foo;
102+
; void func() {
103+
; goto MyLabel;
104+
;
105+
; MyLabel:
106+
; return 1;
107+
; }
67108
; $ clang -g -gpubnames -S -emit-llvm foo.c -o foo.ll
68109

69110
target triple = "x86_64-unknown-linux-gnu"
70111

71112
@foo = dso_local global i32 0, align 4, !dbg !0
72113

114+
define void @func() !dbg !11 {
115+
call void @llvm.dbg.label(metadata !15), !dbg !14
116+
ret void, !dbg !14
117+
}
118+
119+
declare void @llvm.dbg.label(metadata)
120+
73121
!llvm.dbg.cu = !{!2}
74122
!llvm.module.flags = !{!7, !8, !9}
75123
!llvm.ident = !{!10}
@@ -85,3 +133,8 @@ target triple = "x86_64-unknown-linux-gnu"
85133
!8 = !{i32 2, !"Debug Info Version", i32 3}
86134
!9 = !{i32 1, !"wchar_size", i32 4}
87135
!10 = !{!"clang version 12.0.0"}
136+
!11 = distinct !DISubprogram(name: "func", linkageName: "func", scope: !3, file: !3, line: 2, type: !12, unit: !2)
137+
!12 = !DISubroutineType(types: !13)
138+
!13 = !{null}
139+
!14 = !DILocation(line: 2, column: 13, scope: !11)
140+
!15 = !DILabel(scope: !11, name: "MyLabel", file: !3, line: 5)

llvm/test/DebugInfo/X86/dwarfdump-debug-names.s

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@
151151
# CHECK-NEXT: CU[0]: 0x00000000
152152
# CHECK-NEXT: ]
153153
# CHECK-NEXT: Abbreviations [
154-
# CHECK-NEXT: Abbreviation 0x2e {
154+
# CHECK-NEXT: Abbreviation [[ABBREV:0x[0-9a-f]*]] {
155155
# CHECK-NEXT: Tag: DW_TAG_subprogram
156156
# CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
157157
# CHECK-NEXT: }
@@ -164,7 +164,7 @@
164164
# CHECK-NEXT: Hash: 0xB887389
165165
# CHECK-NEXT: String: 0x00000000 "foo"
166166
# CHECK-NEXT: Entry @ 0x4f {
167-
# CHECK-NEXT: Abbrev: 0x2E
167+
# CHECK-NEXT: Abbrev: [[ABBREV]]
168168
# CHECK-NEXT: Tag: DW_TAG_subprogram
169169
# CHECK-NEXT: DW_IDX_die_offset: 0x00000001
170170
# CHECK-NEXT: }
@@ -173,7 +173,7 @@
173173
# CHECK-NEXT: Hash: 0xB5063D0B
174174
# CHECK-NEXT: String: 0x00000004 "_Z3foov"
175175
# CHECK-NEXT: Entry @ 0x58 {
176-
# CHECK-NEXT: Abbrev: 0x2E
176+
# CHECK-NEXT: Abbrev: [[ABBREV]]
177177
# CHECK-NEXT: Tag: DW_TAG_subprogram
178178
# CHECK-NEXT: DW_IDX_die_offset: 0x00000001
179179
# CHECK-NEXT: }
@@ -197,7 +197,7 @@
197197
# CHECK-NEXT: CU[0]: 0x00000002
198198
# CHECK-NEXT: ]
199199
# CHECK-NEXT: Abbreviations [
200-
# CHECK-NEXT: Abbreviation 0x34 {
200+
# CHECK-NEXT: Abbreviation [[ABBREV1:0x[0-9a-f]*]] {
201201
# CHECK-NEXT: Tag: DW_TAG_variable
202202
# CHECK-NEXT: DW_IDX_die_offset: DW_FORM_ref4
203203
# CHECK-NEXT: }
@@ -207,7 +207,7 @@
207207
# CHECK-NEXT: Hash: 0xB8860BA
208208
# CHECK-NEXT: String: 0x0000000c "bar"
209209
# CHECK-NEXT: Entry @ 0xa3 {
210-
# CHECK-NEXT: Abbrev: 0x34
210+
# CHECK-NEXT: Abbrev: [[ABBREV1]]
211211
# CHECK-NEXT: Tag: DW_TAG_variable
212212
# CHECK-NEXT: DW_IDX_die_offset: 0x00000001
213213
# CHECK-NEXT: }
@@ -237,7 +237,7 @@
237237
# CHECK-NEXT: ForeignTU[0]: 0xffffff00ffffffff
238238
# CHECK-NEXT: ]
239239
# CHECK-NEXT: Abbreviations [
240-
# CHECK-NEXT: Abbreviation 0x1 {
240+
# CHECK-NEXT: Abbreviation [[ABBREV2:0x[0-9a-f]*]] {
241241
# CHECK-NEXT: Tag: DW_TAG_base_type
242242
# CHECK-NEXT: DW_IDX_type_unit: DW_FORM_data4
243243
# CHECK-NEXT: DW_IDX_type_hash: DW_FORM_data8
@@ -248,7 +248,7 @@
248248
# CHECK-NEXT: Hash: 0xB887389
249249
# CHECK-NEXT: String: 0x00000000 "foo"
250250
# CHECK-NEXT: Entry @ 0x111 {
251-
# CHECK-NEXT: Abbrev: 0x1
251+
# CHECK-NEXT: Abbrev: [[ABBREV2]]
252252
# CHECK-NEXT: Tag: DW_TAG_base_type
253253
# CHECK-NEXT: DW_IDX_type_unit: 0x00000001
254254
# CHECK-NEXT: DW_IDX_type_hash: 0x0000ff03ffffffff

llvm/test/tools/llvm-dwarfdump/X86/debug-names-misaligned.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
# CHECK: Name 1 {
8585
# CHECK-NEXT: String: 0x00000000 "foo"
8686
# CHECK-NEXT: Entry @ 0x37 {
87-
# CHECK-NEXT: Abbrev: 0x2E
87+
# CHECK-NEXT: Abbrev: 0x2e
8888
# CHECK-NEXT: Tag: DW_TAG_subprogram
8989
# CHECK-NEXT: DW_IDX_die_offset: 0x00000001
9090
# CHECK-NEXT: }

0 commit comments

Comments
 (0)