diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4a10a0e94cf..d3f6ec661e5 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -888,15 +888,6 @@ void DwarfDebug::beginModule() { // available. for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) constructImportedEntityDIE(CU, ImportedEntities.getElement(i)); - // If we're splitting the dwarf out now that we've got the entire - // CU then construct a skeleton CU based upon it. - if (useSplitDwarf()) { - // This should be a unique identifier when we want to build .dwp files. - CU->addUInt(CU->getCUDie(), dwarf::DW_AT_GNU_dwo_id, - dwarf::DW_FORM_data8, 0); - // Now construct the skeleton CU associated. - constructSkeletonCU(CUNode); - } } // Tell MMI that we have debug info. @@ -1005,14 +996,6 @@ void DwarfDebug::finalizeModuleInfo() { // Attach DW_AT_inline attribute with inlined subprogram DIEs. computeInlinedDIEs(); - // Emit DW_AT_containing_type attribute to connect types with their - // vtable holding type. - for (DenseMap::iterator CUI = CUMap.begin(), - CUE = CUMap.end(); CUI != CUE; ++CUI) { - CompileUnit *TheCU = CUI->second; - TheCU->constructContainingTypeDIEs(); - } - // Split out type units and conditionally add an ODR tag to the split // out type. // FIXME: Do type splitting. @@ -1029,7 +1012,30 @@ void DwarfDebug::finalizeModuleInfo() { Hash.computeDIEODRSignature(Die)); } - // Compute DIE offsets and sizes. + // Handle anything that needs to be done on a per-cu basis. + for (DenseMap::iterator CUI = CUMap.begin(), + CUE = CUMap.end(); + CUI != CUE; ++CUI) { + CompileUnit *TheCU = CUI->second; + // Emit DW_AT_containing_type attribute to connect types with their + // vtable holding type. + TheCU->constructContainingTypeDIEs(); + + // If we're splitting the dwarf out now that we've got the entire + // CU then construct a skeleton CU based upon it. + if (useSplitDwarf()) { + // This should be a unique identifier when we want to build .dwp files. + TheCU->addUInt(TheCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id, + dwarf::DW_FORM_data8, 0); + // Now construct the skeleton CU associated. + CompileUnit *SkCU = constructSkeletonCU(CUI->first); + // This should be a unique identifier when we want to build .dwp files. + SkCU->addUInt(SkCU->getCUDie(), dwarf::DW_AT_GNU_dwo_id, + dwarf::DW_FORM_data8, 0); + } + } + + // Compute DIE offsets and sizes. InfoHolder.computeSizeAndOffsets(); if (useSplitDwarf()) SkeletonHolder.computeSizeAndOffsets(); @@ -2686,9 +2692,6 @@ CompileUnit *DwarfDebug::constructSkeletonCU(const MDNode *N) { NewCU->addLocalString(Die, dwarf::DW_AT_GNU_dwo_name, DIUnit.getSplitDebugFilename()); - // This should be a unique identifier when we want to build .dwp files. - NewCU->addUInt(Die, dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, 0); - // 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()) diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll index 8ad3c2d97a5..7aeefab8aa1 100644 --- a/test/DebugInfo/X86/fission-cu.ll +++ b/test/DebugInfo/X86/fission-cu.ll @@ -23,20 +23,20 @@ ; CHECK: Abbrev table for offset: 0x00000000 ; CHECK: [1] DW_TAG_compile_unit DW_CHILDREN_no ; CHECK: DW_AT_GNU_dwo_name DW_FORM_strp -; CHECK: DW_AT_GNU_dwo_id DW_FORM_data8 ; CHECK: DW_AT_GNU_addr_base DW_FORM_sec_offset ; CHECK: DW_AT_low_pc DW_FORM_addr ; CHECK: DW_AT_stmt_list DW_FORM_sec_offset ; CHECK: DW_AT_comp_dir DW_FORM_strp +; CHECK: DW_AT_GNU_dwo_id DW_FORM_data8 ; CHECK: .debug_info contents: ; CHECK: DW_TAG_compile_unit ; CHECK: DW_AT_GNU_dwo_name [DW_FORM_strp] ( .debug_str[0x00000000] = "baz.dwo") -; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) ; CHECK: DW_AT_GNU_addr_base [DW_FORM_sec_offset] (0x00000000) ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000) ; CHECK: DW_AT_comp_dir [DW_FORM_strp] ( .debug_str[0x00000008] = "/usr/local/google/home/echristo/tmp") +; CHECK: DW_AT_GNU_dwo_id [DW_FORM_data8] (0x0000000000000000) ; CHECK: .debug_str contents: ; CHECK: 0x00000000: "baz.dwo"