In Dwarf 3 (and Dwarf 2) attributes whose value are offsets into a

section use the form DW_FORM_data4 whilst in Dwarf 4 and later they
use the form DW_FORM_sec_offset.

This patch updates the places where such attributes are generated to
use the appropriate form depending on the Dwarf version. The DIE entries
affected have the following tags:
DW_AT_stmt_list, DW_AT_ranges, DW_AT_location, DW_AT_GNU_pubnames,
DW_AT_GNU_pubtypes, DW_AT_GNU_addr_base, DW_AT_GNU_ranges_base

It also adds a hidden command line option "--dwarf-version=<uint>"
to llc which allows the version of Dwarf to be generated to override
what is specified in the metadata; this makes it possible to update
existing tests to check the debugging information generated for both
Dwarf 4 (the default) and Dwarf 3 using the same metadata.

Patch (slightly modified) by Keith Walker!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195391 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher
2013-11-21 23:46:41 +00:00
parent 46f7257ed1
commit 2d5d104c5b
9 changed files with 250 additions and 93 deletions

View File

@@ -341,6 +341,7 @@ void DIEDelta::EmitValue(AsmPrinter *AP, dwarf::Form Form) const {
///
unsigned DIEDelta::SizeOf(AsmPrinter *AP, dwarf::Form Form) const {
if (Form == dwarf::DW_FORM_data4) return 4;
if (Form == dwarf::DW_FORM_sec_offset) return 4;
if (Form == dwarf::DW_FORM_strp) return 4;
return AP->getDataLayout().getPointerSize();
}

View File

@@ -245,6 +245,26 @@ void CompileUnit::addLabel(DIEBlock *Die, dwarf::Form Form,
addLabel(Die, (dwarf::Attribute)0, Form, Label);
}
/// addSectionLabel - Add a Dwarf section label attribute data and value.
///
void CompileUnit::addSectionLabel(DIE *Die, dwarf::Attribute Attribute,
const MCSymbol *Label) {
if (DD->getDwarfVersion() >= 4)
addLabel(Die, Attribute, dwarf::DW_FORM_sec_offset, Label);
else
addLabel(Die, Attribute, dwarf::DW_FORM_data4, Label);
}
/// addSectionOffset - Add an offset into a section attribute data and value.
///
void CompileUnit::addSectionOffset(DIE *Die, dwarf::Attribute Attribute,
uint64_t Integer) {
if (DD->getDwarfVersion() >= 4)
addUInt(Die, Attribute, dwarf::DW_FORM_sec_offset, Integer);
else
addUInt(Die, Attribute, dwarf::DW_FORM_data4, Integer);
}
/// addLabelAddress - Add a dwarf label attribute data and value using
/// DW_FORM_addr or DW_FORM_GNU_addr_index.
///
@@ -282,13 +302,15 @@ void CompileUnit::addOpAddress(DIEBlock *Die, const MCSymbol *Sym) {
}
}
/// addDelta - Add a label delta attribute data and value.
/// addSectionDelta - Add a section label delta attribute data and value.
///
void CompileUnit::addDelta(DIE *Die, dwarf::Attribute Attribute,
dwarf::Form Form, const MCSymbol *Hi,
const MCSymbol *Lo) {
void CompileUnit::addSectionDelta(DIE *Die, dwarf::Attribute Attribute,
const MCSymbol *Hi, const MCSymbol *Lo) {
DIEValue *Value = new (DIEValueAllocator) DIEDelta(Hi, Lo);
Die->addValue(Attribute, Form, Value);
if (DD->getDwarfVersion() >= 4)
Die->addValue(Attribute, dwarf::DW_FORM_sec_offset, Value);
else
Die->addValue(Attribute, dwarf::DW_FORM_data4, Value);
}
/// addDIEEntry - Add a DIE attribute data and value.
@@ -1814,9 +1836,7 @@ DIE *CompileUnit::constructVariableDIE(DbgVariable &DV, bool isScopeAbstract) {
unsigned Offset = DV.getDotDebugLocOffset();
if (Offset != ~0U) {
addLabel(VariableDie, dwarf::DW_AT_location,
DD->getDwarfVersion() >= 4 ? dwarf::DW_FORM_sec_offset
: dwarf::DW_FORM_data4,
addSectionLabel(VariableDie, dwarf::DW_AT_location,
Asm->GetTempSymbol("debug_loc", Offset));
DV.setDIE(VariableDie);
return VariableDie;

View File

@@ -212,6 +212,14 @@ public:
void addLabel(DIEBlock *Die, dwarf::Form Form, const MCSymbol *Label);
/// addSectionLabel - Add a Dwarf section label attribute data and value.
///
void addSectionLabel(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Label);
/// addSectionOffset - Add an offset into a section attribute data and value.
///
void addSectionOffset(DIE *Die, dwarf::Attribute Attribute, uint64_t Integer);
/// addLabelAddress - Add a dwarf label attribute data and value using
/// either DW_FORM_addr or DW_FORM_GNU_addr_index.
void addLabelAddress(DIE *Die, dwarf::Attribute Attribute, MCSymbol *Label);
@@ -220,9 +228,9 @@ public:
/// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index.
void addOpAddress(DIEBlock *Die, const MCSymbol *Label);
/// addDelta - Add a label delta attribute data and value.
void addDelta(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form,
const MCSymbol *Hi, const MCSymbol *Lo);
/// addSectionDelta - Add a label delta attribute data and value.
void addSectionDelta(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Hi,
const MCSymbol *Lo);
/// addDIEEntry - Add a DIE attribute data and value.
void addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry);

View File

@@ -104,6 +104,11 @@ DwarfPubSections("generate-dwarf-pub-sections", cl::Hidden,
clEnumVal(Disable, "Disabled"), clEnumValEnd),
cl::init(Default));
static cl::opt<unsigned>
DwarfVersionNumber("dwarf-version", cl::Hidden,
cl::desc("Generate DWARF for dwarf version."),
cl::init(0));
static const char *const DWARFGroupName = "DWARF Emission";
static const char *const DbgTimerName = "DWARF Debug Writer";
@@ -212,7 +217,9 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
else
HasDwarfPubSections = DwarfPubSections == Enable;
DwarfVersion = getDwarfVersionFromModule(MMI->getModule());
DwarfVersion = DwarfVersionNumber
? DwarfVersionNumber
: getDwarfVersionFromModule(MMI->getModule());
{
NamedRegionTimer T(DbgTimerName, DWARFGroupName, TimePassesIsEnabled);
@@ -470,7 +477,7 @@ DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
// .debug_range section has not been laid out yet. Emit offset in
// .debug_range as a uint, size 4, for now. emitDIE will handle
// DW_AT_ranges appropriately.
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges,
DebugRangeSymbols.size() *
Asm->getDataLayout().getPointerSize());
for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
@@ -526,7 +533,7 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
// .debug_range section has not been laid out yet. Emit offset in
// .debug_range as a uint, size 4, for now. emitDIE will handle
// DW_AT_ranges appropriately.
TheCU->addUInt(ScopeDIE, dwarf::DW_AT_ranges, dwarf::DW_FORM_data4,
TheCU->addSectionOffset(ScopeDIE, dwarf::DW_AT_ranges,
DebugRangeSymbols.size() *
Asm->getDataLayout().getPointerSize());
for (SmallVectorImpl<InsnRange>::const_iterator RI = Ranges.begin(),
@@ -766,13 +773,14 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit DIUnit) {
// The line table entries are not always emitted in assembly, so it
// is not okay to use line_table_start here.
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(
Die, dwarf::DW_AT_stmt_list,
UseTheFirstCU ? Asm->GetTempSymbol("section_line")
: LineTableStartSym);
else if (UseTheFirstCU)
NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4, 0);
NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0);
else
NewCU->addDelta(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_data4,
NewCU->addSectionDelta(Die, dwarf::DW_AT_stmt_list,
LineTableStartSym, DwarfLineSectionSym);
// If we're using split dwarf the compilation dir is going to be in the
@@ -784,22 +792,22 @@ CompileUnit *DwarfDebug::constructCompileUnit(DICompileUnit DIUnit) {
// emit it here if we don't have a skeleton CU for split dwarf.
if (GenerateGnuPubSections) {
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(
Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(
Die, dwarf::DW_AT_GNU_pubnames,
Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
else
NewCU->addDelta(
Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
NewCU->addSectionDelta(
Die, dwarf::DW_AT_GNU_pubnames,
Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
DwarfGnuPubNamesSectionSym);
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(
Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(
Die, dwarf::DW_AT_GNU_pubtypes,
Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
else
NewCU->addDelta(
Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
NewCU->addSectionDelta(
Die, dwarf::DW_AT_GNU_pubtypes,
Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()),
DwarfGnuPubTypesSectionSym);
}
@@ -2957,11 +2965,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
// Relocate to the beginning of the addr_base section, else 0 for the
// beginning of the one for this compile unit.
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_addr_base,
DwarfAddrSectionSym);
else
NewCU->addUInt(Die, dwarf::DW_AT_GNU_addr_base, dwarf::DW_FORM_sec_offset,
0);
NewCU->addSectionOffset(Die, dwarf::DW_AT_GNU_addr_base, 0);
// 2.17.1 requires that we use DW_AT_low_pc for a single entry point
// into an entity. We're using 0, or a NULL label for this.
@@ -2971,10 +2978,10 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
// compile unit in debug_line section.
// FIXME: Should handle multiple compile units.
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(Die, dwarf::DW_AT_stmt_list,
DwarfLineSectionSym);
else
NewCU->addUInt(Die, dwarf::DW_AT_stmt_list, dwarf::DW_FORM_sec_offset, 0);
NewCU->addSectionOffset(Die, dwarf::DW_AT_stmt_list, 0);
if (!CompilationDir.empty())
NewCU->addLocalString(Die, dwarf::DW_AT_comp_dir, CompilationDir);
@@ -2982,18 +2989,22 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
// Flags to let the linker know we have emitted new style pubnames.
if (GenerateGnuPubSections) {
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(
Die, dwarf::DW_AT_GNU_pubnames,
Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()));
else
NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubnames, dwarf::DW_FORM_data4,
NewCU->addSectionDelta(
Die, dwarf::DW_AT_GNU_pubnames,
Asm->GetTempSymbol("gnu_pubnames", NewCU->getUniqueID()),
DwarfGnuPubNamesSectionSym);
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_sec_offset,
NewCU->addSectionLabel(
Die, dwarf::DW_AT_GNU_pubtypes,
Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()));
else
NewCU->addDelta(Die, dwarf::DW_AT_GNU_pubtypes, dwarf::DW_FORM_data4,
NewCU->addSectionDelta(
Die, dwarf::DW_AT_GNU_pubtypes,
Asm->GetTempSymbol("gnu_pubtypes", NewCU->getUniqueID()),
DwarfGnuPubTypesSectionSym);
}
@@ -3001,8 +3012,8 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const CompileUnit *CU) {
// Flag if we've emitted any ranges and their location for the compile unit.
if (DebugRangeSymbols.size()) {
if (Asm->MAI->doesDwarfUseRelocationsAcrossSections())
NewCU->addLabel(Die, dwarf::DW_AT_GNU_ranges_base,
dwarf::DW_FORM_sec_offset, DwarfDebugRangeSectionSym);
NewCU->addSectionLabel(Die, dwarf::DW_AT_GNU_ranges_base,
DwarfDebugRangeSectionSym);
else
NewCU->addUInt(Die, dwarf::DW_AT_GNU_ranges_base, dwarf::DW_FORM_data4,
0);

View File

@@ -1,7 +1,10 @@
; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj %s
; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s
; RUN: llc -mtriple=i686-w64-mingw32 -o %t -filetype=obj -dwarf-version=3 %s
; RUN: llvm-dwarfdump -debug-dump=all %t | FileCheck %s -check-prefix=DWARF3
; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset]
; DWARF3: DW_AT_stmt_list [DW_FORM_data4]
;
; generated from:
; clang -g -S -emit-llvm test.c -o test.ll
@@ -36,5 +39,5 @@ attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"=
!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 ]
!7 = metadata !{metadata !8}
!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]
!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 3}
!9 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}
!10 = metadata !{i32 3, i32 0, metadata !4, null}

View File

@@ -1,5 +1,7 @@
; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s
; RUN: llc -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3
; Checks that we emit debug info for the block variable declare.
; CHECK: DW_TAG_subprogram [3]
@@ -7,6 +9,11 @@
; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "block")
; CHECK: DW_AT_location [DW_FORM_sec_offset] ({{.*}})
; DWARF3: DW_TAG_subprogram [3]
; DWARF3: DW_TAG_variable [5]
; DWARF3: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "block")
; DWARF3: DW_AT_location [DW_FORM_data4] ({{.*}})
%struct.__block_descriptor = type { i64, i64 }
%struct.__block_literal_generic = type { i8*, i32, i32, i8*, %struct.__block_descriptor* }

View File

@@ -1,5 +1,6 @@
; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections < %s | FileCheck -check-prefix=ASM %s
; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-gnu-dwarf-pub-sections -filetype=obj < %s | llvm-dwarfdump - | FileCheck %s
; 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
; ModuleID = 'dwarf-public-names.cpp'
;
; Generated from:
@@ -123,6 +124,85 @@
; CHECK-DAG: [[D]] EXTERNAL TYPE "ns::D"
; CHECK-DAG: [[INT]] STATIC TYPE "int"
; DWARF3: .debug_info contents:
; DWARF3: DW_AT_GNU_pubnames [DW_FORM_data4] (0x00000000)
; DWARF3: DW_AT_GNU_pubtypes [DW_FORM_data4] (0x00000000)
; DWARF3: [[C:[0-9a-f]+]]: DW_TAG_structure_type
; DWARF3-NEXT: DW_AT_name {{.*}} "C"
; DWARF3: [[STATIC_MEM_DECL:[0-9a-f]+]]: DW_TAG_member
; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_variable"
; DWARF3: [[MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_MIPS_linkage_name
; DWARF3-NEXT: DW_AT_name {{.*}} "member_function"
; DWARF3: [[STATIC_MEM_FUNC_DECL:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_MIPS_linkage_name
; DWARF3-NEXT: DW_AT_name {{.*}} "static_member_function"
; DWARF3: [[INT:[0-9a-f]+]]: DW_TAG_base_type
; DWARF3-NEXT: DW_AT_name {{.*}} "int"
; DWARF3: [[STATIC_MEM_VAR:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_DECL]]
; DWARF3: [[GLOB_VAR:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_name {{.*}} "global_variable"
; DWARF3: [[NS:[0-9a-f]+]]: DW_TAG_namespace
; DWARF3-NEXT: DW_AT_name {{.*}} "ns"
; DWARF3: [[GLOB_NS_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_variable"
; DWARF3: [[D_VAR_DECL:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_name {{.*}} "d"
; DWARF3: [[D:[0-9a-f]+]]: DW_TAG_structure_type
; DWARF3-NEXT: DW_AT_name {{.*}} "D"
; DWARF3: [[GLOB_NS_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_MIPS_linkage_name
; DWARF3-NEXT: DW_AT_name {{.*}} "global_namespace_function"
; DWARF3: [[GLOB_NS_VAR:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_specification {{.*}}[[GLOB_NS_VAR_DECL]]
; DWARF3: [[D_VAR:[0-9a-f]+]]: DW_TAG_variable
; DWARF3-NEXT: DW_AT_specification {{.*}}[[D_VAR_DECL]]
; DWARF3: [[MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_specification {{.*}}[[MEM_FUNC_DECL]]
; DWARF3: [[STATIC_MEM_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_specification {{.*}}[[STATIC_MEM_FUNC_DECL]]
; DWARF3: [[GLOBAL_FUNC:[0-9a-f]+]]: DW_TAG_subprogram
; DWARF3-NEXT: DW_AT_MIPS_linkage_name
; DWARF3-NEXT: DW_AT_name {{.*}} "global_function"
; DWARF3-LABEL: .debug_gnu_pubnames contents:
; DWARF3-NEXT: length = 0x000000e7 version = 0x0002 unit_offset = 0x00000000 unit_size = 0x0000018b
; DWARF3-NEXT: Offset Linkage Kind Name
; DWARF3-DAG: [[GLOBAL_FUNC]] EXTERNAL FUNCTION "global_function"
; DWARF3-DAG: [[NS]] EXTERNAL TYPE "ns"
; DWARF3-DAG: [[MEM_FUNC]] EXTERNAL FUNCTION "C::member_function"
; DWARF3-DAG: [[GLOB_VAR]] EXTERNAL VARIABLE "global_variable"
; DWARF3-DAG: [[GLOB_NS_VAR]] EXTERNAL VARIABLE "ns::global_namespace_variable"
; DWARF3-DAG: [[GLOB_NS_FUNC]] EXTERNAL FUNCTION "ns::global_namespace_function"
; DWARF3-DAG: [[D_VAR]] EXTERNAL VARIABLE "ns::d"
; DWARF3-DAG: [[STATIC_MEM_VAR]] EXTERNAL VARIABLE "C::static_member_variable"
; DWARF3-DAG: [[STATIC_MEM_FUNC]] EXTERNAL FUNCTION "C::static_member_function"
; DWARF3-LABEL: debug_gnu_pubtypes contents:
; DWARF3: Offset Linkage Kind Name
; DWARF3-DAG: [[C]] EXTERNAL TYPE "C"
; DWARF3-DAG: [[D]] EXTERNAL TYPE "ns::D"
; DWARF3-DAG: [[INT]] STATIC TYPE "int"
%struct.C = type { i8 }
%"struct.ns::D" = type { i32 }

View File

@@ -1,11 +1,18 @@
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DW-CHECK
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3
; DW-CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla")
; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
; DW_AT_location lists yet.
; DW-CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
; DWARF3: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla")
; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
; DW_AT_location lists yet.
; DWARF3: DW_AT_location [DW_FORM_data4] (0x00000000)
; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations
; right now, so we check the asm output:
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - -filetype=asm | FileCheck %s -check-prefix=ASM-CHECK

View File

@@ -1,16 +1,18 @@
; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t
; RUN: llvm-dwarfdump %t | FileCheck %s
; RUN: llc -O0 %s -mtriple=x86_64-apple-darwin -filetype=obj -o %t -dwarf-version=3
; RUN: llvm-dwarfdump %t | FileCheck %s -check-prefix=DWARF3
; RUN: llc < %s -O0 -mtriple=x86_64-apple-macosx10.7 | FileCheck %s -check-prefix=ASM
; rdar://13067005
; CHECK: .debug_info contents:
; CHECK: DW_TAG_compile_unit
; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x00000000)
; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
; CHECK: DW_TAG_compile_unit
; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; CHECK: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c)
; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c)
; CHECK: .debug_line contents:
; CHECK-NEXT: Line table prologue:
@@ -21,6 +23,24 @@
; CHECK: file_names[ 1] 0 0x00000000 0x00000000 simple2.c
; CHECK-NOT: file_names
; DWARF3: .debug_info contents:
; DWARF3: DW_TAG_compile_unit
; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000)
; DWARF3: DW_TAG_compile_unit
; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000)
; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c)
; DWARF3: .debug_line contents:
; DWARF3-NEXT: Line table prologue:
; DWARF3-NEXT: total_length: 0x00000038
; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple.c
; DWARF3: Line table prologue:
; DWARF3-NEXT: total_length: 0x00000039
; DWARF3: file_names[ 1] 0 0x00000000 0x00000000 simple2.c
; DWARF3-NOT: file_names
; PR15408
; ASM: L__DWARF__debug_info_begin0:
; ASM: .long 0 ## DW_AT_stmt_list