1263320SdimPull in r195391 from upstream llvm trunk (by Eric Christopher): 2263320Sdim 3263320Sdim In Dwarf 3 (and Dwarf 2) attributes whose value are offsets into a 4263320Sdim section use the form DW_FORM_data4 whilst in Dwarf 4 and later they 5263320Sdim use the form DW_FORM_sec_offset. 6263320Sdim 7263320Sdim This patch updates the places where such attributes are generated to 8263320Sdim use the appropriate form depending on the Dwarf version. The DIE entries 9263320Sdim affected have the following tags: 10263320Sdim DW_AT_stmt_list, DW_AT_ranges, DW_AT_location, DW_AT_GNU_pubnames, 11263320Sdim DW_AT_GNU_pubtypes, DW_AT_GNU_addr_base, DW_AT_GNU_ranges_base 12263320Sdim 13263320Sdim It also adds a hidden command line option "--dwarf-version=<uint>" 14263320Sdim to llc which allows the version of Dwarf to be generated to override 15263320Sdim what is specified in the metadata; this makes it possible to update 16263320Sdim existing tests to check the debugging information generated for both 17263320Sdim Dwarf 4 (the default) and Dwarf 3 using the same metadata. 18263320Sdim 19263320Sdim Patch (slightly modified) by Keith Walker! 20263320Sdim 21263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/261991 22263320Sdim 23263320SdimIndex: lib/CodeGen/AsmPrinter/DIE.cpp 24263320Sdim=================================================================== 25263320Sdim--- lib/CodeGen/AsmPrinter/DIE.cpp 26263320Sdim+++ lib/CodeGen/AsmPrinter/DIE.cpp 27263320Sdim@@ -338,6 +338,7 @@ void DIEDelta::EmitValue(AsmPrinter *AP, dwarf::Fo 28263320Sdim /// 29263320Sdim unsigned DIEDelta::SizeOf(AsmPrinter *AP, dwarf::Form Form) const { 30263320Sdim if (Form == dwarf::DW_FORM_data4) return 4; 31263320Sdim+ if (Form == dwarf::DW_FORM_sec_offset) return 4; 32263320Sdim if (Form == dwarf::DW_FORM_strp) return 4; 33263320Sdim return AP->getDataLayout().getPointerSize(); 34263320Sdim } 35263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfDebug.cpp 36263320Sdim=================================================================== 37263320Sdim--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp 38263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp 39263320Sdim@@ -105,6 +105,11 @@ DwarfPubSections("generate-dwarf-pub-sections", cl 40263320Sdim clEnumVal(Disable, "Disabled"), clEnumValEnd), 41263320Sdim cl::init(Default)); 42263320Sdim 43263320Sdim+static cl::opt<unsigned> 44263320Sdim+DwarfVersionNumber("dwarf-version", cl::Hidden, 45263320Sdim+ cl::desc("Generate DWARF for dwarf version."), 46263320Sdim+ cl::init(0)); 47263320Sdim+ 48263320Sdim static const char *const DWARFGroupName = "DWARF Emission"; 49263320Sdim static const char *const DbgTimerName = "DWARF Debug Writer"; 50263320Sdim 51263320Sdim@@ -215,7 +220,9 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) 52263320Sdim else 53263320Sdim HasDwarfPubSections = DwarfPubSections == Enable; 54263320Sdim 55263320Sdim- DwarfVersion = getDwarfVersionFromModule(MMI->getModule()); 56263320Sdim+ DwarfVersion = DwarfVersionNumber 57263320Sdim+ ? DwarfVersionNumber 58263320Sdim+ : getDwarfVersionFromModule(MMI->getModule()); 59263320Sdim 60263320Sdim { 61263320Sdim NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled); 62263320Sdim@@ -470,9 +477,9 @@ DIE *DwarfDebug::constructLexicalScopeDIE(CompileU 63263320Sdim // .debug_range section has not been laid out yet. Emit offset in 64263320Sdim // .debug_range as a uint, size 4, for now. emitDIE will handle 65263320Sdim // DW_AT_ranges appropriately. 66263320Sdim- TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 67263320Sdim- DebugRangeSymbols.size() 68263320Sdim- * Asm->getDataLayout().getPointerSize()); 69263320Sdim+ TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges, 70263320Sdim+ DebugRangeSymbols.size() * 71263320Sdim+ Asm->getDataLayout().getPointerSize()); 72263320Sdim for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(), 73263320Sdim RE = Ranges.end(); RI != RE; ++RI) { 74263320Sdim DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 75263320Sdim@@ -525,9 +532,9 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileU 76263320Sdim // .debug_range section has not been laid out yet. Emit offset in 77263320Sdim // .debug_range as a uint, size 4, for now. emitDIE will handle 78263320Sdim // DW_AT_ranges appropriately. 79263320Sdim- TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4, 80263320Sdim- DebugRangeSymbols.size() 81263320Sdim- * Asm->getDataLayout().getPointerSize()); 82263320Sdim+ TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges, 83263320Sdim+ DebugRangeSymbols.size() * 84263320Sdim+ Asm->getDataLayout().getPointerSize()); 85263320Sdim for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(), 86263320Sdim RE = Ranges.end(); RI != RE; ++RI) { 87263320Sdim DebugRangeSymbols.push_back(getLabelBeforeInsn(RI->first)); 88263320Sdim@@ -758,14 +765,15 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICo 89263320Sdim // The line table entries are not always emitted in assembly, so it 90263320Sdim // is not okay to use line_table_start here. 91263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 92263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 93263320Sdim- UseTheFirstCU ? Asm->GetTempSymbol("section_line") 94263320Sdim- : LineTableStartSym); 95263320Sdim+ NewCU->addSectionLabel( 96263320Sdim+ Die, dwarf::DW_AT_stmt_list, 97263320Sdim+ UseTheFirstCU ? Asm->GetTempSymbol("section_line") 98263320Sdim+ : LineTableStartSym); 99263320Sdim else if (UseTheFirstCU) 100263320Sdim- NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0); 101263320Sdim+ NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0); 102263320Sdim else 103263320Sdim- NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 104263320Sdim- LineTableStartSym, DwarfLineSectionSym); 105263320Sdim+ NewCU->addSectionDelta(Die, dwarf::DW_AT_stmt_list, 106263320Sdim+ LineTableStartSym, DwarfLineSectionSym); 107263320Sdim 108263320Sdim // If we're using split dwarf the compilation dir is going to be in the 109263320Sdim // skeleton CU and so we don't need to duplicate it here. 110263320Sdim@@ -776,26 +784,24 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICo 111263320Sdim // emit it here if we don't have a skeleton CU for split dwarf. 112263320Sdim if (GenerateGnuPubSections) { 113263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 114263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames, 115263320Sdim- dwarf::DW_FORM_sec_offset, 116263320Sdim- Asm->GetTempSymbol("gnu_pubnames", 117263320Sdim- NewCU->getUniqueID())); 118263320Sdim+ NewCU->addSectionLabel( 119263320Sdim+ Die, dwarf::DW_AT_GNU_pubnames, 120263320Sdim+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID())); 121263320Sdim else 122263320Sdim- NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4, 123263320Sdim- Asm->GetTempSymbol("gnu_pubnames", 124263320Sdim- NewCU->getUniqueID()), 125263320Sdim- DwarfGnuPubNamesSectionSym); 126263320Sdim+ NewCU->addSectionDelta( 127263320Sdim+ Die, dwarf::DW_AT_GNU_pubnames, 128263320Sdim+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()), 129263320Sdim+ DwarfGnuPubNamesSectionSym); 130263320Sdim 131263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 132263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes, 133263320Sdim- dwarf::DW_FORM_sec_offset, 134263320Sdim- Asm->GetTempSymbol("gnu_pubtypes", 135263320Sdim- NewCU->getUniqueID())); 136263320Sdim+ NewCU->addSectionLabel( 137263320Sdim+ Die, dwarf::DW_AT_GNU_pubtypes, 138263320Sdim+ Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID())); 139263320Sdim else 140263320Sdim- NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4, 141263320Sdim- Asm->GetTempSymbol("gnu_pubtypes", 142263320Sdim- NewCU->getUniqueID()), 143263320Sdim- DwarfGnuPubTypesSectionSym); 144263320Sdim+ NewCU->addSectionDelta( 145263320Sdim+ Die, dwarf::DW_AT_GNU_pubtypes, 146263320Sdim+ Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()), 147263320Sdim+ DwarfGnuPubTypesSectionSym); 148263320Sdim } 149263320Sdim } 150263320Sdim 151263320Sdim@@ -2956,11 +2962,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const 152263320Sdim // Relocate to the beginning of the addr_base section, else 0 for the 153263320Sdim // beginning of the one for this compile unit. 154263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 155263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset, 156263320Sdim- DwarfAddrSectionSym); 157263320Sdim+ NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_addr_base, 158263320Sdim+ DwarfAddrSectionSym); 159263320Sdim else 160263320Sdim- NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, 161263320Sdim- dwarf::DW_FORM_sec_offset, 0); 162263320Sdim+ NewCU->addSectionOffset(Die, dwarf::DW_AT_GNU_addr_base, 0); 163263320Sdim 164263320Sdim // 2.17.1 requires that we use DW_AT_low_pc for a single entry point 165263320Sdim // into an entity. We're using 0, or a NULL label for this. 166263320Sdim@@ -2970,10 +2975,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const 167263320Sdim // compile unit in debug_line section. 168263320Sdim // FIXME: Should handle multiple compile units. 169263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 170263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 171263320Sdim- DwarfLineSectionSym); 172263320Sdim+ NewCU->addSectionLabel(Die, dwarf::DW_AT_stmt_list, 173263320Sdim+ DwarfLineSectionSym); 174263320Sdim else 175263320Sdim- NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0); 176263320Sdim+ NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0); 177263320Sdim 178263320Sdim if (!CompilationDir.empty()) 179263320Sdim NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir); 180263320Sdim@@ -2981,27 +2986,31 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const 181263320Sdim // Flags to let the linker know we have emitted new style pubnames. 182263320Sdim if (GenerateGnuPubSections) { 183263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 184263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_sec_offset, 185263320Sdim- Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID())); 186263320Sdim+ NewCU->addSectionLabel( 187263320Sdim+ Die, dwarf::DW_AT_GNU_pubnames, 188263320Sdim+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID())); 189263320Sdim else 190263320Sdim- NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4, 191263320Sdim- Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()), 192263320Sdim- DwarfGnuPubNamesSectionSym); 193263320Sdim+ NewCU->addSectionDelta( 194263320Sdim+ Die, dwarf::DW_AT_GNU_pubnames, 195263320Sdim+ Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()), 196263320Sdim+ DwarfGnuPubNamesSectionSym); 197263320Sdim 198263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 199263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_sec_offset, 200263320Sdim- Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID())); 201263320Sdim+ NewCU->addSectionLabel( 202263320Sdim+ Die, dwarf::DW_AT_GNU_pubtypes, 203263320Sdim+ Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID())); 204263320Sdim else 205263320Sdim- NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4, 206263320Sdim- Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()), 207263320Sdim- DwarfGnuPubTypesSectionSym); 208263320Sdim+ NewCU->addSectionDelta( 209263320Sdim+ Die, dwarf::DW_AT_GNU_pubtypes, 210263320Sdim+ Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()), 211263320Sdim+ DwarfGnuPubTypesSectionSym); 212263320Sdim } 213263320Sdim 214263320Sdim // Flag if we've emitted any ranges and their location for the compile unit. 215263320Sdim if (DebugRangeSymbols.size()) { 216263320Sdim if (Asm->MAI->doesDwarfUseRelocationsAcrossSections()) 217263320Sdim- NewCU->addLabel(Die, dwarf::DW_AT_GNU_ranges_base, 218263320Sdim- dwarf::DW_FORM_sec_offset, DwarfDebugRangeSectionSym); 219263320Sdim+ NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_ranges_base, 220263320Sdim+ DwarfDebugRangeSectionSym); 221263320Sdim else 222263320Sdim NewCU->addUInt(Die, dwarf::DW_AT_GNU_ranges_base, dwarf::DW_FORM_data4, 223263320Sdim 0); 224263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp 225263320Sdim=================================================================== 226263320Sdim--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp 227263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp 228263320Sdim@@ -227,6 +227,26 @@ void CompileUnit::addLabel(DIEBlock *Die, dwarf::F 229263320Sdim addLabel(Die, (dwarf::Attribute)0, Form, Label); 230263320Sdim } 231263320Sdim 232263320Sdim+/// addSectionLabel - Add a Dwarf section label attribute data and value. 233263320Sdim+/// 234263320Sdim+void CompileUnit::addSectionLabel(DIE *Die, dwarf::Attribute Attribute, 235263320Sdim+ const MCSymbol *Label) { 236263320Sdim+ if (DD->getDwarfVersion() >= 4) 237263320Sdim+ addLabel(Die, Attribute, dwarf::DW_FORM_sec_offset, Label); 238263320Sdim+ else 239263320Sdim+ addLabel(Die, Attribute, dwarf::DW_FORM_data4, Label); 240263320Sdim+} 241263320Sdim+ 242263320Sdim+/// addSectionOffset - Add an offset into a section attribute data and value. 243263320Sdim+/// 244263320Sdim+void CompileUnit::addSectionOffset(DIE *Die, dwarf::Attribute Attribute, 245263320Sdim+ uint64_t Integer) { 246263320Sdim+ if (DD->getDwarfVersion() >= 4) 247263320Sdim+ addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer); 248263320Sdim+ else 249263320Sdim+ addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer); 250263320Sdim+} 251263320Sdim+ 252263320Sdim /// addLabelAddress - Add a dwarf label attribute data and value using 253263320Sdim /// DW_FORM_addr or DW_FORM_GNU_addr_index. 254263320Sdim /// 255263320Sdim@@ -264,13 +284,15 @@ void CompileUnit::addOpAddress(DIEBlock *Die, cons 256263320Sdim } 257263320Sdim } 258263320Sdim 259263320Sdim-/// addDelta - Add a label delta attribute data and value. 260263320Sdim+/// addSectionDelta - Add a section label delta attribute data and value. 261263320Sdim /// 262263320Sdim-void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute, 263263320Sdim- dwarf::Form Form, const MCSymbol *Hi, 264263320Sdim- const MCSymbol *Lo) { 265263320Sdim+void CompileUnit::addSectionDelta(DIE *Die, dwarf::Attribute Attribute, 266263320Sdim+ const MCSymbol *Hi, const MCSymbol *Lo) { 267263320Sdim DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo); 268263320Sdim- Die->addValue(Attribute, Form, Value); 269263320Sdim+ if (DD->getDwarfVersion() >= 4) 270263320Sdim+ Die->addValue(Attribute, dwarf::DW_FORM_sec_offset, Value); 271263320Sdim+ else 272263320Sdim+ Die->addValue(Attribute, dwarf::DW_FORM_data4, Value); 273263320Sdim } 274263320Sdim 275263320Sdim /// addDIEEntry - Add a DIE attribute data and value. 276263320Sdim@@ -1768,10 +1790,8 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable 277263320Sdim 278263320Sdim unsigned Offset = DV.getDotDebugLocOffset(); 279263320Sdim if (Offset != ~0U) { 280263320Sdim- addLabel(VariableDie, dwarf::DW_AT_location, 281263320Sdim- DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset 282263320Sdim- : dwarf::DW_FORM_data4, 283263320Sdim- Asm->GetTempSymbol("debug_loc", Offset)); 284263320Sdim+ addSectionLabel(VariableDie, dwarf::DW_AT_location, 285263320Sdim+ Asm->GetTempSymbol("debug_loc", Offset)); 286263320Sdim DV.setDIE(VariableDie); 287263320Sdim return VariableDie; 288263320Sdim } 289263320SdimIndex: lib/CodeGen/AsmPrinter/DwarfCompileUnit.h 290263320Sdim=================================================================== 291263320Sdim--- lib/CodeGen/AsmPrinter/DwarfCompileUnit.h 292263320Sdim+++ lib/CodeGen/AsmPrinter/DwarfCompileUnit.h 293263320Sdim@@ -209,6 +209,14 @@ class CompileUnit { 294263320Sdim 295263320Sdim void addLabel(DIEBlock *Die, dwarf::Form Form, const MCSymbol *Label); 296263320Sdim 297263320Sdim+ /// addSectionLabel - Add a Dwarf section label attribute data and value. 298263320Sdim+ /// 299263320Sdim+ void addSectionLabel(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Label); 300263320Sdim+ 301263320Sdim+ /// addSectionOffset - Add an offset into a section attribute data and value. 302263320Sdim+ /// 303263320Sdim+ void addSectionOffset(DIE *Die, dwarf::Attribute Attribute, uint64_t Integer); 304263320Sdim+ 305263320Sdim /// addLabelAddress - Add a dwarf label attribute data and value using 306263320Sdim /// either DW_FORM_addr or DW_FORM_GNU_addr_index. 307263320Sdim /// 308263320Sdim@@ -219,10 +227,9 @@ class CompileUnit { 309263320Sdim /// 310263320Sdim void addOpAddress(DIEBlock *Die, const MCSymbol *Label); 311263320Sdim 312263320Sdim- /// addDelta - Add a label delta attribute data and value. 313263320Sdim- /// 314263320Sdim- void addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form, const MCSymbol *Hi, 315263320Sdim- const MCSymbol *Lo); 316263320Sdim+ /// addSectionDelta - Add a label delta attribute data and value. 317263320Sdim+ void addSectionDelta(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Hi, 318263320Sdim+ const MCSymbol *Lo); 319263320Sdim 320263320Sdim /// addDIEEntry - Add a DIE attribute data and value. 321263320Sdim /// 322263320SdimIndex: test/DebugInfo/X86/gnu-public-names.ll 323263320Sdim=================================================================== 324263320Sdim--- test/DebugInfo/X86/gnu-public-names.ll 325263320Sdim+++ test/DebugInfo/X86/gnu-public-names.ll 326263320Sdim@@ -1,5 +1,6 @@ 327263320Sdim ; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections < %s | FileCheck -check-prefix=ASM %s 328263320Sdim ; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s 329263320Sdim+; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections -filetype=obj -dwarf-version=3 < %s | llvm-dwarfdump - | FileCheck %s -check-prefix=DWARF3 330263320Sdim ; ModuleID = 'dwarf-public-names.cpp' 331263320Sdim ; 332263320Sdim ; Generated from: 333263320Sdim@@ -123,6 +124,85 @@ 334263320Sdim ; CHECK-DAG: [[D]] EXTERNAL TYPE "ns::D" 335263320Sdim ; CHECK-DAG: [[INT]] STATIC TYPE "int" 336263320Sdim 337263320Sdim+; DWARF3: .debug_info contents: 338263320Sdim+; DWARF3: DW_AT_GNU_pubnames [DW_FORM_data4] (0x00000000) 339263320Sdim+; DWARF3: DW_AT_GNU_pubtypes [DW_FORM_data4] (0x00000000) 340263320Sdim+ 341263320Sdim+; DWARF3: [[C:[0-9a-f]+]]: DW_TAG_structure_type 342263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "C" 343263320Sdim+ 344263320Sdim+; DWARF3: [[STATIC_MEM_DECL:[0-9a-f]+]]: DW_TAG_member 345263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_variable" 346263320Sdim+ 347263320Sdim+; DWARF3: [[MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram 348263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name 349263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "member_function" 350263320Sdim+ 351263320Sdim+; DWARF3: [[STATIC_MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram 352263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name 353263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_function" 354263320Sdim+ 355263320Sdim+; DWARF3: [[INT:[0-9a-f]+]]: DW_TAG_base_type 356263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "int" 357263320Sdim+ 358263320Sdim+; DWARF3: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable 359263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]] 360263320Sdim+ 361263320Sdim+; DWARF3: [[GLOB_VAR:[0-9a-f]+]]: DW_TAG_variable 362263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_variable" 363263320Sdim+ 364263320Sdim+; DWARF3: [[NS:[0-9a-f]+]]: DW_TAG_namespace 365263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "ns" 366263320Sdim+ 367263320Sdim+; DWARF3: [[GLOB_NS_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable 368263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_variable" 369263320Sdim+ 370263320Sdim+; DWARF3: [[D_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable 371263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "d" 372263320Sdim+ 373263320Sdim+; DWARF3: [[D:[0-9a-f]+]]: DW_TAG_structure_type 374263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "D" 375263320Sdim+ 376263320Sdim+; DWARF3: [[GLOB_NS_FUNC:[0-9a-f]+]]: DW_TAG_subprogram 377263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name 378263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_function" 379263320Sdim+ 380263320Sdim+; DWARF3: [[GLOB_NS_VAR:[0-9a-f]+]]: DW_TAG_variable 381263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[GLOB_NS_VAR_DECL]] 382263320Sdim+ 383263320Sdim+; DWARF3: [[D_VAR:[0-9a-f]+]]: DW_TAG_variable 384263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[D_VAR_DECL]] 385263320Sdim+ 386263320Sdim+; DWARF3: [[MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram 387263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[MEM_FUNC_DECL]] 388263320Sdim+ 389263320Sdim+; DWARF3: [[STATIC_MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram 390263320Sdim+; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_FUNC_DECL]] 391263320Sdim+ 392263320Sdim+; DWARF3: [[GLOBAL_FUNC:[0-9a-f]+]]: DW_TAG_subprogram 393263320Sdim+; DWARF3-NEXT: DW_AT_MIPS_linkage_name 394263320Sdim+; DWARF3-NEXT: DW_AT_name {{.*}} "global_function" 395263320Sdim+ 396263320Sdim+; DWARF3-LABEL: .debug_gnu_pubnames contents: 397263320Sdim+; DWARF3-NEXT: length = 0x000000e7 version = 0x0002 unit_offset = 0x00000000 unit_size = 0x0000018b 398263320Sdim+; DWARF3-NEXT: Offset Linkage Kind Name 399263320Sdim+; DWARF3-DAG: [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function" 400263320Sdim+; DWARF3-DAG: [[NS]] EXTERNAL TYPE "ns" 401263320Sdim+; DWARF3-DAG: [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function" 402263320Sdim+; DWARF3-DAG: [[GLOB_VAR]] EXTERNAL VARIABLE "global_variable" 403263320Sdim+; DWARF3-DAG: [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable" 404263320Sdim+; DWARF3-DAG: [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function" 405263320Sdim+; DWARF3-DAG: [[D_VAR]] EXTERNAL VARIABLE "ns::d" 406263320Sdim+; DWARF3-DAG: [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable" 407263320Sdim+; DWARF3-DAG: [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function" 408263320Sdim+ 409263320Sdim+ 410263320Sdim+; DWARF3-LABEL: debug_gnu_pubtypes contents: 411263320Sdim+; DWARF3: Offset Linkage Kind Name 412263320Sdim+; DWARF3-DAG: [[C]] EXTERNAL TYPE "C" 413263320Sdim+; DWARF3-DAG: [[D]] EXTERNAL TYPE "ns::D" 414263320Sdim+; DWARF3-DAG: [[INT]] STATIC TYPE "int" 415263320Sdim+ 416263320Sdim %struct.C = type { i8 } 417263320Sdim %"struct.ns::D" = type { i32 } 418263320Sdim 419263320SdimIndex: test/DebugInfo/X86/stmt-list-multiple-compile-units.ll 420263320Sdim=================================================================== 421263320Sdim--- test/DebugInfo/X86/stmt-list-multiple-compile-units.ll 422263320Sdim+++ test/DebugInfo/X86/stmt-list-multiple-compile-units.ll 423263320Sdim@@ -1,5 +1,7 @@ 424263320Sdim ; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t 425263320Sdim ; RUN: llvm-dwarfdump %t | FileCheck %s 426263320Sdim+; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t -dwarf-version=3 427263320Sdim+; RUN: llvm-dwarfdump %t | FileCheck %s -check-prefix=DWARF3 428263320Sdim ; RUN: llc < %s -O0 -mtriple=x86_64-apple-macosx10.7 | FileCheck %s -check-prefix=ASM 429263320Sdim 430263320Sdim ; rdar://13067005 431263320Sdim@@ -6,11 +8,11 @@ 432263320Sdim ; CHECK: .debug_info contents: 433263320Sdim ; CHECK: DW_TAG_compile_unit 434263320Sdim ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 435263320Sdim-; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) 436263320Sdim+; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) 437263320Sdim 438263320Sdim ; CHECK: DW_TAG_compile_unit 439263320Sdim ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 440263320Sdim-; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) 441263320Sdim+; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c) 442263320Sdim 443263320Sdim ; CHECK: .debug_line contents: 444263320Sdim ; CHECK-NEXT: Line table prologue: 445263320Sdim@@ -21,6 +23,24 @@ 446263320Sdim ; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c 447263320Sdim ; CHECK-NOT: file_names 448263320Sdim 449263320Sdim+; DWARF3: .debug_info contents: 450263320Sdim+; DWARF3: DW_TAG_compile_unit 451263320Sdim+; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 452263320Sdim+; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) 453263320Sdim+ 454263320Sdim+; DWARF3: DW_TAG_compile_unit 455263320Sdim+; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) 456263320Sdim+; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) 457263320Sdim+ 458263320Sdim+; DWARF3: .debug_line contents: 459263320Sdim+; DWARF3-NEXT: Line table prologue: 460263320Sdim+; DWARF3-NEXT: total_length: 0x00000038 461263320Sdim+; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple.c 462263320Sdim+; DWARF3: Line table prologue: 463263320Sdim+; DWARF3-NEXT: total_length: 0x00000039 464263320Sdim+; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple2.c 465263320Sdim+; DWARF3-NOT: file_names 466263320Sdim+ 467263320Sdim ; PR15408 468263320Sdim ; ASM: L__DWARF__debug_info_begin0: 469263320Sdim ; ASM: .long 0 ## DW_AT_stmt_list 470263320SdimIndex: test/DebugInfo/X86/block-capture.ll 471263320Sdim=================================================================== 472263320Sdim--- test/DebugInfo/X86/block-capture.ll 473263320Sdim+++ test/DebugInfo/X86/block-capture.ll 474263320Sdim@@ -1,5 +1,7 @@ 475263320Sdim ; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj 476263320Sdim ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s 477263320Sdim+; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3 478263320Sdim+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3 479263320Sdim 480263320Sdim ; Checks that we emit debug info for the block variable declare. 481263320Sdim ; CHECK: DW_TAG_subprogram [3] 482263320Sdim@@ -7,6 +9,11 @@ 483263320Sdim ; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "block") 484263320Sdim ; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}}) 485263320Sdim 486263320Sdim+; DWARF3: DW_TAG_subprogram [3] 487263320Sdim+; DWARF3: DW_TAG_variable [5] 488263320Sdim+; DWARF3: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "block") 489263320Sdim+; DWARF3: DW_AT_location [DW_FORM_data4] ({{.*}}) 490263320Sdim+ 491263320Sdim %struct.__block_descriptor = type { i64, i64 } 492263320Sdim %struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* } 493263320Sdim 494263320SdimIndex: test/DebugInfo/X86/op_deref.ll 495263320Sdim=================================================================== 496263320Sdim--- test/DebugInfo/X86/op_deref.ll 497263320Sdim+++ test/DebugInfo/X86/op_deref.ll 498263320Sdim@@ -1,5 +1,7 @@ 499263320Sdim ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj 500263320Sdim ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DW-CHECK 501263320Sdim+; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3 502263320Sdim+; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3 503263320Sdim 504263320Sdim ; DW-CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla") 505263320Sdim ; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle 506263320Sdim@@ -6,6 +8,11 @@ 507263320Sdim ; DW_AT_location lists yet. 508263320Sdim ; DW-CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000) 509263320Sdim 510263320Sdim+; DWARF3: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla") 511263320Sdim+; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle 512263320Sdim+; DW_AT_location lists yet. 513263320Sdim+; DWARF3: DW_AT_location [DW_FORM_data4] (0x00000000) 514263320Sdim+ 515263320Sdim ; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations 516263320Sdim ; right now, so we check the asm output: 517263320Sdim ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - -filetype=asm | FileCheck %s -check-prefix=ASM-CHECK 518263320SdimIndex: test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll 519263320Sdim=================================================================== 520263320Sdim--- test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll 521263320Sdim+++ test/DebugInfo/X86/DW_AT_stmt_list_sec_offset.ll 522263320Sdim@@ -1,7 +1,10 @@ 523263320Sdim ; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj %s 524263320Sdim ; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s 525263320Sdim+; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj -dwarf-version=3 %s 526263320Sdim+; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s -check-prefix=DWARF3 527263320Sdim 528263320Sdim ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] 529263320Sdim+; DWARF3: DW_AT_stmt_list [DW_FORM_data4] 530263320Sdim ; 531263320Sdim ; generated from: 532263320Sdim ; clang -g -S -emit-llvm test.c -o test.ll 533263320Sdim@@ -36,6 +39,6 @@ attributes #0 = { nounwind "less-precise-fpmad"="f 534263320Sdim !6 = metadata !{i32 786453, i32 0, null, metadata !"", i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ] 535263320Sdim !7 = metadata !{metadata !8} 536263320Sdim !8 = metadata !{i32 786468, null, null, metadata !"int", i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed] 537263320Sdim-!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3} 538263320Sdim+!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4} 539263320Sdim !10 = metadata !{i32 3, i32 0, metadata !4, null} 540263320Sdim !11 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} 541