From: Eric Christopher Date: Fri, 24 Jan 2014 11:40:29 +0000 (+0000) Subject: Use DW_AT_high_pc and DW_AT_low_pc for the high and low pc for a X-Git-Tag: v01.01.07.01~12274 X-Git-Url: https://git.ti.com/gitweb?p=opencl%2Fllvm.git;a=commitdiff_plain;h=a268ba84d7f3a4625e5ff8294e81f17e4ba9b9a1 Use DW_AT_high_pc and DW_AT_low_pc for the high and low pc for a compile unit. Make these relocations on the platforms that need relocations and add a routine to ensure that we don't put the addresses in an offset table for split dwarf. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199990 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 7ba4fece43..077af8c375 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -187,6 +187,7 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) DwarfAddrSectionSym = 0; DwarfAbbrevDWOSectionSym = DwarfStrDWOSectionSym = 0; FunctionBeginSym = FunctionEndSym = 0; + TextSectionBeginSym = TextSectionEndSym = 0; CurFn = 0; CurMI = 0; @@ -1061,9 +1062,12 @@ void DwarfDebug::finalizeModuleInfo() { addSectionLabel(Asm, U, U->getUnitDie(), dwarf::DW_AT_ranges, Asm->GetTempSymbol("cu_ranges", U->getUniqueID()), DwarfDebugRangeSectionSym); - else - U->addUInt(U->getUnitDie(), dwarf::DW_AT_low_pc, dwarf::DW_FORM_addr, - 0); + else { + U->addLocalLabelAddress(U->getUnitDie(), dwarf::DW_AT_low_pc, + TextSectionBeginSym); + U->addLocalLabelAddress(U->getUnitDie(), dwarf::DW_AT_high_pc, + TextSectionEndSym); + } } } @@ -1117,6 +1121,10 @@ void DwarfDebug::endSections() { Sym = Asm->GetTempSymbol("debug_end", ID); Asm->OutStreamer.SwitchSection(Section); Asm->OutStreamer.EmitLabel(Sym); + // If this is the end of the text section keep track of where the end of + // the section is so that we can use it later. + if (Section == Asm->getObjFileLowering().getTextSection()) + TextSectionEndSym = Sym; } // Insert a final terminator. @@ -2012,6 +2020,8 @@ void DwarfDebug::emitSectionLabels() { DwarfDebugLocSectionSym = emitSectionSym(Asm, TLOF.getDwarfLocSection(), "section_debug_loc"); + + TextSectionBeginSym = emitSectionSym(Asm, TLOF.getTextSection(), "text_begin"); } // Recursively emits a debug information entry. diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.h b/lib/CodeGen/AsmPrinter/DwarfDebug.h index 516def804d..1071e5892a 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -432,6 +432,7 @@ class DwarfDebug : public AsmPrinterHandler { MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym; MCSymbol *DwarfStrDWOSectionSym; MCSymbol *DwarfGnuPubNamesSectionSym, *DwarfGnuPubTypesSectionSym; + MCSymbol *TextSectionBeginSym, *TextSectionEndSym; // As an optimization, there is no need to emit an entry in the directory // table for the same directory as DW_AT_comp_dir. diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 4f55d89ce2..e9b10ba291 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -266,21 +266,32 @@ void DwarfUnit::addSectionOffset(DIE *Die, dwarf::Attribute Attribute, /// void DwarfCompileUnit::addLabelAddress(DIE *Die, dwarf::Attribute Attribute, MCSymbol *Label) { + if (!DD->useSplitDwarf()) + return addLocalLabelAddress(Die, Attribute, Label); + if (Label) DD->addArangeLabel(SymbolCU(this, Label)); - if (!DD->useSplitDwarf()) { - if (Label) { - 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); - } + unsigned idx = DU->getAddrPoolIndex(Label); + DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); + Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value); +} + +/// addLocalLabelAddress - Add a dwarf label attribute data and value using +/// DW_FORM_addr only. +/// +void DwarfCompileUnit::addLocalLabelAddress(DIE *Die, + dwarf::Attribute Attribute, + MCSymbol *Label) { + if (Label) + DD->addArangeLabel(SymbolCU(this, Label)); + + if (Label) { + DIEValue *Value = new (DIEValueAllocator) DIELabel(Label); + Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); } else { - unsigned idx = DU->getAddrPoolIndex(Label); - DIEValue *Value = new (DIEValueAllocator) DIEInteger(idx); - Die->addValue(Attribute, dwarf::DW_FORM_GNU_addr_index, Value); + DIEValue *Value = new (DIEValueAllocator) DIEInteger(0); + Die->addValue(Attribute, dwarf::DW_FORM_addr, Value); } } diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 3f42e2f672..684c46b624 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -545,6 +545,11 @@ public: /// addLabelAddress - Add a dwarf label attribute data and value using /// 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 only. + void addLocalLabelAddress(DIE *Die, dwarf::Attribute Attribute, + MCSymbol *Label); }; class DwarfTypeUnit : public DwarfUnit { diff --git a/test/DebugInfo/X86/concrete_out_of_line.ll b/test/DebugInfo/X86/concrete_out_of_line.ll index 4a152963a1..ce82c7a6c7 100644 --- a/test/DebugInfo/X86/concrete_out_of_line.ll +++ b/test/DebugInfo/X86/concrete_out_of_line.ll @@ -7,15 +7,15 @@ ; first check that we have a TAG_subprogram at a given offset and it has ; AT_inline. -; CHECK: 0x0000011c: DW_TAG_subprogram [17] +; CHECK: 0x00000124: DW_TAG_subprogram [17] ; CHECK-NEXT: DW_AT_specification ; CHECK-NEXT: DW_AT_inline ; and then that a TAG_subprogram refers to it with AT_abstract_origin. -; CHECK: 0x0000015d: DW_TAG_subprogram [19] -; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x011c => {0x0000011c}) +; CHECK: 0x00000165: DW_TAG_subprogram [19] +; CHECK-NEXT: DW_AT_abstract_origin [DW_FORM_ref4] (cu + 0x0124 => {0x00000124}) define i32 @_ZN17nsAutoRefCnt7ReleaseEv() { entry: diff --git a/test/DebugInfo/X86/fission-cu.ll b/test/DebugInfo/X86/fission-cu.ll index 1af7f97b31..ccdbb6e918 100644 --- a/test/DebugInfo/X86/fission-cu.ll +++ b/test/DebugInfo/X86/fission-cu.ll @@ -109,6 +109,8 @@ ; OBJ-NEXT: R_X86_64_32 .debug_str ; OBJ-NEXT: R_X86_64_32 .debug_addr ; OBJ-NEXT: R_X86_64_32 .debug_str +; OBJ-NEXT: R_X86_64_64 .text 0x0 +; OBJ-NEXT: R_X86_64_64 .text 0x0 ; OBJ-NEXT: } ; OBJ: .debug_aranges ; OBJ-NEXT: R_X86_64_32 .debug_info 0x0