Index: lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1645,9 +1645,11 @@ addSourceLine(*VariableDIE, GV); } + if (!GV.isDefinition()) + addFlag(*VariableDIE, dwarf::DW_AT_declaration); + // Add location. bool addToAccelTable = false; - DIE *VariableSpecDIE = nullptr; bool isGlobalVariable = GV.getGlobal() != nullptr; if (isGlobalVariable) { addToAccelTable = true; @@ -1678,31 +1680,25 @@ DD->addArangeLabel(SymbolCU(this, Sym)); addOpAddress(*Loc, Sym); } - // A static member's declaration is already flagged as such. - if (!SDMDecl.Verify() && !GV.isDefinition()) - addFlag(*VariableDIE, dwarf::DW_AT_declaration); - // Do not create specification DIE if context is either compile unit - // or a subprogram. - if (GVContext && GV.isDefinition() && !GVContext.isCompileUnit() && - !GVContext.isFile() && !DD->isSubprogramContext(GVContext)) { - // Create specification DIE. - VariableSpecDIE = &createAndAddDIE(dwarf::DW_TAG_variable, UnitDie); + + if (IsStaticMember) { + // Create specification DIE. The in-type declaration DIE is done. + DIE *VariableSpecDIE = &createAndAddDIE(dwarf::DW_TAG_variable, UnitDie); addDIEEntry(*VariableSpecDIE, dwarf::DW_AT_specification, *VariableDIE); addBlock(*VariableSpecDIE, dwarf::DW_AT_location, Loc); + VariableDIE = VariableSpecDIE; // A static member's declaration is already flagged as such. - if (!SDMDecl.Verify()) - addFlag(*VariableDIE, dwarf::DW_AT_declaration); } else { addBlock(*VariableDIE, dwarf::DW_AT_location, Loc); } + // Add the linkage name. StringRef LinkageName = GV.getLinkageName(); if (!LinkageName.empty()) // From DWARF4: DIEs to which DW_AT_linkage_name may apply include: // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and // TAG_variable. - addString(IsStaticMember && VariableSpecDIE ? *VariableSpecDIE - : *VariableDIE, + addString(*VariableDIE, DD->getDwarfVersion() >= 4 ? dwarf::DW_AT_linkage_name : dwarf::DW_AT_MIPS_linkage_name, GlobalValue::getRealLinkageName(LinkageName)); @@ -1729,19 +1725,17 @@ addBlock(*VariableDIE, dwarf::DW_AT_location, Loc); } - DIE *ResultDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; - if (addToAccelTable) { - DD->addAccelName(GV.getName(), *ResultDIE); + DD->addAccelName(GV.getName(), *VariableDIE); // If the linkage name is different than the name, go ahead and output // that as well into the name table. if (GV.getLinkageName() != "" && GV.getName() != GV.getLinkageName()) - DD->addAccelName(GV.getLinkageName(), *ResultDIE); + DD->addAccelName(GV.getLinkageName(), *VariableDIE); } - addGlobalName(GV.getName(), *ResultDIE, GV.getContext()); - return ResultDIE; + addGlobalName(GV.getName(), *VariableDIE, GV.getContext()); + return VariableDIE; } /// constructSubrangeDIE - Construct subrange DIE from DISubrange. Index: test/DebugInfo/X86/gnu-public-names.ll =================================================================== --- test/DebugInfo/X86/gnu-public-names.ll +++ test/DebugInfo/X86/gnu-public-names.ll @@ -75,10 +75,10 @@ ; CHECK: [[NS:0x[0-9a-f]+]]: DW_TAG_namespace ; CHECK-NEXT: DW_AT_name {{.*}} "ns" -; CHECK: [[GLOB_NS_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable +; CHECK: [[GLOB_NS_VAR:0x[0-9a-f]+]]: DW_TAG_variable ; CHECK-NEXT: DW_AT_name {{.*}} "global_namespace_variable" -; CHECK: [[D_VAR_DECL:0x[0-9a-f]+]]: DW_TAG_variable +; CHECK: [[D_VAR:0x[0-9a-f]+]]: DW_TAG_variable ; CHECK-NEXT: DW_AT_name {{.*}} "d" ; CHECK: [[D:0x[0-9a-f]+]]: DW_TAG_structure_type @@ -90,12 +90,6 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "global_namespace_function" -; CHECK: [[GLOB_NS_VAR:0x[0-9a-f]+]]: DW_TAG_variable -; CHECK-NEXT: DW_AT_specification {{.*}} {[[GLOB_NS_VAR_DECL]]} - -; CHECK: [[D_VAR:0x[0-9a-f]+]]: DW_TAG_variable -; CHECK-NEXT: DW_AT_specification {{.*}} {[[D_VAR_DECL]]} - ; CHECK: DW_TAG_subprogram ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "f3" @@ -116,7 +110,7 @@ ; CHECK: [[OUTER_ANON:.*]]: DW_TAG_namespace ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK-NOT: DW_AT_name -; CHECK: [[OUTER_ANON_C_DECL:.*]]: DW_TAG_variable +; CHECK: [[OUTER_ANON_C:.*]]: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "c" ; CHECK-NOT: {{DW_TAG|NULL}} @@ -129,9 +123,6 @@ ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: NULL ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: [[OUTER_ANON_C:.*]]: DW_TAG_variable -; CHECK-NOT: DW_TAG -; CHECK-NEXT: DW_AT_specification {{.*}} {[[OUTER_ANON_C_DECL]]} ; CHECK: [[ANON:.*]]: DW_TAG_namespace ; CHECK-NOT: DW_AT_name @@ -139,24 +130,18 @@ ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "inner" ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: [[ANON_INNER_B_DECL:.*]]: DW_TAG_variable +; CHECK: [[ANON_INNER_B:.*]]: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "b" ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: NULL ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: [[ANON_I_DECL:.*]]: DW_TAG_variable +; CHECK: [[ANON_I:.*]]: DW_TAG_variable ; CHECK-NOT: DW_TAG ; CHECK: DW_AT_name {{.*}} "i" ; CHECK-NOT: {{DW_TAG|NULL}} ; CHECK: NULL ; CHECK-NOT: {{DW_TAG|NULL}} -; CHECK: [[ANON_INNER_B:.*]]: DW_TAG_variable -; CHECK-NOT: DW_TAG -; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_INNER_B_DECL]]} -; CHECK: [[ANON_I:.*]]: DW_TAG_variable -; CHECK-NOT: DW_TAG -; CHECK-NEXT: DW_AT_specification {{.*}} {[[ANON_I_DECL]]} ; CHECK: [[MEM_FUNC:0x[0-9a-f]+]]: DW_TAG_subprogram ; CHECK-NOT: DW_TAG