提交 2c16e246 编写于 作者: J Jan-Erik Rediger

Use C type when passing value to LLVM pass

Previously the C type LLVMRelocMode (available as RelocMode in Rust)
was passed as is to the function.
However createTargetMachine expects a Reloc::Model, which is an enum
just one value short.
Additionally, the function was marked as requiring Reloc::Model in the
C code, but RelocMode on the Rust-side.

We now use the correct C type LLVMRelocMode and convert it to an
Optional<Reloc::Model> as expected by the createTargetMachine call the
same the original LLVMCreateTargetMachine function does.
See
https://github.com/llvm-mirror/llvm/blob/c9b262bfbd5b9fb6f10749dba1465569f39bd625/lib/Target/TargetMachineC.cpp#L104-L121

This was found by @EddyB.
上级 079db4f9
...@@ -167,12 +167,35 @@ LLVMRustCreateTargetMachine(const char *triple, ...@@ -167,12 +167,35 @@ LLVMRustCreateTargetMachine(const char *triple,
const char *cpu, const char *cpu,
const char *feature, const char *feature,
CodeModel::Model CM, CodeModel::Model CM,
Reloc::Model RM, LLVMRelocMode Reloc,
CodeGenOpt::Level OptLevel, CodeGenOpt::Level OptLevel,
bool UseSoftFloat, bool UseSoftFloat,
bool PositionIndependentExecutable, bool PositionIndependentExecutable,
bool FunctionSections, bool FunctionSections,
bool DataSections) { bool DataSections) {
#if LLVM_VERSION_MINOR <= 8
Reloc::Model RM;
#else
Optional<Reloc::Model> RM;
#endif
switch (Reloc){
case LLVMRelocStatic:
RM = Reloc::Static;
break;
case LLVMRelocPIC:
RM = Reloc::PIC_;
break;
case LLVMRelocDynamicNoPic:
RM = Reloc::DynamicNoPIC;
break;
default:
#if LLVM_VERSION_MINOR <= 8
RM = Reloc::Default;
#endif
break;
}
std::string Error; std::string Error;
Triple Trip(Triple::normalize(triple)); Triple Trip(Triple::normalize(triple));
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(), const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip.getTriple(),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册