diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 1aae6abad0f..a30e8bbd954 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -773,6 +773,12 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { DIUnit.getLanguage()); NewCU->addString(Die, dwarf::DW_AT_name, FN); + // 2.17.1 requires that we use DW_AT_low_pc for a single entry point + // into an entity. We're using 0 (or a NULL label) for this. For + // split dwarf it's in the skeleton CU so omit it here. + if (!useSplitDwarf()) + NewCU->addLabelAddress(Die, dwarf::DW_AT_low_pc, NULL); + // Define start line table label for each Compile Unit. MCSymbol *LineTableStartSym = Asm->GetTempSymbol("line_table_start", NewCU->getUniqueID()); @@ -825,11 +831,11 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) { NewCU->initSection( useSplitDwarf() ? Asm->getObjFileLowering().getDwarfInfoDWOSection() : Asm->getObjFileLowering().getDwarfInfoSection(), - useSplitDwarf() ? DwarfInfoDWOSectionSym : DwarfInfoSectionSym); - - // If we're splitting the dwarf then construct the skeleton CU now. - if (useSplitDwarf()) - NewCU->setSkeleton(constructSkeletonCU(NewCU)); + // FIXME: This is subtle (using the info section even when + // this CU is in the dwo section) and necessary for the + // current arange code - ideally it should iterate + // skeleton units, not full units, if it's going to reference skeletons + DwarfInfoSectionSym); CUMap.insert(std::make_pair(DIUnit, NewCU)); CUDieMap.insert(std::make_pair(Die, NewCU)); @@ -1076,9 +1082,7 @@ void DwarfDebug::finalizeModuleInfo() { // Add CU specific attributes if we need to add any. if (TheU->getUnitDie()->getTag() == dwarf::DW_TAG_compile_unit) { // If we're splitting the dwarf out now that we've got the entire - // CU then add the dwo id to it. - DwarfCompileUnit *SkCU = - static_cast(TheU->getSkeleton()); + // CU then construct a skeleton CU based upon it. if (useSplitDwarf()) { // This should be a unique identifier when we want to build .dwp files. uint64_t ID = 0; @@ -1088,22 +1092,19 @@ void DwarfDebug::finalizeModuleInfo() { } TheU->addUInt(TheU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, ID); + // Now construct the skeleton CU associated. + DwarfCompileUnit *SkCU = + constructSkeletonCU(static_cast(TheU)); SkCU->addUInt(SkCU->getUnitDie(), dwarf::DW_AT_GNU_dwo_id, dwarf::DW_FORM_data8, ID); + } else { + // Attribute if we've emitted a range list for the compile unit, this + // will get constructed for the skeleton CU separately if we have one. + if (DwarfCURanges && TheU->getRanges().size()) + addSectionLabel(Asm, TheU, TheU->getUnitDie(), dwarf::DW_AT_ranges, + Asm->GetTempSymbol("cu_ranges", TheU->getUniqueID()), + DwarfDebugRangeSectionSym); } - - // If we've requested ranges and have them emit a DW_AT_ranges attribute - // on the unit that will remain in the .o file, otherwise add a DW_AT_low_pc. - // FIXME: Also add a high pc if we can. - // FIXME: We should use ranges if we have multiple compile units. - DwarfCompileUnit *U = SkCU ? SkCU : static_cast(TheU); - if (DwarfCURanges && TheU->getRanges().size()) - addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, - Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), - DwarfDebugRangeSectionSym); - else - U->addLocalLabelAddress(U->getUnitDie(), dwarf::DW_AT_low_pc, - TextSectionSym); } } @@ -2006,9 +2007,6 @@ void DwarfDebug::emitSectionLabels() { // Dwarf sections base addresses. DwarfInfoSectionSym = emitSectionSym(Asm, TLOF.getDwarfInfoSection(), "section_info"); - if (useSplitDwarf()) - DwarfInfoDWOSectionSym = - emitSectionSym(Asm, TLOF.getDwarfInfoDWOSection(), "section_info_dwo"); DwarfAbbrevSectionSym = emitSectionSym(Asm, TLOF.getDwarfAbbrevSection(), "section_abbrev"); if (useSplitDwarf()) @@ -2874,7 +2872,7 @@ void DwarfDebug::emitDebugARanges() { Asm->OutStreamer.AddComment("DWARF Arange version number"); Asm->EmitInt16(dwarf::DW_ARANGES_VERSION); Asm->OutStreamer.AddComment("Offset Into Debug Info Section"); - Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym()); + Asm->EmitSectionOffset(CU->getLabelBegin(), CU->getSectionSym()); Asm->OutStreamer.AddComment("Address Size (in bytes)"); Asm->EmitInt8(PtrSize); Asm->OutStreamer.AddComment("Segment Size (in bytes)"); @@ -2999,6 +2997,15 @@ DwarfCompileUnit *DwarfDebug::constructSkeletonCU(const DwarfCompileUnit *CU) { else NewCU->addSectionOffset(Die, dwarf::DW_AT_GNU_addr_base, 0); + // Attribute if we've emitted a range list for the compile unit, this + // will get constructed for the skeleton CU separately if we have one. + if (DwarfCURanges && CU->getRanges().size()) + addSectionLabel(Asm, NewCU, Die, dwarf::DW_AT_ranges, + Asm->GetTempSymbol("cu_ranges", CU->getUniqueID()), + DwarfDebugRangeSectionSym); + else + NewCU->addUInt(Die, dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, 0); + // DW_AT_stmt_list is a offset of line number information for this // compile unit in debug_line section. // FIXME: Should handle multiple compile units. diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index b81688ea3f0..10ce17fa2dd 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -429,8 +429,7 @@ class DwarfDebug : public AsmPrinterHandler { MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym; MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym; MCSymbol *FunctionBeginSym, *FunctionEndSym; - MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym; - MCSymbol *DwarfStrDWOSectionSym; + MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym; MCSymbol *DwarfGnuPubNamesSectionSym, *DwarfGnuPubTypesSectionSym; // As an optimization, there is no need to emit an entry in the directory diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 75c9580ea30..693e37ffe8d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -43,7 +43,7 @@ GenerateDwarfTypeUnits("generate-type-units", cl::Hidden, DwarfUnit::DwarfUnit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU) : UniqueID(UID), Node(Node), UnitDie(D), DebugInfoOffset(0), Asm(A), DD(DW), - DU(DWU), IndexTyDie(0), Section(0), Skeleton(0) { + DU(DWU), IndexTyDie(0), Section(0) { DIEIntegerOne = new (DIEValueAllocator) DIEInteger(1); } @@ -293,23 +293,6 @@ void DwarfCompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute, } } -/// addLocalLabelAddress - Add a dwarf label attribute data and value using -/// DW_FORM_addr. -void DwarfCompileUnit::addLocalLabelAddress(DIE *Die, - dwarf::Attribute Attribute, - MCSymbol *Label) { - if (Label) - DD->addArangeLabel(SymbolCU(this, Label)); - - if (Label != NULL) { - DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); - Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); - } else { - DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); - Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); - } -} - /// addOpAddress - Add a dwarf op address data and value using the /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. /// diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index d5cb9b4f0ef..7d7b351b9b0 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -146,21 +146,12 @@ protected: /// The label for the start of the range sets for the elements of this unit. MCSymbol *LabelRange; - /// Skeleton unit associated with this unit. - DwarfUnit *Skeleton; - DwarfUnit(unsigned UID, DIE *D, DICompileUnit CU, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU); public: virtual ~DwarfUnit(); - /// Set the skeleton unit associated with this unit. - void setSkeleton(DwarfUnit *Skel) { Skeleton = Skel; } - - /// Get the skeleton unit associated with this unit. - DwarfUnit *getSkeleton() const { return Skeleton; } - /// Pass in the SectionSym even though we could recreate it in every compile /// unit (type units will have actually distinct symbols once they're in /// comdat sections). @@ -180,27 +171,11 @@ public: return Section; } - /// If there's a skeleton then return the section symbol for the skeleton - /// unit, otherwise return the section symbol for this unit. - MCSymbol *getLocalSectionSym() const { - if (Skeleton) - return Skeleton->getSectionSym(); - return SectionSym; - } - MCSymbol *getSectionSym() const { assert(Section); return SectionSym; } - /// If there's a skeleton then return the begin label for the skeleton unit, - /// otherwise return the local label for this unit. - MCSymbol *getLocalLabelBegin() const { - if (Skeleton) - return Skeleton->getLabelBegin(); - return LabelBegin; - } - MCSymbol *getLabelBegin() const { assert(Section); return LabelBegin; @@ -546,11 +521,6 @@ public: /// either DW_FORM_addr or DW_FORM_GNU_addr_index. void addLabelAddress(DIE *Die, dwarf::Attribute Attribute, MCSymbol *Label); - /// addLocalLabelAddress - Add a dwarf label attribute data and value using - /// DW_FORM_addr. - void addLocalLabelAddress(DIE *Die, dwarf::Attribute Attribute, - MCSymbol *Label); - uint16_t getLanguage() const LLVM_OVERRIDE { return getNode().getLanguage(); } }; diff --git a/test/DebugInfo/X86/arange.ll b/test/DebugInfo/X86/arange.ll index 819f9863bc7..fd0d0a3e08d 100644 --- a/test/DebugInfo/X86/arange.ll +++ b/test/DebugInfo/X86/arange.ll @@ -1,7 +1,6 @@ ; REQUIRES: object-emission ; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s | llvm-dwarfdump -debug-dump=aranges - | FileCheck %s -; RUN: llc -mtriple=x86_64-linux -O0 -filetype=obj < %s | llvm-readobj --relocations - | FileCheck --check-prefix=OBJ %s ; extern int i; ; template @@ -16,10 +15,6 @@ ; CHECK-NEXT: [0x ; CHECK-NOT: [0x -; Check that we have a relocation back to the debug_info section from the debug_aranges section -; OBJ: debug_aranges -; OBJ-NEXT: R_X86_64_32 .debug_info 0x0 - %struct.foo = type { i8 } @f = global %struct.foo zeroinitializer, align 1 diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll index 135c78029a2..06408d70815 100644 --- a/test/DebugInfo/X86/fission-cu.ll +++ b/test/DebugInfo/X86/fission-cu.ll @@ -25,19 +25,19 @@ ; CHECK: [1] DW_TAG_compile_unit DW_CHILDREN_no ; CHECK: DW_AT_GNU_dwo_name DW_FORM_strp ; 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: DW_AT_low_pc DW_FORM_addr ; 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_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: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) ; CHECK: .debug_str contents: ; CHECK: 0x00000000: "baz.dwo" @@ -110,9 +110,5 @@ ; OBJ-NEXT: R_X86_64_32 .debug_addr ; OBJ-NEXT: R_X86_64_32 .debug_line ; OBJ-NEXT: R_X86_64_32 .debug_str -; OBJ-NEXT: R_X86_64_64 .text 0x0 ; OBJ-NEXT: } -; OBJ: .debug_aranges -; OBJ-NEXT: R_X86_64_32 .debug_info 0x0 - !9 = metadata !{i32 1, metadata !"Debug Info Version", i32 1} diff --git a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll index e63cbd11e48..147937aaf48 100644 --- a/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll +++ b/test/DebugInfo/X86/stmt-list-multiple-compile-units.ll @@ -7,12 +7,12 @@ ; rdar://13067005 ; CHECK: .debug_info contents: ; CHECK: DW_TAG_compile_unit -; CHECK: DW_AT_stmt_list [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_TAG_compile_unit -; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c) ; CHECK: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x0000003c) ; CHECK: .debug_line contents: ; CHECK-NEXT: Line table prologue: @@ -25,12 +25,12 @@ ; DWARF3: .debug_info contents: ; DWARF3: DW_TAG_compile_unit -; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) ; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x00000000) ; DWARF3: DW_TAG_compile_unit -; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) ; DWARF3: DW_AT_low_pc [DW_FORM_addr] (0x0000000000000000) +; DWARF3: DW_AT_stmt_list [DW_FORM_data4] (0x0000003c) ; DWARF3: .debug_line contents: ; DWARF3-NEXT: Line table prologue: