Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -779,7 +779,7 @@ ScopesWithImportedEntities.end(), less_first()); DIArray GVs = CUNode.getGlobalVariables(); for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) - CU.createGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i))); + CU.getOrCreateGlobalVariableDIE(DIGlobalVariable(GVs.getElement(i))); DIArray SPs = CUNode.getSubprograms(); for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) SPMap.insert(std::make_pair(SPs.getElement(i), &CU)); Index: lib/CodeGen/AsmPrinter/DwarfUnit.h =================================================================== --- lib/CodeGen/AsmPrinter/DwarfUnit.h +++ lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -536,8 +536,8 @@ /// Apply the DW_AT_stmt_list from this compile unit to the specified DIE. void applyStmtList(DIE &D); - /// createGlobalVariableDIE - create global variable DIE. - void createGlobalVariableDIE(DIGlobalVariable GV); + /// getOrCreateGlobalVariableDIE - get or create global variable DIE. + DIE *getOrCreateGlobalVariableDIE(DIGlobalVariable GV); /// addLabelAddress - Add a dwarf label attribute data and value using /// either DW_FORM_addr or DW_FORM_GNU_addr_index. Index: lib/CodeGen/AsmPrinter/DwarfUnit.cpp =================================================================== --- lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -1592,11 +1592,11 @@ return CE; } -/// createGlobalVariableDIE - create global variable DIE. -void DwarfCompileUnit::createGlobalVariableDIE(DIGlobalVariable GV) { +/// getOrCreateGlobalVariableDIE - get or create global variable DIE. +DIE *DwarfCompileUnit::getOrCreateGlobalVariableDIE(DIGlobalVariable GV) { // Check for pre-existence. - if (getDIE(GV)) - return; + if (DIE *Die = getDIE(GV)) + return Die; assert(GV.isGlobalVariable()); @@ -1718,18 +1718,19 @@ addBlock(*VariableDIE, dwarf::DW_AT_location, Loc); } + DIE *ResultDIE = VariableSpecDIE ? VariableSpecDIE : VariableDIE; + if (addToAccelTable) { - DIE &AddrDIE = VariableSpecDIE ? *VariableSpecDIE : *VariableDIE; - DD->addAccelName(GV.getName(), AddrDIE); + DD->addAccelName(GV.getName(), *ResultDIE); // 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(), AddrDIE); + DD->addAccelName(GV.getLinkageName(), *ResultDIE); } - addGlobalName(GV.getName(), VariableSpecDIE ? *VariableSpecDIE : *VariableDIE, - GV.getContext()); + addGlobalName(GV.getName(), *ResultDIE, GV.getContext()); + return ResultDIE; } /// constructSubrangeDIE - Construct subrange DIE from DISubrange.