Rollup merge of #119162 - heiher:direct-access-external-data, r=petrochenkov
Add unstable `-Z direct-access-external-data` cmdline flag for `rustc` The new flag has been described in the Major Change Proposal at https://github.com/rust-lang/compiler-team/issues/707 Fixes #118053
This commit is contained in:
commit
7954c28cf9
8 changed files with 74 additions and 10 deletions
|
@ -123,6 +123,17 @@ impl CodegenCx<'_, '_> {
|
|||
return false;
|
||||
}
|
||||
|
||||
// Match clang by only supporting COFF and ELF for now.
|
||||
if self.tcx.sess.target.is_like_osx {
|
||||
return false;
|
||||
}
|
||||
|
||||
// With pie relocation model calls of functions defined in the translation
|
||||
// unit can use copy relocations.
|
||||
if self.tcx.sess.relocation_model() == RelocModel::Pie && !is_declaration {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Thread-local variables generally don't support copy relocations.
|
||||
let is_thread_local_var = llvm::LLVMIsAGlobalVariable(llval)
|
||||
.is_some_and(|v| llvm::LLVMIsThreadLocal(v) == llvm::True);
|
||||
|
@ -130,18 +141,12 @@ impl CodegenCx<'_, '_> {
|
|||
return false;
|
||||
}
|
||||
|
||||
// Match clang by only supporting COFF and ELF for now.
|
||||
if self.tcx.sess.target.is_like_osx {
|
||||
return false;
|
||||
// Respect the direct-access-external-data to override default behavior if present.
|
||||
if let Some(direct) = self.tcx.sess.direct_access_external_data() {
|
||||
return direct;
|
||||
}
|
||||
|
||||
// Static relocation model should force copy relocations everywhere.
|
||||
if self.tcx.sess.relocation_model() == RelocModel::Static {
|
||||
return true;
|
||||
}
|
||||
|
||||
// With pie relocation model calls of functions defined in the translation
|
||||
// unit can use copy relocations.
|
||||
self.tcx.sess.relocation_model() == RelocModel::Pie && !is_declaration
|
||||
self.tcx.sess.relocation_model() == RelocModel::Static
|
||||
}
|
||||
}
|
||||
|
|
|
@ -749,6 +749,7 @@ fn test_unstable_options_tracking_hash() {
|
|||
tracked!(debug_macros, true);
|
||||
tracked!(default_hidden_visibility, Some(true));
|
||||
tracked!(dep_info_omit_d_target, true);
|
||||
tracked!(direct_access_external_data, Some(true));
|
||||
tracked!(dual_proc_macros, true);
|
||||
tracked!(dwarf_version, Some(5));
|
||||
tracked!(emit_thin_lto, false);
|
||||
|
|
|
@ -1572,6 +1572,8 @@ options! {
|
|||
dep_info_omit_d_target: bool = (false, parse_bool, [TRACKED],
|
||||
"in dep-info output, omit targets for tracking dependencies of the dep-info files \
|
||||
themselves (default: no)"),
|
||||
direct_access_external_data: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||
"Direct or use GOT indirect to reference external data symbols"),
|
||||
dual_proc_macros: bool = (false, parse_bool, [TRACKED],
|
||||
"load proc macros for both target and host, but only link to the target (default: no)"),
|
||||
dump_dep_graph: bool = (false, parse_bool, [UNTRACKED],
|
||||
|
|
|
@ -767,6 +767,13 @@ impl Session {
|
|||
self.opts.unstable_opts.tls_model.unwrap_or(self.target.tls_model)
|
||||
}
|
||||
|
||||
pub fn direct_access_external_data(&self) -> Option<bool> {
|
||||
self.opts
|
||||
.unstable_opts
|
||||
.direct_access_external_data
|
||||
.or(self.target.direct_access_external_data)
|
||||
}
|
||||
|
||||
pub fn split_debuginfo(&self) -> SplitDebuginfo {
|
||||
self.opts.cg.split_debuginfo.unwrap_or(self.target.split_debuginfo)
|
||||
}
|
||||
|
|
|
@ -1887,6 +1887,8 @@ pub struct TargetOptions {
|
|||
/// passed, and cannot be disabled even via `-C`. Corresponds to `llc
|
||||
/// -mattr=$features`.
|
||||
pub features: StaticCow<str>,
|
||||
/// Direct or use GOT indirect to reference external data symbols
|
||||
pub direct_access_external_data: Option<bool>,
|
||||
/// Whether dynamic linking is available on this target. Defaults to false.
|
||||
pub dynamic_linking: bool,
|
||||
/// Whether dynamic linking can export TLS globals. Defaults to true.
|
||||
|
@ -2281,6 +2283,7 @@ impl Default for TargetOptions {
|
|||
asm_args: cvs![],
|
||||
cpu: "generic".into(),
|
||||
features: "".into(),
|
||||
direct_access_external_data: None,
|
||||
dynamic_linking: false,
|
||||
dll_tls_export: true,
|
||||
only_cdylib: false,
|
||||
|
@ -2580,6 +2583,12 @@ impl Target {
|
|||
base.$key_name = s as u32;
|
||||
}
|
||||
} );
|
||||
($key_name:ident, Option<bool>) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
if let Some(s) = obj.remove(&name).and_then(|b| b.as_bool()) {
|
||||
base.$key_name = Some(s);
|
||||
}
|
||||
} );
|
||||
($key_name:ident, Option<u64>) => ( {
|
||||
let name = (stringify!($key_name)).replace("_", "-");
|
||||
if let Some(s) = obj.remove(&name).and_then(|b| b.as_u64()) {
|
||||
|
@ -3008,6 +3017,7 @@ impl Target {
|
|||
key!(cpu);
|
||||
key!(features);
|
||||
key!(dynamic_linking, bool);
|
||||
key!(direct_access_external_data, Option<bool>);
|
||||
key!(dll_tls_export, bool);
|
||||
key!(only_cdylib, bool);
|
||||
key!(executables, bool);
|
||||
|
@ -3262,6 +3272,7 @@ impl ToJson for Target {
|
|||
target_option_val!(cpu);
|
||||
target_option_val!(features);
|
||||
target_option_val!(dynamic_linking);
|
||||
target_option_val!(direct_access_external_data);
|
||||
target_option_val!(dll_tls_export);
|
||||
target_option_val!(only_cdylib);
|
||||
target_option_val!(executables);
|
||||
|
|
|
@ -12,6 +12,7 @@ pub fn target() -> Target {
|
|||
features: "+f,+d".into(),
|
||||
llvm_abiname: "lp64d".into(),
|
||||
max_atomic_width: Some(64),
|
||||
direct_access_external_data: Some(false),
|
||||
..base::linux_gnu::opts()
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue