mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[Targets] Add errors for tiny and kernel codemodel on targets that don't support them
Adds fatal errors for any target that does not support the Tiny or Kernel codemodels by rejigging the getEffectiveCodeModel calls. Differential Revision: https://reviews.llvm.org/D50141 llvm-svn: 348585
This commit is contained in:
parent
690edaebad
commit
76448ad394
@ -354,6 +354,23 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// Helper method for getting the code model, returning Default if
|
||||
/// CM does not have a value. The tiny and kernel models will produce
|
||||
/// an error, so targets that support them or require more complex codemodel
|
||||
/// selection logic should implement and call their own getEffectiveCodeModel.
|
||||
inline CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
|
||||
CodeModel::Model Default) {
|
||||
if (CM) {
|
||||
// By default, targets do not support the tiny and kernel models.
|
||||
if (*CM == CodeModel::Tiny)
|
||||
report_fatal_error("Target does not support the tiny CodeModel");
|
||||
if (*CM == CodeModel::Kernel)
|
||||
report_fatal_error("Target does not support the kernel CodeModel");
|
||||
return *CM;
|
||||
}
|
||||
return Default;
|
||||
}
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif // LLVM_TARGET_TARGETMACHINE_H
|
||||
|
@ -219,8 +219,8 @@ static Reloc::Model getEffectiveRelocModel(const Triple &TT,
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(const Triple &TT,
|
||||
Optional<CodeModel::Model> CM,
|
||||
static CodeModel::Model
|
||||
getEffectiveAArch64CodeModel(const Triple &TT, Optional<CodeModel::Model> CM,
|
||||
bool JIT) {
|
||||
if (CM) {
|
||||
if (*CM != CodeModel::Small && *CM != CodeModel::Tiny &&
|
||||
@ -255,7 +255,7 @@ AArch64TargetMachine::AArch64TargetMachine(const Target &T, const Triple &TT,
|
||||
: LLVMTargetMachine(T,
|
||||
computeDataLayout(TT, Options.MCOptions, LittleEndian),
|
||||
TT, CPU, FS, Options, getEffectiveRelocModel(TT, RM),
|
||||
getEffectiveCodeModel(TT, CM, JIT), OL),
|
||||
getEffectiveAArch64CodeModel(TT, CM, JIT), OL),
|
||||
TLOF(createTLOF(getTargetTriple())), isLittle(LittleEndian) {
|
||||
initAsmInfo();
|
||||
|
||||
|
@ -310,12 +310,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return Reloc::PIC_;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
AMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
TargetOptions Options,
|
||||
@ -324,7 +318,7 @@ AMDGPUTargetMachine::AMDGPUTargetMachine(const Target &T, const Triple &TT,
|
||||
CodeGenOpt::Level OptLevel)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT), TT, getGPUOrDefault(TT, CPU),
|
||||
FS, Options, getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM), OptLevel),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OptLevel),
|
||||
TLOF(createTLOF(getTargetTriple())) {
|
||||
initAsmInfo();
|
||||
}
|
||||
|
@ -26,12 +26,6 @@ static Reloc::Model getRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
/// ARCTargetMachine ctor - Create an ILP32 architecture model
|
||||
ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
@ -43,7 +37,7 @@ ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT,
|
||||
"e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-"
|
||||
"f32:32:32-i64:32-f64:32-a:0:32-n32",
|
||||
TT, CPU, FS, Options, getRelocModel(RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TLOF(make_unique<TargetLoweringObjectFileELF>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -194,12 +194,6 @@ static Reloc::Model getEffectiveRelocModel(const Triple &TT,
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
/// Create an ARM architecture model.
|
||||
///
|
||||
ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT,
|
||||
@ -210,7 +204,7 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT,
|
||||
CodeGenOpt::Level OL, bool isLittle)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options, isLittle), TT,
|
||||
CPU, FS, Options, getEffectiveRelocModel(TT, RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TargetABI(computeTargetABI(TT, CPU, Options)),
|
||||
TLOF(createTLOF(getTargetTriple())), isLittle(isLittle) {
|
||||
|
||||
|
@ -40,12 +40,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return RM.hasValue() ? *RM : Reloc::Static;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
AVRTargetMachine::AVRTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
@ -53,8 +47,8 @@ AVRTargetMachine::AVRTargetMachine(const Target &T, const Triple &TT,
|
||||
Optional<CodeModel::Model> CM,
|
||||
CodeGenOpt::Level OL, bool JIT)
|
||||
: LLVMTargetMachine(T, AVRDataLayout, TT, getCPU(CPU), FS, Options,
|
||||
getEffectiveRelocModel(RM), getEffectiveCodeModel(CM),
|
||||
OL),
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
SubTarget(TT, getCPU(CPU), FS, *this) {
|
||||
this->TLOF = make_unique<AVRTargetObjectFile>();
|
||||
initAsmInfo();
|
||||
|
@ -51,12 +51,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
BPFTargetMachine::BPFTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
@ -64,8 +58,8 @@ BPFTargetMachine::BPFTargetMachine(const Target &T, const Triple &TT,
|
||||
Optional<CodeModel::Model> CM,
|
||||
CodeGenOpt::Level OL, bool JIT)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(RM), getEffectiveCodeModel(CM),
|
||||
OL),
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TLOF(make_unique<TargetLoweringObjectFileELF>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -180,12 +180,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
extern "C" void LLVMInitializeHexagonTarget() {
|
||||
// Register the target.
|
||||
RegisterTargetMachine<HexagonTargetMachine> X(getTheHexagonTarget());
|
||||
@ -222,7 +216,8 @@ HexagonTargetMachine::HexagonTargetMachine(const Target &T, const Triple &TT,
|
||||
"i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-"
|
||||
"v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048",
|
||||
TT, CPU, FS, Options, getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM), (HexagonNoOpt ? CodeGenOpt::None : OL)),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small),
|
||||
(HexagonNoOpt ? CodeGenOpt::None : OL)),
|
||||
TLOF(make_unique<HexagonTargetObjectFile>()) {
|
||||
initializeHexagonExpandCondsetsPass(*PassRegistry::getPassRegistry());
|
||||
initAsmInfo();
|
||||
|
@ -53,12 +53,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Medium;
|
||||
}
|
||||
|
||||
LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef Cpu, StringRef FeatureString,
|
||||
const TargetOptions &Options,
|
||||
@ -67,7 +61,8 @@ LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,
|
||||
CodeGenOpt::Level OptLevel, bool JIT)
|
||||
: LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CodeModel), OptLevel),
|
||||
getEffectiveCodeModel(CodeModel, CodeModel::Medium),
|
||||
OptLevel),
|
||||
Subtarget(TT, Cpu, FeatureString, *this, Options, getCodeModel(),
|
||||
OptLevel),
|
||||
TLOF(new LanaiTargetObjectFile()) {
|
||||
|
@ -32,12 +32,6 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
static std::string computeDataLayout(const Triple &TT, StringRef CPU,
|
||||
const TargetOptions &Options) {
|
||||
return "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16";
|
||||
@ -51,7 +45,7 @@ MSP430TargetMachine::MSP430TargetMachine(const Target &T, const Triple &TT,
|
||||
CodeGenOpt::Level OL, bool JIT)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options), TT, CPU, FS,
|
||||
Options, getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TLOF(make_unique<TargetLoweringObjectFileELF>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -101,12 +101,6 @@ static Reloc::Model getEffectiveRelocModel(bool JIT,
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
// On function prologue, the stack is created by decrementing
|
||||
// its pointer. Once decremented, all references are done with positive
|
||||
// offset from the stack/frame pointer, using StackGrowsUp enables
|
||||
@ -121,7 +115,7 @@ MipsTargetMachine::MipsTargetMachine(const Target &T, const Triple &TT,
|
||||
bool isLittle)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options, isLittle), TT,
|
||||
CPU, FS, Options, getEffectiveRelocModel(JIT, RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
isLittle(isLittle), TLOF(llvm::make_unique<MipsTargetObjectFile>()),
|
||||
ABI(MipsABIInfo::computeTargetABI(TT, CPU, Options.MCOptions)),
|
||||
Subtarget(nullptr), DefaultSubtarget(TT, CPU, FS, isLittle, *this,
|
||||
|
@ -102,12 +102,6 @@ static std::string computeDataLayout(bool is64Bit, bool UseShortPointers) {
|
||||
return Ret;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
NVPTXTargetMachine::NVPTXTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
@ -118,7 +112,7 @@ NVPTXTargetMachine::NVPTXTargetMachine(const Target &T, const Triple &TT,
|
||||
// specified, as it is the only relocation model currently supported.
|
||||
: LLVMTargetMachine(T, computeDataLayout(is64bit, UseShortPointersOpt), TT,
|
||||
CPU, FS, Options, Reloc::PIC_,
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
is64bit(is64bit), UseShortPointers(UseShortPointersOpt),
|
||||
TLOF(llvm::make_unique<NVPTXTargetObjectFile>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
|
@ -37,23 +37,15 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
|
||||
Reloc::Model RM, bool JIT) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
Nios2TargetMachine::Nios2TargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
Optional<Reloc::Model> RM,
|
||||
Optional<CodeModel::Model> CM,
|
||||
CodeGenOpt::Level OL, bool JIT)
|
||||
: LLVMTargetMachine(
|
||||
T, computeDataLayout(), TT, CPU, FS, Options,
|
||||
: LLVMTargetMachine(T, computeDataLayout(), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM, getEffectiveRelocModel(RM), JIT), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TLOF(make_unique<Nios2TargetObjectFile>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -222,11 +222,16 @@ static Reloc::Model getEffectiveRelocModel(const Triple &TT,
|
||||
return Reloc::Static;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(const Triple &TT,
|
||||
static CodeModel::Model getEffectivePPCCodeModel(const Triple &TT,
|
||||
Optional<CodeModel::Model> CM,
|
||||
bool JIT) {
|
||||
if (CM)
|
||||
if (CM) {
|
||||
if (*CM == CodeModel::Tiny)
|
||||
report_fatal_error("Target does not support the tiny CodeModel");
|
||||
if (*CM == CodeModel::Kernel)
|
||||
report_fatal_error("Target does not support the kernel CodeModel");
|
||||
return *CM;
|
||||
}
|
||||
if (!TT.isOSDarwin() && !JIT &&
|
||||
(TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le))
|
||||
return CodeModel::Medium;
|
||||
@ -246,7 +251,7 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, const Triple &TT,
|
||||
: LLVMTargetMachine(T, getDataLayoutString(TT), TT, CPU,
|
||||
computeFSAdditions(FS, OL, TT), Options,
|
||||
getEffectiveRelocModel(TT, RM),
|
||||
getEffectiveCodeModel(TT, CM, JIT), OL),
|
||||
getEffectivePPCCodeModel(TT, CM, JIT), OL),
|
||||
TLOF(createTLOF(getTargetTriple())),
|
||||
TargetABI(computeTargetABI(TT, Options)) {
|
||||
initAsmInfo();
|
||||
|
@ -47,12 +47,6 @@ static Reloc::Model getEffectiveRelocModel(const Triple &TT,
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM)
|
||||
return *CM;
|
||||
return CodeModel::Small;
|
||||
}
|
||||
|
||||
RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT,
|
||||
StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options,
|
||||
@ -61,7 +55,7 @@ RISCVTargetMachine::RISCVTargetMachine(const Target &T, const Triple &TT,
|
||||
CodeGenOpt::Level OL, bool JIT)
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(TT, RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Small), OL),
|
||||
TLOF(make_unique<RISCVELFTargetObjectFile>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -70,11 +70,16 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
// pic32 PIC_ Medium GOT < 2^32 bytes
|
||||
//
|
||||
// All code models require that the text segment is smaller than 2GB.
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
|
||||
Reloc::Model RM, bool Is64Bit,
|
||||
bool JIT) {
|
||||
if (CM)
|
||||
static CodeModel::Model
|
||||
getEffectiveSparcCodeModel(Optional<CodeModel::Model> CM, Reloc::Model RM,
|
||||
bool Is64Bit, bool JIT) {
|
||||
if (CM) {
|
||||
if (*CM == CodeModel::Tiny)
|
||||
report_fatal_error("Target does not support the tiny CodeModel");
|
||||
if (*CM == CodeModel::Kernel)
|
||||
report_fatal_error("Target does not support the kernel CodeModel");
|
||||
return *CM;
|
||||
}
|
||||
if (Is64Bit) {
|
||||
if (JIT)
|
||||
return CodeModel::Large;
|
||||
@ -88,10 +93,10 @@ SparcTargetMachine::SparcTargetMachine(
|
||||
const Target &T, const Triple &TT, StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options, Optional<Reloc::Model> RM,
|
||||
Optional<CodeModel::Model> CM, CodeGenOpt::Level OL, bool JIT, bool is64bit)
|
||||
: LLVMTargetMachine(
|
||||
T, computeDataLayout(TT, is64bit), TT, CPU, FS, Options,
|
||||
: LLVMTargetMachine(T, computeDataLayout(TT, is64bit), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM, getEffectiveRelocModel(RM), is64bit, JIT),
|
||||
getEffectiveSparcCodeModel(
|
||||
CM, getEffectiveRelocModel(RM), is64bit, JIT),
|
||||
OL),
|
||||
TLOF(make_unique<SparcELFTargetObjectFile>()),
|
||||
Subtarget(TT, CPU, FS, *this, is64bit), is64Bit(is64bit) {
|
||||
|
@ -128,10 +128,16 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
// in range of LARL. However, the JIT environment has no equivalent
|
||||
// of copy relocs, so locally-binding data symbols might not be in
|
||||
// the range of LARL. We need the Medium model in that case.
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
|
||||
Reloc::Model RM, bool JIT) {
|
||||
if (CM)
|
||||
static CodeModel::Model
|
||||
getEffectiveSystemZCodeModel(Optional<CodeModel::Model> CM, Reloc::Model RM,
|
||||
bool JIT) {
|
||||
if (CM) {
|
||||
if (*CM == CodeModel::Tiny)
|
||||
report_fatal_error("Target does not support the tiny CodeModel");
|
||||
if (*CM == CodeModel::Kernel)
|
||||
report_fatal_error("Target does not support the kernel CodeModel");
|
||||
return *CM;
|
||||
}
|
||||
if (JIT)
|
||||
return RM == Reloc::PIC_ ? CodeModel::Small : CodeModel::Medium;
|
||||
return CodeModel::Small;
|
||||
@ -146,7 +152,8 @@ SystemZTargetMachine::SystemZTargetMachine(const Target &T, const Triple &TT,
|
||||
: LLVMTargetMachine(
|
||||
T, computeDataLayout(TT, CPU, FS), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM, getEffectiveRelocModel(RM), JIT), OL),
|
||||
getEffectiveSystemZCodeModel(CM, getEffectiveRelocModel(RM), JIT),
|
||||
OL),
|
||||
TLOF(llvm::make_unique<TargetLoweringObjectFileELF>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
@ -101,7 +101,7 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine(
|
||||
TT.isArch64Bit() ? "e-m:e-p:64:64-i64:64-n32:64-S128"
|
||||
: "e-m:e-p:32:32-i64:64-n32:64-S128",
|
||||
TT, CPU, FS, Options, getEffectiveRelocModel(RM),
|
||||
CM ? *CM : CodeModel::Large, OL),
|
||||
getEffectiveCodeModel(CM, CodeModel::Large), OL),
|
||||
TLOF(new WebAssemblyTargetObjectFile()) {
|
||||
// WebAssembly type-checks instructions, but a noreturn function with a return
|
||||
// type that doesn't match the context will cause a check failure. So we lower
|
||||
|
@ -189,10 +189,13 @@ static Reloc::Model getEffectiveRelocModel(const Triple &TT,
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM,
|
||||
static CodeModel::Model getEffectiveX86CodeModel(Optional<CodeModel::Model> CM,
|
||||
bool JIT, bool Is64Bit) {
|
||||
if (CM)
|
||||
if (CM) {
|
||||
if (*CM == CodeModel::Tiny)
|
||||
report_fatal_error("Target does not support the tiny CodeModel");
|
||||
return *CM;
|
||||
}
|
||||
if (JIT)
|
||||
return Is64Bit ? CodeModel::Large : CodeModel::Small;
|
||||
return CodeModel::Small;
|
||||
@ -209,7 +212,8 @@ X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT,
|
||||
: LLVMTargetMachine(
|
||||
T, computeDataLayout(TT), TT, CPU, FS, Options,
|
||||
getEffectiveRelocModel(TT, JIT, RM),
|
||||
getEffectiveCodeModel(CM, JIT, TT.getArch() == Triple::x86_64), OL),
|
||||
getEffectiveX86CodeModel(CM, JIT, TT.getArch() == Triple::x86_64),
|
||||
OL),
|
||||
TLOF(createTLOF(getTargetTriple())) {
|
||||
// Windows stack unwinder gets confused when execution flow "falls through"
|
||||
// after a call to 'noreturn' function.
|
||||
|
@ -31,7 +31,8 @@ static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
|
||||
return *RM;
|
||||
}
|
||||
|
||||
static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) {
|
||||
static CodeModel::Model
|
||||
getEffectiveXCoreCodeModel(Optional<CodeModel::Model> CM) {
|
||||
if (CM) {
|
||||
if (*CM != CodeModel::Small && *CM != CodeModel::Large)
|
||||
report_fatal_error("Target only supports CodeModel Small or Large");
|
||||
@ -51,7 +52,7 @@ XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Triple &TT,
|
||||
: LLVMTargetMachine(
|
||||
T, "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32",
|
||||
TT, CPU, FS, Options, getEffectiveRelocModel(RM),
|
||||
getEffectiveCodeModel(CM), OL),
|
||||
getEffectiveXCoreCodeModel(CM), OL),
|
||||
TLOF(llvm::make_unique<XCoreTargetObjectFile>()),
|
||||
Subtarget(TT, CPU, FS, *this) {
|
||||
initAsmInfo();
|
||||
|
9
test/CodeGen/ARM/codemodel.ll
Normal file
9
test/CodeGen/ARM/codemodel.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=tiny < %s 2>&1 | FileCheck %s --check-prefix=TINY
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=kernel < %s 2>&1 | FileCheck %s --check-prefix=KERNEL
|
||||
|
||||
; TINY: Target does not support the tiny CodeModel
|
||||
; KERNEL: Target does not support the kernel CodeModel
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
@ -1,5 +1,10 @@
|
||||
; RUN: llc -march=lanai < %s | FileCheck %s
|
||||
; RUN: llc -march=lanai < %s -code-model=small | FileCheck -check-prefix CHECK-SMALL %s
|
||||
; RUN: not llc -march=lanai < %s -code-model=tiny 2>&1 | FileCheck -check-prefix CHECK-TINY %s
|
||||
; RUN: not llc -march=lanai < %s -code-model=kernel 2>&1 | FileCheck -check-prefix CHECK-KERNEL %s
|
||||
|
||||
; CHECK-TINY: Target does not support the tiny CodeModel
|
||||
; CHECK-KERNEL: Target does not support the kernel CodeModel
|
||||
|
||||
@data = external global [0 x i32] ; <[0 x i32]*> [#uses=5]
|
||||
|
||||
|
9
test/CodeGen/PowerPC/codemodel.ll
Normal file
9
test/CodeGen/PowerPC/codemodel.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=tiny < %s 2>&1 | FileCheck %s --check-prefix=TINY
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=kernel < %s 2>&1 | FileCheck %s --check-prefix=KERNEL
|
||||
|
||||
; TINY: Target does not support the tiny CodeModel
|
||||
; KERNEL: Target does not support the kernel CodeModel
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
9
test/CodeGen/SPARC/codemodel.ll
Normal file
9
test/CodeGen/SPARC/codemodel.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=tiny < %s 2>&1 | FileCheck %s --check-prefix=TINY
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=kernel < %s 2>&1 | FileCheck %s --check-prefix=KERNEL
|
||||
|
||||
; TINY: Target does not support the tiny CodeModel
|
||||
; KERNEL: Target does not support the kernel CodeModel
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
9
test/CodeGen/SystemZ/codemodel.ll
Normal file
9
test/CodeGen/SystemZ/codemodel.ll
Normal file
@ -0,0 +1,9 @@
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=tiny < %s 2>&1 | FileCheck %s --check-prefix=TINY
|
||||
; RUN: not llc -verify-machineinstrs -o - -mtriple=arm-none-eabi -code-model=kernel < %s 2>&1 | FileCheck %s --check-prefix=KERNEL
|
||||
|
||||
; TINY: Target does not support the tiny CodeModel
|
||||
; KERNEL: Target does not support the kernel CodeModel
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
@ -1,10 +1,13 @@
|
||||
; RUN: llc < %s -code-model=small | FileCheck -check-prefix CHECK-SMALL %s
|
||||
; RUN: llc < %s -code-model=kernel | FileCheck -check-prefix CHECK-KERNEL %s
|
||||
; RUN: not llc < %s -code-model=tiny 2>&1 | FileCheck -check-prefix CHECK-TINY %s
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
@data = external global [0 x i32] ; <[0 x i32]*> [#uses=5]
|
||||
|
||||
; CHECK-TINY: Target does not support the tiny CodeModel
|
||||
|
||||
define i32 @foo() nounwind readonly {
|
||||
entry:
|
||||
; CHECK-SMALL-LABEL: foo:
|
||||
|
@ -1,6 +1,7 @@
|
||||
|
||||
; RUN: not llc < %s -march=xcore -code-model=medium 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
||||
; RUN: not llc < %s -march=xcore -code-model=kernel 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
||||
; RUN: not llc < %s -march=xcore -code-model=tiny 2>&1 | FileCheck %s -check-prefix=BAD_CM
|
||||
; BAD_CM: Target only supports CodeModel Small or Large
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user