mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
Fix aranges and split dwarf by ensuring that the symbol and relocation
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
This commit is contained in:
parent
8e58e03822
commit
782b70f4b3
@ -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)");
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
@ -15,6 +16,10 @@
|
||||
; 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
|
||||
|
@ -112,4 +112,7 @@
|
||||
; 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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user