mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-17 18:31:04 +00:00
Use rip-rel addressing on win64 by default. For this we just
defaults to small pic code model. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111741 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9dd3e92e1d
commit
699647cabc
@ -73,7 +73,7 @@ ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const {
|
||||
if (GV->hasDefaultVisibility() &&
|
||||
(isDecl || GV->isWeakForLinker()))
|
||||
return X86II::MO_GOTPCREL;
|
||||
} else {
|
||||
} else if (!isTargetWin64()) {
|
||||
assert(isTargetELF() && "Unknown rip-relative target");
|
||||
|
||||
// Extra load is needed for all externally visible.
|
||||
|
@ -112,15 +112,21 @@ X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT,
|
||||
InstrInfo(*this), JITInfo(*this), TLInfo(*this), TSInfo(*this),
|
||||
ELFWriterInfo(*this) {
|
||||
DefRelocModel = getRelocationModel();
|
||||
|
||||
|
||||
// If no relocation model was picked, default as appropriate for the target.
|
||||
if (getRelocationModel() == Reloc::Default) {
|
||||
if (!Subtarget.isTargetDarwin())
|
||||
setRelocationModel(Reloc::Static);
|
||||
else if (Subtarget.is64Bit())
|
||||
// Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
|
||||
// Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
|
||||
// use static relocation model by default.
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.is64Bit())
|
||||
setRelocationModel(Reloc::PIC_);
|
||||
else
|
||||
setRelocationModel(Reloc::DynamicNoPIC);
|
||||
} else if (Subtarget.isTargetWin64())
|
||||
setRelocationModel(Reloc::PIC_);
|
||||
else
|
||||
setRelocationModel(Reloc::DynamicNoPIC);
|
||||
setRelocationModel(Reloc::Static);
|
||||
}
|
||||
|
||||
assert(getRelocationModel() != Reloc::Default &&
|
||||
@ -143,29 +149,27 @@ X86TargetMachine::X86TargetMachine(const Target &T, const std::string &TT,
|
||||
Subtarget.isTargetDarwin() &&
|
||||
is64Bit)
|
||||
setRelocationModel(Reloc::PIC_);
|
||||
|
||||
|
||||
// Determine the PICStyle based on the target selected.
|
||||
if (getRelocationModel() == Reloc::Static) {
|
||||
// Unless we're in PIC or DynamicNoPIC mode, set the PIC style to None.
|
||||
Subtarget.setPICStyle(PICStyles::None);
|
||||
} else if (Subtarget.is64Bit()) {
|
||||
// PIC in 64 bit mode is always rip-rel.
|
||||
Subtarget.setPICStyle(PICStyles::RIPRel);
|
||||
} else if (Subtarget.isTargetCygMing()) {
|
||||
Subtarget.setPICStyle(PICStyles::None);
|
||||
} else if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.is64Bit())
|
||||
Subtarget.setPICStyle(PICStyles::RIPRel);
|
||||
else if (getRelocationModel() == Reloc::PIC_)
|
||||
if (getRelocationModel() == Reloc::PIC_)
|
||||
Subtarget.setPICStyle(PICStyles::StubPIC);
|
||||
else {
|
||||
assert(getRelocationModel() == Reloc::DynamicNoPIC);
|
||||
Subtarget.setPICStyle(PICStyles::StubDynamicNoPIC);
|
||||
}
|
||||
} else if (Subtarget.isTargetELF()) {
|
||||
if (Subtarget.is64Bit())
|
||||
Subtarget.setPICStyle(PICStyles::RIPRel);
|
||||
else
|
||||
Subtarget.setPICStyle(PICStyles::GOT);
|
||||
Subtarget.setPICStyle(PICStyles::GOT);
|
||||
}
|
||||
|
||||
|
||||
// Finally, if we have "none" as our PIC style, force to static mode.
|
||||
if (Subtarget.getPICStyle() == PICStyles::None)
|
||||
setRelocationModel(Reloc::Static);
|
||||
|
Loading…
Reference in New Issue
Block a user