diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index fe4a729e965..39f61e1ad09 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -843,6 +843,34 @@ void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) { addGlobalType(Ty); } +// Accelerator table mutators - add each name along with its companion +// DIE to the proper table while ensuring that the name that we're going +// to reference is in the string table. We do this since the names we +// add may not only be identical to the names in the DIE. +void CompileUnit::addAccelName(StringRef Name, DIE *Die) { + DU->getStringPoolEntry(Name); + std::vector &DIEs = AccelNames[Name]; + DIEs.push_back(Die); +} + +void CompileUnit::addAccelObjC(StringRef Name, DIE *Die) { + DU->getStringPoolEntry(Name); + std::vector &DIEs = AccelObjC[Name]; + DIEs.push_back(Die); +} + +void CompileUnit::addAccelNamespace(StringRef Name, DIE *Die) { + DU->getStringPoolEntry(Name); + std::vector &DIEs = AccelNamespace[Name]; + DIEs.push_back(Die); +} + +void CompileUnit::addAccelType(StringRef Name, std::pair Die) { + DU->getStringPoolEntry(Name); + std::vector > &DIEs = AccelTypes[Name]; + DIEs.push_back(Die); +} + /// addGlobalName - Add a new global name to the compile unit. void CompileUnit::addGlobalName(StringRef Name, DIE *Die) { GlobalNames[Name] = Die; diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index 980ebc8b625..0c0916538dd 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -136,22 +136,16 @@ public: void addGlobalType(DIType Ty); /// addAccelName - Add a new name to the name accelerator table. - void addAccelName(StringRef Name, DIE *Die) { - std::vector &DIEs = AccelNames[Name]; - DIEs.push_back(Die); - } - void addAccelObjC(StringRef Name, DIE *Die) { - std::vector &DIEs = AccelObjC[Name]; - DIEs.push_back(Die); - } - void addAccelNamespace(StringRef Name, DIE *Die) { - std::vector &DIEs = AccelNamespace[Name]; - DIEs.push_back(Die); - } - void addAccelType(StringRef Name, std::pair Die) { - std::vector > &DIEs = AccelTypes[Name]; - DIEs.push_back(Die); - } + void addAccelName(StringRef Name, DIE *Die); + + /// addAccelObjC - Add a new name to the ObjC accelerator table. + void addAccelObjC(StringRef Name, DIE *Die); + + /// addAccelNamespace - Add a new name to the namespace accelerator table. + void addAccelNamespace(StringRef Name, DIE *Die); + + /// addAccelType - Add a new type to the type accelerator table. + void addAccelType(StringRef Name, std::pair Die); /// getDIE - Returns the debug information entry map slot for the /// specified debug variable. diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 76d63c722b3..6414969774b 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -313,10 +313,12 @@ static StringRef getObjCMethodName(StringRef In) { } // Add the various names to the Dwarf accelerator table names. +// TODO: Determine whether or not we should add names for programs +// that do not have a DW_AT_name or DW_AT_linkage_name field - this +// is only slightly different than the lookup of non-standard ObjC names. static void addSubprogramNames(CompileUnit *TheCU, DISubprogram SP, DIE* Die) { if (!SP.isDefinition()) return; - TheCU->addAccelName(SP.getName(), Die); // If the linkage name is different than the name, go ahead and output @@ -1126,6 +1128,8 @@ void DwarfDebug::endModule() { finalizeModuleInfo(); if (!useSplitDwarf()) { + emitDebugStr(); + // Emit all the DIEs into a debug info section. emitDebugInfo(); @@ -1147,6 +1151,9 @@ void DwarfDebug::endModule() { } else { // TODO: Fill this in for separated debug sections and separate // out information into new sections. + emitDebugStr(); + if (useSplitDwarf()) + emitDebugStrDWO(); // Emit the debug info section and compile units. emitDebugInfo(); @@ -1187,11 +1194,6 @@ void DwarfDebug::endModule() { emitDebugPubTypes(GenerateGnuPubSections); } - // Finally emit string information into a string table. - emitDebugStr(); - if (useSplitDwarf()) - emitDebugStrDWO(); - // clean up. SPMap.clear(); for (DenseMap::iterator I = CUMap.begin(), diff --git a/test/DebugInfo/AArch64/variable-loc.ll b/test/DebugInfo/AArch64/variable-loc.ll index 1f4f12ac576..6005ac0880b 100644 --- a/test/DebugInfo/AArch64/variable-loc.ll +++ b/test/DebugInfo/AArch64/variable-loc.ll @@ -23,7 +23,10 @@ ; CHECK: add x29, sp, #416 ; CHECK: add {{x[0-9]+}}, sp, #4 - ; Now check the debugging information reflects this: +; CHECK: .Linfo_string7: +; CHECK-NEXT: main_arr + +; Now check the debugging information reflects this: ; CHECK: DW_TAG_variable ; CHECK-NEXT: .word .Linfo_string7 @@ -32,8 +35,6 @@ ; CHECK-NEXT: .byte 145 ; CHECK-NEXT: .ascii "\344|" -; CHECK: .Linfo_string7: -; CHECK-NEXT: main_arr target datalayout = "e-p:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-i128:128:128-f32:32:32-f64:64:64-f128:128:128-n32:64-S128" diff --git a/test/DebugInfo/SystemZ/variable-loc.ll b/test/DebugInfo/SystemZ/variable-loc.ll index a191b06ff73..7ab47d88cee 100644 --- a/test/DebugInfo/SystemZ/variable-loc.ll +++ b/test/DebugInfo/SystemZ/variable-loc.ll @@ -11,6 +11,9 @@ ; CHECK: la %r2, 164(%r11) ; CHECK: brasl %r14, populate_array@PLT ; +; CHECK: .Linfo_string7: +; CHECK-NEXT: main_arr +; ; Now check that the debugging information reflects this: ; CHECK: DW_TAG_variable ; CHECK-NEXT: .long .Linfo_string7 @@ -21,8 +24,6 @@ ; CHECK-NEXT: .byte 145 ; CHECK-NEXT: .ascii "\244\001" ; -; CHECK: .Linfo_string7: -; CHECK-NEXT: main_arr @.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 2 diff --git a/test/DebugInfo/X86/stringpool.ll b/test/DebugInfo/X86/stringpool.ll index 45c2b2a2a3d..40b5977eedd 100644 --- a/test/DebugInfo/X86/stringpool.ll +++ b/test/DebugInfo/X86/stringpool.ll @@ -16,6 +16,12 @@ !7 = metadata !{i32 720932, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] !8 = metadata !{metadata !"z.c", metadata !"/home/nicholas"} +; Verify that "yyyy" ended up in the stringpool. +; LINUX: .section .debug_str,"MS",@progbits,1 +; LINUX: yyyy +; DARWIN: .section __DWARF,__debug_str,regular,debug +; DARWIN: yyyy + ; Verify that we refer to 'yyyy' with a relocation. ; LINUX: .long .Linfo_string3 # DW_AT_name ; LINUX-NEXT: .long 38 # DW_AT_type @@ -36,11 +42,3 @@ ; DARWIN-NEXT: .byte 9 ## DW_AT_location ; DARWIN-NEXT: .byte 3 ; DARWIN-NEXT: .quad _yyyy - -; Verify that "yyyy" ended up in the stringpool. -; LINUX: .section .debug_str,"MS",@progbits,1 -; LINUX-NOT: .section -; LINUX: yyyy -; DARWIN: .section __DWARF,__debug_str,regular,debug -; DARWIN-NOT: .section -; DARWIN: yyyy