DebugInfo: Reference abstract definitions from variables in concrete definitions...
authorDavid Blaikie <dblaikie@gmail.com>
Fri, 13 Jun 2014 22:35:44 +0000 (22:35 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Fri, 13 Jun 2014 22:35:44 +0000 (22:35 +0000)
Rather than relying on abstract variables looked up at the time the
concrete variable is created, look them up at the end of the module to
ensure they're referenced even if they're created after the concrete
definition. This completes/matches the work done in r209677 to handle
this for the subprograms themselves.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210946 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h
test/DebugInfo/X86/dbg-value-inlined-parameter.ll

index 1eb88b9178d48e4c6e59c1e6dcb620ce916de1d8..77bb77d4a5fd1e127849bd12a0c088500fdc0484 100644 (file)
@@ -791,7 +791,7 @@ void DwarfDebug::finishVariableDefinitions() {
     // DIE::getUnit isn't simple - it walks parent pointers, etc.
     DwarfCompileUnit *Unit = lookupUnit(VariableDie->getUnit());
     assert(Unit);
-    DbgVariable *AbsVar = Var->getAbstractVariable();
+    DbgVariable *AbsVar = getExistingAbstractVariable(Var->getVariable());
     if (AbsVar && AbsVar->getDIE()) {
       Unit->addDIEEntry(*VariableDie, dwarf::DW_AT_abstract_origin,
                         *AbsVar->getDIE());
@@ -1081,6 +1081,11 @@ DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV,
   return nullptr;
 }
 
+DbgVariable *DwarfDebug::getExistingAbstractVariable(const DIVariable &DV) {
+  DIVariable Cleansed;
+  return getExistingAbstractVariable(DV, Cleansed);
+}
+
 DbgVariable *DwarfDebug::createAbstractVariable(DIVariable &Var,
                                                 LexicalScope *Scope) {
   auto AbsDbgVariable = make_unique<DbgVariable>(Var, nullptr, this);
index 88b8a674b3e19c6a25a693800fb7d1c93b7dab56..8445b74798f5d1311de52c3317ba353f936918f5 100644 (file)
@@ -346,6 +346,7 @@ class DwarfDebug : public AsmPrinterHandler {
   /// \brief Find abstract variable associated with Var.
   DbgVariable *getExistingAbstractVariable(const DIVariable &DV,
                                            DIVariable &Cleansed);
+  DbgVariable *getExistingAbstractVariable(const DIVariable &DV);
   DbgVariable *createAbstractVariable(DIVariable &DV, LexicalScope *Scope);
   DbgVariable *getOrCreateAbstractVariable(DIVariable &Var,
                                            const MDNode *Scope);
index 2d3cf6e680729580f74852019577e7bf4a53d654..4d18f7dc306396c623572239348ed45b25177240 100644 (file)
@@ -7,22 +7,20 @@
 
 ; CHECK: DW_TAG_subprogram
 ; CHECK:   DW_AT_abstract_origin {{.*}}{[[ABS:.*]]}
-; FIXME: An out of line definition preceding an inline usage doesn't properly
-; reference abstract variables.
 ; CHECK:   DW_TAG_formal_parameter
 ; CHECK-NOT: DW_TAG
-; CHECK:     DW_AT_name {{.*}} "sp"
+; CHECK:     DW_AT_abstract_origin {{.*}}{[[ABS_SP:.*]]}
 ; CHECK:   DW_TAG_formal_parameter
 ; CHECK-NOT: DW_TAG
-; CHECK:     DW_AT_name {{.*}} "nums"
+; CHECK:     DW_AT_abstract_origin {{.*}}{[[ABS_NUMS:.*]]}
 
 ; CHECK: [[ABS]]: DW_TAG_subprogram
 ; CHECK-NOT: DW_TAG
 ; CHECK:   DW_AT_name {{.*}} "foo"
-; CHECK: [[ABS_SP:.*]]:   DW_TAG_formal_parameter
+; CHECK: [[ABS_SP]]:   DW_TAG_formal_parameter
 ; CHECK-NOT: DW_TAG
 ; CHECK:     DW_AT_name {{.*}} "sp"
-; CHECK: [[ABS_NUMS:.*]]:  DW_TAG_formal_parameter
+; CHECK: [[ABS_NUMS]]:  DW_TAG_formal_parameter
 ; CHECK-NOT: DW_TAG
 ; CHECK:     DW_AT_name {{.*}} "nums"