mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
DebugInfo: Following up to r209677, refactor local variable emission to delay the choice between emitting the definition attributes or using DW_AT_abstract_definition
This doesn't fix the abstract variable handling yet, but it introduces a similar delay mechanism as was added for subprograms, causing DW_AT_location to be reordered to the beginning of the attribute list for local variables, and fixes all the test fallout for that. A subsequent commit will remove the abstract variable handling in DbgVariable and just do the abstract variable lookup at module end to ensure that abstract variables introduced after their concrete counterparts are appropriately referenced by the concrete variable. llvm-svn: 210943
This commit is contained in:
parent
5712aace0c
commit
33f6d6743b
@ -783,6 +783,23 @@ void DwarfDebug::beginModule() {
|
|||||||
SectionMap[Asm->getObjFileLowering().getTextSection()];
|
SectionMap[Asm->getObjFileLowering().getTextSection()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DwarfDebug::finishVariableDefinitions() {
|
||||||
|
for (const auto &Var : ConcreteVariables) {
|
||||||
|
DIE *VariableDie = Var->getDIE();
|
||||||
|
// FIXME: Consider the time-space tradeoff of just storing the unit pointer
|
||||||
|
// in the ConcreteVariables list, rather than looking it up again here.
|
||||||
|
// DIE::getUnit isn't simple - it walks parent pointers, etc.
|
||||||
|
DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
|
||||||
|
assert(Unit);
|
||||||
|
DbgVariable *AbsVar = Var->getAbstractVariable();
|
||||||
|
if (AbsVar && AbsVar->getDIE()) {
|
||||||
|
Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
|
||||||
|
*AbsVar->getDIE());
|
||||||
|
} else
|
||||||
|
Unit->applyVariableAttributes(*Var, *VariableDie);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DwarfDebug::finishSubprogramDefinitions() {
|
void DwarfDebug::finishSubprogramDefinitions() {
|
||||||
const Module *M = MMI->getModule();
|
const Module *M = MMI->getModule();
|
||||||
|
|
||||||
@ -849,7 +866,9 @@ void DwarfDebug::collectDeadVariables() {
|
|||||||
DIVariable DV(Variables.getElement(vi));
|
DIVariable DV(Variables.getElement(vi));
|
||||||
assert(DV.isVariable());
|
assert(DV.isVariable());
|
||||||
DbgVariable NewVar(DV, nullptr, this);
|
DbgVariable NewVar(DV, nullptr, this);
|
||||||
SPDIE->addChild(SPCU->constructVariableDIE(NewVar));
|
auto VariableDie = SPCU->constructVariableDIE(NewVar);
|
||||||
|
SPCU->applyVariableAttributes(NewVar, *VariableDie);
|
||||||
|
SPDIE->addChild(std::move(VariableDie));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -859,6 +878,8 @@ void DwarfDebug::collectDeadVariables() {
|
|||||||
void DwarfDebug::finalizeModuleInfo() {
|
void DwarfDebug::finalizeModuleInfo() {
|
||||||
finishSubprogramDefinitions();
|
finishSubprogramDefinitions();
|
||||||
|
|
||||||
|
finishVariableDefinitions();
|
||||||
|
|
||||||
// Collect info for variables that were optimized out.
|
// Collect info for variables that were optimized out.
|
||||||
collectDeadVariables();
|
collectDeadVariables();
|
||||||
|
|
||||||
@ -1126,7 +1147,8 @@ void DwarfDebug::collectVariableInfoFromMMITable(
|
|||||||
|
|
||||||
DbgVariable *AbsDbgVariable =
|
DbgVariable *AbsDbgVariable =
|
||||||
findAbstractVariable(DV, Scope->getScopeNode());
|
findAbstractVariable(DV, Scope->getScopeNode());
|
||||||
DbgVariable *RegVar = new DbgVariable(DV, AbsDbgVariable, this);
|
ConcreteVariables.push_back(make_unique<DbgVariable>(DV, AbsDbgVariable, this));
|
||||||
|
DbgVariable *RegVar = ConcreteVariables.back().get();
|
||||||
RegVar->setFrameIndex(VI.Slot);
|
RegVar->setFrameIndex(VI.Slot);
|
||||||
addScopeVariable(Scope, RegVar);
|
addScopeVariable(Scope, RegVar);
|
||||||
}
|
}
|
||||||
@ -1194,7 +1216,8 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
|
|||||||
const MachineInstr *MInsn = Ranges.front().first;
|
const MachineInstr *MInsn = Ranges.front().first;
|
||||||
assert(MInsn->isDebugValue() && "History must begin with debug value");
|
assert(MInsn->isDebugValue() && "History must begin with debug value");
|
||||||
DbgVariable *AbsVar = findAbstractVariable(DV, Scope->getScopeNode());
|
DbgVariable *AbsVar = findAbstractVariable(DV, Scope->getScopeNode());
|
||||||
DbgVariable *RegVar = new DbgVariable(MInsn, AbsVar, this);
|
ConcreteVariables.push_back(make_unique<DbgVariable>(MInsn, AbsVar, this));
|
||||||
|
DbgVariable *RegVar = ConcreteVariables.back().get();
|
||||||
addScopeVariable(Scope, RegVar);
|
addScopeVariable(Scope, RegVar);
|
||||||
|
|
||||||
// Check if the first DBG_VALUE is valid for the rest of the function.
|
// Check if the first DBG_VALUE is valid for the rest of the function.
|
||||||
@ -1250,9 +1273,9 @@ DwarfDebug::collectVariableInfo(SmallPtrSet<const MDNode *, 16> &Processed) {
|
|||||||
if (!Processed.insert(DV))
|
if (!Processed.insert(DV))
|
||||||
continue;
|
continue;
|
||||||
if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {
|
if (LexicalScope *Scope = LScopes.findLexicalScope(DV.getContext())) {
|
||||||
auto *RegVar = new DbgVariable(
|
ConcreteVariables.push_back(make_unique<DbgVariable>(
|
||||||
DV, findAbstractVariable(DV, Scope->getScopeNode()), this);
|
DV, findAbstractVariable(DV, Scope->getScopeNode()), this));
|
||||||
addScopeVariable(Scope, RegVar);
|
addScopeVariable(Scope, ConcreteVariables.back().get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1554,12 +1577,8 @@ void DwarfDebug::endFunction(const MachineFunction *MF) {
|
|||||||
// Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
|
// Ownership of DbgVariables is a bit subtle - ScopeVariables owns all the
|
||||||
// DbgVariables except those that are also in AbstractVariables (since they
|
// DbgVariables except those that are also in AbstractVariables (since they
|
||||||
// can be used cross-function)
|
// can be used cross-function)
|
||||||
for (const auto &I : ScopeVariables)
|
|
||||||
for (const auto *Var : I.second)
|
|
||||||
if (!AbstractVariables.count(Var->getVariable()) || Var->getAbstractVariable())
|
|
||||||
delete Var;
|
|
||||||
ScopeVariables.clear();
|
ScopeVariables.clear();
|
||||||
DeleteContainerPointers(CurrentFnArguments);
|
CurrentFnArguments.clear();
|
||||||
DbgValues.clear();
|
DbgValues.clear();
|
||||||
LabelsBeforeInsn.clear();
|
LabelsBeforeInsn.clear();
|
||||||
LabelsAfterInsn.clear();
|
LabelsAfterInsn.clear();
|
||||||
|
@ -209,6 +209,7 @@ class DwarfDebug : public AsmPrinterHandler {
|
|||||||
|
|
||||||
// Collection of abstract variables.
|
// Collection of abstract variables.
|
||||||
DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables;
|
DenseMap<const MDNode *, std::unique_ptr<DbgVariable>> AbstractVariables;
|
||||||
|
SmallVector<std::unique_ptr<DbgVariable>, 64> ConcreteVariables;
|
||||||
|
|
||||||
// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
|
// Collection of DebugLocEntry. Stored in a linked list so that DIELocLists
|
||||||
// can refer to them in spite of insertions into this list.
|
// can refer to them in spite of insertions into this list.
|
||||||
@ -402,6 +403,8 @@ class DwarfDebug : public AsmPrinterHandler {
|
|||||||
/// \brief Collect info for variables that were optimized out.
|
/// \brief Collect info for variables that were optimized out.
|
||||||
void collectDeadVariables();
|
void collectDeadVariables();
|
||||||
|
|
||||||
|
void finishVariableDefinitions();
|
||||||
|
|
||||||
void finishSubprogramDefinitions();
|
void finishSubprogramDefinitions();
|
||||||
|
|
||||||
/// \brief Finish off debug information after all functions have been
|
/// \brief Finish off debug information after all functions have been
|
||||||
|
@ -1514,6 +1514,17 @@ void DwarfUnit::applySubprogramAttributes(DISubprogram SP, DIE &SPDie) {
|
|||||||
addFlag(SPDie, dwarf::DW_AT_explicit);
|
addFlag(SPDie, dwarf::DW_AT_explicit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DwarfUnit::applyVariableAttributes(const DbgVariable &Var,
|
||||||
|
DIE &VariableDie) {
|
||||||
|
StringRef Name = Var.getName();
|
||||||
|
if (!Name.empty())
|
||||||
|
addString(VariableDie, dwarf::DW_AT_name, Name);
|
||||||
|
addSourceLine(VariableDie, Var.getVariable());
|
||||||
|
addType(VariableDie, Var.getType());
|
||||||
|
if (Var.isArtificial())
|
||||||
|
addFlag(VariableDie, dwarf::DW_AT_artificial);
|
||||||
|
}
|
||||||
|
|
||||||
// Return const expression if value is a GEP to access merged global
|
// Return const expression if value is a GEP to access merged global
|
||||||
// constant. e.g.
|
// constant. e.g.
|
||||||
// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
|
// i8* getelementptr ({ i8, i8, i8, i8 }* @_MergedGlobals, i32 0, i32 0)
|
||||||
@ -1787,24 +1798,13 @@ std::unique_ptr<DIE> DwarfUnit::constructVariableDIE(DbgVariable &DV,
|
|||||||
|
|
||||||
std::unique_ptr<DIE> DwarfUnit::constructVariableDIEImpl(const DbgVariable &DV,
|
std::unique_ptr<DIE> DwarfUnit::constructVariableDIEImpl(const DbgVariable &DV,
|
||||||
bool Abstract) {
|
bool Abstract) {
|
||||||
StringRef Name = DV.getName();
|
|
||||||
|
|
||||||
// Define variable debug information entry.
|
// Define variable debug information entry.
|
||||||
auto VariableDie = make_unique<DIE>(DV.getTag());
|
auto VariableDie = make_unique<DIE>(DV.getTag());
|
||||||
DbgVariable *AbsVar = DV.getAbstractVariable();
|
|
||||||
if (AbsVar && AbsVar->getDIE()) {
|
|
||||||
addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin, *AbsVar->getDIE());
|
|
||||||
} else {
|
|
||||||
if (!Name.empty())
|
|
||||||
addString(*VariableDie, dwarf::DW_AT_name, Name);
|
|
||||||
addSourceLine(*VariableDie, DV.getVariable());
|
|
||||||
addType(*VariableDie, DV.getType());
|
|
||||||
if (DV.isArtificial())
|
|
||||||
addFlag(*VariableDie, dwarf::DW_AT_artificial);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Abstract)
|
if (Abstract) {
|
||||||
|
applyVariableAttributes(DV, *VariableDie);
|
||||||
return VariableDie;
|
return VariableDie;
|
||||||
|
}
|
||||||
|
|
||||||
// Add variable address.
|
// Add variable address.
|
||||||
|
|
||||||
|
@ -401,6 +401,7 @@ public:
|
|||||||
|
|
||||||
void applySubprogramAttributes(DISubprogram SP, DIE &SPDie);
|
void applySubprogramAttributes(DISubprogram SP, DIE &SPDie);
|
||||||
void applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie);
|
void applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie);
|
||||||
|
void applyVariableAttributes(const DbgVariable &Var, DIE &VariableDie);
|
||||||
|
|
||||||
/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
|
/// getOrCreateTypeDIE - Find existing DIE or create new DIE for the
|
||||||
/// given DIType.
|
/// given DIType.
|
||||||
|
@ -8,11 +8,11 @@ target triple = "x86_64-apple-darwin10.0.0"
|
|||||||
; CHECK: DW_TAG_subprogram
|
; CHECK: DW_TAG_subprogram
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
|
; CHECK-NEXT: DW_AT_location
|
||||||
; CHECK-NEXT: DW_AT_name {{.*}} "z_s"
|
; CHECK-NEXT: DW_AT_name {{.*}} "z_s"
|
||||||
; CHECK-NEXT: DW_AT_decl_file
|
; CHECK-NEXT: DW_AT_decl_file
|
||||||
; CHECK-NEXT: DW_AT_decl_line
|
; CHECK-NEXT: DW_AT_decl_line
|
||||||
; CHECK-NEXT: DW_AT_type{{.*}}{[[TYPE:.*]]}
|
; CHECK-NEXT: DW_AT_type{{.*}}{[[TYPE:.*]]}
|
||||||
; CHECK-NEXT: DW_AT_location
|
|
||||||
; CHECK: [[TYPE]]:
|
; CHECK: [[TYPE]]:
|
||||||
; CHECK-NEXT: DW_AT_name {{.*}} "int"
|
; CHECK-NEXT: DW_AT_name {{.*}} "int"
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@
|
|||||||
; CHECK: brasl %r14, populate_array@PLT
|
; CHECK: brasl %r14, populate_array@PLT
|
||||||
|
|
||||||
; DEBUG: DW_TAG_variable
|
; DEBUG: DW_TAG_variable
|
||||||
; DEBUG-NOT: DW_TAG
|
|
||||||
; DEBUG: DW_AT_name {{.*}} "main_arr"
|
|
||||||
; Rather hard-coded, but 0x91 => DW_OP_fbreg and 0xa401 is SLEB128 encoded 164.
|
; Rather hard-coded, but 0x91 => DW_OP_fbreg and 0xa401 is SLEB128 encoded 164.
|
||||||
; DEBUG-NOT: DW_TAG
|
; DEBUG-NOT: DW_TAG
|
||||||
; DEBUG: DW_AT_location {{.*}}(<0x3> 91 a4 01 )
|
; DEBUG: DW_AT_location {{.*}}(<0x3> 91 a4 01 )
|
||||||
|
; DEBUG-NOT: DW_TAG
|
||||||
|
; DEBUG: DW_AT_name {{.*}} "main_arr"
|
||||||
|
|
||||||
|
|
||||||
@.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 2
|
@.str = private unnamed_addr constant [13 x i8] c"Total is %d\0A\00", align 2
|
||||||
|
@ -31,11 +31,11 @@
|
|||||||
; // The 'x' variable and its symbol reference location
|
; // The 'x' variable and its symbol reference location
|
||||||
; CHECK: .debug_info contents:
|
; CHECK: .debug_info contents:
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
|
; CHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
|
||||||
; CHECK-NEXT: DW_AT_name {{.*}} "x"
|
; CHECK-NEXT: DW_AT_name {{.*}} "x"
|
||||||
; CHECK-NEXT: DW_AT_decl_file
|
; CHECK-NEXT: DW_AT_decl_file
|
||||||
; CHECK-NEXT: DW_AT_decl_line
|
; CHECK-NEXT: DW_AT_decl_line
|
||||||
; CHECK-NEXT: DW_AT_type
|
; CHECK-NEXT: DW_AT_type
|
||||||
; CHECK-NEXT: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
|
|
||||||
|
|
||||||
; Check that the location contains only 4 ranges - this verifies that the 4th
|
; Check that the location contains only 4 ranges - this verifies that the 4th
|
||||||
; and 5th ranges were successfully merged into a single range.
|
; and 5th ranges were successfully merged into a single range.
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj %s -o %t
|
; RUN: llc -mtriple=x86_64-apple-darwin12 -filetype=obj < %s \
|
||||||
; RUN: llvm-dwarfdump %t | FileCheck %s
|
; RUN: | llvm-dwarfdump -debug-dump=info - | FileCheck %s
|
||||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
|
||||||
target triple = "x86_64-apple-macosx10.6.7"
|
target triple = "x86_64-apple-macosx10.6.7"
|
||||||
; Radar 9511391
|
; Radar 9511391
|
||||||
|
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK: "i"
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_const_value [DW_FORM_sdata] (42)
|
; CHECK: DW_AT_const_value [DW_FORM_sdata] (42)
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "i"
|
||||||
|
|
||||||
define i32 @foo() nounwind uwtable readnone optsize ssp {
|
define i32 @foo() nounwind uwtable readnone optsize ssp {
|
||||||
entry:
|
entry:
|
||||||
|
@ -20,9 +20,10 @@
|
|||||||
;
|
;
|
||||||
; CHECK: .debug_info contents:
|
; CHECK: .debug_info contents:
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK-NEXT: DW_AT_name{{.*}}"i"
|
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location [DW_FORM_data4] ([[LOC:.*]])
|
; CHECK: DW_AT_location [DW_FORM_data4] ([[LOC:.*]])
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}}"i"
|
||||||
; CHECK: .debug_loc contents:
|
; CHECK: .debug_loc contents:
|
||||||
; CHECK: [[LOC]]:
|
; CHECK: [[LOC]]:
|
||||||
; consts 0x00000003
|
; consts 0x00000003
|
||||||
|
@ -6,11 +6,11 @@ target triple = "x86_64-apple-darwin10.0.0"
|
|||||||
; rdar://8950491
|
; rdar://8950491
|
||||||
|
|
||||||
;CHECK: DW_TAG_formal_parameter
|
;CHECK: DW_TAG_formal_parameter
|
||||||
|
;CHECK-NEXT: DW_AT_location
|
||||||
;CHECK-NEXT: DW_AT_name {{.*}} "var"
|
;CHECK-NEXT: DW_AT_name {{.*}} "var"
|
||||||
;CHECK-NEXT: DW_AT_decl_file
|
;CHECK-NEXT: DW_AT_decl_file
|
||||||
;CHECK-NEXT: DW_AT_decl_line
|
;CHECK-NEXT: DW_AT_decl_line
|
||||||
;CHECK-NEXT: DW_AT_type
|
;CHECK-NEXT: DW_AT_type
|
||||||
;CHECK-NEXT: DW_AT_location
|
|
||||||
|
|
||||||
@dfm = external global i32, align 4
|
@dfm = external global i32, align 4
|
||||||
|
|
||||||
|
@ -9,15 +9,17 @@
|
|||||||
;
|
;
|
||||||
; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}}
|
; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}}
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}}
|
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}}"self"{{.*}}
|
||||||
;
|
;
|
||||||
; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}}
|
; CHECK: {{.*}}DW_AT_name{{.*}}_block_invoke{{.*}}
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK: {{.*}}DW_AT_name{{.*}}"self"{{.*}}
|
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}}"self"{{.*}}
|
||||||
;
|
;
|
||||||
; Generated (and then reduced) from
|
; Generated (and then reduced) from
|
||||||
; ----------------------------------------------------------------------
|
; ----------------------------------------------------------------------
|
||||||
|
@ -20,22 +20,23 @@
|
|||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_name{{.*}}.block_descriptor
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}}.block_descriptor
|
||||||
|
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK-NEXT: DW_AT_name{{.*}}"self"
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]}
|
|
||||||
; CHECK-NOT: DW_TAG
|
|
||||||
; CHECK: DW_AT_artificial
|
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; 0x06 = DW_OP_deref
|
; 0x06 = DW_OP_deref
|
||||||
; 0x23 = DW_OP_uconst
|
; 0x23 = DW_OP_uconst
|
||||||
; 0x91 = DW_OP_fbreg
|
; 0x91 = DW_OP_fbreg
|
||||||
; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} )
|
; CHECK: DW_AT_location{{.*}}91 {{[0-9]+}} 06 23 {{[0-9]+}} )
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}}"self"
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_type{{.*}}{[[APTR:.*]]}
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_artificial
|
||||||
|
|
||||||
; CHECK: [[APTR]]: DW_TAG_pointer_type
|
; CHECK: [[APTR]]: DW_TAG_pointer_type
|
||||||
; CHECK-NEXT: {[[A]]}
|
; CHECK-NEXT: {[[A]]}
|
||||||
|
@ -44,8 +44,10 @@
|
|||||||
; CHECK: DW_AT_MIPS_linkage_name [DW_FORM_strp]{{.*}}"_Z3baz1A"
|
; CHECK: DW_AT_MIPS_linkage_name [DW_FORM_strp]{{.*}}"_Z3baz1A"
|
||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK-NEXT: DW_AT_name [DW_FORM_strp]{{.*}}"a"
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
|
; CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name [DW_FORM_strp]{{.*}}"a"
|
||||||
|
|
||||||
; CHECK: DW_TAG_variable
|
; CHECK: DW_TAG_variable
|
||||||
; CHECK: DW_AT_location [DW_FORM_exprloc]
|
; CHECK: DW_AT_location [DW_FORM_exprloc]
|
||||||
|
@ -28,6 +28,11 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
|||||||
; An empty array should not have an AT_upper_bound attribute. But an array of 1
|
; An empty array should not have an AT_upper_bound attribute. But an array of 1
|
||||||
; should.
|
; should.
|
||||||
|
|
||||||
|
; CHECK: DW_TAG_base_type
|
||||||
|
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "int")
|
||||||
|
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
|
||||||
|
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04)
|
||||||
|
|
||||||
; int foo::b[1]:
|
; int foo::b[1]:
|
||||||
; CHECK: DW_TAG_structure_type
|
; CHECK: DW_TAG_structure_type
|
||||||
; CHECK: DW_AT_name{{.*}}"foo"
|
; CHECK: DW_AT_name{{.*}}"foo"
|
||||||
@ -36,11 +41,6 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
|
|||||||
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b")
|
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "b")
|
||||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||||
|
|
||||||
; CHECK: DW_TAG_base_type
|
|
||||||
; CHECK-NEXT: DW_AT_name [DW_FORM_strp] ( .debug_str[{{.*}}] = "int")
|
|
||||||
; CHECK-NEXT: DW_AT_encoding [DW_FORM_data1] (0x05)
|
|
||||||
; CHECK-NEXT: DW_AT_byte_size [DW_FORM_data1] (0x04)
|
|
||||||
|
|
||||||
; int[1]:
|
; int[1]:
|
||||||
; CHECK: DW_TAG_array_type [{{.*}}] *
|
; CHECK: DW_TAG_array_type [{{.*}}] *
|
||||||
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
; CHECK-NEXT: DW_AT_type [DW_FORM_ref4]
|
||||||
|
@ -7,19 +7,32 @@
|
|||||||
; CHECK: .debug_info contents:
|
; CHECK: .debug_info contents:
|
||||||
; CHECK: DW_TAG_compile_unit
|
; CHECK: DW_TAG_compile_unit
|
||||||
; CHECK: DW_TAG_subprogram
|
; CHECK: DW_TAG_subprogram
|
||||||
; CHECK: Proc8
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "Proc8"
|
||||||
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK: Array1Par
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "Array1Par"
|
||||||
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK: Array2Par
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "Array2Par"
|
||||||
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK: IntParI1
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "IntParI1"
|
||||||
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK: IntParI2
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "IntParI2"
|
||||||
|
|
||||||
%struct.Record = type { %struct.Record*, i32, i32, i32, [31 x i8] }
|
%struct.Record = type { %struct.Record*, i32, i32, i32, [31 x i8] }
|
||||||
|
|
||||||
|
@ -1,18 +1,21 @@
|
|||||||
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj
|
; RUN: llc -O0 -mtriple=x86_64-apple-darwin < %s -filetype=obj \
|
||||||
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DW-CHECK
|
; RUN: | llvm-dwarfdump -debug-dump=info - \
|
||||||
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o %t -filetype=obj -dwarf-version=3
|
; RUN: | FileCheck %s -check-prefix=CHECK -check-prefix=DWARF4
|
||||||
; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s -check-prefix=DWARF3
|
; RUN: llc -O0 -mtriple=x86_64-apple-darwin < %s -filetype=obj -dwarf-version=3 \
|
||||||
|
; RUN: | llvm-dwarfdump -debug-dump=info - \
|
||||||
|
; RUN: | FileCheck %s -check-prefix=CHECK -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
|
; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
|
||||||
; DW_AT_location lists yet.
|
; DW_AT_location lists yet.
|
||||||
; DW-CHECK: DW_AT_location [DW_FORM_sec_offset] (0x00000000)
|
; DWARF4: 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
|
; FIXME: The location here needs to be fixed, but llvm-dwarfdump doesn't handle
|
||||||
; DW_AT_location lists yet.
|
; DW_AT_location lists yet.
|
||||||
; DWARF3: DW_AT_location [DW_FORM_data4] (0x00000000)
|
; DWARF3: DW_AT_location [DW_FORM_data4] (0x00000000)
|
||||||
|
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name [DW_FORM_strp] ( .debug_str[0x00000067] = "vla")
|
||||||
|
|
||||||
; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations
|
; Unfortunately llvm-dwarfdump can't unparse a list of DW_AT_locations
|
||||||
; right now, so we check the asm output:
|
; 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
|
; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - -filetype=asm | FileCheck %s -check-prefix=ASM-CHECK
|
||||||
|
@ -23,13 +23,15 @@
|
|||||||
; }
|
; }
|
||||||
|
|
||||||
; CHECK: debug_info contents
|
; CHECK: debug_info contents
|
||||||
; CHECK: DW_AT_name{{.*}} = "f"
|
|
||||||
; 0x74 is DW_OP_breg4, showing that the parameter is accessed indirectly
|
; 0x74 is DW_OP_breg4, showing that the parameter is accessed indirectly
|
||||||
; (with a zero offset) from the register parameter
|
; (with a zero offset) from the register parameter
|
||||||
; CHECK: DW_AT_location{{.*}}(<0x0{{.}}> 74 00
|
; CHECK: DW_AT_location{{.*}}(<0x0{{.}}> 74 00
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}} = "f"
|
||||||
|
|
||||||
; CHECK: DW_AT_name{{.*}} = "g"
|
|
||||||
; CHECK: DW_AT_location{{.*}}([[G_LOC:0x[0-9]*]])
|
; CHECK: DW_AT_location{{.*}}([[G_LOC:0x[0-9]*]])
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name{{.*}} = "g"
|
||||||
; CHECK: debug_loc contents
|
; CHECK: debug_loc contents
|
||||||
; CHECK-NEXT: [[G_LOC]]: Beginning
|
; CHECK-NEXT: [[G_LOC]]: Beginning
|
||||||
; CHECK-NEXT: Ending
|
; CHECK-NEXT: Ending
|
||||||
|
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
; Based on the debuginfo-tests/sret.cpp code.
|
; Based on the debuginfo-tests/sret.cpp code.
|
||||||
|
|
||||||
; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x72aabf538392d298)
|
; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x5b59949640ec1580)
|
||||||
; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x72aabf538392d298)
|
; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x5b59949640ec1580)
|
||||||
|
|
||||||
%class.A = type { i32 (...)**, i32 }
|
%class.A = type { i32 (...)**, i32 }
|
||||||
%class.B = type { i8 }
|
%class.B = type { i8 }
|
||||||
|
@ -56,8 +56,9 @@
|
|||||||
; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_FUNC]]}
|
; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_FUNC]]}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]}
|
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_abstract_origin {{.*}} {0x[[ABS_VAR]]}
|
||||||
|
|
||||||
|
|
||||||
@i = external global i32
|
@i = external global i32
|
||||||
|
@ -28,8 +28,9 @@
|
|||||||
; CHECK-NOT: {{DW_TAG|NULL}}
|
; CHECK-NOT: {{DW_TAG|NULL}}
|
||||||
; CHECK: DW_TAG_formal_parameter
|
; CHECK: DW_TAG_formal_parameter
|
||||||
; CHECK-NOT: DW_TAG
|
; CHECK-NOT: DW_TAG
|
||||||
; CHECK: DW_AT_name {{.*}} "i"
|
|
||||||
; CHECK: DW_AT_location
|
; CHECK: DW_AT_location
|
||||||
|
; CHECK-NOT: DW_TAG
|
||||||
|
; CHECK: DW_AT_name {{.*}} "i"
|
||||||
|
|
||||||
|
|
||||||
%struct.S = type { i32 }
|
%struct.S = type { i32 }
|
||||||
|
Loading…
Reference in New Issue
Block a user