]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
Use DW_AT_high_pc and DW_AT_low_pc for the high and low pc for a
authorEric Christopher <echristo@gmail.com>
Fri, 24 Jan 2014 11:40:29 +0000 (11:40 +0000)
committerEric Christopher <echristo@gmail.com>
Fri, 24 Jan 2014 11:40:29 +0000 (11:40 +0000)
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

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h
lib/CodeGen/AsmPrinter/DwarfUnit.cpp
lib/CodeGen/AsmPrinter/DwarfUnit.h
test/DebugInfo/X86/concrete_out_of_line.ll
test/DebugInfo/X86/fission-cu.ll

index 7ba4fece43bc22a0881860c6931ca565e6d14646..077af8c375619758e74b7450e5ed7e34e8295a76 100644 (file)
@@ -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.
index 516def804d1533f577900bbc1ce55479d8ec5930..1071e5892ac428e5c4194f69b2bf4b6fd51ab89c 100644 (file)
@@ -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.
index 4f55d89ce2c959ac2b34988354d1c360a2f0409d..e9b10ba2911024196f6d9f9f5380bb51d16bed72 100644 (file)
@@ -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);
   }
 }
 
index 3f42e2f672813cfb5857a5ce31c529016dad00fa..684c46b624e2e0ef9fe782815c05fbc11a72fc6c 100644 (file)
@@ -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 {
index 4a152963a1444124e793d62f1766e2a5e9378405..ce82c7a6c7f860c04a799d10f6725ae190434f34 100644 (file)
@@ -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:
index 1af7f97b317336db89de4824f5332e914c702f10..ccdbb6e9186606756661241e62f1e516939e2ab7 100644 (file)
 ; 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