mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-01 10:57:21 +00:00
Merging r198744:
------------------------------------------------------------------------ r198744 | iain | 2014-01-08 05:22:54 -0500 (Wed, 08 Jan 2014) | 8 lines [patch] Adjust behavior of FDE cross-section relocs for targets that don't support abs-differences. Modern versions of OSX/Darwin's ld (ld64 > 97.17) have an optimisation present that allows the back end to omit relocations (and replace them with an absolute difference) for FDE some text section refs. This patch allows a backend to opt-in to this behaviour by setting "DwarfFDESymbolsUseAbsDiff". At present, this is only enabled for modern x86 OSX ports. test changes by David Fang. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_34@205768 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
16fbfb406f
commit
89bdc4dd55
@ -302,6 +302,10 @@ namespace llvm {
|
|||||||
/// uses relocations for references to other .debug_* sections.
|
/// uses relocations for references to other .debug_* sections.
|
||||||
bool DwarfUsesRelocationsAcrossSections;
|
bool DwarfUsesRelocationsAcrossSections;
|
||||||
|
|
||||||
|
/// DwarfFDESymbolsUseAbsDiff - true if DWARF FDE symbol reference
|
||||||
|
/// relocations should be replaced by an absolute difference.
|
||||||
|
bool DwarfFDESymbolsUseAbsDiff;
|
||||||
|
|
||||||
/// DwarfRegNumForCFI - True if dwarf register numbers are printed
|
/// DwarfRegNumForCFI - True if dwarf register numbers are printed
|
||||||
/// instead of symbolic register names in .cfi_* directives.
|
/// instead of symbolic register names in .cfi_* directives.
|
||||||
bool DwarfRegNumForCFI; // Defaults to false;
|
bool DwarfRegNumForCFI; // Defaults to false;
|
||||||
@ -527,6 +531,9 @@ namespace llvm {
|
|||||||
bool doesDwarfUseRelocationsAcrossSections() const {
|
bool doesDwarfUseRelocationsAcrossSections() const {
|
||||||
return DwarfUsesRelocationsAcrossSections;
|
return DwarfUsesRelocationsAcrossSections;
|
||||||
}
|
}
|
||||||
|
bool doDwarfFDESymbolsUseAbsDiff() const {
|
||||||
|
return DwarfFDESymbolsUseAbsDiff;
|
||||||
|
}
|
||||||
bool useDwarfRegNumForCFI() const {
|
bool useDwarfRegNumForCFI() const {
|
||||||
return DwarfRegNumForCFI;
|
return DwarfRegNumForCFI;
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ MCAsmInfo::MCAsmInfo() {
|
|||||||
SupportsDebugInformation = false;
|
SupportsDebugInformation = false;
|
||||||
ExceptionsType = ExceptionHandling::None;
|
ExceptionsType = ExceptionHandling::None;
|
||||||
DwarfUsesRelocationsAcrossSections = true;
|
DwarfUsesRelocationsAcrossSections = true;
|
||||||
|
DwarfFDESymbolsUseAbsDiff = false;
|
||||||
DwarfRegNumForCFI = false;
|
DwarfRegNumForCFI = false;
|
||||||
HasMicrosoftFastStdCallMangling = false;
|
HasMicrosoftFastStdCallMangling = false;
|
||||||
NeedsDwarfSectionOffsetDirective = false;
|
NeedsDwarfSectionOffsetDirective = false;
|
||||||
|
@ -836,8 +836,9 @@ static unsigned getSizeForEncoding(MCStreamer &streamer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol,
|
static void EmitFDESymbol(MCStreamer &streamer, const MCSymbol &symbol,
|
||||||
unsigned symbolEncoding, const char *comment = 0) {
|
unsigned symbolEncoding, bool isEH,
|
||||||
|
const char *comment = 0) {
|
||||||
MCContext &context = streamer.getContext();
|
MCContext &context = streamer.getContext();
|
||||||
const MCAsmInfo *asmInfo = context.getAsmInfo();
|
const MCAsmInfo *asmInfo = context.getAsmInfo();
|
||||||
const MCExpr *v = asmInfo->getExprForFDESymbol(&symbol,
|
const MCExpr *v = asmInfo->getExprForFDESymbol(&symbol,
|
||||||
@ -845,7 +846,10 @@ static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol,
|
|||||||
streamer);
|
streamer);
|
||||||
unsigned size = getSizeForEncoding(streamer, symbolEncoding);
|
unsigned size = getSizeForEncoding(streamer, symbolEncoding);
|
||||||
if (streamer.isVerboseAsm() && comment) streamer.AddComment(comment);
|
if (streamer.isVerboseAsm() && comment) streamer.AddComment(comment);
|
||||||
|
if (asmInfo->doDwarfFDESymbolsUseAbsDiff() && isEH)
|
||||||
streamer.EmitAbsValue(v, size);
|
streamer.EmitAbsValue(v, size);
|
||||||
|
else
|
||||||
|
streamer.EmitValue(v, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol,
|
static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol,
|
||||||
@ -1344,7 +1348,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
|
|||||||
unsigned PCEncoding = IsEH ? MOFI->getFDEEncoding(UsingCFI)
|
unsigned PCEncoding = IsEH ? MOFI->getFDEEncoding(UsingCFI)
|
||||||
: (unsigned)dwarf::DW_EH_PE_absptr;
|
: (unsigned)dwarf::DW_EH_PE_absptr;
|
||||||
unsigned PCSize = getSizeForEncoding(streamer, PCEncoding);
|
unsigned PCSize = getSizeForEncoding(streamer, PCEncoding);
|
||||||
EmitSymbol(streamer, *frame.Begin, PCEncoding, "FDE initial location");
|
EmitFDESymbol(streamer, *frame.Begin, PCEncoding, IsEH, "FDE initial location");
|
||||||
|
|
||||||
// PC Range
|
// PC Range
|
||||||
const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,
|
const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,
|
||||||
@ -1364,7 +1368,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
|
|||||||
|
|
||||||
// Augmentation Data
|
// Augmentation Data
|
||||||
if (frame.Lsda)
|
if (frame.Lsda)
|
||||||
EmitSymbol(streamer, *frame.Lsda, frame.LsdaEncoding,
|
EmitFDESymbol(streamer, *frame.Lsda, frame.LsdaEncoding, true,
|
||||||
"Language Specific Data Area");
|
"Language Specific Data Area");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,6 +65,11 @@ X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) {
|
|||||||
|
|
||||||
// Exceptions handling
|
// Exceptions handling
|
||||||
ExceptionsType = ExceptionHandling::DwarfCFI;
|
ExceptionsType = ExceptionHandling::DwarfCFI;
|
||||||
|
|
||||||
|
// FIXME: this should not depend on the target OS version, but on the ld64
|
||||||
|
// version in use. From at least >= ld64-97.17 (Xcode 3.2.6) the abs-ified
|
||||||
|
// FDE relocs may be used.
|
||||||
|
DwarfFDESymbolsUseAbsDiff = T.isMacOSX() && !T.isMacOSXVersionLT(10, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple)
|
X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple)
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
; RUN: llc < %s -mtriple=x86_64-apple-macosx -disable-cfi | FileCheck %s
|
; RUN: llc < %s -mtriple=x86_64-apple-macosx10.7 -disable-cfi | FileCheck --check-prefix=CHECK-64-D11 %s
|
||||||
|
; RUN: llc < %s -mtriple=x86_64-apple-macosx10.6 -disable-cfi | FileCheck %s
|
||||||
|
; RUN: llc < %s -mtriple=x86_64-apple-macosx10.5 -disable-cfi | FileCheck --check-prefix=CHECK-64-D89 %s
|
||||||
|
; RUN: llc < %s -mtriple=i686-apple-macosx10.6 -disable-cfi | FileCheck --check-prefix=CHECK-I686-D10 %s
|
||||||
|
; RUN: llc < %s -mtriple=i686-apple-macosx10.5 -disable-cfi | FileCheck --check-prefix=CHECK-I686-D89 %s
|
||||||
|
; RUN: llc < %s -mtriple=i686-apple-macosx10.4 -disable-cfi | FileCheck --check-prefix=CHECK-I686-D89 %s
|
||||||
|
|
||||||
define private void @foo() {
|
define private void @foo() {
|
||||||
ret void
|
ret void
|
||||||
@ -19,3 +24,44 @@ define void @bar() {
|
|||||||
; CHECK: Ltmp19:
|
; CHECK: Ltmp19:
|
||||||
; CHECK-NEXT: Ltmp20 = Ltmp2-Ltmp19 ## FDE initial location
|
; CHECK-NEXT: Ltmp20 = Ltmp2-Ltmp19 ## FDE initial location
|
||||||
; CHECK-NEXT: .quad Ltmp20
|
; CHECK-NEXT: .quad Ltmp20
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK-64-D11: Ltmp13:
|
||||||
|
; CHECK-64-D11-NEXT: Ltmp14 = L_foo-Ltmp13 ## FDE initial location
|
||||||
|
; CHECK-64-D11-NEXT: .quad Ltmp14
|
||||||
|
|
||||||
|
; CHECK-64-D11: Ltmp20:
|
||||||
|
; CHECK-64-D11-NEXT: Ltmp21 = Ltmp2-Ltmp20 ## FDE initial location
|
||||||
|
; CHECK-64-D11-NEXT: .quad Ltmp21
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK-64-D89: Ltmp12:
|
||||||
|
; CHECK-64-D89-NEXT: .quad L_foo-Ltmp12 ## FDE initial location
|
||||||
|
; CHECK-64-D89-NEXT: Ltmp13 = (Ltmp0-L_foo)-0 ## FDE address range
|
||||||
|
; CHECK-64-D89-NEXT: .quad Ltmp13
|
||||||
|
|
||||||
|
; CHECK-64-D89: Ltmp18:
|
||||||
|
; CHECK-64-D89-NEXT: .quad Ltmp2-Ltmp18 ## FDE initial location
|
||||||
|
; CHECK-64-D89-NEXT: Ltmp19 = (Ltmp4-Ltmp2)-0 ## FDE address range
|
||||||
|
; CHECK-64-D89-NEXT: .quad Ltmp19
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK-I686-D10: Ltmp12:
|
||||||
|
; CHECK-I686-D10-NEXT: Ltmp13 = L_foo-Ltmp12 ## FDE initial location
|
||||||
|
; CHECK-I686-D10-NEXT: .long Ltmp13
|
||||||
|
|
||||||
|
; CHECK-I686-D10: Ltmp19:
|
||||||
|
; CHECK-I686-D10-NEXT: Ltmp20 = Ltmp2-Ltmp19 ## FDE initial location
|
||||||
|
; CHECK-I686-D10-NEXT: .long Ltmp20
|
||||||
|
|
||||||
|
|
||||||
|
; CHECK-I686-D89: Ltmp12:
|
||||||
|
; CHECK-I686-D89-NEXT: .long L_foo-Ltmp12 ## FDE initial location
|
||||||
|
; CHECK-I686-D89-NEXT: Ltmp13 = (Ltmp0-L_foo)-0 ## FDE address range
|
||||||
|
; CHECK-I686-D89-NEXT: .long Ltmp13
|
||||||
|
|
||||||
|
; CHECK-I686-D89: Ltmp18:
|
||||||
|
; CHECK-I686-D89-NEXT: .long Ltmp2-Ltmp18 ## FDE initial location
|
||||||
|
; CHECK-I686-D89-NEXT: Ltmp19 = (Ltmp4-Ltmp2)-0 ## FDE address range
|
||||||
|
; CHECK-I686-D89-NEXT: .long Ltmp19
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user