Remove get_reloc_model and target_cpu dependency from most of link.rs

This commit is contained in:
bjorn3 2019-03-30 12:59:40 +01:00
parent d8bce01a04
commit de4ee55dc7
2 changed files with 19 additions and 15 deletions

View file

@ -2,8 +2,6 @@ use super::archive::LlvmArchiveBuilder;
use super::rpath::RPathConfig; use super::rpath::RPathConfig;
use super::rpath; use super::rpath;
use crate::back::wasm; use crate::back::wasm;
use crate::context::get_reloc_model;
use crate::llvm;
use rustc_codegen_ssa::{METADATA_FILENAME, RLIB_BYTECODE_EXTENSION}; use rustc_codegen_ssa::{METADATA_FILENAME, RLIB_BYTECODE_EXTENSION};
use rustc_codegen_ssa::back::archive::ArchiveBuilder; use rustc_codegen_ssa::back::archive::ArchiveBuilder;
use rustc_codegen_ssa::back::linker::Linker; use rustc_codegen_ssa::back::linker::Linker;
@ -40,6 +38,7 @@ pub(crate) fn link_binary<'a>(sess: &'a Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
outputs: &OutputFilenames, outputs: &OutputFilenames,
crate_name: &str) -> Vec<PathBuf> { crate_name: &str) -> Vec<PathBuf> {
let target_cpu = crate::llvm_util::target_cpu(sess);
let mut out_filenames = Vec::new(); let mut out_filenames = Vec::new();
for &crate_type in sess.crate_types.borrow().iter() { for &crate_type in sess.crate_types.borrow().iter() {
// Ignore executable crates if we have -Z no-codegen, as they will error. // Ignore executable crates if we have -Z no-codegen, as they will error.
@ -58,7 +57,8 @@ pub(crate) fn link_binary<'a>(sess: &'a Session,
codegen_results, codegen_results,
crate_type, crate_type,
outputs, outputs,
crate_name); crate_name,
target_cpu);
out_filenames.extend(out_files); out_filenames.extend(out_files);
} }
@ -92,7 +92,8 @@ fn link_binary_output<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
crate_type: config::CrateType, crate_type: config::CrateType,
outputs: &OutputFilenames, outputs: &OutputFilenames,
crate_name: &str) -> Vec<PathBuf> { crate_name: &str,
target_cpu: &str) -> Vec<PathBuf> {
for obj in codegen_results.modules.iter().filter_map(|m| m.object.as_ref()) { for obj in codegen_results.modules.iter().filter_map(|m| m.object.as_ref()) {
check_file_is_writeable(obj, sess); check_file_is_writeable(obj, sess);
} }
@ -134,7 +135,7 @@ fn link_binary_output<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
link_staticlib::<B>(sess, codegen_results, &out_filename, &tmpdir); link_staticlib::<B>(sess, codegen_results, &out_filename, &tmpdir);
} }
_ => { _ => {
link_natively::<B>(sess, crate_type, &out_filename, codegen_results, tmpdir.path()); link_natively::<B>(sess, crate_type, &out_filename, codegen_results, tmpdir.path(), target_cpu);
} }
} }
out_filenames.push(out_filename); out_filenames.push(out_filename);
@ -167,11 +168,6 @@ fn emit_metadata<'a>(
out_filename out_filename
} }
enum RlibFlavor {
Normal,
StaticlibBase,
}
// Create an 'rlib' // Create an 'rlib'
// //
// An rlib in its current incarnation is essentially a renamed .a file. The // An rlib in its current incarnation is essentially a renamed .a file. The
@ -354,7 +350,8 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
crate_type: config::CrateType, crate_type: config::CrateType,
out_filename: &Path, out_filename: &Path,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
tmpdir: &Path) { tmpdir: &Path,
target_cpu: &str) {
info!("preparing {:?} to {:?}", crate_type, out_filename); info!("preparing {:?} to {:?}", crate_type, out_filename);
let (linker, flavor) = linker_and_flavor(sess); let (linker, flavor) = linker_and_flavor(sess);
@ -407,7 +404,6 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(sess: &'a Session,
} }
{ {
let target_cpu = crate::llvm_util::target_cpu(sess);
let mut linker = codegen_results.linker_info.to_linker(cmd, &sess, flavor, target_cpu); let mut linker = codegen_results.linker_info.to_linker(cmd, &sess, flavor, target_cpu);
link_args::<B>(&mut *linker, flavor, sess, crate_type, tmpdir, link_args::<B>(&mut *linker, flavor, sess, crate_type, tmpdir,
out_filename, codegen_results); out_filename, codegen_results);
@ -663,8 +659,7 @@ fn link_args<'a, B: ArchiveBuilder<'a>>(cmd: &mut dyn Linker,
let more_args = &sess.opts.cg.link_arg; let more_args = &sess.opts.cg.link_arg;
let mut args = args.iter().chain(more_args.iter()).chain(used_link_args.iter()); let mut args = args.iter().chain(more_args.iter()).chain(used_link_args.iter());
if get_reloc_model(sess) == llvm::RelocMode::PIC if is_pic(sess) && !sess.crt_static() && !args.any(|x| *x == "-static") {
&& !sess.crt_static() && !args.any(|x| *x == "-static") {
position_independent_executable = true; position_independent_executable = true;
} }
} }
@ -1106,3 +1101,12 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>(cmd: &mut dyn Linker,
parent.unwrap_or(Path::new(""))); parent.unwrap_or(Path::new("")));
} }
} }
fn is_pic(sess: &Session) -> bool {
let reloc_model_arg = match sess.opts.cg.relocation_model {
Some(ref s) => &s[..],
None => &sess.target.target.options.relocation_model[..],
};
reloc_model_arg == "pic"
}

View file

@ -258,7 +258,7 @@ pub fn archive_search_paths(sess: &Session) -> Vec<PathBuf> {
sess.target_filesearch(PathKind::Native).search_path_dirs() sess.target_filesearch(PathKind::Native).search_path_dirs()
} }
enum RlibFlavor { pub enum RlibFlavor {
Normal, Normal,
StaticlibBase, StaticlibBase,
} }