Skip to content

Commit b215a2c

Browse files
committed
.debug_gnu_pub{names,types}: Stabilize iteration order
StringMap iteration order is not guaranteed to be deterministic (https://llvm.org/docs/ProgrammersManual.html#llvm-adt-stringmap-h). Sort by DIE offset (which looks like a pre-order traversal order).
1 parent 76fd79b commit b215a2c

File tree

5 files changed

+34
-29
lines changed

5 files changed

+34
-29
lines changed

llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,10 +2549,13 @@ void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name,
25492549
Asm->emitDwarfLengthOrOffset(TheU->getLength());
25502550

25512551
// Emit the pubnames for this compilation unit.
2552-
for (const auto &GI : Globals) {
2553-
const char *Name = GI.getKeyData();
2554-
const DIE *Entity = GI.second;
2555-
2552+
SmallVector<std::pair<StringRef, const DIE *>, 0> Vec;
2553+
for (const auto &GI : Globals)
2554+
Vec.emplace_back(GI.first(), GI.second);
2555+
llvm::sort(Vec, [](auto &A, auto &B) {
2556+
return A.second->getOffset() < B.second->getOffset();
2557+
});
2558+
for (const auto &[Name, Entity] : Vec) {
25562559
Asm->OutStreamer->AddComment("DIE offset");
25572560
Asm->emitDwarfLengthOrOffset(Entity->getOffset());
25582561

@@ -2565,7 +2568,7 @@ void DwarfDebug::emitDebugPubSection(bool GnuStyle, StringRef Name,
25652568
}
25662569

25672570
Asm->OutStreamer->AddComment("External Name");
2568-
Asm->OutStreamer->emitBytes(StringRef(Name, GI.getKeyLength() + 1));
2571+
Asm->OutStreamer->emitBytes(StringRef(Name.data(), Name.size() + 1));
25692572
}
25702573

25712574
Asm->OutStreamer->AddComment("End Mark");

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
; CHECK: .debug_pubtypes contents:
2020
; CHECK-NEXT: length = 0x0000000000000032, format = DWARF64, version = 0x0002, unit_offset =
2121
; CHECK-NEXT: Offset Name
22-
; CHECK-NEXT: 0x00000000[[BASET]] "int"
2322
; CHECK-NEXT: 0x00000000[[STRUCT]] "Foo"
23+
; CHECK-NEXT: 0x00000000[[BASET]] "int"
2424

2525
; IR generated and reduced from:
2626
; $ cat foo.c

llvm/test/DebugInfo/X86/gnu-public-names-gmlt.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
; GPUB: .debug_gnu_pubnames contents:
1818
; GPUB-NEXT: unit_offset = 0x00000000
1919
; GPUB-NEXT: Name
20-
; GPUB-NEXT: "f3"
2120
; GPUB-NEXT: "f2"
21+
; GPUB-NEXT: "f3"
2222

2323
; GPUB: .debug_gnu_pubtypes contents:
2424
; GPUB-NEXT: length = 0x0000000e, format = DWARF32, version = 0x0002, unit_offset = 0x00000000

llvm/test/DebugInfo/X86/gnu-public-names-tu.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
; CHECK-LABEL: debug_gnu_pubtypes contents:
2626
; CHECK-NEXT: length = {{.*}}, version = 0x0002, unit_offset = 0x00000000, unit_size = {{.*}}
2727
; CHECK-NEXT: Offset Linkage Kind Name
28-
; CHECK-NEXT: [[BAR]] EXTERNAL TYPE "bar"
2928
; CHECK-NEXT: [[CU]] EXTERNAL TYPE "ns::foo"
29+
; CHECK-NEXT: [[BAR]] EXTERNAL TYPE "bar"
3030

3131
%struct.bar = type { %"struct.ns::foo" }
3232
%"struct.ns::foo" = type { i8 }

llvm/test/DebugInfo/X86/gnu-public-names.ll

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@
6666

6767
; ASM: .section .debug_gnu_pubnames
6868
; ASM: .byte 32 # Attributes: VARIABLE, EXTERNAL
69-
; ASM-NEXT: .asciz "ns::global_namespace_variable" # External Name
69+
; ASM-NEXT: .asciz "C::static_member_variable" # External Name
7070
; ASM: .byte 32 # Attributes: VARIABLE, EXTERNAL
7171
; ASM-NEXT: .asciz "global_variable" # External Name
72+
; ASM: .byte 32 # Attributes: VARIABLE, EXTERNAL
73+
; ASM-NEXT: .asciz "ns::global_namespace_variable" # External Name
7274

7375
; ASM: .section .debug_gnu_pubtypes
7476
; ASM: .byte 16 # Attributes: TYPE, EXTERNAL
@@ -196,42 +198,42 @@
196198
; CHECK-LABEL: .debug_gnu_pubnames contents:
197199
; CHECK-NEXT: length = {{.*}}, version = 0x0002, unit_offset = 0x00000000, unit_size = {{.*}}
198200
; CHECK-NEXT: Offset Linkage Kind Name
199-
; CHECK-NEXT: [[ANON_INNER_B]] STATIC VARIABLE "(anonymous namespace)::inner::b"
200-
; CHECK-NEXT: [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function"
201-
; CHECK-NEXT: [[OUTER]] EXTERNAL TYPE "outer"
202-
; CHECK-NEXT: [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable"
201+
; CHECK-NEXT: [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable"
203202
; CHECK-NEXT: [[GLOB_VAR]] EXTERNAL VARIABLE "global_variable"
204-
; CHECK-NEXT: [[UNNAMED_ENUM_ENUMERATOR]] STATIC VARIABLE "unnamed_enum_enumerator"
205-
; CHECK-NEXT: [[GLOBAL_F7]] EXTERNAL FUNCTION "f7"
206-
; CHECK-NEXT: [[OUTER_ANON]] EXTERNAL TYPE "outer::(anonymous namespace)"
207-
; FIXME: GCC produces enumerators as EXTERNAL, not STATIC
208-
; CHECK-NEXT: [[NAMED_ENUM_CLASS_ENUMERATOR]] STATIC VARIABLE "named_enum_class_enumerator"
209-
; CHECK-NEXT: [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function"
210-
; CHECK-NEXT: [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function"
211203
; CHECK-NEXT: [[NS]] EXTERNAL TYPE "ns"
212-
; CHECK-NEXT: [[NAMED_ENUM_ENUMERATOR]] STATIC VARIABLE "named_enum_enumerator"
213-
; CHECK-NEXT: [[ANON]] EXTERNAL TYPE "(anonymous namespace)"
214-
; CHECK-NEXT: [[OUTER_ANON_C]] STATIC VARIABLE "outer::(anonymous namespace)::c"
204+
; CHECK-NEXT: [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable"
215205
; CHECK-NEXT: [[D_VAR]] EXTERNAL VARIABLE "ns::d"
216-
; CHECK-NEXT: [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function"
217-
; CHECK-NEXT: [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable"
218-
; CHECK-NEXT: [[ANON_I]] STATIC VARIABLE "(anonymous namespace)::i"
219-
; CHECK-NEXT: [[ANON_INNER]] EXTERNAL TYPE "(anonymous namespace)::inner"
206+
; CHECK-NEXT: [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function"
220207
; CHECK-NEXT: [[F3]] EXTERNAL FUNCTION "f3"
221208
; GCC Doesn't put local statics in pubnames, but it seems not unreasonable and
222209
; comes out naturally from LLVM's implementation, so I'm OK with it for now. If
223210
; it's demonstrated that this is a major size concern or degrades debug info
224211
; consumer behavior, feel free to change it.
225212
; CHECK-NEXT: [[F3_Z]] STATIC VARIABLE "f3::z"
213+
; CHECK-NEXT: [[ANON]] EXTERNAL TYPE "(anonymous namespace)"
214+
; CHECK-NEXT: [[ANON_I]] STATIC VARIABLE "(anonymous namespace)::i"
215+
; CHECK-NEXT: [[ANON_INNER]] EXTERNAL TYPE "(anonymous namespace)::inner"
216+
; CHECK-NEXT: [[ANON_INNER_B]] STATIC VARIABLE "(anonymous namespace)::inner::b"
217+
; CHECK-NEXT: [[OUTER]] EXTERNAL TYPE "outer"
218+
; CHECK-NEXT: [[OUTER_ANON]] EXTERNAL TYPE "outer::(anonymous namespace)"
219+
; CHECK-NEXT: [[OUTER_ANON_C]] STATIC VARIABLE "outer::(anonymous namespace)::c"
220+
; CHECK-NEXT: [[UNNAMED_ENUM_ENUMERATOR]] STATIC VARIABLE "unnamed_enum_enumerator"
221+
; CHECK-NEXT: [[NAMED_ENUM_ENUMERATOR]] STATIC VARIABLE "named_enum_enumerator"
222+
; CHECK-NEXT: [[NAMED_ENUM_CLASS_ENUMERATOR]] STATIC VARIABLE "named_enum_class_enumerator"
223+
; CHECK-NEXT: [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function"
224+
; CHECK-NEXT: [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function"
225+
; FIXME: GCC produces enumerators as EXTERNAL, not STATIC
226+
; CHECK-NEXT: [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function"
227+
; CHECK-NEXT: [[GLOBAL_F7]] EXTERNAL FUNCTION "f7"
226228

227229
; CHECK-LABEL: debug_gnu_pubtypes contents:
228230
; CHECK: Offset Linkage Kind Name
229-
; CHECK-NEXT: [[INT]] STATIC TYPE "int"
230231
; CHECK-NEXT: [[C]] EXTERNAL TYPE "C"
232+
; CHECK-NEXT: [[INT]] STATIC TYPE "int"
233+
; CHECK-NEXT: [[D]] EXTERNAL TYPE "ns::D"
231234
; CHECK-NEXT: [[UNSIGNED_INT]] STATIC TYPE "unsigned int"
232235
; CHECK-NEXT: [[NAMED_ENUM]] EXTERNAL TYPE "named_enum"
233236
; CHECK-NEXT: [[NAMED_ENUM_CLASS]] EXTERNAL TYPE "named_enum_class"
234-
; CHECK-NEXT: [[D]] EXTERNAL TYPE "ns::D"
235237

236238
%struct.C = type { i8 }
237239
%"struct.ns::D" = type { i32 }

0 commit comments

Comments
 (0)