OSDN Git Service

Fix aranges and split dwarf by ensuring that the symbol and relocation
authorEric Christopher <echristo@gmail.com>
Mon, 30 Dec 2013 05:25:49 +0000 (05:25 +0000)
committerEric Christopher <echristo@gmail.com>
Mon, 30 Dec 2013 05:25:49 +0000 (05:25 +0000)
back to the compile unit from the aranges section is to the skeleton
unit and not the one in the dwo.

Do this by adding a method to grab a forwarded on local sym and local
section by querying the skeleton if one exists and using that. Add
a few tests to verify the relocations are back to the correct section.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198202 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f1ae89e..1aae6ab 100644 (file)
@@ -825,11 +825,7 @@ DwarfCompileUnit *DwarfDebug::constructDwarfCompileUnit(DICompileUnit DIUnit) {
   NewCU->initSection(
       useSplitDwarf() ? Asm->getObjFileLowering().getDwarfInfoDWOSection()
                       : Asm->getObjFileLowering().getDwarfInfoSection(),
-      // 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);
+      useSplitDwarf() ? DwarfInfoDWOSectionSym : DwarfInfoSectionSym);
 
   // If we're splitting the dwarf then construct the skeleton CU now.
   if (useSplitDwarf())
@@ -2010,6 +2006,9 @@ 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())
@@ -2875,7 +2874,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->getLabelBegin(), CU->getSectionSym());
+    Asm->EmitSectionOffset(CU->getLocalLabelBegin(), CU->getLocalSectionSym());
     Asm->OutStreamer.AddComment("Address Size (in bytes)");
     Asm->EmitInt8(PtrSize);
     Asm->OutStreamer.AddComment("Segment Size (in bytes)");
index 10ce17f..b81688e 100644 (file)
@@ -429,7 +429,8 @@ class DwarfDebug : public AsmPrinterHandler {
   MCSymbol *DwarfStrSectionSym, *TextSectionSym, *DwarfDebugRangeSectionSym;
   MCSymbol *DwarfDebugLocSectionSym, *DwarfLineSectionSym, *DwarfAddrSectionSym;
   MCSymbol *FunctionBeginSym, *FunctionEndSym;
-  MCSymbol *DwarfAbbrevDWOSectionSym, *DwarfStrDWOSectionSym;
+  MCSymbol *DwarfInfoDWOSectionSym, *DwarfAbbrevDWOSectionSym;
+  MCSymbol *DwarfStrDWOSectionSym;
   MCSymbol *DwarfGnuPubNamesSectionSym, *DwarfGnuPubTypesSectionSym;
 
   // As an optimization, there is no need to emit an entry in the directory
index 49c9b0c..d5cb9b4 100644 (file)
@@ -180,11 +180,27 @@ 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;
index fd0d0a3..819f986 100644 (file)
@@ -1,6 +1,7 @@
 ; 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<int *x>
 ; 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
index 1d0ec27..135c780 100644 (file)
 ; 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}