Rollup merge of #47710 - alexcrichton:llvm-6-compat, r=nikomatsakis
First round of LLVM 6.0.0 compatibility This includes a number of commits for the first round of upgrading to LLVM 6. There are still [lingering bugs](https://github.com/rust-lang/rust/issues/47683) but I believe all of this will nonetheless be necessary!
This commit is contained in:
commit
8a9381db01
10 changed files with 55 additions and 40 deletions
|
@ -1,4 +1,4 @@
|
|||
FROM ubuntu:16.04
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
clang \
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
FROM ubuntu:16.04
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
clang \
|
||||
|
|
|
@ -320,8 +320,8 @@ pub struct TargetOptions {
|
|||
/// Relocation model to use in object file. Corresponds to `llc
|
||||
/// -relocation-model=$relocation_model`. Defaults to "pic".
|
||||
pub relocation_model: String,
|
||||
/// Code model to use. Corresponds to `llc -code-model=$code_model`. Defaults to "default".
|
||||
pub code_model: String,
|
||||
/// Code model to use. Corresponds to `llc -code-model=$code_model`.
|
||||
pub code_model: Option<String>,
|
||||
/// TLS model to use. Options are "global-dynamic" (default), "local-dynamic", "initial-exec"
|
||||
/// and "local-exec". This is similar to the -ftls-model option in GCC/Clang.
|
||||
pub tls_model: String,
|
||||
|
@ -483,7 +483,7 @@ impl Default for TargetOptions {
|
|||
only_cdylib: false,
|
||||
executables: false,
|
||||
relocation_model: "pic".to_string(),
|
||||
code_model: "default".to_string(),
|
||||
code_model: None,
|
||||
tls_model: "global-dynamic".to_string(),
|
||||
disable_redzone: false,
|
||||
eliminate_frame_pointer: true,
|
||||
|
@ -736,7 +736,7 @@ impl Target {
|
|||
key!(only_cdylib, bool);
|
||||
key!(executables, bool);
|
||||
key!(relocation_model);
|
||||
key!(code_model);
|
||||
key!(code_model, optional);
|
||||
key!(tls_model);
|
||||
key!(disable_redzone, bool);
|
||||
key!(eliminate_frame_pointer, bool);
|
||||
|
|
|
@ -299,12 +299,11 @@ pub enum RelocMode {
|
|||
#[repr(C)]
|
||||
pub enum CodeModel {
|
||||
Other,
|
||||
Default,
|
||||
JITDefault,
|
||||
Small,
|
||||
Kernel,
|
||||
Medium,
|
||||
Large,
|
||||
None,
|
||||
}
|
||||
|
||||
/// LLVMRustDiagnosticKind
|
||||
|
@ -331,7 +330,6 @@ pub enum DiagnosticKind {
|
|||
pub enum ArchiveKind {
|
||||
Other,
|
||||
K_GNU,
|
||||
K_MIPS64,
|
||||
K_BSD,
|
||||
K_COFF,
|
||||
}
|
||||
|
|
|
@ -105,7 +105,6 @@ impl FromStr for ArchiveKind {
|
|||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
"gnu" => Ok(ArchiveKind::K_GNU),
|
||||
"mips64" => Ok(ArchiveKind::K_MIPS64),
|
||||
"bsd" => Ok(ArchiveKind::K_BSD),
|
||||
"coff" => Ok(ArchiveKind::K_COFF),
|
||||
_ => Err(()),
|
||||
|
|
|
@ -69,8 +69,7 @@ pub const RELOC_MODEL_ARGS : [(&'static str, llvm::RelocMode); 7] = [
|
|||
("ropi-rwpi", llvm::RelocMode::ROPI_RWPI),
|
||||
];
|
||||
|
||||
pub const CODE_GEN_MODEL_ARGS : [(&'static str, llvm::CodeModel); 5] = [
|
||||
("default", llvm::CodeModel::Default),
|
||||
pub const CODE_GEN_MODEL_ARGS: &[(&str, llvm::CodeModel)] = &[
|
||||
("small", llvm::CodeModel::Small),
|
||||
("kernel", llvm::CodeModel::Kernel),
|
||||
("medium", llvm::CodeModel::Medium),
|
||||
|
@ -171,20 +170,23 @@ pub fn target_machine_factory(sess: &Session)
|
|||
let ffunction_sections = sess.target.target.options.function_sections;
|
||||
let fdata_sections = ffunction_sections;
|
||||
|
||||
let code_model_arg = match sess.opts.cg.code_model {
|
||||
Some(ref s) => &s,
|
||||
None => &sess.target.target.options.code_model,
|
||||
};
|
||||
let code_model_arg = sess.opts.cg.code_model.as_ref().or(
|
||||
sess.target.target.options.code_model.as_ref(),
|
||||
);
|
||||
|
||||
let code_model = match CODE_GEN_MODEL_ARGS.iter().find(
|
||||
|&&arg| arg.0 == code_model_arg) {
|
||||
Some(x) => x.1,
|
||||
_ => {
|
||||
sess.err(&format!("{:?} is not a valid code model",
|
||||
code_model_arg));
|
||||
sess.abort_if_errors();
|
||||
bug!();
|
||||
let code_model = match code_model_arg {
|
||||
Some(s) => {
|
||||
match CODE_GEN_MODEL_ARGS.iter().find(|arg| arg.0 == s) {
|
||||
Some(x) => x.1,
|
||||
_ => {
|
||||
sess.err(&format!("{:?} is not a valid code model",
|
||||
code_model_arg));
|
||||
sess.abort_if_errors();
|
||||
bug!();
|
||||
}
|
||||
}
|
||||
}
|
||||
None => llvm::CodeModel::None,
|
||||
};
|
||||
|
||||
let singlethread = sess.target.target.options.singlethread;
|
||||
|
@ -746,7 +748,7 @@ unsafe fn codegen(cgcx: &CodegenContext,
|
|||
// We can't use the same module for asm and binary output, because that triggers
|
||||
// various errors like invalid IR or broken binaries, so we might have to clone the
|
||||
// module to produce the asm output
|
||||
let llmod = if config.emit_obj {
|
||||
let llmod = if config.emit_obj && !asm2wasm {
|
||||
llvm::LLVMCloneModule(llmod)
|
||||
} else {
|
||||
llmod
|
||||
|
@ -755,7 +757,7 @@ unsafe fn codegen(cgcx: &CodegenContext,
|
|||
write_output_file(diag_handler, tm, cpm, llmod, &path,
|
||||
llvm::FileType::AssemblyFile)
|
||||
})?;
|
||||
if config.emit_obj {
|
||||
if config.emit_obj && !asm2wasm {
|
||||
llvm::LLVMDisposeModule(llmod);
|
||||
}
|
||||
timeline.record("asm");
|
||||
|
|
1
src/llvm-emscripten
Submodule
1
src/llvm-emscripten
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 2717444753318e461e0c3b30dacd03ffbac96903
|
|
@ -42,7 +42,6 @@ struct RustArchiveIterator {
|
|||
enum class LLVMRustArchiveKind {
|
||||
Other,
|
||||
GNU,
|
||||
MIPS64,
|
||||
BSD,
|
||||
COFF,
|
||||
};
|
||||
|
@ -51,8 +50,6 @@ static Archive::Kind fromRust(LLVMRustArchiveKind Kind) {
|
|||
switch (Kind) {
|
||||
case LLVMRustArchiveKind::GNU:
|
||||
return Archive::K_GNU;
|
||||
case LLVMRustArchiveKind::MIPS64:
|
||||
return Archive::K_MIPS64;
|
||||
case LLVMRustArchiveKind::BSD:
|
||||
return Archive::K_BSD;
|
||||
case LLVMRustArchiveKind::COFF:
|
||||
|
@ -235,9 +232,16 @@ LLVMRustWriteArchive(char *Dst, size_t NumMembers,
|
|||
Members.push_back(std::move(*MOrErr));
|
||||
}
|
||||
}
|
||||
auto Pair = writeArchive(Dst, Members, WriteSymbtab, Kind, true, false);
|
||||
if (!Pair.second)
|
||||
auto Result = writeArchive(Dst, Members, WriteSymbtab, Kind, true, false);
|
||||
#if LLVM_VERSION_GE(6, 0)
|
||||
if (!Result)
|
||||
return LLVMRustResult::Success;
|
||||
LLVMRustSetLastError(Pair.second.message().c_str());
|
||||
LLVMRustSetLastError(toString(std::move(Result)).c_str());
|
||||
#else
|
||||
if (!Result.second)
|
||||
return LLVMRustResult::Success;
|
||||
LLVMRustSetLastError(Result.second.message().c_str());
|
||||
#endif
|
||||
|
||||
return LLVMRustResult::Failure;
|
||||
}
|
||||
|
|
|
@ -23,9 +23,15 @@
|
|||
#include "llvm/Support/FileSystem.h"
|
||||
#include "llvm/Support/Host.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
|
||||
|
||||
#if LLVM_VERSION_GE(6, 0)
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#else
|
||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||
#endif
|
||||
|
||||
#if LLVM_VERSION_GE(4, 0)
|
||||
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
||||
#include "llvm/Transforms/IPO/FunctionImport.h"
|
||||
|
@ -210,20 +216,15 @@ extern "C" bool LLVMRustHasFeature(LLVMTargetMachineRef TM,
|
|||
|
||||
enum class LLVMRustCodeModel {
|
||||
Other,
|
||||
Default,
|
||||
JITDefault,
|
||||
Small,
|
||||
Kernel,
|
||||
Medium,
|
||||
Large,
|
||||
None,
|
||||
};
|
||||
|
||||
static CodeModel::Model fromRust(LLVMRustCodeModel Model) {
|
||||
switch (Model) {
|
||||
case LLVMRustCodeModel::Default:
|
||||
return CodeModel::Default;
|
||||
case LLVMRustCodeModel::JITDefault:
|
||||
return CodeModel::JITDefault;
|
||||
case LLVMRustCodeModel::Small:
|
||||
return CodeModel::Small;
|
||||
case LLVMRustCodeModel::Kernel:
|
||||
|
@ -360,7 +361,6 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
|||
bool TrapUnreachable,
|
||||
bool Singlethread) {
|
||||
|
||||
auto CM = fromRust(RustCM);
|
||||
auto OptLevel = fromRust(RustOptLevel);
|
||||
auto RM = fromRust(RustReloc);
|
||||
|
||||
|
@ -399,6 +399,13 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine(
|
|||
Options.ThreadModel = ThreadModel::Single;
|
||||
}
|
||||
|
||||
#if LLVM_VERSION_GE(6, 0)
|
||||
Optional<CodeModel::Model> CM;
|
||||
#else
|
||||
CodeModel::Model CM = CodeModel::Model::Default;
|
||||
#endif
|
||||
if (RustCM != LLVMRustCodeModel::None)
|
||||
CM = fromRust(RustCM);
|
||||
TargetMachine *TM = TheTarget->createTargetMachine(
|
||||
Trip.getTriple(), RealCPU, Feature, Options, RM, CM, OptLevel);
|
||||
return wrap(TM);
|
||||
|
|
|
@ -315,7 +315,11 @@ extern "C" void LLVMRustRemoveFunctionAttributes(LLVMValueRef Fn,
|
|||
// enable fpmath flag UnsafeAlgebra
|
||||
extern "C" void LLVMRustSetHasUnsafeAlgebra(LLVMValueRef V) {
|
||||
if (auto I = dyn_cast<Instruction>(unwrap<Value>(V))) {
|
||||
#if LLVM_VERSION_GE(6, 0)
|
||||
I->setFast(true);
|
||||
#else
|
||||
I->setHasUnsafeAlgebra(true);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue