rustc: Link LLVM directly into rustc again

This commit builds on #65501 continue to simplify the build system and
compiler now that we no longer have multiple LLVM backends to ship by
default. Here this switches the compiler back to what it once was long
long ago, which is linking LLVM directly to the compiler rather than
dynamically loading it at runtime. The `codegen-backends` directory of
the sysroot no longer exists and all relevant support in the build
system is removed. Note that `rustc` still supports a dynamically loaded
codegen backend as it did previously, it just no longer supports
dynamically loaded codegen backends in its own sysroot.

Additionally as part of this the `librustc_codegen_llvm` crate now once
again explicitly depends on all of its crates instead of implicitly
loading them through the sysroot. This involved filling out its
`Cargo.toml` and deleting all the now-unnecessary `extern crate`
annotations in the header of the crate. (this in turn required adding a
number of imports for names of macros too).

The end results of this change are:

* Rustbuild's build process for the compiler as all the "oh don't forget
  the codegen backend" checks can be easily removed.
* Building `rustc_codegen_llvm` is much simpler since it's simply
  another compiler crate.
* Managing the dependencies of `rustc_codegen_llvm` is much simpler since
  it's "just another `Cargo.toml` to edit"
* The build process should be a smidge faster because there's more
  parallelism in the main rustc build step rather than splitting
  `librustc_codegen_llvm` out to its own step.
* The compiler is expected to be slightly faster by default because the
  codegen backend does not need to be dynamically loaded.
* Disabling LLVM as part of rustbuild is still supported, supporting
  multiple codegen backends is still supported, and dynamic loading of a
  codegen backend is still supported.
This commit is contained in:
Alex Crichton 2019-10-22 08:51:35 -07:00 committed by Aaron Hill
parent 033662dfbc
commit 7f23e6e8d7
No known key found for this signature in database
GPG Key ID: B4087E510E98B164
41 changed files with 163 additions and 415 deletions

View File

@ -3435,7 +3435,25 @@ dependencies = [
name = "rustc_codegen_llvm" name = "rustc_codegen_llvm"
version = "0.0.0" version = "0.0.0"
dependencies = [ dependencies = [
"bitflags",
"flate2",
"libc",
"log",
"rustc",
"rustc-demangle",
"rustc_codegen_ssa",
"rustc_codegen_utils",
"rustc_data_structures",
"rustc_errors",
"rustc_fs_util",
"rustc_incremental",
"rustc_index",
"rustc_llvm", "rustc_llvm",
"rustc_target",
"smallvec 0.6.10",
"syntax",
"syntax_expand",
"syntax_pos",
] ]
[[package]] [[package]]
@ -3596,7 +3614,12 @@ dependencies = [
"log", "log",
"once_cell", "once_cell",
"rustc", "rustc",
<<<<<<< HEAD
"rustc-rayon", "rustc-rayon",
=======
"rustc-rayon 0.3.0",
"rustc_codegen_llvm",
>>>>>>> rustc: Link LLVM directly into rustc again
"rustc_codegen_ssa", "rustc_codegen_ssa",
"rustc_codegen_utils", "rustc_codegen_utils",
"rustc_data_structures", "rustc_data_structures",

View File

@ -379,9 +379,6 @@
# and currently the only standard option supported is `"llvm"` # and currently the only standard option supported is `"llvm"`
#codegen-backends = ["llvm"] #codegen-backends = ["llvm"]
# This is the name of the directory in which codegen backends will get installed
#codegen-backends-dir = "codegen-backends"
# Indicates whether LLD will be compiled and made available in the sysroot for # Indicates whether LLD will be compiled and made available in the sysroot for
# rustc to execute. # rustc to execute.
#lld = false #lld = false

View File

@ -339,7 +339,6 @@ impl<'a> Builder<'a> {
Kind::Build => describe!( Kind::Build => describe!(
compile::Std, compile::Std,
compile::Rustc, compile::Rustc,
compile::CodegenBackend,
compile::StartupObjects, compile::StartupObjects,
tool::BuildManifest, tool::BuildManifest,
tool::Rustbook, tool::Rustbook,
@ -364,7 +363,6 @@ impl<'a> Builder<'a> {
Kind::Check | Kind::Clippy | Kind::Fix => describe!( Kind::Check | Kind::Clippy | Kind::Fix => describe!(
check::Std, check::Std,
check::Rustc, check::Rustc,
check::CodegenBackend,
check::Rustdoc check::Rustdoc
), ),
Kind::Test => describe!( Kind::Test => describe!(
@ -632,11 +630,6 @@ impl<'a> Builder<'a> {
self.ensure(Libdir { compiler, target }) self.ensure(Libdir { compiler, target })
} }
pub fn sysroot_codegen_backends(&self, compiler: Compiler) -> PathBuf {
self.sysroot_libdir(compiler, compiler.host)
.with_file_name(self.config.rust_codegen_backends_dir.clone())
}
/// Returns the compiler's libdir where it stores the dynamic libraries that /// Returns the compiler's libdir where it stores the dynamic libraries that
/// it itself links against. /// it itself links against.
/// ///
@ -707,15 +700,6 @@ impl<'a> Builder<'a> {
} }
} }
/// Gets the paths to all of the compiler's codegen backends.
fn codegen_backends(&self, compiler: Compiler) -> impl Iterator<Item = PathBuf> {
fs::read_dir(self.sysroot_codegen_backends(compiler))
.into_iter()
.flatten()
.filter_map(Result::ok)
.map(|entry| entry.path())
}
pub fn rustdoc(&self, compiler: Compiler) -> PathBuf { pub fn rustdoc(&self, compiler: Compiler) -> PathBuf {
self.ensure(tool::Rustdoc { compiler }) self.ensure(tool::Rustdoc { compiler })
} }
@ -759,12 +743,6 @@ impl<'a> Builder<'a> {
let mut cargo = Command::new(&self.initial_cargo); let mut cargo = Command::new(&self.initial_cargo);
let out_dir = self.stage_out(compiler, mode); let out_dir = self.stage_out(compiler, mode);
// Codegen backends are not yet tracked by -Zbinary-dep-depinfo,
// so we need to explicitly clear out if they've been updated.
for backend in self.codegen_backends(compiler) {
self.clear_if_dirty(&out_dir, &backend);
}
if cmd == "doc" || cmd == "rustdoc" { if cmd == "doc" || cmd == "rustdoc" {
let my_out = match mode { let my_out = match mode {
// This is the intended out directory for compiler documentation. // This is the intended out directory for compiler documentation.

View File

@ -1,11 +1,10 @@
//! Implementation of compiling the compiler and standard library, in "check"-based modes. //! Implementation of compiling the compiler and standard library, in "check"-based modes.
use crate::compile::{run_cargo, std_cargo, rustc_cargo, rustc_cargo_env, use crate::compile::{run_cargo, std_cargo, rustc_cargo, add_to_sysroot};
add_to_sysroot};
use crate::builder::{RunConfig, Builder, Kind, ShouldRun, Step}; use crate::builder::{RunConfig, Builder, Kind, ShouldRun, Step};
use crate::tool::{prepare_tool_cargo, SourceType}; use crate::tool::{prepare_tool_cargo, SourceType};
use crate::{Compiler, Mode}; use crate::{Compiler, Mode};
use crate::cache::{INTERNER, Interned}; use crate::cache::Interned;
use std::path::PathBuf; use std::path::PathBuf;
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@ -97,7 +96,7 @@ impl Step for Rustc {
let mut cargo = builder.cargo(compiler, Mode::Rustc, target, let mut cargo = builder.cargo(compiler, Mode::Rustc, target,
cargo_subcommand(builder.kind)); cargo_subcommand(builder.kind));
rustc_cargo(builder, &mut cargo); rustc_cargo(builder, &mut cargo, target);
builder.info(&format!("Checking compiler artifacts ({} -> {})", &compiler.host, target)); builder.info(&format!("Checking compiler artifacts ({} -> {})", &compiler.host, target));
run_cargo(builder, run_cargo(builder,
@ -113,55 +112,6 @@ impl Step for Rustc {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct CodegenBackend {
pub target: Interned<String>,
pub backend: Interned<String>,
}
impl Step for CodegenBackend {
type Output = ();
const ONLY_HOSTS: bool = true;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.all_krates("rustc_codegen_llvm")
}
fn make_run(run: RunConfig<'_>) {
let backend = run.builder.config.rust_codegen_backends.get(0);
let backend = backend.cloned().unwrap_or_else(|| {
INTERNER.intern_str("llvm")
});
run.builder.ensure(CodegenBackend {
target: run.target,
backend,
});
}
fn run(self, builder: &Builder<'_>) {
let compiler = builder.compiler(0, builder.config.build);
let target = self.target;
let backend = self.backend;
builder.ensure(Rustc { target });
let mut cargo = builder.cargo(compiler, Mode::Codegen, target,
cargo_subcommand(builder.kind));
cargo.arg("--manifest-path").arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
rustc_cargo_env(builder, &mut cargo);
// We won't build LLVM if it's not available, as it shouldn't affect `check`.
run_cargo(builder,
cargo,
args(builder.kind),
&codegen_backend_stamp(builder, compiler, target, backend),
vec![],
true);
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct Rustdoc { pub struct Rustdoc {
pub target: Interned<String>, pub target: Interned<String>,
@ -231,16 +181,6 @@ pub fn librustc_stamp(
builder.cargo_out(compiler, Mode::Rustc, target).join(".librustc-check.stamp") builder.cargo_out(compiler, Mode::Rustc, target).join(".librustc-check.stamp")
} }
/// Cargo's output path for librustc_codegen_llvm in a given stage, compiled by a particular
/// compiler for the specified target and backend.
fn codegen_backend_stamp(builder: &Builder<'_>,
compiler: Compiler,
target: Interned<String>,
backend: Interned<String>) -> PathBuf {
builder.cargo_out(compiler, Mode::Codegen, target)
.join(format!(".librustc_codegen_llvm-{}-check.stamp", backend))
}
/// Cargo's output path for rustdoc in a given stage, compiled by a particular /// Cargo's output path for rustdoc in a given stage, compiled by a particular
/// compiler for the specified target. /// compiler for the specified target.
pub fn rustdoc_stamp( pub fn rustdoc_stamp(

View File

@ -27,7 +27,7 @@ use crate::{Compiler, Mode, GitRepo};
use crate::native; use crate::native;
use crate::cache::{INTERNER, Interned}; use crate::cache::{INTERNER, Interned};
use crate::builder::{Step, RunConfig, ShouldRun, Builder}; use crate::builder::{Step, RunConfig, ShouldRun, Builder, Kind};
#[derive(Debug, PartialOrd, Ord, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, PartialOrd, Ord, Copy, Clone, PartialEq, Eq, Hash)]
pub struct Std { pub struct Std {
@ -445,7 +445,7 @@ impl Step for Rustc {
}); });
let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "build"); let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "build");
rustc_cargo(builder, &mut cargo); rustc_cargo(builder, &mut cargo, target);
builder.info(&format!("Building stage{} compiler artifacts ({} -> {})", builder.info(&format!("Building stage{} compiler artifacts ({} -> {})",
compiler.stage, &compiler.host, target)); compiler.stage, &compiler.host, target));
@ -464,21 +464,20 @@ impl Step for Rustc {
} }
} }
pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo) { pub fn rustc_cargo(builder: &Builder<'_>, cargo: &mut Cargo, target: Interned<String>) {
cargo.arg("--features").arg(builder.rustc_features()) cargo.arg("--features").arg(builder.rustc_features())
.arg("--manifest-path") .arg("--manifest-path")
.arg(builder.src.join("src/rustc/Cargo.toml")); .arg(builder.src.join("src/rustc/Cargo.toml"));
rustc_cargo_env(builder, cargo); rustc_cargo_env(builder, cargo, target);
} }
pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo) { pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo, target: Interned<String>) {
// Set some configuration variables picked up by build scripts and // Set some configuration variables picked up by build scripts and
// the compiler alike // the compiler alike
cargo.env("CFG_RELEASE", builder.rust_release()) cargo.env("CFG_RELEASE", builder.rust_release())
.env("CFG_RELEASE_CHANNEL", &builder.config.channel) .env("CFG_RELEASE_CHANNEL", &builder.config.channel)
.env("CFG_VERSION", builder.rust_version()) .env("CFG_VERSION", builder.rust_version())
.env("CFG_PREFIX", builder.config.prefix.clone().unwrap_or_default()) .env("CFG_PREFIX", builder.config.prefix.clone().unwrap_or_default());
.env("CFG_CODEGEN_BACKENDS_DIR", &builder.config.rust_codegen_backends_dir);
let libdir_relative = builder.config.libdir_relative().unwrap_or(Path::new("lib")); let libdir_relative = builder.config.libdir_relative().unwrap_or(Path::new("lib"));
cargo.env("CFG_LIBDIR_RELATIVE", libdir_relative); cargo.env("CFG_LIBDIR_RELATIVE", libdir_relative);
@ -501,6 +500,49 @@ pub fn rustc_cargo_env(builder: &Builder<'_>, cargo: &mut Cargo) {
if builder.config.rust_verify_llvm_ir { if builder.config.rust_verify_llvm_ir {
cargo.env("RUSTC_VERIFY_LLVM_IR", "1"); cargo.env("RUSTC_VERIFY_LLVM_IR", "1");
} }
// Pass down configuration from the LLVM build into the build of
// librustc_llvm and librustc_codegen_llvm.
//
// Note that this is disabled if LLVM itself is disabled or we're in a check
// build, where if we're in a check build there's no need to build all of
// LLVM and such.
if builder.config.llvm_enabled() && builder.kind != Kind::Check {
if builder.is_rust_llvm(target) {
cargo.env("LLVM_RUSTLLVM", "1");
}
let llvm_config = builder.ensure(native::Llvm { target });
cargo.env("LLVM_CONFIG", &llvm_config);
let target_config = builder.config.target_config.get(&target);
if let Some(s) = target_config.and_then(|c| c.llvm_config.as_ref()) {
cargo.env("CFG_LLVM_ROOT", s);
}
// Some LLVM linker flags (-L and -l) may be needed to link librustc_llvm.
if let Some(ref s) = builder.config.llvm_ldflags {
cargo.env("LLVM_LINKER_FLAGS", s);
}
// Building with a static libstdc++ is only supported on linux right now,
// not for MSVC or macOS
if builder.config.llvm_static_stdcpp &&
!target.contains("freebsd") &&
!target.contains("windows") &&
!target.contains("apple") {
let file = compiler_file(builder,
builder.cxx(target).unwrap(),
target,
"libstdc++.a");
cargo.env("LLVM_STATIC_STDCPP", file);
}
if builder.config.llvm_link_shared || builder.config.llvm_thin_lto {
cargo.env("LLVM_LINK_SHARED", "1");
}
if builder.config.llvm_use_libcxx {
cargo.env("LLVM_USE_LIBCXX", "1");
}
if builder.config.llvm_optimize && !builder.config.llvm_release_debuginfo {
cargo.env("LLVM_NDEBUG", "1");
}
}
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
@ -537,197 +579,6 @@ impl Step for RustcLink {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct CodegenBackend {
pub compiler: Compiler,
pub target: Interned<String>,
pub backend: Interned<String>,
}
impl Step for CodegenBackend {
type Output = ();
const ONLY_HOSTS: bool = true;
const DEFAULT: bool = true;
fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
run.all_krates("rustc_codegen_llvm")
}
fn make_run(run: RunConfig<'_>) {
let backend = run.builder.config.rust_codegen_backends.get(0);
let backend = backend.cloned().unwrap_or_else(|| {
INTERNER.intern_str("llvm")
});
run.builder.ensure(CodegenBackend {
compiler: run.builder.compiler(run.builder.top_stage, run.host),
target: run.target,
backend,
});
}
fn run(self, builder: &Builder<'_>) {
let compiler = self.compiler;
let target = self.target;
let backend = self.backend;
builder.ensure(Rustc { compiler, target });
if builder.config.keep_stage.contains(&compiler.stage) {
builder.info("Warning: Using a potentially old codegen backend. \
This may not behave well.");
// Codegen backends are linked separately from this step today, so we don't do
// anything here.
return;
}
let compiler_to_use = builder.compiler_for(compiler.stage, compiler.host, target);
if compiler_to_use != compiler {
builder.ensure(CodegenBackend {
compiler: compiler_to_use,
target,
backend,
});
return;
}
let out_dir = builder.cargo_out(compiler, Mode::Codegen, target);
let mut cargo = builder.cargo(compiler, Mode::Codegen, target, "build");
cargo.arg("--manifest-path")
.arg(builder.src.join("src/librustc_codegen_llvm/Cargo.toml"));
rustc_cargo_env(builder, &mut cargo);
let features = build_codegen_backend(&builder, &mut cargo, &compiler, target, backend);
cargo.arg("--features").arg(features);
let tmp_stamp = out_dir.join(".tmp.stamp");
let files = run_cargo(builder, cargo, vec![], &tmp_stamp, vec![], false);
if builder.config.dry_run {
return;
}
let mut files = files.into_iter()
.filter(|f| {
let filename = f.file_name().unwrap().to_str().unwrap();
is_dylib(filename) && filename.contains("rustc_codegen_llvm-")
});
let codegen_backend = match files.next() {
Some(f) => f,
None => panic!("no dylibs built for codegen backend?"),
};
if let Some(f) = files.next() {
panic!("codegen backend built two dylibs:\n{}\n{}",
codegen_backend.display(),
f.display());
}
let stamp = codegen_backend_stamp(builder, compiler, target, backend);
let codegen_backend = codegen_backend.to_str().unwrap();
t!(fs::write(&stamp, &codegen_backend));
}
}
pub fn build_codegen_backend(builder: &Builder<'_>,
cargo: &mut Cargo,
compiler: &Compiler,
target: Interned<String>,
backend: Interned<String>) -> String {
match &*backend {
"llvm" => {
// Build LLVM for our target. This will implicitly build the
// host LLVM if necessary.
let llvm_config = builder.ensure(native::Llvm {
target,
});
builder.info(&format!("Building stage{} codegen artifacts ({} -> {}, {})",
compiler.stage, &compiler.host, target, backend));
// Pass down configuration from the LLVM build into the build of
// librustc_llvm and librustc_codegen_llvm.
if builder.is_rust_llvm(target) {
cargo.env("LLVM_RUSTLLVM", "1");
}
cargo.env("LLVM_CONFIG", &llvm_config);
let target_config = builder.config.target_config.get(&target);
if let Some(s) = target_config.and_then(|c| c.llvm_config.as_ref()) {
cargo.env("CFG_LLVM_ROOT", s);
}
// Some LLVM linker flags (-L and -l) may be needed to link librustc_llvm.
if let Some(ref s) = builder.config.llvm_ldflags {
cargo.env("LLVM_LINKER_FLAGS", s);
}
// Building with a static libstdc++ is only supported on linux and mingw right now,
// not for MSVC or macOS
if builder.config.llvm_static_stdcpp &&
!target.contains("freebsd") &&
!target.contains("msvc") &&
!target.contains("apple") {
let file = compiler_file(builder,
builder.cxx(target).unwrap(),
target,
"libstdc++.a");
cargo.env("LLVM_STATIC_STDCPP", file);
}
if builder.config.llvm_link_shared || builder.config.llvm_thin_lto {
cargo.env("LLVM_LINK_SHARED", "1");
}
if builder.config.llvm_use_libcxx {
cargo.env("LLVM_USE_LIBCXX", "1");
}
if builder.config.llvm_optimize && !builder.config.llvm_release_debuginfo {
cargo.env("LLVM_NDEBUG", "1");
}
}
_ => panic!("unknown backend: {}", backend),
}
String::new()
}
/// Creates the `codegen-backends` folder for a compiler that's about to be
/// assembled as a complete compiler.
///
/// This will take the codegen artifacts produced by `compiler` and link them
/// into an appropriate location for `target_compiler` to be a functional
/// compiler.
fn copy_codegen_backends_to_sysroot(builder: &Builder<'_>,
compiler: Compiler,
target_compiler: Compiler) {
let target = target_compiler.host;
// Note that this step is different than all the other `*Link` steps in
// that it's not assembling a bunch of libraries but rather is primarily
// moving the codegen backend into place. The codegen backend of rustc is
// not linked into the main compiler by default but is rather dynamically
// selected at runtime for inclusion.
//
// Here we're looking for the output dylib of the `CodegenBackend` step and
// we're copying that into the `codegen-backends` folder.
let dst = builder.sysroot_codegen_backends(target_compiler);
t!(fs::create_dir_all(&dst));
if builder.config.dry_run {
return;
}
for backend in builder.config.rust_codegen_backends.iter() {
let stamp = codegen_backend_stamp(builder, compiler, target, *backend);
let dylib = t!(fs::read_to_string(&stamp));
let file = Path::new(&dylib);
let filename = file.file_name().unwrap().to_str().unwrap();
// change `librustc_codegen_llvm-xxxxxx.so` to `librustc_codegen_llvm-llvm.so`
let target_filename = {
let dash = filename.find('-').unwrap();
let dot = filename.find('.').unwrap();
format!("{}-{}{}",
&filename[..dash],
backend,
&filename[dot..])
};
builder.copy(&file, &dst.join(target_filename));
}
}
fn copy_lld_to_sysroot(builder: &Builder<'_>, fn copy_lld_to_sysroot(builder: &Builder<'_>,
target_compiler: Compiler, target_compiler: Compiler,
lld_install_root: &Path) { lld_install_root: &Path) {
@ -766,16 +617,6 @@ pub fn librustc_stamp(
builder.cargo_out(compiler, Mode::Rustc, target).join(".librustc.stamp") builder.cargo_out(compiler, Mode::Rustc, target).join(".librustc.stamp")
} }
/// Cargo's output path for librustc_codegen_llvm in a given stage, compiled by a particular
/// compiler for the specified target and backend.
fn codegen_backend_stamp(builder: &Builder<'_>,
compiler: Compiler,
target: Interned<String>,
backend: Interned<String>) -> PathBuf {
builder.cargo_out(compiler, Mode::Codegen, target)
.join(format!(".librustc_codegen_llvm-{}.stamp", backend))
}
pub fn compiler_file( pub fn compiler_file(
builder: &Builder<'_>, builder: &Builder<'_>,
compiler: &Path, compiler: &Path,
@ -879,13 +720,6 @@ impl Step for Assemble {
compiler: build_compiler, compiler: build_compiler,
target: target_compiler.host, target: target_compiler.host,
}); });
for &backend in builder.config.rust_codegen_backends.iter() {
builder.ensure(CodegenBackend {
compiler: build_compiler,
target: target_compiler.host,
backend,
});
}
let lld_install = if builder.config.lld_enabled { let lld_install = if builder.config.lld_enabled {
Some(builder.ensure(native::Lld { Some(builder.ensure(native::Lld {
@ -911,9 +745,6 @@ impl Step for Assemble {
} }
} }
copy_codegen_backends_to_sysroot(builder,
build_compiler,
target_compiler);
if let Some(lld_install) = lld_install { if let Some(lld_install) = lld_install {
copy_lld_to_sysroot(builder, target_compiler, &lld_install); copy_lld_to_sysroot(builder, target_compiler, &lld_install);
} }

View File

@ -105,7 +105,6 @@ pub struct Config {
pub rust_optimize_tests: bool, pub rust_optimize_tests: bool,
pub rust_dist_src: bool, pub rust_dist_src: bool,
pub rust_codegen_backends: Vec<Interned<String>>, pub rust_codegen_backends: Vec<Interned<String>>,
pub rust_codegen_backends_dir: String,
pub rust_verify_llvm_ir: bool, pub rust_verify_llvm_ir: bool,
pub rust_remap_debuginfo: bool, pub rust_remap_debuginfo: bool,
@ -316,7 +315,6 @@ struct Rust {
dist_src: Option<bool>, dist_src: Option<bool>,
save_toolstates: Option<String>, save_toolstates: Option<String>,
codegen_backends: Option<Vec<String>>, codegen_backends: Option<Vec<String>>,
codegen_backends_dir: Option<String>,
lld: Option<bool>, lld: Option<bool>,
llvm_tools: Option<bool>, llvm_tools: Option<bool>,
lldb: Option<bool>, lldb: Option<bool>,
@ -372,7 +370,6 @@ impl Config {
config.ignore_git = false; config.ignore_git = false;
config.rust_dist_src = true; config.rust_dist_src = true;
config.rust_codegen_backends = vec![INTERNER.intern_str("llvm")]; config.rust_codegen_backends = vec![INTERNER.intern_str("llvm")];
config.rust_codegen_backends_dir = "codegen-backends".to_owned();
config.deny_warnings = true; config.deny_warnings = true;
config.missing_tools = false; config.missing_tools = false;
@ -575,8 +572,6 @@ impl Config {
.collect(); .collect();
} }
set(&mut config.rust_codegen_backends_dir, rust.codegen_backends_dir.clone());
config.rust_codegen_units = rust.codegen_units.map(threads_from_config); config.rust_codegen_units = rust.codegen_units.map(threads_from_config);
config.rust_codegen_units_std = rust.codegen_units_std.map(threads_from_config); config.rust_codegen_units_std = rust.codegen_units_std.map(threads_from_config);
} }

View File

@ -498,16 +498,6 @@ impl Step for Rustc {
} }
} }
// Copy over the codegen backends
let backends_src = builder.sysroot_codegen_backends(compiler);
let backends_rel = backends_src.strip_prefix(&src).unwrap()
.strip_prefix(builder.sysroot_libdir_relative(compiler)).unwrap();
// Don't use custom libdir here because ^lib/ will be resolved again with installer
let backends_dst = image.join("lib").join(&backends_rel);
t!(fs::create_dir_all(&backends_dst));
builder.cp_r(&backends_src, &backends_dst);
// Copy libLLVM.so to the lib dir as well, if needed. While not // Copy libLLVM.so to the lib dir as well, if needed. While not
// technically needed by rustc itself it's needed by lots of other // technically needed by rustc itself it's needed by lots of other
// components like the llvm tools and LLD. LLD is included below and // components like the llvm tools and LLD. LLD is included below and

View File

@ -541,7 +541,7 @@ impl Step for Rustc {
// Build cargo command. // Build cargo command.
let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "doc"); let mut cargo = builder.cargo(compiler, Mode::Rustc, target, "doc");
cargo.env("RUSTDOCFLAGS", "--document-private-items --passes strip-hidden"); cargo.env("RUSTDOCFLAGS", "--document-private-items --passes strip-hidden");
compile::rustc_cargo(builder, &mut cargo); compile::rustc_cargo(builder, &mut cargo, target);
// Only include compiler crates, no dependencies of those, such as `libc`. // Only include compiler crates, no dependencies of those, such as `libc`.
cargo.arg("--no-deps"); cargo.arg("--no-deps");

View File

@ -500,6 +500,9 @@ impl Build {
if self.config.jemalloc { if self.config.jemalloc {
features.push_str("jemalloc"); features.push_str("jemalloc");
} }
if self.config.llvm_enabled() {
features.push_str(" llvm");
}
features features
} }

View File

@ -1773,7 +1773,7 @@ impl Step for Crate {
} }
Mode::Rustc => { Mode::Rustc => {
builder.ensure(compile::Rustc { compiler, target }); builder.ensure(compile::Rustc { compiler, target });
compile::rustc_cargo(builder, &mut cargo); compile::rustc_cargo(builder, &mut cargo, target);
} }
_ => panic!("can only test libraries"), _ => panic!("can only test libraries"),
}; };

View File

@ -7,8 +7,26 @@ edition = "2018"
[lib] [lib]
name = "rustc_codegen_llvm" name = "rustc_codegen_llvm"
path = "lib.rs" path = "lib.rs"
crate-type = ["dylib"]
test = false test = false
doctest = false
[dependencies] [dependencies]
bitflags = "1.0"
flate2 = "1.0"
libc = "0.2"
log = "0.4"
rustc = { path = "../librustc" }
rustc-demangle = "0.1"
rustc_codegen_ssa = { path = "../librustc_codegen_ssa" }
rustc_codegen_utils = { path = "../librustc_codegen_utils" }
rustc_data_structures = { path = "../librustc_data_structures" }
rustc_errors = { path = "../librustc_errors" }
rustc_fs_util = { path = "../librustc_fs_util" }
rustc_incremental = { path = "../librustc_incremental" }
rustc_index = { path = "../librustc_index" }
rustc_llvm = { path = "../librustc_llvm" } rustc_llvm = { path = "../librustc_llvm" }
rustc_target = { path = "../librustc_target" }
smallvec = { version = "0.6.7", features = ["union", "may_dangle"] }
syntax = { path = "../libsyntax" }
syntax_expand = { path = "../libsyntax_expand" }
syntax_pos = { path = "../libsyntax_pos" }

View File

@ -8,6 +8,8 @@ use crate::value::Value;
use rustc_codegen_ssa::MemFlags; use rustc_codegen_ssa::MemFlags;
use rustc_codegen_ssa::mir::place::PlaceRef; use rustc_codegen_ssa::mir::place::PlaceRef;
use rustc_codegen_ssa::mir::operand::OperandValue; use rustc_codegen_ssa::mir::operand::OperandValue;
use rustc_target::abi::call::ArgAbi;
use rustc::bug;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc_target::abi::call::ArgAbi; use rustc_target::abi::call::ArgAbi;
use rustc_target::abi::{HasDataLayout, LayoutOf}; use rustc_target::abi::{HasDataLayout, LayoutOf};

View File

@ -4,6 +4,7 @@ use crate::attributes;
use libc::c_uint; use libc::c_uint;
use rustc::ty::TyCtxt; use rustc::ty::TyCtxt;
use syntax::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS}; use syntax::expand::allocator::{AllocatorKind, AllocatorTy, ALLOCATOR_METHODS};
use rustc::bug;
use crate::ModuleLlvm; use crate::ModuleLlvm;
use crate::llvm::{self, False, True}; use crate::llvm::{self, False, True};

View File

@ -12,7 +12,7 @@ use syntax_pos::Span;
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use libc::{c_uint, c_char}; use libc::{c_uint, c_char};
use log::debug;
impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> { impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
fn codegen_inline_asm( fn codegen_inline_asm(

View File

@ -12,6 +12,7 @@ use rustc::ty::query::Providers;
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_target::abi::call::Conv; use rustc_target::abi::call::Conv;
use rustc_data_structures::const_cstr;
use rustc_target::spec::PanicStrategy; use rustc_target::spec::PanicStrategy;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;

View File

@ -4,11 +4,12 @@ use crate::back::write::{self, DiagnosticHandlers, with_llvm_pmb, save_temp_bitc
use crate::llvm::archive_ro::ArchiveRO; use crate::llvm::archive_ro::ArchiveRO;
use crate::llvm::{self, True, False}; use crate::llvm::{self, True, False};
use crate::{ModuleLlvm, LlvmCodegenBackend}; use crate::{ModuleLlvm, LlvmCodegenBackend};
use rustc::bug;
use rustc_codegen_ssa::back::symbol_export; use rustc_codegen_ssa::back::symbol_export;
use rustc_codegen_ssa::back::write::{ModuleConfig, CodegenContext, FatLTOInput}; use rustc_codegen_ssa::back::write::{ModuleConfig, CodegenContext, FatLTOInput};
use rustc_codegen_ssa::back::lto::{SerializedModule, LtoModuleCodegen, ThinShared, ThinModule}; use rustc_codegen_ssa::back::lto::{SerializedModule, LtoModuleCodegen, ThinShared, ThinModule};
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use errors::{FatalError, Handler}; use rustc_errors::{FatalError, Handler};
use rustc::dep_graph::WorkProduct; use rustc::dep_graph::WorkProduct;
use rustc_session::cgu_reuse_tracker::CguReuse; use rustc_session::cgu_reuse_tracker::CguReuse;
use rustc::hir::def_id::LOCAL_CRATE; use rustc::hir::def_id::LOCAL_CRATE;
@ -17,6 +18,7 @@ use rustc::session::config::{self, Lto};
use rustc::util::common::time_ext; use rustc::util::common::time_ext;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_codegen_ssa::{RLIB_BYTECODE_EXTENSION, ModuleCodegen, ModuleKind}; use rustc_codegen_ssa::{RLIB_BYTECODE_EXTENSION, ModuleCodegen, ModuleKind};
use log::{info, debug};
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use std::ptr; use std::ptr;

View File

@ -10,6 +10,7 @@ use crate::type_::Type;
use crate::context::{is_pie_binary, get_reloc_model}; use crate::context::{is_pie_binary, get_reloc_model};
use crate::common; use crate::common;
use crate::LlvmCodegenBackend; use crate::LlvmCodegenBackend;
use rustc::bug;
use rustc::hir::def_id::LOCAL_CRATE; use rustc::hir::def_id::LOCAL_CRATE;
use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, run_assembler}; use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, run_assembler};
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
@ -20,7 +21,8 @@ use rustc_codegen_ssa::{RLIB_BYTECODE_EXTENSION, ModuleCodegen, CompiledModule};
use rustc::util::common::time_ext; use rustc::util::common::time_ext;
use rustc_fs_util::{path_to_c_string, link_or_copy}; use rustc_fs_util::{path_to_c_string, link_or_copy};
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use errors::{Handler, FatalError}; use rustc_errors::{Handler, FatalError};
use log::debug;
use std::ffi::CString; use std::ffi::CString;
use std::fs; use std::fs;
@ -55,7 +57,7 @@ pub const TLS_MODEL_ARGS : [(&str, llvm::ThreadLocalMode); 4] = [
("local-exec", llvm::ThreadLocalMode::LocalExec), ("local-exec", llvm::ThreadLocalMode::LocalExec),
]; ];
pub fn llvm_err(handler: &errors::Handler, msg: &str) -> FatalError { pub fn llvm_err(handler: &rustc_errors::Handler, msg: &str) -> FatalError {
match llvm::last_error() { match llvm::last_error() {
Some(err) => handler.fatal(&format!("{}: {}", msg, err)), Some(err) => handler.fatal(&format!("{}: {}", msg, err)),
None => handler.fatal(&msg), None => handler.fatal(&msg),
@ -63,7 +65,7 @@ pub fn llvm_err(handler: &errors::Handler, msg: &str) -> FatalError {
} }
pub fn write_output_file( pub fn write_output_file(
handler: &errors::Handler, handler: &rustc_errors::Handler,
target: &'ll llvm::TargetMachine, target: &'ll llvm::TargetMachine,
pm: &llvm::PassManager<'ll>, pm: &llvm::PassManager<'ll>,
m: &'ll llvm::Module, m: &'ll llvm::Module,

View File

@ -23,6 +23,8 @@ use std::ffi::CStr;
use std::ops::{Deref, Range}; use std::ops::{Deref, Range};
use std::ptr; use std::ptr;
use std::iter::TrustedLen; use std::iter::TrustedLen;
use rustc_data_structures::const_cstr;
use log::debug;
// All Builders must have an llfn associated with them // All Builders must have an llfn associated with them
#[must_use] #[must_use]

View File

@ -10,6 +10,7 @@ use crate::llvm;
use crate::context::CodegenCx; use crate::context::CodegenCx;
use crate::value::Value; use crate::value::Value;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use log::debug;
use rustc::ty::{TypeFoldable, Instance}; use rustc::ty::{TypeFoldable, Instance};
use rustc::ty::layout::{FnAbiExt, HasTyCtxt}; use rustc::ty::layout::{FnAbiExt, HasTyCtxt};

View File

@ -8,6 +8,8 @@ use crate::type_::Type;
use crate::type_of::LayoutLlvmExt; use crate::type_of::LayoutLlvmExt;
use crate::value::Value; use crate::value::Value;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc::bug;
use log::debug;
use crate::consts::const_alloc_to_llvm; use crate::consts::const_alloc_to_llvm;
use rustc::ty::layout::{HasDataLayout, LayoutOf, self, TyLayout, Size}; use rustc::ty::layout::{HasDataLayout, LayoutOf, self, TyLayout, Size};

View File

@ -16,6 +16,9 @@ use rustc::ty::{self, Ty, Instance};
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use syntax::symbol::{Symbol, sym}; use syntax::symbol::{Symbol, sym};
use syntax_pos::Span; use syntax_pos::Span;
use rustc::{bug, span_bug};
use rustc_data_structures::const_cstr;
use log::debug;
use rustc::ty::layout::{self, Size, Align, LayoutOf}; use rustc::ty::layout::{self, Size, Align, LayoutOf};

View File

@ -12,6 +12,7 @@ use rustc_codegen_ssa::traits::*;
use rustc_data_structures::base_n; use rustc_data_structures::base_n;
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use rustc::bug;
use rustc::mir::mono::CodegenUnit; use rustc::mir::mono::CodegenUnit;
use rustc::session::config::{self, DebugInfo}; use rustc::session::config::{self, DebugInfo};
use rustc::session::Session; use rustc::session::Session;
@ -23,6 +24,7 @@ use rustc::util::nodemap::FxHashMap;
use rustc_target::spec::{HasTargetSpec, Target}; use rustc_target::spec::{HasTargetSpec, Target};
use rustc_codegen_ssa::base::wants_msvc_seh; use rustc_codegen_ssa::base::wants_msvc_seh;
use crate::callee::get_fn; use crate::callee::get_fn;
use rustc_data_structures::const_cstr;
use std::ffi::CStr; use std::ffi::CStr;
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};

View File

@ -7,6 +7,7 @@ use crate::builder::Builder;
use crate::value::Value; use crate::value::Value;
use rustc::session::config::DebugInfo; use rustc::session::config::DebugInfo;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc::bug;
use syntax::attr; use syntax::attr;
use syntax::symbol::sym; use syntax::symbol::sym;

View File

@ -35,10 +35,13 @@ use rustc::session::config::{self, DebugInfo};
use rustc::util::nodemap::FxHashMap; use rustc::util::nodemap::FxHashMap;
use rustc_fs_util::path_to_c_string; use rustc_fs_util::path_to_c_string;
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use rustc_data_structures::const_cstr;
use rustc_target::abi::HasDataLayout; use rustc_target::abi::HasDataLayout;
use syntax::ast; use syntax::ast;
use syntax::symbol::{Interner, Symbol}; use syntax::symbol::{Interner, Symbol};
use syntax_pos::{self, Span, FileName}; use syntax_pos::{self, Span, FileName};
use rustc::{bug, span_bug};
use log::debug;
use libc::{c_uint, c_longlong}; use libc::{c_uint, c_longlong};
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;

View File

@ -33,6 +33,7 @@ use rustc_codegen_ssa::mir::debuginfo::{FunctionDebugContext, DebugScope,
use libc::c_uint; use libc::c_uint;
use std::cell::RefCell; use std::cell::RefCell;
use std::ffi::CString; use std::ffi::CString;
use log::debug;
use smallvec::SmallVec; use smallvec::SmallVec;
use syntax_pos::{self, BytePos, Span, Pos}; use syntax_pos::{self, BytePos, Span, Pos};

View File

@ -8,6 +8,7 @@ use crate::llvm;
use crate::llvm::debuginfo::DIScope; use crate::llvm::debuginfo::DIScope;
use crate::builder::Builder; use crate::builder::Builder;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use log::debug;
use libc::c_uint; use libc::c_uint;
use syntax_pos::{Span, Pos}; use syntax_pos::{Span, Pos};

View File

@ -22,6 +22,7 @@ use rustc::ty::Ty;
use rustc::session::config::Sanitizer; use rustc::session::config::Sanitizer;
use rustc_data_structures::small_c_str::SmallCStr; use rustc_data_structures::small_c_str::SmallCStr;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use log::debug;
/// Declare a function. /// Declare a function.
/// ///

View File

@ -19,6 +19,7 @@ use rustc_codegen_ssa::common::{IntPredicate, TypeKind};
use rustc::hir; use rustc::hir;
use rustc_target::abi::HasDataLayout; use rustc_target::abi::HasDataLayout;
use syntax::ast; use syntax::ast;
use rustc::{bug, span_bug};
use rustc_codegen_ssa::common::span_invalid_monomorphization_error; use rustc_codegen_ssa::common::span_invalid_monomorphization_error;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;

View File

@ -24,6 +24,7 @@
use back::write::{create_target_machine, create_informational_target_machine}; use back::write::{create_target_machine, create_informational_target_machine};
use syntax_pos::symbol::Symbol; use syntax_pos::symbol::Symbol;
<<<<<<< HEAD
extern crate rustc_demangle; extern crate rustc_demangle;
extern crate flate2; extern crate flate2;
#[macro_use] extern crate bitflags; #[macro_use] extern crate bitflags;
@ -46,11 +47,13 @@ extern crate syntax_pos;
extern crate rustc_errors as errors; extern crate rustc_errors as errors;
extern crate rustc_session; extern crate rustc_session;
=======
>>>>>>> rustc: Link LLVM directly into rustc again
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, FatLTOInput}; use rustc_codegen_ssa::back::write::{CodegenContext, ModuleConfig, FatLTOInput};
use rustc_codegen_ssa::back::lto::{SerializedModule, LtoModuleCodegen, ThinModule}; use rustc_codegen_ssa::back::lto::{SerializedModule, LtoModuleCodegen, ThinModule};
use rustc_codegen_ssa::CompiledModule; use rustc_codegen_ssa::CompiledModule;
use errors::{FatalError, Handler}; use rustc_errors::{FatalError, Handler};
use rustc::dep_graph::WorkProduct; use rustc::dep_graph::WorkProduct;
use syntax::expand::allocator::AllocatorKind; use syntax::expand::allocator::AllocatorKind;
pub use llvm_util::target_features; pub use llvm_util::target_features;
@ -339,12 +342,6 @@ impl CodegenBackend for LlvmCodegenBackend {
} }
} }
/// This is the entrypoint for a hot plugged rustc_codegen_llvm
#[no_mangle]
pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
LlvmCodegenBackend::new()
}
pub struct ModuleLlvm { pub struct ModuleLlvm {
llcx: &'static mut llvm::Context, llcx: &'static mut llvm::Context,
llmod_raw: *const llvm::Module, llmod_raw: *const llvm::Module,

View File

@ -544,6 +544,7 @@ pub type InlineAsmDiagHandler = unsafe extern "C" fn(&SMDiagnostic, *const c_voi
pub mod debuginfo { pub mod debuginfo {
use super::{InvariantOpaque, Metadata}; use super::{InvariantOpaque, Metadata};
use bitflags::bitflags;
#[repr(C)] #[repr(C)]
pub struct DIBuilder<'a>(InvariantOpaque<'a>); pub struct DIBuilder<'a>(InvariantOpaque<'a>);

View File

@ -8,6 +8,7 @@ use libc::c_int;
use std::ffi::CString; use std::ffi::CString;
use rustc_feature::UnstableFeatures; use rustc_feature::UnstableFeatures;
use syntax::symbol::sym; use syntax::symbol::sym;
use rustc::bug;
use std::str; use std::str;
use std::slice; use std::slice;

View File

@ -6,6 +6,8 @@ use rustc_target::spec::Target;
use rustc_data_structures::owning_ref::OwningRef; use rustc_data_structures::owning_ref::OwningRef;
use rustc_codegen_ssa::METADATA_FILENAME; use rustc_codegen_ssa::METADATA_FILENAME;
use log::debug;
use rustc_data_structures::rustc_erase_owner;
use std::path::Path; use std::path::Path;
use std::slice; use std::slice;

View File

@ -9,6 +9,7 @@ use rustc::mir::mono::{Linkage, Visibility};
use rustc::ty::{TypeFoldable, Instance}; use rustc::ty::{TypeFoldable, Instance};
use rustc::ty::layout::{FnAbiExt, LayoutOf}; use rustc::ty::layout::{FnAbiExt, LayoutOf};
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use log::debug;
pub use rustc::mir::mono::MonoItem; pub use rustc::mir::mono::MonoItem;

View File

@ -5,6 +5,7 @@ use crate::llvm::{Bool, False, True};
use crate::context::CodegenCx; use crate::context::CodegenCx;
use crate::value::Value; use crate::value::Value;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use rustc::bug;
use crate::common; use crate::common;
use crate::type_of::LayoutLlvmExt; use crate::type_of::LayoutLlvmExt;

View File

@ -6,6 +6,8 @@ use rustc::ty::layout::{self, Align, LayoutOf, FnAbiExt, PointeeInfo, Size, TyLa
use rustc_target::abi::TyLayoutMethods; use rustc_target::abi::TyLayoutMethods;
use rustc::ty::print::obsolete::DefPathBasedNames; use rustc::ty::print::obsolete::DefPathBasedNames;
use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::traits::*;
use log::debug;
use rustc::bug;
use std::fmt::Write; use std::fmt::Write;

View File

@ -32,3 +32,6 @@ rustc_serialize = { path = "../libserialize", package = "serialize" }
rustc_resolve = { path = "../librustc_resolve" } rustc_resolve = { path = "../librustc_resolve" }
syntax = { path = "../libsyntax" } syntax = { path = "../libsyntax" }
syntax_pos = { path = "../libsyntax_pos" } syntax_pos = { path = "../libsyntax_pos" }
[features]
llvm = ['rustc_interface/llvm']

View File

@ -43,6 +43,8 @@ use rustc_codegen_utils::codegen_backend::CodegenBackend;
use errors::{PResult, registry::Registry}; use errors::{PResult, registry::Registry};
use rustc_interface::{interface, Queries}; use rustc_interface::{interface, Queries};
use rustc_interface::util::get_codegen_sysroot; use rustc_interface::util::get_codegen_sysroot;
use rustc_interface::interface;
use rustc_interface::util::get_builtin_codegen_backend;
use rustc_data_structures::sync::SeqCst; use rustc_data_structures::sync::SeqCst;
use rustc_feature::{find_gated_cfg, UnstableFeatures}; use rustc_feature::{find_gated_cfg, UnstableFeatures};
use rustc_serialize::json::ToJson; use rustc_serialize::json::ToJson;
@ -765,7 +767,7 @@ pub fn version(binary: &str, matches: &getopts::Matches) {
println!("commit-date: {}", unw(commit_date_str())); println!("commit-date: {}", unw(commit_date_str()));
println!("host: {}", config::host_triple()); println!("host: {}", config::host_triple());
println!("release: {}", unw(release_str())); println!("release: {}", unw(release_str()));
get_codegen_sysroot("llvm")().print_version(); get_builtin_codegen_backend("llvm")().print_version();
} }
} }
@ -1059,7 +1061,7 @@ pub fn handle_options(args: &[String]) -> Option<getopts::Matches> {
} }
if cg_flags.iter().any(|x| *x == "passes=list") { if cg_flags.iter().any(|x| *x == "passes=list") {
get_codegen_sysroot("llvm")().print_passes(); get_builtin_codegen_backend("llvm")().print_passes();
return None; return None;
} }

View File

@ -25,6 +25,7 @@ rustc_traits = { path = "../librustc_traits" }
rustc_data_structures = { path = "../librustc_data_structures" } rustc_data_structures = { path = "../librustc_data_structures" }
rustc_codegen_ssa = { path = "../librustc_codegen_ssa" } rustc_codegen_ssa = { path = "../librustc_codegen_ssa" }
rustc_codegen_utils = { path = "../librustc_codegen_utils" } rustc_codegen_utils = { path = "../librustc_codegen_utils" }
rustc_codegen_llvm = { path = "../librustc_codegen_llvm", optional = true }
rustc_metadata = { path = "../librustc_metadata" } rustc_metadata = { path = "../librustc_metadata" }
rustc_mir = { path = "../librustc_mir" } rustc_mir = { path = "../librustc_mir" }
rustc_passes = { path = "../librustc_passes" } rustc_passes = { path = "../librustc_passes" }
@ -39,3 +40,6 @@ once_cell = "1"
[dev-dependencies] [dev-dependencies]
rustc_target = { path = "../librustc_target" } rustc_target = { path = "../librustc_target" }
[features]
llvm = ['rustc_codegen_llvm']

View File

@ -16,11 +16,9 @@ use rustc_errors::registry::Registry;
use rustc_metadata::dynamic_lib::DynamicLibrary; use rustc_metadata::dynamic_lib::DynamicLibrary;
use rustc_resolve::{self, Resolver}; use rustc_resolve::{self, Resolver};
use std::env; use std::env;
use std::env::consts::{DLL_PREFIX, DLL_SUFFIX};
use std::io::{self, Write}; use std::io::{self, Write};
use std::mem; use std::mem;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex, Once}; use std::sync::{Arc, Mutex, Once};
use std::ops::DerefMut; use std::ops::DerefMut;
use smallvec::SmallVec; use smallvec::SmallVec;
@ -249,7 +247,7 @@ pub fn get_codegen_backend(sess: &Session) -> Box<dyn CodegenBackend> {
filename if filename.contains(".") => { filename if filename.contains(".") => {
load_backend_from_dylib(filename.as_ref()) load_backend_from_dylib(filename.as_ref())
} }
codegen_name => get_codegen_sysroot(codegen_name), codegen_name => get_builtin_codegen_backend(codegen_name),
}; };
unsafe { unsafe {
@ -384,83 +382,16 @@ fn sysroot_candidates() -> Vec<PathBuf> {
} }
} }
pub fn get_codegen_sysroot(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> { pub fn get_builtin_codegen_backend(backend_name: &str) -> fn() -> Box<dyn CodegenBackend> {
// For now we only allow this function to be called once as it'll dlopen a #[cfg(feature = "llvm")]
// few things, which seems to work best if we only do that once. In {
// general this assertion never trips due to the once guard in `get_codegen_backend`, if backend_name == "llvm" {
// but there's a few manual calls to this function in this file we protect return rustc_codegen_llvm::LlvmCodegenBackend::new;
// against.
static LOADED: AtomicBool = AtomicBool::new(false);
assert!(!LOADED.fetch_or(true, Ordering::SeqCst),
"cannot load the default codegen backend twice");
let target = session::config::host_triple();
let sysroot_candidates = sysroot_candidates();
let sysroot = sysroot_candidates.iter()
.map(|sysroot| {
let libdir = filesearch::relative_target_lib_path(&sysroot, &target);
sysroot.join(libdir).with_file_name(
option_env!("CFG_CODEGEN_BACKENDS_DIR").unwrap_or("codegen-backends"))
})
.filter(|f| {
info!("codegen backend candidate: {}", f.display());
f.exists()
})
.next();
let sysroot = sysroot.unwrap_or_else(|| {
let candidates = sysroot_candidates.iter()
.map(|p| p.display().to_string())
.collect::<Vec<_>>()
.join("\n* ");
let err = format!("failed to find a `codegen-backends` folder \
in the sysroot candidates:\n* {}", candidates);
early_error(ErrorOutputType::default(), &err);
});
info!("probing {} for a codegen backend", sysroot.display());
let d = sysroot.read_dir().unwrap_or_else(|e| {
let err = format!("failed to load default codegen backend, couldn't \
read `{}`: {}", sysroot.display(), e);
early_error(ErrorOutputType::default(), &err);
});
let mut file: Option<PathBuf> = None;
let expected_name = format!("rustc_codegen_llvm-{}", backend_name);
for entry in d.filter_map(|e| e.ok()) {
let path = entry.path();
let filename = match path.file_name().and_then(|s| s.to_str()) {
Some(s) => s,
None => continue,
};
if !(filename.starts_with(DLL_PREFIX) && filename.ends_with(DLL_SUFFIX)) {
continue
}
let name = &filename[DLL_PREFIX.len() .. filename.len() - DLL_SUFFIX.len()];
if name != expected_name {
continue
}
if let Some(ref prev) = file {
let err = format!("duplicate codegen backends found\n\
first: {}\n\
second: {}\n\
", prev.display(), path.display());
early_error(ErrorOutputType::default(), &err);
}
file = Some(path.clone());
}
match file {
Some(ref s) => return load_backend_from_dylib(s),
None => {
let err = format!("failed to load default codegen backend for `{}`, \
no appropriate codegen dylib found in `{}`",
backend_name, sysroot.display());
early_error(ErrorOutputType::default(), &err);
} }
} }
let err = format!("unsupported builtin codegen backend `{}`", backend_name);
early_error(ErrorOutputType::default(), &err);
} }
pub(crate) fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguator { pub(crate) fn compute_crate_disambiguator(session: &Session) -> CrateDisambiguator {

View File

@ -23,3 +23,4 @@ features = ['unprefixed_malloc_on_supported_platforms']
[features] [features]
jemalloc = ['jemalloc-sys'] jemalloc = ['jemalloc-sys']
llvm = ['rustc_driver/llvm']

View File

@ -135,6 +135,7 @@ const WHITELIST: &[Crate<'_>] = &[
Crate("polonius-engine"), Crate("polonius-engine"),
Crate("ppv-lite86"), Crate("ppv-lite86"),
Crate("proc-macro2"), Crate("proc-macro2"),
Crate("punycode"),
Crate("quick-error"), Crate("quick-error"),
Crate("quote"), Crate("quote"),
Crate("rand"), Crate("rand"),