From 9e037634f93e2772f3fc7915a6b937f28e6b1f21 Mon Sep 17 00:00:00 2001 From: "dragan.mladjenovic" Date: Fri, 30 Mar 2018 14:48:41 +0200 Subject: [PATCH 1/2] Add TargetOption::force_pic_relocation_model and use it for mips64 targets. --- src/librustc_back/target/mips64_unknown_linux_gnuabi64.rs | 3 +++ .../target/mips64el_unknown_linux_gnuabi64.rs | 3 +++ src/librustc_back/target/mod.rs | 6 ++++++ src/librustc_trans/context.rs | 8 +++++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/librustc_back/target/mips64_unknown_linux_gnuabi64.rs b/src/librustc_back/target/mips64_unknown_linux_gnuabi64.rs index 5c3cf31b3e45f..c8ef7e3dbb8bb 100644 --- a/src/librustc_back/target/mips64_unknown_linux_gnuabi64.rs +++ b/src/librustc_back/target/mips64_unknown_linux_gnuabi64.rs @@ -32,6 +32,9 @@ pub fn target() -> TargetResult { // see #36994 exe_allocation_crate: None, + // see #49421 + force_pic_relocation_model: true, + ..super::linux_base::opts() }, }) diff --git a/src/librustc_back/target/mips64el_unknown_linux_gnuabi64.rs b/src/librustc_back/target/mips64el_unknown_linux_gnuabi64.rs index 96988388e811e..77771ce6c6a2b 100644 --- a/src/librustc_back/target/mips64el_unknown_linux_gnuabi64.rs +++ b/src/librustc_back/target/mips64el_unknown_linux_gnuabi64.rs @@ -32,6 +32,9 @@ pub fn target() -> TargetResult { // see #36994 exe_allocation_crate: None, + // see #49421 + force_pic_relocation_model: true, + ..super::linux_base::opts() }, }) diff --git a/src/librustc_back/target/mod.rs b/src/librustc_back/target/mod.rs index 507243a58a5f9..aff44fc404bcb 100644 --- a/src/librustc_back/target/mod.rs +++ b/src/librustc_back/target/mod.rs @@ -478,6 +478,9 @@ pub struct TargetOptions { /// Whether or not bitcode is embedded in object files pub embed_bitcode: bool, + + /// This target requires everything to be compiled with pic reloc model. + pub force_pic_relocation_model: bool, } impl Default for TargetOptions { @@ -550,6 +553,7 @@ impl Default for TargetOptions { codegen_backend: "llvm".to_string(), default_hidden_visibility: false, embed_bitcode: false, + force_pic_relocation_model: false, } } } @@ -799,6 +803,7 @@ impl Target { key!(codegen_backend); key!(default_hidden_visibility, bool); key!(embed_bitcode, bool); + key!(force_pic_relocation_model, bool); if let Some(array) = obj.find("abi-blacklist").and_then(Json::as_array) { for name in array.iter().filter_map(|abi| abi.as_string()) { @@ -1002,6 +1007,7 @@ impl ToJson for Target { target_option_val!(codegen_backend); target_option_val!(default_hidden_visibility); target_option_val!(embed_bitcode); + target_option_val!(force_pic_relocation_model); if default.abi_blacklist != self.options.abi_blacklist { d.insert("abi-blacklist".to_string(), self.options.abi_blacklist.iter() diff --git a/src/librustc_trans/context.rs b/src/librustc_trans/context.rs index 1f2c3cc883c68..92199e382c45c 100644 --- a/src/librustc_trans/context.rs +++ b/src/librustc_trans/context.rs @@ -115,7 +115,7 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode { None => &sess.target.target.options.relocation_model[..], }; - match ::back::write::RELOC_MODEL_ARGS.iter().find( + let reloc_model = match ::back::write::RELOC_MODEL_ARGS.iter().find( |&&arg| arg.0 == reloc_model_arg) { Some(x) => x.1, _ => { @@ -124,6 +124,12 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode { sess.abort_if_errors(); bug!(); } + }; + + if sess.target.target.options.force_pic_relocation_model { + llvm::RelocMode::PIC + } else { + reloc_model } } From a185b740e241b4ea555e63f2c6976266f3d2bca4 Mon Sep 17 00:00:00 2001 From: "dragan.mladjenovic" Date: Wed, 4 Apr 2018 22:23:06 +0200 Subject: [PATCH 2/2] Take force_pic_relocation_model into account only when configuring LLVM TargetMachine. This allows user specified relocation_model to affect type of linking output. --- src/librustc_trans/back/write.rs | 10 +++++++++- src/librustc_trans/context.rs | 8 +------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index fc699f7569f1c..4017e7e1469ac 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -154,6 +154,14 @@ fn get_llvm_opt_size(optimize: config::OptLevel) -> llvm::CodeGenOptSize { } } +fn get_llvm_reloc_model(sess: &Session) -> llvm::RelocMode { + if sess.target.target.options.force_pic_relocation_model { + llvm::RelocMode::PIC + } else { + get_reloc_model(sess) + } +} + pub fn create_target_machine(sess: &Session) -> TargetMachineRef { target_machine_factory(sess)().unwrap_or_else(|err| { llvm_err(sess.diagnostic(), err).raise() @@ -163,7 +171,7 @@ pub fn create_target_machine(sess: &Session) -> TargetMachineRef { pub fn target_machine_factory(sess: &Session) -> Arc Result + Send + Sync> { - let reloc_model = get_reloc_model(sess); + let reloc_model = get_llvm_reloc_model(sess); let opt_level = get_llvm_opt_level(sess.opts.optimize); let use_softfp = sess.opts.cg.soft_float; diff --git a/src/librustc_trans/context.rs b/src/librustc_trans/context.rs index 92199e382c45c..1f2c3cc883c68 100644 --- a/src/librustc_trans/context.rs +++ b/src/librustc_trans/context.rs @@ -115,7 +115,7 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode { None => &sess.target.target.options.relocation_model[..], }; - let reloc_model = match ::back::write::RELOC_MODEL_ARGS.iter().find( + match ::back::write::RELOC_MODEL_ARGS.iter().find( |&&arg| arg.0 == reloc_model_arg) { Some(x) => x.1, _ => { @@ -124,12 +124,6 @@ pub fn get_reloc_model(sess: &Session) -> llvm::RelocMode { sess.abort_if_errors(); bug!(); } - }; - - if sess.target.target.options.force_pic_relocation_model { - llvm::RelocMode::PIC - } else { - reloc_model } }