mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Replace target.target with target and target.ptr_width with target.pointer_width
Preparation for a subsequent change that replaces rustc_target::config::Config with its wrapped Target. On its own, this commit breaks the build. I don't like making build-breaking commits, but in this instance I believe that it makes review easier, as the "real" changes of this PR can be seen much more easily. Result of running: find compiler/ -type f -exec sed -i -e 's/target\.target\([)\.,; ]\)/target\1/g' {} \; find compiler/ -type f -exec sed -i -e 's/target\.target$/target/g' {} \; find compiler/ -type f -exec sed -i -e 's/target.ptr_width/target.pointer_width/g' {} \; ./x.py fmt
This commit is contained in:
parent
0d1aa1e034
commit
4fa5578774
@ -985,7 +985,7 @@ impl<'hir> LoweringContext<'_, 'hir> {
|
|||||||
asm::InlineAsmReg::parse(
|
asm::InlineAsmReg::parse(
|
||||||
sess.asm_arch?,
|
sess.asm_arch?,
|
||||||
|feature| sess.target_features.contains(&Symbol::intern(feature)),
|
|feature| sess.target_features.contains(&Symbol::intern(feature)),
|
||||||
&sess.target.target,
|
&sess.target,
|
||||||
s,
|
s,
|
||||||
)
|
)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
|
@ -796,7 +796,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
|
|||||||
|
|
||||||
fn visit_expr(&mut self, expr: &'a Expr) {
|
fn visit_expr(&mut self, expr: &'a Expr) {
|
||||||
match &expr.kind {
|
match &expr.kind {
|
||||||
ExprKind::LlvmInlineAsm(..) if !self.session.target.target.options.allow_asm => {
|
ExprKind::LlvmInlineAsm(..) if !self.session.target.options.allow_asm => {
|
||||||
struct_span_err!(
|
struct_span_err!(
|
||||||
self.session,
|
self.session,
|
||||||
expr.span,
|
expr.span,
|
||||||
|
@ -37,7 +37,7 @@ struct TestCtxt<'a> {
|
|||||||
pub fn inject(sess: &Session, resolver: &mut dyn ResolverExpand, krate: &mut ast::Crate) {
|
pub fn inject(sess: &Session, resolver: &mut dyn ResolverExpand, krate: &mut ast::Crate) {
|
||||||
let span_diagnostic = sess.diagnostic();
|
let span_diagnostic = sess.diagnostic();
|
||||||
let panic_strategy = sess.panic_strategy();
|
let panic_strategy = sess.panic_strategy();
|
||||||
let platform_panic_strategy = sess.target.target.options.panic_strategy;
|
let platform_panic_strategy = sess.target.options.panic_strategy;
|
||||||
|
|
||||||
// Check for #![reexport_test_harness_main = "some_name"] which gives the
|
// Check for #![reexport_test_harness_main = "some_name"] which gives the
|
||||||
// main test function the name `some_name` without hygiene. This needs to be
|
// main test function the name `some_name` without hygiene. This needs to be
|
||||||
|
@ -16,7 +16,7 @@ pub(crate) unsafe fn codegen(
|
|||||||
) {
|
) {
|
||||||
let llcx = &*mods.llcx;
|
let llcx = &*mods.llcx;
|
||||||
let llmod = mods.llmod();
|
let llmod = mods.llmod();
|
||||||
let usize = match tcx.sess.target.target.pointer_width {
|
let usize = match tcx.sess.target.pointer_width {
|
||||||
16 => llvm::LLVMInt16TypeInContext(llcx),
|
16 => llvm::LLVMInt16TypeInContext(llcx),
|
||||||
32 => llvm::LLVMInt32TypeInContext(llcx),
|
32 => llvm::LLVMInt32TypeInContext(llcx),
|
||||||
64 => llvm::LLVMInt64TypeInContext(llcx),
|
64 => llvm::LLVMInt64TypeInContext(llcx),
|
||||||
@ -57,7 +57,7 @@ pub(crate) unsafe fn codegen(
|
|||||||
let name = format!("__rust_{}", method.name);
|
let name = format!("__rust_{}", method.name);
|
||||||
let llfn = llvm::LLVMRustGetOrInsertFunction(llmod, name.as_ptr().cast(), name.len(), ty);
|
let llfn = llvm::LLVMRustGetOrInsertFunction(llmod, name.as_ptr().cast(), name.len(), ty);
|
||||||
|
|
||||||
if tcx.sess.target.target.options.default_hidden_visibility {
|
if tcx.sess.target.options.default_hidden_visibility {
|
||||||
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
||||||
}
|
}
|
||||||
if tcx.sess.must_emit_unwind_tables() {
|
if tcx.sess.must_emit_unwind_tables() {
|
||||||
@ -98,7 +98,7 @@ pub(crate) unsafe fn codegen(
|
|||||||
// -> ! DIFlagNoReturn
|
// -> ! DIFlagNoReturn
|
||||||
llvm::Attribute::NoReturn.apply_llfn(llvm::AttributePlace::Function, llfn);
|
llvm::Attribute::NoReturn.apply_llfn(llvm::AttributePlace::Function, llfn);
|
||||||
|
|
||||||
if tcx.sess.target.target.options.default_hidden_visibility {
|
if tcx.sess.target.options.default_hidden_visibility {
|
||||||
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
llvm::LLVMRustSetVisibility(llfn, llvm::Visibility::Hidden);
|
||||||
}
|
}
|
||||||
if tcx.sess.must_emit_unwind_tables() {
|
if tcx.sess.must_emit_unwind_tables() {
|
||||||
|
@ -60,7 +60,7 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
|
|
||||||
// Default per-arch clobbers
|
// Default per-arch clobbers
|
||||||
// Basically what clang does
|
// Basically what clang does
|
||||||
let arch_clobbers = match &self.sess().target.target.arch[..] {
|
let arch_clobbers = match &self.sess().target.arch[..] {
|
||||||
"x86" | "x86_64" => vec!["~{dirflag}", "~{fpsr}", "~{flags}"],
|
"x86" | "x86_64" => vec!["~{dirflag}", "~{fpsr}", "~{flags}"],
|
||||||
"mips" | "mips64" => vec!["~{$1}"],
|
"mips" | "mips64" => vec!["~{$1}"],
|
||||||
_ => Vec::new(),
|
_ => Vec::new(),
|
||||||
|
@ -31,7 +31,7 @@ fn inline(cx: &CodegenCx<'ll, '_>, val: &'ll Value, inline: InlineAttr) {
|
|||||||
Hint => Attribute::InlineHint.apply_llfn(Function, val),
|
Hint => Attribute::InlineHint.apply_llfn(Function, val),
|
||||||
Always => Attribute::AlwaysInline.apply_llfn(Function, val),
|
Always => Attribute::AlwaysInline.apply_llfn(Function, val),
|
||||||
Never => {
|
Never => {
|
||||||
if cx.tcx().sess.target.target.arch != "amdgpu" {
|
if cx.tcx().sess.target.arch != "amdgpu" {
|
||||||
Attribute::NoInline.apply_llfn(Function, val);
|
Attribute::NoInline.apply_llfn(Function, val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,8 +91,7 @@ fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
|||||||
// The function name varies on platforms.
|
// The function name varies on platforms.
|
||||||
// See test/CodeGen/mcount.c in clang.
|
// See test/CodeGen/mcount.c in clang.
|
||||||
let mcount_name =
|
let mcount_name =
|
||||||
CString::new(cx.sess().target.target.options.target_mcount.as_str().as_bytes())
|
CString::new(cx.sess().target.options.target_mcount.as_str().as_bytes()).unwrap();
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
llvm::AddFunctionAttrStringValue(
|
llvm::AddFunctionAttrStringValue(
|
||||||
llfn,
|
llfn,
|
||||||
@ -106,7 +105,7 @@ fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
|||||||
fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
||||||
// Only use stack probes if the target specification indicates that we
|
// Only use stack probes if the target specification indicates that we
|
||||||
// should be using stack probes
|
// should be using stack probes
|
||||||
if !cx.sess().target.target.options.stack_probes {
|
if !cx.sess().target.options.stack_probes {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +344,7 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty::
|
|||||||
// Note that currently the `wasm-import-module` doesn't do anything, but
|
// Note that currently the `wasm-import-module` doesn't do anything, but
|
||||||
// eventually LLVM 7 should read this and ferry the appropriate import
|
// eventually LLVM 7 should read this and ferry the appropriate import
|
||||||
// module to the output file.
|
// module to the output file.
|
||||||
if cx.tcx.sess.target.target.arch == "wasm32" {
|
if cx.tcx.sess.target.arch == "wasm32" {
|
||||||
if let Some(module) = wasm_import_module(cx.tcx, instance.def_id()) {
|
if let Some(module) = wasm_import_module(cx.tcx, instance.def_id()) {
|
||||||
llvm::AddFunctionAttrStringValue(
|
llvm::AddFunctionAttrStringValue(
|
||||||
llfn,
|
llfn,
|
||||||
|
@ -206,7 +206,7 @@ impl<'a> LlvmArchiveBuilder<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn llvm_archive_kind(&self) -> Result<ArchiveKind, &str> {
|
fn llvm_archive_kind(&self) -> Result<ArchiveKind, &str> {
|
||||||
let kind = &*self.config.sess.target.target.options.archive_format;
|
let kind = &*self.config.sess.target.options.archive_format;
|
||||||
kind.parse().map_err(|_| kind)
|
kind.parse().map_err(|_| kind)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,40 +128,40 @@ pub fn target_machine_factory(
|
|||||||
let (opt_level, _) = to_llvm_opt_settings(optlvl);
|
let (opt_level, _) = to_llvm_opt_settings(optlvl);
|
||||||
let use_softfp = sess.opts.cg.soft_float;
|
let use_softfp = sess.opts.cg.soft_float;
|
||||||
|
|
||||||
let ffunction_sections = sess.target.target.options.function_sections;
|
let ffunction_sections = sess.target.options.function_sections;
|
||||||
let fdata_sections = ffunction_sections;
|
let fdata_sections = ffunction_sections;
|
||||||
|
|
||||||
let code_model = to_llvm_code_model(sess.code_model());
|
let code_model = to_llvm_code_model(sess.code_model());
|
||||||
|
|
||||||
let features = attributes::llvm_target_features(sess).collect::<Vec<_>>();
|
let features = attributes::llvm_target_features(sess).collect::<Vec<_>>();
|
||||||
let mut singlethread = sess.target.target.options.singlethread;
|
let mut singlethread = sess.target.options.singlethread;
|
||||||
|
|
||||||
// On the wasm target once the `atomics` feature is enabled that means that
|
// On the wasm target once the `atomics` feature is enabled that means that
|
||||||
// we're no longer single-threaded, or otherwise we don't want LLVM to
|
// we're no longer single-threaded, or otherwise we don't want LLVM to
|
||||||
// lower atomic operations to single-threaded operations.
|
// lower atomic operations to single-threaded operations.
|
||||||
if singlethread
|
if singlethread
|
||||||
&& sess.target.target.llvm_target.contains("wasm32")
|
&& sess.target.llvm_target.contains("wasm32")
|
||||||
&& sess.target_features.contains(&sym::atomics)
|
&& sess.target_features.contains(&sym::atomics)
|
||||||
{
|
{
|
||||||
singlethread = false;
|
singlethread = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let triple = SmallCStr::new(&sess.target.target.llvm_target);
|
let triple = SmallCStr::new(&sess.target.llvm_target);
|
||||||
let cpu = SmallCStr::new(llvm_util::target_cpu(sess));
|
let cpu = SmallCStr::new(llvm_util::target_cpu(sess));
|
||||||
let features = features.join(",");
|
let features = features.join(",");
|
||||||
let features = CString::new(features).unwrap();
|
let features = CString::new(features).unwrap();
|
||||||
let abi = SmallCStr::new(&sess.target.target.options.llvm_abiname);
|
let abi = SmallCStr::new(&sess.target.options.llvm_abiname);
|
||||||
let trap_unreachable = sess.target.target.options.trap_unreachable;
|
let trap_unreachable = sess.target.options.trap_unreachable;
|
||||||
let emit_stack_size_section = sess.opts.debugging_opts.emit_stack_sizes;
|
let emit_stack_size_section = sess.opts.debugging_opts.emit_stack_sizes;
|
||||||
|
|
||||||
let asm_comments = sess.asm_comments();
|
let asm_comments = sess.asm_comments();
|
||||||
let relax_elf_relocations = sess.target.target.options.relax_elf_relocations;
|
let relax_elf_relocations = sess.target.options.relax_elf_relocations;
|
||||||
|
|
||||||
let use_init_array = !sess
|
let use_init_array = !sess
|
||||||
.opts
|
.opts
|
||||||
.debugging_opts
|
.debugging_opts
|
||||||
.use_ctors_section
|
.use_ctors_section
|
||||||
.unwrap_or(sess.target.target.options.use_ctors_section);
|
.unwrap_or(sess.target.options.use_ctors_section);
|
||||||
|
|
||||||
Arc::new(move || {
|
Arc::new(move || {
|
||||||
let tm = unsafe {
|
let tm = unsafe {
|
||||||
|
@ -60,7 +60,7 @@ pub fn write_compressed_metadata<'tcx>(
|
|||||||
unsafe { llvm::LLVMAddGlobal(metadata_llmod, common::val_ty(llconst), buf.as_ptr()) };
|
unsafe { llvm::LLVMAddGlobal(metadata_llmod, common::val_ty(llconst), buf.as_ptr()) };
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMSetInitializer(llglobal, llconst);
|
llvm::LLVMSetInitializer(llglobal, llconst);
|
||||||
let section_name = metadata::metadata_section_name(&tcx.sess.target.target);
|
let section_name = metadata::metadata_section_name(&tcx.sess.target);
|
||||||
let name = SmallCStr::new(section_name);
|
let name = SmallCStr::new(section_name);
|
||||||
llvm::LLVMSetSection(llglobal, name.as_ptr());
|
llvm::LLVMSetSection(llglobal, name.as_ptr());
|
||||||
|
|
||||||
|
@ -308,8 +308,8 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
use rustc_middle::ty::{Int, Uint};
|
use rustc_middle::ty::{Int, Uint};
|
||||||
|
|
||||||
let new_kind = match ty.kind() {
|
let new_kind = match ty.kind() {
|
||||||
Int(t @ Isize) => Int(t.normalize(self.tcx.sess.target.ptr_width)),
|
Int(t @ Isize) => Int(t.normalize(self.tcx.sess.target.pointer_width)),
|
||||||
Uint(t @ Usize) => Uint(t.normalize(self.tcx.sess.target.ptr_width)),
|
Uint(t @ Usize) => Uint(t.normalize(self.tcx.sess.target.pointer_width)),
|
||||||
t @ (Uint(_) | Int(_)) => t.clone(),
|
t @ (Uint(_) | Int(_)) => t.clone(),
|
||||||
_ => panic!("tried to get overflow intrinsic for op applied to non-int type"),
|
_ => panic!("tried to get overflow intrinsic for op applied to non-int type"),
|
||||||
};
|
};
|
||||||
@ -541,7 +541,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn range_metadata(&mut self, load: &'ll Value, range: Range<u128>) {
|
fn range_metadata(&mut self, load: &'ll Value, range: Range<u128>) {
|
||||||
if self.sess().target.target.arch == "amdgpu" {
|
if self.sess().target.arch == "amdgpu" {
|
||||||
// amdgpu/LLVM does something weird and thinks a i64 value is
|
// amdgpu/LLVM does something weird and thinks a i64 value is
|
||||||
// split into a v2i32, halving the bitwidth LLVM expects,
|
// split into a v2i32, halving the bitwidth LLVM expects,
|
||||||
// tripping an assertion. So, for now, just disable this
|
// tripping an assertion. So, for now, just disable this
|
||||||
@ -671,7 +671,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
// WebAssembly has saturating floating point to integer casts if the
|
// WebAssembly has saturating floating point to integer casts if the
|
||||||
// `nontrapping-fptoint` target feature is activated. We'll use those if
|
// `nontrapping-fptoint` target feature is activated. We'll use those if
|
||||||
// they are available.
|
// they are available.
|
||||||
if self.sess().target.target.arch == "wasm32"
|
if self.sess().target.arch == "wasm32"
|
||||||
&& self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
&& self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
||||||
{
|
{
|
||||||
let src_ty = self.cx.val_ty(val);
|
let src_ty = self.cx.val_ty(val);
|
||||||
@ -696,7 +696,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
// WebAssembly has saturating floating point to integer casts if the
|
// WebAssembly has saturating floating point to integer casts if the
|
||||||
// `nontrapping-fptoint` target feature is activated. We'll use those if
|
// `nontrapping-fptoint` target feature is activated. We'll use those if
|
||||||
// they are available.
|
// they are available.
|
||||||
if self.sess().target.target.arch == "wasm32"
|
if self.sess().target.arch == "wasm32"
|
||||||
&& self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
&& self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
||||||
{
|
{
|
||||||
let src_ty = self.cx.val_ty(val);
|
let src_ty = self.cx.val_ty(val);
|
||||||
@ -1427,7 +1427,7 @@ impl Builder<'a, 'll, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn wasm_and_missing_nontrapping_fptoint(&self) -> bool {
|
fn wasm_and_missing_nontrapping_fptoint(&self) -> bool {
|
||||||
self.sess().target.target.arch == "wasm32"
|
self.sess().target.arch == "wasm32"
|
||||||
&& !self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
&& !self.sess().target_features.contains(&sym::nontrapping_dash_fptoint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ pub fn get_fn(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) -> &'ll Value
|
|||||||
// should use dllimport for functions.
|
// should use dllimport for functions.
|
||||||
if cx.use_dll_storage_attrs
|
if cx.use_dll_storage_attrs
|
||||||
&& tcx.is_dllimport_foreign_item(instance_def_id)
|
&& tcx.is_dllimport_foreign_item(instance_def_id)
|
||||||
&& tcx.sess.target.target.target_env != "gnu"
|
&& tcx.sess.target.target_env != "gnu"
|
||||||
{
|
{
|
||||||
unsafe {
|
unsafe {
|
||||||
llvm::LLVMSetDLLStorageClass(llfn, llvm::DLLStorageClass::DllImport);
|
llvm::LLVMSetDLLStorageClass(llfn, llvm::DLLStorageClass::DllImport);
|
||||||
|
@ -92,7 +92,7 @@ fn set_global_alignment(cx: &CodegenCx<'ll, '_>, gv: &'ll Value, mut align: Alig
|
|||||||
// The target may require greater alignment for globals than the type does.
|
// The target may require greater alignment for globals than the type does.
|
||||||
// Note: GCC and Clang also allow `__attribute__((aligned))` on variables,
|
// Note: GCC and Clang also allow `__attribute__((aligned))` on variables,
|
||||||
// which can force it to be smaller. Rust doesn't support this yet.
|
// which can force it to be smaller. Rust doesn't support this yet.
|
||||||
if let Some(min) = cx.sess().target.target.options.min_global_align {
|
if let Some(min) = cx.sess().target.options.min_global_align {
|
||||||
match Align::from_bits(min) {
|
match Align::from_bits(min) {
|
||||||
Ok(min) => align = align.max(min),
|
Ok(min) => align = align.max(min),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@ -283,7 +283,7 @@ impl CodegenCx<'ll, 'tcx> {
|
|||||||
// argument validation.
|
// argument validation.
|
||||||
debug_assert!(
|
debug_assert!(
|
||||||
!(self.tcx.sess.opts.cg.linker_plugin_lto.enabled()
|
!(self.tcx.sess.opts.cg.linker_plugin_lto.enabled()
|
||||||
&& self.tcx.sess.target.target.options.is_like_windows
|
&& self.tcx.sess.target.options.is_like_windows
|
||||||
&& self.tcx.sess.opts.cg.prefer_dynamic)
|
&& self.tcx.sess.opts.cg.prefer_dynamic)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -437,7 +437,7 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
|
|||||||
// will use load-unaligned instructions instead, and thus avoiding the crash.
|
// will use load-unaligned instructions instead, and thus avoiding the crash.
|
||||||
//
|
//
|
||||||
// We could remove this hack whenever we decide to drop macOS 10.10 support.
|
// We could remove this hack whenever we decide to drop macOS 10.10 support.
|
||||||
if self.tcx.sess.target.target.options.is_like_osx {
|
if self.tcx.sess.target.options.is_like_osx {
|
||||||
// The `inspect` method is okay here because we checked relocations, and
|
// The `inspect` method is okay here because we checked relocations, and
|
||||||
// because we are doing this access to inspect the final interpreter state
|
// because we are doing this access to inspect the final interpreter state
|
||||||
// (not as part of the interpreter execution).
|
// (not as part of the interpreter execution).
|
||||||
|
@ -118,18 +118,18 @@ pub unsafe fn create_module(
|
|||||||
let mod_name = SmallCStr::new(mod_name);
|
let mod_name = SmallCStr::new(mod_name);
|
||||||
let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx);
|
let llmod = llvm::LLVMModuleCreateWithNameInContext(mod_name.as_ptr(), llcx);
|
||||||
|
|
||||||
let mut target_data_layout = sess.target.target.data_layout.clone();
|
let mut target_data_layout = sess.target.data_layout.clone();
|
||||||
if llvm_util::get_major_version() < 9 {
|
if llvm_util::get_major_version() < 9 {
|
||||||
target_data_layout = strip_function_ptr_alignment(target_data_layout);
|
target_data_layout = strip_function_ptr_alignment(target_data_layout);
|
||||||
}
|
}
|
||||||
if llvm_util::get_major_version() < 10 {
|
if llvm_util::get_major_version() < 10 {
|
||||||
if sess.target.target.arch == "x86" || sess.target.target.arch == "x86_64" {
|
if sess.target.arch == "x86" || sess.target.arch == "x86_64" {
|
||||||
target_data_layout = strip_x86_address_spaces(target_data_layout);
|
target_data_layout = strip_x86_address_spaces(target_data_layout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the data-layout values hardcoded remain the defaults.
|
// Ensure the data-layout values hardcoded remain the defaults.
|
||||||
if sess.target.target.options.is_builtin {
|
if sess.target.options.is_builtin {
|
||||||
let tm = crate::back::write::create_informational_target_machine(tcx.sess);
|
let tm = crate::back::write::create_informational_target_machine(tcx.sess);
|
||||||
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm);
|
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm);
|
||||||
llvm::LLVMRustDisposeTargetMachine(tm);
|
llvm::LLVMRustDisposeTargetMachine(tm);
|
||||||
@ -160,7 +160,7 @@ pub unsafe fn create_module(
|
|||||||
bug!(
|
bug!(
|
||||||
"data-layout for builtin `{}` target, `{}`, \
|
"data-layout for builtin `{}` target, `{}`, \
|
||||||
differs from LLVM default, `{}`",
|
differs from LLVM default, `{}`",
|
||||||
sess.target.target.llvm_target,
|
sess.target.llvm_target,
|
||||||
target_data_layout,
|
target_data_layout,
|
||||||
llvm_data_layout
|
llvm_data_layout
|
||||||
);
|
);
|
||||||
@ -170,7 +170,7 @@ pub unsafe fn create_module(
|
|||||||
let data_layout = SmallCStr::new(&target_data_layout);
|
let data_layout = SmallCStr::new(&target_data_layout);
|
||||||
llvm::LLVMSetDataLayout(llmod, data_layout.as_ptr());
|
llvm::LLVMSetDataLayout(llmod, data_layout.as_ptr());
|
||||||
|
|
||||||
let llvm_target = SmallCStr::new(&sess.target.target.llvm_target);
|
let llvm_target = SmallCStr::new(&sess.target.llvm_target);
|
||||||
llvm::LLVMRustSetNormalizedTarget(llmod, llvm_target.as_ptr());
|
llvm::LLVMRustSetNormalizedTarget(llmod, llvm_target.as_ptr());
|
||||||
|
|
||||||
if sess.relocation_model() == RelocModel::Pic {
|
if sess.relocation_model() == RelocModel::Pic {
|
||||||
@ -190,7 +190,7 @@ pub unsafe fn create_module(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Control Flow Guard is currently only supported by the MSVC linker on Windows.
|
// Control Flow Guard is currently only supported by the MSVC linker on Windows.
|
||||||
if sess.target.target.options.is_like_msvc {
|
if sess.target.options.is_like_msvc {
|
||||||
match sess.opts.cg.control_flow_guard {
|
match sess.opts.cg.control_flow_guard {
|
||||||
CFGuard::Disabled => {}
|
CFGuard::Disabled => {}
|
||||||
CFGuard::NoChecks => {
|
CFGuard::NoChecks => {
|
||||||
@ -265,7 +265,7 @@ impl<'ll, 'tcx> CodegenCx<'ll, 'tcx> {
|
|||||||
// linker will take care of everything. Fixing this problem will likely
|
// linker will take care of everything. Fixing this problem will likely
|
||||||
// require adding a few attributes to Rust itself (feature gated at the
|
// require adding a few attributes to Rust itself (feature gated at the
|
||||||
// start) and then strongly recommending static linkage on Windows!
|
// start) and then strongly recommending static linkage on Windows!
|
||||||
let use_dll_storage_attrs = tcx.sess.target.target.options.is_like_windows;
|
let use_dll_storage_attrs = tcx.sess.target.options.is_like_windows;
|
||||||
|
|
||||||
let check_overflow = tcx.sess.overflow_checks();
|
let check_overflow = tcx.sess.overflow_checks();
|
||||||
|
|
||||||
@ -839,7 +839,7 @@ impl CodegenCx<'b, 'tcx> {
|
|||||||
return eh_catch_typeinfo;
|
return eh_catch_typeinfo;
|
||||||
}
|
}
|
||||||
let tcx = self.tcx;
|
let tcx = self.tcx;
|
||||||
assert!(self.sess().target.target.options.is_like_emscripten);
|
assert!(self.sess().target.options.is_like_emscripten);
|
||||||
let eh_catch_typeinfo = match tcx.lang_items().eh_catch_typeinfo() {
|
let eh_catch_typeinfo = match tcx.lang_items().eh_catch_typeinfo() {
|
||||||
Some(def_id) => self.get_static(def_id),
|
Some(def_id) => self.get_static(def_id),
|
||||||
_ => {
|
_ => {
|
||||||
@ -878,7 +878,7 @@ impl HasDataLayout for CodegenCx<'ll, 'tcx> {
|
|||||||
|
|
||||||
impl HasTargetSpec for CodegenCx<'ll, 'tcx> {
|
impl HasTargetSpec for CodegenCx<'ll, 'tcx> {
|
||||||
fn target_spec(&self) -> &Target {
|
fn target_spec(&self) -> &Target {
|
||||||
&self.tcx.sess.target.target
|
&self.tcx.sess.target
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,5 +67,5 @@ pub fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool {
|
|||||||
|
|
||||||
!omit_gdb_pretty_printer_section
|
!omit_gdb_pretty_printer_section
|
||||||
&& cx.sess().opts.debuginfo != DebugInfo::None
|
&& cx.sess().opts.debuginfo != DebugInfo::None
|
||||||
&& cx.sess().target.target.options.emit_debug_gdb_scripts
|
&& cx.sess().target.options.emit_debug_gdb_scripts
|
||||||
}
|
}
|
||||||
|
@ -874,7 +874,7 @@ fn basic_type_metadata(cx: &CodegenCx<'ll, 'tcx>, t: Ty<'tcx>) -> &'ll DIType {
|
|||||||
|
|
||||||
// When targeting MSVC, emit MSVC style type names for compatibility with
|
// When targeting MSVC, emit MSVC style type names for compatibility with
|
||||||
// .natvis visualizers (and perhaps other existing native debuggers?)
|
// .natvis visualizers (and perhaps other existing native debuggers?)
|
||||||
let msvc_like_names = cx.tcx.sess.target.target.options.is_like_msvc;
|
let msvc_like_names = cx.tcx.sess.target.options.is_like_msvc;
|
||||||
|
|
||||||
let (name, encoding) = match t.kind() {
|
let (name, encoding) = match t.kind() {
|
||||||
ty::Never => ("!", DW_ATE_unsigned),
|
ty::Never => ("!", DW_ATE_unsigned),
|
||||||
@ -985,7 +985,7 @@ pub fn compile_unit_metadata(
|
|||||||
// if multiple object files with the same `DW_AT_name` are linked together.
|
// if multiple object files with the same `DW_AT_name` are linked together.
|
||||||
// As a workaround we generate unique names for each object file. Those do
|
// As a workaround we generate unique names for each object file. Those do
|
||||||
// not correspond to an actual source file but that should be harmless.
|
// not correspond to an actual source file but that should be harmless.
|
||||||
if tcx.sess.target.target.options.is_like_osx {
|
if tcx.sess.target.options.is_like_osx {
|
||||||
name_in_debuginfo.push("@");
|
name_in_debuginfo.push("@");
|
||||||
name_in_debuginfo.push(codegen_unit_name);
|
name_in_debuginfo.push(codegen_unit_name);
|
||||||
}
|
}
|
||||||
@ -1401,7 +1401,7 @@ fn prepare_union_metadata(
|
|||||||
/// on MSVC we have to use the fallback mode, because LLVM doesn't
|
/// on MSVC we have to use the fallback mode, because LLVM doesn't
|
||||||
/// lower variant parts to PDB.
|
/// lower variant parts to PDB.
|
||||||
fn use_enum_fallback(cx: &CodegenCx<'_, '_>) -> bool {
|
fn use_enum_fallback(cx: &CodegenCx<'_, '_>) -> bool {
|
||||||
cx.sess().target.target.options.is_like_msvc
|
cx.sess().target.options.is_like_msvc
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(eddyb) maybe precompute this? Right now it's computed once
|
// FIXME(eddyb) maybe precompute this? Right now it's computed once
|
||||||
|
@ -120,12 +120,12 @@ pub fn finalize(cx: &CodegenCx<'_, '_>) {
|
|||||||
// for macOS to understand. For more info see #11352
|
// for macOS to understand. For more info see #11352
|
||||||
// This can be overridden using --llvm-opts -dwarf-version,N.
|
// This can be overridden using --llvm-opts -dwarf-version,N.
|
||||||
// Android has the same issue (#22398)
|
// Android has the same issue (#22398)
|
||||||
if let Some(version) = cx.sess().target.target.options.dwarf_version {
|
if let Some(version) = cx.sess().target.options.dwarf_version {
|
||||||
llvm::LLVMRustAddModuleFlag(cx.llmod, "Dwarf Version\0".as_ptr().cast(), version)
|
llvm::LLVMRustAddModuleFlag(cx.llmod, "Dwarf Version\0".as_ptr().cast(), version)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Indicate that we want CodeView debug information on MSVC
|
// Indicate that we want CodeView debug information on MSVC
|
||||||
if cx.sess().target.target.options.is_like_msvc {
|
if cx.sess().target.options.is_like_msvc {
|
||||||
llvm::LLVMRustAddModuleFlag(cx.llmod, "CodeView\0".as_ptr().cast(), 1)
|
llvm::LLVMRustAddModuleFlag(cx.llmod, "CodeView\0".as_ptr().cast(), 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +346,7 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Arguments types
|
// Arguments types
|
||||||
if cx.sess().target.target.options.is_like_msvc {
|
if cx.sess().target.options.is_like_msvc {
|
||||||
// FIXME(#42800):
|
// FIXME(#42800):
|
||||||
// There is a bug in MSDIA that leads to a crash when it encounters
|
// There is a bug in MSDIA that leads to a crash when it encounters
|
||||||
// a fixed-size array of `u8` or something zero-sized in a
|
// a fixed-size array of `u8` or something zero-sized in a
|
||||||
|
@ -38,7 +38,7 @@ impl CodegenCx<'ll, '_> {
|
|||||||
// For MSVC, omit the column number.
|
// For MSVC, omit the column number.
|
||||||
// Otherwise, emit it. This mimics clang behaviour.
|
// Otherwise, emit it. This mimics clang behaviour.
|
||||||
// See discussion in https://github.com/rust-lang/rust/issues/42921
|
// See discussion in https://github.com/rust-lang/rust/issues/42921
|
||||||
if self.sess().target.target.options.is_like_msvc {
|
if self.sess().target.options.is_like_msvc {
|
||||||
DebugLoc { file, line, col: None }
|
DebugLoc { file, line, col: None }
|
||||||
} else {
|
} else {
|
||||||
DebugLoc { file, line, col }
|
DebugLoc { file, line, col }
|
||||||
|
@ -42,7 +42,7 @@ fn declare_raw_fn(
|
|||||||
// be merged.
|
// be merged.
|
||||||
llvm::SetUnnamedAddress(llfn, llvm::UnnamedAddr::Global);
|
llvm::SetUnnamedAddress(llfn, llvm::UnnamedAddr::Global);
|
||||||
|
|
||||||
if cx.tcx.sess.opts.cg.no_redzone.unwrap_or(cx.tcx.sess.target.target.options.disable_redzone) {
|
if cx.tcx.sess.opts.cg.no_redzone.unwrap_or(cx.tcx.sess.target.options.disable_redzone) {
|
||||||
llvm::Attribute::NoRedZone.apply_llfn(Function, llfn);
|
llvm::Attribute::NoRedZone.apply_llfn(Function, llfn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -367,7 +367,7 @@ fn try_intrinsic(
|
|||||||
bx.store(bx.const_i32(0), dest, ret_align);
|
bx.store(bx.const_i32(0), dest, ret_align);
|
||||||
} else if wants_msvc_seh(bx.sess()) {
|
} else if wants_msvc_seh(bx.sess()) {
|
||||||
codegen_msvc_try(bx, try_func, data, catch_func, dest);
|
codegen_msvc_try(bx, try_func, data, catch_func, dest);
|
||||||
} else if bx.sess().target.target.options.is_like_emscripten {
|
} else if bx.sess().target.options.is_like_emscripten {
|
||||||
codegen_emcc_try(bx, try_func, data, catch_func, dest);
|
codegen_emcc_try(bx, try_func, data, catch_func, dest);
|
||||||
} else {
|
} else {
|
||||||
codegen_gnu_try(bx, try_func, data, catch_func, dest);
|
codegen_gnu_try(bx, try_func, data, catch_func, dest);
|
||||||
@ -1722,10 +1722,10 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
|
|||||||
fn int_type_width_signed(ty: Ty<'_>, cx: &CodegenCx<'_, '_>) -> Option<(u64, bool)> {
|
fn int_type_width_signed(ty: Ty<'_>, cx: &CodegenCx<'_, '_>) -> Option<(u64, bool)> {
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Int(t) => {
|
ty::Int(t) => {
|
||||||
Some((t.bit_width().unwrap_or(u64::from(cx.tcx.sess.target.ptr_width)), true))
|
Some((t.bit_width().unwrap_or(u64::from(cx.tcx.sess.target.pointer_width)), true))
|
||||||
}
|
}
|
||||||
ty::Uint(t) => {
|
ty::Uint(t) => {
|
||||||
Some((t.bit_width().unwrap_or(u64::from(cx.tcx.sess.target.ptr_width)), false))
|
Some((t.bit_width().unwrap_or(u64::from(cx.tcx.sess.target.pointer_width)), false))
|
||||||
}
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ fn require_inited() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn configure_llvm(sess: &Session) {
|
unsafe fn configure_llvm(sess: &Session) {
|
||||||
let n_args = sess.opts.cg.llvm_args.len() + sess.target.target.options.llvm_args.len();
|
let n_args = sess.opts.cg.llvm_args.len() + sess.target.options.llvm_args.len();
|
||||||
let mut llvm_c_strs = Vec::with_capacity(n_args + 1);
|
let mut llvm_c_strs = Vec::with_capacity(n_args + 1);
|
||||||
let mut llvm_args = Vec::with_capacity(n_args + 1);
|
let mut llvm_args = Vec::with_capacity(n_args + 1);
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ unsafe fn configure_llvm(sess: &Session) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let cg_opts = sess.opts.cg.llvm_args.iter();
|
let cg_opts = sess.opts.cg.llvm_args.iter();
|
||||||
let tg_opts = sess.target.target.options.llvm_args.iter();
|
let tg_opts = sess.target.options.llvm_args.iter();
|
||||||
let sess_args = cg_opts.chain(tg_opts);
|
let sess_args = cg_opts.chain(tg_opts);
|
||||||
|
|
||||||
let user_specified_args: FxHashSet<_> =
|
let user_specified_args: FxHashSet<_> =
|
||||||
@ -88,7 +88,7 @@ unsafe fn configure_llvm(sess: &Session) {
|
|||||||
.opts
|
.opts
|
||||||
.debugging_opts
|
.debugging_opts
|
||||||
.merge_functions
|
.merge_functions
|
||||||
.unwrap_or(sess.target.target.options.merge_functions)
|
.unwrap_or(sess.target.options.merge_functions)
|
||||||
{
|
{
|
||||||
MergeFunctions::Disabled | MergeFunctions::Trampolines => {}
|
MergeFunctions::Disabled | MergeFunctions::Trampolines => {}
|
||||||
MergeFunctions::Aliases => {
|
MergeFunctions::Aliases => {
|
||||||
@ -96,9 +96,7 @@ unsafe fn configure_llvm(sess: &Session) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sess.target.target.target_os == "emscripten"
|
if sess.target.target_os == "emscripten" && sess.panic_strategy() == PanicStrategy::Unwind {
|
||||||
&& sess.panic_strategy() == PanicStrategy::Unwind
|
|
||||||
{
|
|
||||||
add("-enable-emscripten-cxx-exceptions", false);
|
add("-enable-emscripten-cxx-exceptions", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,7 +138,7 @@ pub fn time_trace_profiler_finish(file_name: &str) {
|
|||||||
// to LLVM or the feature detection code will walk past the end of the feature
|
// to LLVM or the feature detection code will walk past the end of the feature
|
||||||
// array, leading to crashes.
|
// array, leading to crashes.
|
||||||
pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
|
pub fn to_llvm_feature<'a>(sess: &Session, s: &'a str) -> &'a str {
|
||||||
let arch = if sess.target.target.arch == "x86_64" { "x86" } else { &*sess.target.target.arch };
|
let arch = if sess.target.arch == "x86_64" { "x86" } else { &*sess.target.arch };
|
||||||
match (arch, s) {
|
match (arch, s) {
|
||||||
("x86", "pclmulqdq") => "pclmul",
|
("x86", "pclmulqdq") => "pclmul",
|
||||||
("x86", "rdrand") => "rdrnd",
|
("x86", "rdrand") => "rdrnd",
|
||||||
@ -217,7 +215,7 @@ fn handle_native(name: &str) -> &str {
|
|||||||
pub fn target_cpu(sess: &Session) -> &str {
|
pub fn target_cpu(sess: &Session) -> &str {
|
||||||
let name = match sess.opts.cg.target_cpu {
|
let name = match sess.opts.cg.target_cpu {
|
||||||
Some(ref s) => &**s,
|
Some(ref s) => &**s,
|
||||||
None => &*sess.target.target.options.cpu,
|
None => &*sess.target.options.cpu,
|
||||||
};
|
};
|
||||||
|
|
||||||
handle_native(name)
|
handle_native(name)
|
||||||
|
@ -52,7 +52,7 @@ fn emit_direct_ptr_va_arg(
|
|||||||
let next = bx.inbounds_gep(addr, &[full_direct_size]);
|
let next = bx.inbounds_gep(addr, &[full_direct_size]);
|
||||||
bx.store(next, va_list_addr, bx.tcx().data_layout.pointer_align.abi);
|
bx.store(next, va_list_addr, bx.tcx().data_layout.pointer_align.abi);
|
||||||
|
|
||||||
if size.bytes() < slot_size.bytes() && &*bx.tcx().sess.target.target.target_endian == "big" {
|
if size.bytes() < slot_size.bytes() && &*bx.tcx().sess.target.target_endian == "big" {
|
||||||
let adjusted_size = bx.cx().const_i32((slot_size.bytes() - size.bytes()) as i32);
|
let adjusted_size = bx.cx().const_i32((slot_size.bytes() - size.bytes()) as i32);
|
||||||
let adjusted = bx.inbounds_gep(addr, &[adjusted_size]);
|
let adjusted = bx.inbounds_gep(addr, &[adjusted_size]);
|
||||||
(bx.bitcast(adjusted, bx.cx().type_ptr_to(llty)), addr_align)
|
(bx.bitcast(adjusted, bx.cx().type_ptr_to(llty)), addr_align)
|
||||||
@ -105,7 +105,7 @@ fn emit_aapcs_va_arg(
|
|||||||
let mut end = bx.build_sibling_block("va_arg.end");
|
let mut end = bx.build_sibling_block("va_arg.end");
|
||||||
let zero = bx.const_i32(0);
|
let zero = bx.const_i32(0);
|
||||||
let offset_align = Align::from_bytes(4).unwrap();
|
let offset_align = Align::from_bytes(4).unwrap();
|
||||||
assert!(&*bx.tcx().sess.target.target.target_endian == "little");
|
assert!(&*bx.tcx().sess.target.target_endian == "little");
|
||||||
|
|
||||||
let gr_type = target_ty.is_any_ptr() || target_ty.is_integral();
|
let gr_type = target_ty.is_any_ptr() || target_ty.is_integral();
|
||||||
let (reg_off, reg_top_index, slot_size) = if gr_type {
|
let (reg_off, reg_top_index, slot_size) = if gr_type {
|
||||||
@ -171,8 +171,8 @@ pub(super) fn emit_va_arg(
|
|||||||
) -> &'ll Value {
|
) -> &'ll Value {
|
||||||
// Determine the va_arg implementation to use. The LLVM va_arg instruction
|
// Determine the va_arg implementation to use. The LLVM va_arg instruction
|
||||||
// is lacking in some instances, so we should only use it as a fallback.
|
// is lacking in some instances, so we should only use it as a fallback.
|
||||||
let target = &bx.cx.tcx.sess.target.target;
|
let target = &bx.cx.tcx.sess.target;
|
||||||
let arch = &bx.cx.tcx.sess.target.target.arch;
|
let arch = &bx.cx.tcx.sess.target.arch;
|
||||||
match (&**arch, target.options.is_like_windows) {
|
match (&**arch, target.options.is_like_windows) {
|
||||||
// Windows x86
|
// Windows x86
|
||||||
("x86", true) => {
|
("x86", true) => {
|
||||||
|
@ -9,9 +9,7 @@ pub fn find_library(name: Symbol, search_paths: &[PathBuf], sess: &Session) -> P
|
|||||||
// times show up as foo.lib
|
// times show up as foo.lib
|
||||||
let oslibname = format!(
|
let oslibname = format!(
|
||||||
"{}{}{}",
|
"{}{}{}",
|
||||||
sess.target.target.options.staticlib_prefix,
|
sess.target.options.staticlib_prefix, name, sess.target.options.staticlib_suffix
|
||||||
name,
|
|
||||||
sess.target.target.options.staticlib_suffix
|
|
||||||
);
|
);
|
||||||
let unixlibname = format!("lib{}.a", name);
|
let unixlibname = format!("lib{}.a", name);
|
||||||
|
|
||||||
|
@ -152,7 +152,7 @@ fn get_linker(
|
|||||||
_ => match flavor {
|
_ => match flavor {
|
||||||
LinkerFlavor::Lld(f) => Command::lld(linker, f),
|
LinkerFlavor::Lld(f) => Command::lld(linker, f),
|
||||||
LinkerFlavor::Msvc
|
LinkerFlavor::Msvc
|
||||||
if sess.opts.cg.linker.is_none() && sess.target.target.options.linker.is_none() =>
|
if sess.opts.cg.linker.is_none() && sess.target.options.linker.is_none() =>
|
||||||
{
|
{
|
||||||
Command::new(msvc_tool.as_ref().map(|t| t.path()).unwrap_or(linker))
|
Command::new(msvc_tool.as_ref().map(|t| t.path()).unwrap_or(linker))
|
||||||
}
|
}
|
||||||
@ -163,7 +163,7 @@ fn get_linker(
|
|||||||
// UWP apps have API restrictions enforced during Store submissions.
|
// UWP apps have API restrictions enforced during Store submissions.
|
||||||
// To comply with the Windows App Certification Kit,
|
// To comply with the Windows App Certification Kit,
|
||||||
// MSVC needs to link with the Store versions of the runtime libraries (vcruntime, msvcrt, etc).
|
// MSVC needs to link with the Store versions of the runtime libraries (vcruntime, msvcrt, etc).
|
||||||
let t = &sess.target.target;
|
let t = &sess.target;
|
||||||
if (flavor == LinkerFlavor::Msvc || flavor == LinkerFlavor::Lld(LldFlavor::Link))
|
if (flavor == LinkerFlavor::Msvc || flavor == LinkerFlavor::Lld(LldFlavor::Link))
|
||||||
&& t.target_vendor == "uwp"
|
&& t.target_vendor == "uwp"
|
||||||
{
|
{
|
||||||
@ -197,7 +197,7 @@ fn get_linker(
|
|||||||
// PATH for the child.
|
// PATH for the child.
|
||||||
let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(self_contained);
|
let mut new_path = sess.host_filesearch(PathKind::All).get_tools_search_paths(self_contained);
|
||||||
let mut msvc_changed_path = false;
|
let mut msvc_changed_path = false;
|
||||||
if sess.target.target.options.is_like_msvc {
|
if sess.target.options.is_like_msvc {
|
||||||
if let Some(ref tool) = msvc_tool {
|
if let Some(ref tool) = msvc_tool {
|
||||||
cmd.args(tool.args());
|
cmd.args(tool.args());
|
||||||
for &(ref k, ref v) in tool.env() {
|
for &(ref k, ref v) in tool.env() {
|
||||||
@ -365,7 +365,7 @@ fn link_rlib<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// After adding all files to the archive, we need to update the
|
// After adding all files to the archive, we need to update the
|
||||||
// symbol table of the archive. This currently dies on macOS (see
|
// symbol table of the archive. This currently dies on macOS (see
|
||||||
// #11162), and isn't necessary there anyway
|
// #11162), and isn't necessary there anyway
|
||||||
if !sess.target.target.options.is_like_osx {
|
if !sess.target.options.is_like_osx {
|
||||||
ab.update_symbols();
|
ab.update_symbols();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -476,10 +476,10 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
|
|
||||||
linker::disable_localization(&mut cmd);
|
linker::disable_localization(&mut cmd);
|
||||||
|
|
||||||
for &(ref k, ref v) in &sess.target.target.options.link_env {
|
for &(ref k, ref v) in &sess.target.options.link_env {
|
||||||
cmd.env(k, v);
|
cmd.env(k, v);
|
||||||
}
|
}
|
||||||
for k in &sess.target.target.options.link_env_remove {
|
for k in &sess.target.options.link_env_remove {
|
||||||
cmd.env_remove(k);
|
cmd.env_remove(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,7 +515,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// if the linker doesn't support -no-pie then it should not default to
|
// if the linker doesn't support -no-pie then it should not default to
|
||||||
// linking executables as pie. Different versions of gcc seem to use
|
// linking executables as pie. Different versions of gcc seem to use
|
||||||
// different quotes in the error message so don't check for them.
|
// different quotes in the error message so don't check for them.
|
||||||
if sess.target.target.options.linker_is_gnu
|
if sess.target.options.linker_is_gnu
|
||||||
&& flavor != LinkerFlavor::Ld
|
&& flavor != LinkerFlavor::Ld
|
||||||
&& (out.contains("unrecognized command line option")
|
&& (out.contains("unrecognized command line option")
|
||||||
|| out.contains("unknown argument"))
|
|| out.contains("unknown argument"))
|
||||||
@ -535,7 +535,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
|
|
||||||
// Detect '-static-pie' used with an older version of gcc or clang not supporting it.
|
// Detect '-static-pie' used with an older version of gcc or clang not supporting it.
|
||||||
// Fallback from '-static-pie' to '-static' in that case.
|
// Fallback from '-static-pie' to '-static' in that case.
|
||||||
if sess.target.target.options.linker_is_gnu
|
if sess.target.options.linker_is_gnu
|
||||||
&& flavor != LinkerFlavor::Ld
|
&& flavor != LinkerFlavor::Ld
|
||||||
&& (out.contains("unrecognized command line option")
|
&& (out.contains("unrecognized command line option")
|
||||||
|| out.contains("unknown argument"))
|
|| out.contains("unknown argument"))
|
||||||
@ -548,7 +548,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
);
|
);
|
||||||
// Mirror `add_(pre,post)_link_objects` to replace CRT objects.
|
// Mirror `add_(pre,post)_link_objects` to replace CRT objects.
|
||||||
let self_contained = crt_objects_fallback(sess, crate_type);
|
let self_contained = crt_objects_fallback(sess, crate_type);
|
||||||
let opts = &sess.target.target.options;
|
let opts = &sess.target.options;
|
||||||
let pre_objects = if self_contained {
|
let pre_objects = if self_contained {
|
||||||
&opts.pre_link_objects_fallback
|
&opts.pre_link_objects_fallback
|
||||||
} else {
|
} else {
|
||||||
@ -670,7 +670,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// is not a Microsoft LNK error then suggest a way to fix or
|
// is not a Microsoft LNK error then suggest a way to fix or
|
||||||
// install the Visual Studio build tools.
|
// install the Visual Studio build tools.
|
||||||
if let Some(code) = prog.status.code() {
|
if let Some(code) = prog.status.code() {
|
||||||
if sess.target.target.options.is_like_msvc
|
if sess.target.options.is_like_msvc
|
||||||
&& flavor == LinkerFlavor::Msvc
|
&& flavor == LinkerFlavor::Msvc
|
||||||
// Respect the command line override
|
// Respect the command line override
|
||||||
&& sess.opts.cg.linker.is_none()
|
&& sess.opts.cg.linker.is_none()
|
||||||
@ -741,7 +741,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
|
|
||||||
linker_error.emit();
|
linker_error.emit();
|
||||||
|
|
||||||
if sess.target.target.options.is_like_msvc && linker_not_found {
|
if sess.target.options.is_like_msvc && linker_not_found {
|
||||||
sess.note_without_error(
|
sess.note_without_error(
|
||||||
"the msvc targets depend on the msvc linker \
|
"the msvc targets depend on the msvc linker \
|
||||||
but `link.exe` was not found",
|
but `link.exe` was not found",
|
||||||
@ -758,7 +758,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// On macOS, debuggers need this utility to get run to do some munging of
|
// On macOS, debuggers need this utility to get run to do some munging of
|
||||||
// the symbols. Note, though, that if the object files are being preserved
|
// the symbols. Note, though, that if the object files are being preserved
|
||||||
// for their debug information there's no need for us to run dsymutil.
|
// for their debug information there's no need for us to run dsymutil.
|
||||||
if sess.target.target.options.is_like_osx
|
if sess.target.options.is_like_osx
|
||||||
&& sess.opts.debuginfo != DebugInfo::None
|
&& sess.opts.debuginfo != DebugInfo::None
|
||||||
&& !preserve_objects_for_their_debuginfo(sess)
|
&& !preserve_objects_for_their_debuginfo(sess)
|
||||||
{
|
{
|
||||||
@ -776,7 +776,7 @@ fn link_sanitizers(sess: &Session, crate_type: CrateType, linker: &mut dyn Linke
|
|||||||
let needs_runtime = match crate_type {
|
let needs_runtime = match crate_type {
|
||||||
CrateType::Executable => true,
|
CrateType::Executable => true,
|
||||||
CrateType::Dylib | CrateType::Cdylib | CrateType::ProcMacro => {
|
CrateType::Dylib | CrateType::Cdylib | CrateType::ProcMacro => {
|
||||||
sess.target.target.options.is_like_osx
|
sess.target.options.is_like_osx
|
||||||
}
|
}
|
||||||
CrateType::Rlib | CrateType::Staticlib => false,
|
CrateType::Rlib | CrateType::Staticlib => false,
|
||||||
};
|
};
|
||||||
@ -846,7 +846,7 @@ pub fn ignored_for_lto(sess: &Session, info: &CrateInfo, cnum: CrateNum) -> bool
|
|||||||
// If our target enables builtin function lowering in LLVM then the
|
// If our target enables builtin function lowering in LLVM then the
|
||||||
// crates providing these functions don't participate in LTO (e.g.
|
// crates providing these functions don't participate in LTO (e.g.
|
||||||
// no_builtins or compiler builtins crates).
|
// no_builtins or compiler builtins crates).
|
||||||
!sess.target.target.options.no_builtins
|
!sess.target.options.no_builtins
|
||||||
&& (info.compiler_builtins == Some(cnum) || info.is_no_builtins.contains(&cnum))
|
&& (info.compiler_builtins == Some(cnum) || info.is_no_builtins.contains(&cnum))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -906,10 +906,10 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
|
|||||||
} else if stem == "link" || stem == "lld-link" {
|
} else if stem == "link" || stem == "lld-link" {
|
||||||
LinkerFlavor::Msvc
|
LinkerFlavor::Msvc
|
||||||
} else if stem == "lld" || stem == "rust-lld" {
|
} else if stem == "lld" || stem == "rust-lld" {
|
||||||
LinkerFlavor::Lld(sess.target.target.options.lld_flavor)
|
LinkerFlavor::Lld(sess.target.options.lld_flavor)
|
||||||
} else {
|
} else {
|
||||||
// fall back to the value in the target spec
|
// fall back to the value in the target spec
|
||||||
sess.target.target.linker_flavor
|
sess.target.linker_flavor
|
||||||
};
|
};
|
||||||
|
|
||||||
Some((linker, flavor))
|
Some((linker, flavor))
|
||||||
@ -926,8 +926,8 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) {
|
|||||||
|
|
||||||
if let Some(ret) = infer_from(
|
if let Some(ret) = infer_from(
|
||||||
sess,
|
sess,
|
||||||
sess.target.target.options.linker.clone().map(PathBuf::from),
|
sess.target.options.linker.clone().map(PathBuf::from),
|
||||||
Some(sess.target.target.linker_flavor),
|
Some(sess.target.linker_flavor),
|
||||||
) {
|
) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -962,7 +962,7 @@ fn preserve_objects_for_their_debuginfo(sess: &Session) -> bool {
|
|||||||
// Basically as a result this just means that if we're on OSX and we're
|
// Basically as a result this just means that if we're on OSX and we're
|
||||||
// *not* running dsymutil then the object files are the only source of truth
|
// *not* running dsymutil then the object files are the only source of truth
|
||||||
// for debug information, so we must preserve them.
|
// for debug information, so we must preserve them.
|
||||||
if sess.target.target.options.is_like_osx {
|
if sess.target.options.is_like_osx {
|
||||||
return !sess.opts.debugging_opts.run_dsymutil;
|
return !sess.opts.debugging_opts.run_dsymutil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -988,7 +988,7 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLib]) {
|
|||||||
NativeLibKind::StaticNoBundle
|
NativeLibKind::StaticNoBundle
|
||||||
| NativeLibKind::Dylib
|
| NativeLibKind::Dylib
|
||||||
| NativeLibKind::Unspecified => {
|
| NativeLibKind::Unspecified => {
|
||||||
if sess.target.target.options.is_like_msvc {
|
if sess.target.options.is_like_msvc {
|
||||||
Some(format!("{}.lib", name))
|
Some(format!("{}.lib", name))
|
||||||
} else {
|
} else {
|
||||||
Some(format!("-l{}", name))
|
Some(format!("-l{}", name))
|
||||||
@ -1070,16 +1070,13 @@ fn exec_linker(
|
|||||||
let mut args = String::new();
|
let mut args = String::new();
|
||||||
for arg in cmd2.take_args() {
|
for arg in cmd2.take_args() {
|
||||||
args.push_str(
|
args.push_str(
|
||||||
&Escape {
|
&Escape { arg: arg.to_str().unwrap(), is_like_msvc: sess.target.options.is_like_msvc }
|
||||||
arg: arg.to_str().unwrap(),
|
.to_string(),
|
||||||
is_like_msvc: sess.target.target.options.is_like_msvc,
|
|
||||||
}
|
|
||||||
.to_string(),
|
|
||||||
);
|
);
|
||||||
args.push('\n');
|
args.push('\n');
|
||||||
}
|
}
|
||||||
let file = tmpdir.join("linker-arguments");
|
let file = tmpdir.join("linker-arguments");
|
||||||
let bytes = if sess.target.target.options.is_like_msvc {
|
let bytes = if sess.target.options.is_like_msvc {
|
||||||
let mut out = Vec::with_capacity((1 + args.len()) * 2);
|
let mut out = Vec::with_capacity((1 + args.len()) * 2);
|
||||||
// start the stream with a UTF-16 BOM
|
// start the stream with a UTF-16 BOM
|
||||||
for c in std::iter::once(0xFEFF).chain(args.encode_utf16()) {
|
for c in std::iter::once(0xFEFF).chain(args.encode_utf16()) {
|
||||||
@ -1195,7 +1192,7 @@ fn link_output_kind(sess: &Session, crate_type: CrateType) -> LinkOutputKind {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Adjust the output kind to target capabilities.
|
// Adjust the output kind to target capabilities.
|
||||||
let opts = &sess.target.target.options;
|
let opts = &sess.target.options;
|
||||||
let pic_exe_supported = opts.position_independent_executables;
|
let pic_exe_supported = opts.position_independent_executables;
|
||||||
let static_pic_exe_supported = opts.static_position_independent_executables;
|
let static_pic_exe_supported = opts.static_position_independent_executables;
|
||||||
let static_dylib_supported = opts.crt_static_allows_dylibs;
|
let static_dylib_supported = opts.crt_static_allows_dylibs;
|
||||||
@ -1236,14 +1233,14 @@ fn crt_objects_fallback(sess: &Session, crate_type: CrateType) -> bool {
|
|||||||
return self_contained;
|
return self_contained;
|
||||||
}
|
}
|
||||||
|
|
||||||
match sess.target.target.options.crt_objects_fallback {
|
match sess.target.options.crt_objects_fallback {
|
||||||
// FIXME: Find a better heuristic for "native musl toolchain is available",
|
// FIXME: Find a better heuristic for "native musl toolchain is available",
|
||||||
// based on host and linker path, for example.
|
// based on host and linker path, for example.
|
||||||
// (https://github.com/rust-lang/rust/pull/71769#issuecomment-626330237).
|
// (https://github.com/rust-lang/rust/pull/71769#issuecomment-626330237).
|
||||||
Some(CrtObjectsFallback::Musl) => sess.crt_static(Some(crate_type)),
|
Some(CrtObjectsFallback::Musl) => sess.crt_static(Some(crate_type)),
|
||||||
Some(CrtObjectsFallback::Mingw) => {
|
Some(CrtObjectsFallback::Mingw) => {
|
||||||
sess.host == sess.target.target
|
sess.host == sess.target
|
||||||
&& sess.target.target.target_vendor != "uwp"
|
&& sess.target.target_vendor != "uwp"
|
||||||
&& detect_self_contained_mingw(&sess)
|
&& detect_self_contained_mingw(&sess)
|
||||||
}
|
}
|
||||||
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
|
// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
|
||||||
@ -1259,7 +1256,7 @@ fn add_pre_link_objects(
|
|||||||
link_output_kind: LinkOutputKind,
|
link_output_kind: LinkOutputKind,
|
||||||
self_contained: bool,
|
self_contained: bool,
|
||||||
) {
|
) {
|
||||||
let opts = &sess.target.target.options;
|
let opts = &sess.target.options;
|
||||||
let objects =
|
let objects =
|
||||||
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects };
|
if self_contained { &opts.pre_link_objects_fallback } else { &opts.pre_link_objects };
|
||||||
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
|
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
|
||||||
@ -1274,7 +1271,7 @@ fn add_post_link_objects(
|
|||||||
link_output_kind: LinkOutputKind,
|
link_output_kind: LinkOutputKind,
|
||||||
self_contained: bool,
|
self_contained: bool,
|
||||||
) {
|
) {
|
||||||
let opts = &sess.target.target.options;
|
let opts = &sess.target.options;
|
||||||
let objects =
|
let objects =
|
||||||
if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects };
|
if self_contained { &opts.post_link_objects_fallback } else { &opts.post_link_objects };
|
||||||
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
|
for obj in objects.get(&link_output_kind).iter().copied().flatten() {
|
||||||
@ -1285,7 +1282,7 @@ fn add_post_link_objects(
|
|||||||
/// Add arbitrary "pre-link" args defined by the target spec or from command line.
|
/// Add arbitrary "pre-link" args defined by the target spec or from command line.
|
||||||
/// FIXME: Determine where exactly these args need to be inserted.
|
/// FIXME: Determine where exactly these args need to be inserted.
|
||||||
fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
if let Some(args) = sess.target.target.options.pre_link_args.get(&flavor) {
|
if let Some(args) = sess.target.options.pre_link_args.get(&flavor) {
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
}
|
}
|
||||||
cmd.args(&sess.opts.debugging_opts.pre_link_args);
|
cmd.args(&sess.opts.debugging_opts.pre_link_args);
|
||||||
@ -1293,13 +1290,13 @@ fn add_pre_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor)
|
|||||||
|
|
||||||
/// Add a link script embedded in the target, if applicable.
|
/// Add a link script embedded in the target, if applicable.
|
||||||
fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_type: CrateType) {
|
fn add_link_script(cmd: &mut dyn Linker, sess: &Session, tmpdir: &Path, crate_type: CrateType) {
|
||||||
match (crate_type, &sess.target.target.options.link_script) {
|
match (crate_type, &sess.target.options.link_script) {
|
||||||
(CrateType::Cdylib | CrateType::Executable, Some(script)) => {
|
(CrateType::Cdylib | CrateType::Executable, Some(script)) => {
|
||||||
if !sess.target.target.options.linker_is_gnu {
|
if !sess.target.options.linker_is_gnu {
|
||||||
sess.fatal("can only use link script when linking with GNU-like linker");
|
sess.fatal("can only use link script when linking with GNU-like linker");
|
||||||
}
|
}
|
||||||
|
|
||||||
let file_name = ["rustc", &sess.target.target.llvm_target, "linkfile.ld"].join("-");
|
let file_name = ["rustc", &sess.target.llvm_target, "linkfile.ld"].join("-");
|
||||||
|
|
||||||
let path = tmpdir.join(file_name);
|
let path = tmpdir.join(file_name);
|
||||||
if let Err(e) = fs::write(&path, script) {
|
if let Err(e) = fs::write(&path, script) {
|
||||||
@ -1338,15 +1335,15 @@ fn add_late_link_args(
|
|||||||
*ty == crate_type && list.iter().any(|&linkage| linkage == Linkage::Dynamic)
|
*ty == crate_type && list.iter().any(|&linkage| linkage == Linkage::Dynamic)
|
||||||
});
|
});
|
||||||
if any_dynamic_crate {
|
if any_dynamic_crate {
|
||||||
if let Some(args) = sess.target.target.options.late_link_args_dynamic.get(&flavor) {
|
if let Some(args) = sess.target.options.late_link_args_dynamic.get(&flavor) {
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if let Some(args) = sess.target.target.options.late_link_args_static.get(&flavor) {
|
if let Some(args) = sess.target.options.late_link_args_static.get(&flavor) {
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let Some(args) = sess.target.target.options.late_link_args.get(&flavor) {
|
if let Some(args) = sess.target.options.late_link_args.get(&flavor) {
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1354,7 +1351,7 @@ fn add_late_link_args(
|
|||||||
/// Add arbitrary "post-link" args defined by the target spec.
|
/// Add arbitrary "post-link" args defined by the target spec.
|
||||||
/// FIXME: Determine where exactly these args need to be inserted.
|
/// FIXME: Determine where exactly these args need to be inserted.
|
||||||
fn add_post_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
fn add_post_link_args(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
if let Some(args) = sess.target.target.options.post_link_args.get(&flavor) {
|
if let Some(args) = sess.target.options.post_link_args.get(&flavor) {
|
||||||
cmd.args(args);
|
cmd.args(args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1456,7 +1453,7 @@ fn add_library_search_dirs(cmd: &mut dyn Linker, sess: &Session, self_contained:
|
|||||||
/// Add options making relocation sections in the produced ELF files read-only
|
/// Add options making relocation sections in the produced ELF files read-only
|
||||||
/// and suppressing lazy binding.
|
/// and suppressing lazy binding.
|
||||||
fn add_relro_args(cmd: &mut dyn Linker, sess: &Session) {
|
fn add_relro_args(cmd: &mut dyn Linker, sess: &Session) {
|
||||||
match sess.opts.debugging_opts.relro_level.unwrap_or(sess.target.target.options.relro_level) {
|
match sess.opts.debugging_opts.relro_level.unwrap_or(sess.target.options.relro_level) {
|
||||||
RelroLevel::Full => cmd.full_relro(),
|
RelroLevel::Full => cmd.full_relro(),
|
||||||
RelroLevel::Partial => cmd.partial_relro(),
|
RelroLevel::Partial => cmd.partial_relro(),
|
||||||
RelroLevel::Off => cmd.no_relro(),
|
RelroLevel::Off => cmd.no_relro(),
|
||||||
@ -1487,9 +1484,9 @@ fn add_rpath_args(
|
|||||||
let mut rpath_config = RPathConfig {
|
let mut rpath_config = RPathConfig {
|
||||||
used_crates: &codegen_results.crate_info.used_crates_dynamic,
|
used_crates: &codegen_results.crate_info.used_crates_dynamic,
|
||||||
out_filename: out_filename.to_path_buf(),
|
out_filename: out_filename.to_path_buf(),
|
||||||
has_rpath: sess.target.target.options.has_rpath,
|
has_rpath: sess.target.options.has_rpath,
|
||||||
is_like_osx: sess.target.target.options.is_like_osx,
|
is_like_osx: sess.target.options.is_like_osx,
|
||||||
linker_is_gnu: sess.target.target.options.linker_is_gnu,
|
linker_is_gnu: sess.target.options.linker_is_gnu,
|
||||||
get_install_prefix_lib_path: &mut get_install_prefix_lib_path,
|
get_install_prefix_lib_path: &mut get_install_prefix_lib_path,
|
||||||
};
|
};
|
||||||
cmd.args(&rpath::get_rpath_flags(&mut rpath_config));
|
cmd.args(&rpath::get_rpath_flags(&mut rpath_config));
|
||||||
@ -1517,7 +1514,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
let base_cmd = get_linker(sess, path, flavor, crt_objects_fallback);
|
let base_cmd = get_linker(sess, path, flavor, crt_objects_fallback);
|
||||||
// FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction
|
// FIXME: Move `/LIBPATH` addition for uwp targets from the linker construction
|
||||||
// to the linker args construction.
|
// to the linker args construction.
|
||||||
assert!(base_cmd.get_args().is_empty() || sess.target.target.target_vendor == "uwp");
|
assert!(base_cmd.get_args().is_empty() || sess.target.target_vendor == "uwp");
|
||||||
let cmd = &mut *codegen_results.linker_info.to_linker(base_cmd, &sess, flavor, target_cpu);
|
let cmd = &mut *codegen_results.linker_info.to_linker(base_cmd, &sess, flavor, target_cpu);
|
||||||
let link_output_kind = link_output_kind(sess, crate_type);
|
let link_output_kind = link_output_kind(sess, crate_type);
|
||||||
|
|
||||||
@ -1531,7 +1528,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
add_link_script(cmd, sess, tmpdir, crate_type);
|
add_link_script(cmd, sess, tmpdir, crate_type);
|
||||||
|
|
||||||
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
||||||
if sess.target.target.options.is_like_fuchsia && crate_type == CrateType::Executable {
|
if sess.target.options.is_like_fuchsia && crate_type == CrateType::Executable {
|
||||||
let prefix = if sess.opts.debugging_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
|
let prefix = if sess.opts.debugging_opts.sanitizer.contains(SanitizerSet::ADDRESS) {
|
||||||
"asan/"
|
"asan/"
|
||||||
} else {
|
} else {
|
||||||
@ -1541,7 +1538,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
||||||
if sess.target.target.options.eh_frame_header {
|
if sess.target.options.eh_frame_header {
|
||||||
cmd.add_eh_frame_header();
|
cmd.add_eh_frame_header();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1554,7 +1551,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
|
add_pre_link_objects(cmd, sess, link_output_kind, crt_objects_fallback);
|
||||||
|
|
||||||
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
// NO-OPT-OUT, OBJECT-FILES-NO, AUDIT-ORDER
|
||||||
if sess.target.target.options.is_like_emscripten {
|
if sess.target.options.is_like_emscripten {
|
||||||
cmd.arg("-s");
|
cmd.arg("-s");
|
||||||
cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort {
|
cmd.arg(if sess.panic_strategy() == PanicStrategy::Abort {
|
||||||
"DISABLE_EXCEPTION_CATCHING=1"
|
"DISABLE_EXCEPTION_CATCHING=1"
|
||||||
@ -1582,7 +1579,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
cmd.output_filename(out_filename);
|
cmd.output_filename(out_filename);
|
||||||
|
|
||||||
// OBJECT-FILES-NO, AUDIT-ORDER
|
// OBJECT-FILES-NO, AUDIT-ORDER
|
||||||
if crate_type == CrateType::Executable && sess.target.target.options.is_like_windows {
|
if crate_type == CrateType::Executable && sess.target.options.is_like_windows {
|
||||||
if let Some(ref s) = codegen_results.windows_subsystem {
|
if let Some(ref s) = codegen_results.windows_subsystem {
|
||||||
cmd.subsystem(s);
|
cmd.subsystem(s);
|
||||||
}
|
}
|
||||||
@ -1626,7 +1623,7 @@ fn linker_with_args<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// OBJECT-FILES-NO, AUDIT-ORDER
|
// OBJECT-FILES-NO, AUDIT-ORDER
|
||||||
// We want to prevent the compiler from accidentally leaking in any system libraries,
|
// We want to prevent the compiler from accidentally leaking in any system libraries,
|
||||||
// so by default we tell linkers not to link to any default libraries.
|
// so by default we tell linkers not to link to any default libraries.
|
||||||
if !sess.opts.cg.default_linker_libraries && sess.target.target.options.no_default_libraries {
|
if !sess.opts.cg.default_linker_libraries && sess.target.options.no_default_libraries {
|
||||||
cmd.no_default_libraries();
|
cmd.no_default_libraries();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1945,7 +1942,7 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>(
|
|||||||
// though, so we let that object file slide.
|
// though, so we let that object file slide.
|
||||||
let skip_because_lto = are_upstream_rust_objects_already_included(sess)
|
let skip_because_lto = are_upstream_rust_objects_already_included(sess)
|
||||||
&& is_rust_object
|
&& is_rust_object
|
||||||
&& (sess.target.target.options.no_builtins
|
&& (sess.target.options.no_builtins
|
||||||
|| !codegen_results.crate_info.is_no_builtins.contains(&cnum));
|
|| !codegen_results.crate_info.is_no_builtins.contains(&cnum));
|
||||||
|
|
||||||
if skip_because_cfg_say_so || skip_because_lto {
|
if skip_because_cfg_say_so || skip_because_lto {
|
||||||
@ -2088,10 +2085,10 @@ fn are_upstream_rust_objects_already_included(sess: &Session) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) {
|
||||||
let arch = &sess.target.target.arch;
|
let arch = &sess.target.arch;
|
||||||
let os = &sess.target.target.target_os;
|
let os = &sess.target.target_os;
|
||||||
let llvm_target = &sess.target.target.llvm_target;
|
let llvm_target = &sess.target.llvm_target;
|
||||||
if sess.target.target.target_vendor != "apple"
|
if sess.target.target_vendor != "apple"
|
||||||
|| !matches!(os.as_str(), "ios" | "tvos")
|
|| !matches!(os.as_str(), "ios" | "tvos")
|
||||||
|| flavor != LinkerFlavor::Gcc
|
|| flavor != LinkerFlavor::Gcc
|
||||||
{
|
{
|
||||||
|
@ -184,7 +184,7 @@ impl<'a> GccLinker<'a> {
|
|||||||
// * On OSX they have their own linker, not binutils'
|
// * On OSX they have their own linker, not binutils'
|
||||||
// * For WebAssembly the only functional linker is LLD, which doesn't
|
// * For WebAssembly the only functional linker is LLD, which doesn't
|
||||||
// support hint flags
|
// support hint flags
|
||||||
!self.sess.target.target.options.is_like_osx && self.sess.target.target.arch != "wasm32"
|
!self.sess.target.options.is_like_osx && self.sess.target.arch != "wasm32"
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some platforms take hints about whether a library is static or dynamic.
|
// Some platforms take hints about whether a library is static or dynamic.
|
||||||
@ -232,7 +232,7 @@ impl<'a> GccLinker<'a> {
|
|||||||
|
|
||||||
fn build_dylib(&mut self, out_filename: &Path) {
|
fn build_dylib(&mut self, out_filename: &Path) {
|
||||||
// On mac we need to tell the linker to let this library be rpathed
|
// On mac we need to tell the linker to let this library be rpathed
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.options.is_like_osx {
|
||||||
self.cmd.arg("-dynamiclib");
|
self.cmd.arg("-dynamiclib");
|
||||||
self.linker_arg("-dylib");
|
self.linker_arg("-dylib");
|
||||||
|
|
||||||
@ -248,7 +248,7 @@ impl<'a> GccLinker<'a> {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.cmd.arg("-shared");
|
self.cmd.arg("-shared");
|
||||||
if self.sess.target.target.options.is_like_windows {
|
if self.sess.target.options.is_like_windows {
|
||||||
// The output filename already contains `dll_suffix` so
|
// The output filename already contains `dll_suffix` so
|
||||||
// the resulting import library will have a name in the
|
// the resulting import library will have a name in the
|
||||||
// form of libfoo.dll.a
|
// form of libfoo.dll.a
|
||||||
@ -256,9 +256,9 @@ impl<'a> GccLinker<'a> {
|
|||||||
out_filename.file_name().and_then(|file| file.to_str()).map(|file| {
|
out_filename.file_name().and_then(|file| file.to_str()).map(|file| {
|
||||||
format!(
|
format!(
|
||||||
"{}{}{}",
|
"{}{}{}",
|
||||||
self.sess.target.target.options.staticlib_prefix,
|
self.sess.target.options.staticlib_prefix,
|
||||||
file,
|
file,
|
||||||
self.sess.target.target.options.staticlib_suffix
|
self.sess.target.options.staticlib_suffix
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
if let Some(implib_name) = implib_name {
|
if let Some(implib_name) = implib_name {
|
||||||
@ -280,7 +280,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
fn set_output_kind(&mut self, output_kind: LinkOutputKind, out_filename: &Path) {
|
fn set_output_kind(&mut self, output_kind: LinkOutputKind, out_filename: &Path) {
|
||||||
match output_kind {
|
match output_kind {
|
||||||
LinkOutputKind::DynamicNoPicExe => {
|
LinkOutputKind::DynamicNoPicExe => {
|
||||||
if !self.is_ld && self.sess.target.target.options.linker_is_gnu {
|
if !self.is_ld && self.sess.target.options.linker_is_gnu {
|
||||||
self.cmd.arg("-no-pie");
|
self.cmd.arg("-no-pie");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,7 +291,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
LinkOutputKind::StaticNoPicExe => {
|
LinkOutputKind::StaticNoPicExe => {
|
||||||
// `-static` works for both gcc wrapper and ld.
|
// `-static` works for both gcc wrapper and ld.
|
||||||
self.cmd.arg("-static");
|
self.cmd.arg("-static");
|
||||||
if !self.is_ld && self.sess.target.target.options.linker_is_gnu {
|
if !self.is_ld && self.sess.target.options.linker_is_gnu {
|
||||||
self.cmd.arg("-no-pie");
|
self.cmd.arg("-no-pie");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,7 +320,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
// any `#[link]` attributes in the `libc` crate, see #72782 for details.
|
// any `#[link]` attributes in the `libc` crate, see #72782 for details.
|
||||||
// FIXME: Switch to using `#[link]` attributes in the `libc` crate
|
// FIXME: Switch to using `#[link]` attributes in the `libc` crate
|
||||||
// similarly to other targets.
|
// similarly to other targets.
|
||||||
if self.sess.target.target.target_os == "vxworks"
|
if self.sess.target.target_os == "vxworks"
|
||||||
&& matches!(
|
&& matches!(
|
||||||
output_kind,
|
output_kind,
|
||||||
LinkOutputKind::StaticNoPicExe
|
LinkOutputKind::StaticNoPicExe
|
||||||
@ -385,7 +385,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
// functions, etc.
|
// functions, etc.
|
||||||
fn link_whole_staticlib(&mut self, lib: Symbol, search_path: &[PathBuf]) {
|
fn link_whole_staticlib(&mut self, lib: Symbol, search_path: &[PathBuf]) {
|
||||||
self.hint_static();
|
self.hint_static();
|
||||||
let target = &self.sess.target.target;
|
let target = &self.sess.target;
|
||||||
if !target.options.is_like_osx {
|
if !target.options.is_like_osx {
|
||||||
self.linker_arg("--whole-archive").cmd.arg(format!("-l{}", lib));
|
self.linker_arg("--whole-archive").cmd.arg(format!("-l{}", lib));
|
||||||
self.linker_arg("--no-whole-archive");
|
self.linker_arg("--no-whole-archive");
|
||||||
@ -400,7 +400,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
|
|
||||||
fn link_whole_rlib(&mut self, lib: &Path) {
|
fn link_whole_rlib(&mut self, lib: &Path) {
|
||||||
self.hint_static();
|
self.hint_static();
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.options.is_like_osx {
|
||||||
self.linker_arg("-force_load");
|
self.linker_arg("-force_load");
|
||||||
self.linker_arg(&lib);
|
self.linker_arg(&lib);
|
||||||
} else {
|
} else {
|
||||||
@ -424,9 +424,9 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
// -dead_strip can't be part of the pre_link_args because it's also used
|
// -dead_strip can't be part of the pre_link_args because it's also used
|
||||||
// for partial linking when using multiple codegen units (-r). So we
|
// for partial linking when using multiple codegen units (-r). So we
|
||||||
// insert it here.
|
// insert it here.
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.options.is_like_osx {
|
||||||
self.linker_arg("-dead_strip");
|
self.linker_arg("-dead_strip");
|
||||||
} else if self.sess.target.target.options.is_like_solaris {
|
} else if self.sess.target.options.is_like_solaris {
|
||||||
self.linker_arg("-zignore");
|
self.linker_arg("-zignore");
|
||||||
|
|
||||||
// If we're building a dylib, we don't use --gc-sections because LLVM
|
// If we're building a dylib, we don't use --gc-sections because LLVM
|
||||||
@ -440,7 +440,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn optimize(&mut self) {
|
fn optimize(&mut self) {
|
||||||
if !self.sess.target.target.options.linker_is_gnu {
|
if !self.sess.target.options.linker_is_gnu {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,7 +454,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn pgo_gen(&mut self) {
|
fn pgo_gen(&mut self) {
|
||||||
if !self.sess.target.target.options.linker_is_gnu {
|
if !self.sess.target.options.linker_is_gnu {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,7 +504,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType) {
|
fn export_symbols(&mut self, tmpdir: &Path, crate_type: CrateType) {
|
||||||
// Symbol visibility in object files typically takes care of this.
|
// Symbol visibility in object files typically takes care of this.
|
||||||
if crate_type == CrateType::Executable
|
if crate_type == CrateType::Executable
|
||||||
&& self.sess.target.target.options.override_export_symbols.is_none()
|
&& self.sess.target.options.override_export_symbols.is_none()
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -513,7 +513,7 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
// The object files have far more public symbols than we actually want to export,
|
// The object files have far more public symbols than we actually want to export,
|
||||||
// so we hide them all here.
|
// so we hide them all here.
|
||||||
|
|
||||||
if !self.sess.target.target.options.limit_rdylib_exports {
|
if !self.sess.target.options.limit_rdylib_exports {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,13 +521,13 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let is_windows = self.sess.target.target.options.is_like_windows;
|
let is_windows = self.sess.target.options.is_like_windows;
|
||||||
let mut arg = OsString::new();
|
let mut arg = OsString::new();
|
||||||
let path = tmpdir.join(if is_windows { "list.def" } else { "list" });
|
let path = tmpdir.join(if is_windows { "list.def" } else { "list" });
|
||||||
|
|
||||||
debug!("EXPORTED SYMBOLS:");
|
debug!("EXPORTED SYMBOLS:");
|
||||||
|
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.options.is_like_osx {
|
||||||
// Write a plain, newline-separated list of symbols
|
// Write a plain, newline-separated list of symbols
|
||||||
let res: io::Result<()> = try {
|
let res: io::Result<()> = try {
|
||||||
let mut f = BufWriter::new(File::create(&path)?);
|
let mut f = BufWriter::new(File::create(&path)?);
|
||||||
@ -573,12 +573,12 @@ impl<'a> Linker for GccLinker<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.sess.target.target.options.is_like_osx {
|
if self.sess.target.options.is_like_osx {
|
||||||
if !self.is_ld {
|
if !self.is_ld {
|
||||||
arg.push("-Wl,")
|
arg.push("-Wl,")
|
||||||
}
|
}
|
||||||
arg.push("-exported_symbols_list,");
|
arg.push("-exported_symbols_list,");
|
||||||
} else if self.sess.target.target.options.is_like_solaris {
|
} else if self.sess.target.options.is_like_solaris {
|
||||||
if !self.is_ld {
|
if !self.is_ld {
|
||||||
arg.push("-Wl,")
|
arg.push("-Wl,")
|
||||||
}
|
}
|
||||||
@ -1203,7 +1203,7 @@ impl<'a> Linker for WasmLd<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<String> {
|
fn exported_symbols(tcx: TyCtxt<'_>, crate_type: CrateType) -> Vec<String> {
|
||||||
if let Some(ref exports) = tcx.sess.target.target.options.override_export_symbols {
|
if let Some(ref exports) = tcx.sess.target.options.override_export_symbols {
|
||||||
return exports.clone();
|
return exports.clone();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1293,7 +1293,7 @@ impl<'a> Linker for PtxLinker<'a> {
|
|||||||
// Provide the linker with fallback to internal `target-cpu`.
|
// Provide the linker with fallback to internal `target-cpu`.
|
||||||
self.cmd.arg("--fallback-arch").arg(match self.sess.opts.cg.target_cpu {
|
self.cmd.arg("--fallback-arch").arg(match self.sess.opts.cg.target_cpu {
|
||||||
Some(ref s) => s,
|
Some(ref s) => s,
|
||||||
None => &self.sess.target.target.options.cpu,
|
None => &self.sess.target.options.cpu,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,8 +229,8 @@ fn exported_symbols_provider_local(
|
|||||||
// needs to be exported.
|
// needs to be exported.
|
||||||
// However, on platforms that don't allow for Rust dylibs, having
|
// However, on platforms that don't allow for Rust dylibs, having
|
||||||
// external linkage is enough for monomorphization to be linked to.
|
// external linkage is enough for monomorphization to be linked to.
|
||||||
let need_visibility = tcx.sess.target.target.options.dynamic_linking
|
let need_visibility =
|
||||||
&& !tcx.sess.target.target.options.only_cdylib;
|
tcx.sess.target.options.dynamic_linking && !tcx.sess.target.options.only_cdylib;
|
||||||
|
|
||||||
let (_, cgus) = tcx.collect_and_partition_mono_items(LOCAL_CRATE);
|
let (_, cgus) = tcx.collect_and_partition_mono_items(LOCAL_CRATE);
|
||||||
|
|
||||||
@ -391,7 +391,7 @@ fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel
|
|||||||
codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
|
codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
|
||||||
|
|
||||||
if is_extern && !std_internal {
|
if is_extern && !std_internal {
|
||||||
let target = &tcx.sess.target.target.llvm_target;
|
let target = &tcx.sess.target.llvm_target;
|
||||||
// WebAssembly cannot export data symbols, so reduce their export level
|
// WebAssembly cannot export data symbols, so reduce their export level
|
||||||
if target.contains("emscripten") {
|
if target.contains("emscripten") {
|
||||||
if let Some(Node::Item(&hir::Item { kind: hir::ItemKind::Static(..), .. })) =
|
if let Some(Node::Item(&hir::Item { kind: hir::ItemKind::Static(..), .. })) =
|
||||||
|
@ -139,7 +139,7 @@ impl ModuleConfig {
|
|||||||
|
|
||||||
let emit_obj = if !should_emit_obj {
|
let emit_obj = if !should_emit_obj {
|
||||||
EmitObj::None
|
EmitObj::None
|
||||||
} else if sess.target.target.options.obj_is_bitcode
|
} else if sess.target.options.obj_is_bitcode
|
||||||
|| (sess.opts.cg.linker_plugin_lto.enabled() && !no_builtins)
|
|| (sess.opts.cg.linker_plugin_lto.enabled() && !no_builtins)
|
||||||
{
|
{
|
||||||
// This case is selected if the target uses objects as bitcode, or
|
// This case is selected if the target uses objects as bitcode, or
|
||||||
@ -221,11 +221,11 @@ impl ModuleConfig {
|
|||||||
false
|
false
|
||||||
),
|
),
|
||||||
emit_obj,
|
emit_obj,
|
||||||
bc_cmdline: sess.target.target.options.bitcode_llvm_cmdline.clone(),
|
bc_cmdline: sess.target.options.bitcode_llvm_cmdline.clone(),
|
||||||
|
|
||||||
verify_llvm_ir: sess.verify_llvm_ir(),
|
verify_llvm_ir: sess.verify_llvm_ir(),
|
||||||
no_prepopulate_passes: sess.opts.cg.no_prepopulate_passes,
|
no_prepopulate_passes: sess.opts.cg.no_prepopulate_passes,
|
||||||
no_builtins: no_builtins || sess.target.target.options.no_builtins,
|
no_builtins: no_builtins || sess.target.options.no_builtins,
|
||||||
|
|
||||||
// Exclude metadata and allocator modules from time_passes output,
|
// Exclude metadata and allocator modules from time_passes output,
|
||||||
// since they throw off the "LLVM passes" measurement.
|
// since they throw off the "LLVM passes" measurement.
|
||||||
@ -252,7 +252,7 @@ impl ModuleConfig {
|
|||||||
.opts
|
.opts
|
||||||
.debugging_opts
|
.debugging_opts
|
||||||
.merge_functions
|
.merge_functions
|
||||||
.unwrap_or(sess.target.target.options.merge_functions)
|
.unwrap_or(sess.target.options.merge_functions)
|
||||||
{
|
{
|
||||||
MergeFunctions::Disabled => false,
|
MergeFunctions::Disabled => false,
|
||||||
MergeFunctions::Trampolines | MergeFunctions::Aliases => {
|
MergeFunctions::Trampolines | MergeFunctions::Aliases => {
|
||||||
@ -388,7 +388,7 @@ fn need_bitcode_in_object(sess: &Session) -> bool {
|
|||||||
let requested_for_rlib = sess.opts.cg.embed_bitcode
|
let requested_for_rlib = sess.opts.cg.embed_bitcode
|
||||||
&& sess.crate_types().contains(&CrateType::Rlib)
|
&& sess.crate_types().contains(&CrateType::Rlib)
|
||||||
&& sess.opts.output_types.contains_key(&OutputType::Exe);
|
&& sess.opts.output_types.contains_key(&OutputType::Exe);
|
||||||
let forced_by_target = sess.target.target.options.forces_embed_bitcode;
|
let forced_by_target = sess.target.options.forces_embed_bitcode;
|
||||||
requested_for_rlib || forced_by_target
|
requested_for_rlib || forced_by_target
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1022,8 +1022,8 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
|||||||
tm_factory: TargetMachineFactory(backend.target_machine_factory(tcx.sess, ol)),
|
tm_factory: TargetMachineFactory(backend.target_machine_factory(tcx.sess, ol)),
|
||||||
total_cgus,
|
total_cgus,
|
||||||
msvc_imps_needed: msvc_imps_needed(tcx),
|
msvc_imps_needed: msvc_imps_needed(tcx),
|
||||||
target_pointer_width: tcx.sess.target.target.pointer_width,
|
target_pointer_width: tcx.sess.target.pointer_width,
|
||||||
target_arch: tcx.sess.target.target.arch.clone(),
|
target_arch: tcx.sess.target.arch.clone(),
|
||||||
debuginfo: tcx.sess.opts.debuginfo,
|
debuginfo: tcx.sess.opts.debuginfo,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1865,11 +1865,11 @@ fn msvc_imps_needed(tcx: TyCtxt<'_>) -> bool {
|
|||||||
// something is wrong with commandline arg validation.
|
// something is wrong with commandline arg validation.
|
||||||
assert!(
|
assert!(
|
||||||
!(tcx.sess.opts.cg.linker_plugin_lto.enabled()
|
!(tcx.sess.opts.cg.linker_plugin_lto.enabled()
|
||||||
&& tcx.sess.target.target.options.is_like_windows
|
&& tcx.sess.target.options.is_like_windows
|
||||||
&& tcx.sess.opts.cg.prefer_dynamic)
|
&& tcx.sess.opts.cg.prefer_dynamic)
|
||||||
);
|
);
|
||||||
|
|
||||||
tcx.sess.target.target.options.is_like_windows &&
|
tcx.sess.target.options.is_like_windows &&
|
||||||
tcx.sess.crate_types().iter().any(|ct| *ct == CrateType::Rlib) &&
|
tcx.sess.crate_types().iter().any(|ct| *ct == CrateType::Rlib) &&
|
||||||
// ThinLTO can't handle this workaround in all cases, so we don't
|
// ThinLTO can't handle this workaround in all cases, so we don't
|
||||||
// emit the `__imp_` symbols. Instead we make them unnecessary by disallowing
|
// emit the `__imp_` symbols. Instead we make them unnecessary by disallowing
|
||||||
|
@ -327,7 +327,7 @@ fn cast_shift_rhs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||||||
/// currently uses SEH-ish unwinding with DWARF info tables to the side (same as
|
/// currently uses SEH-ish unwinding with DWARF info tables to the side (same as
|
||||||
/// 64-bit MinGW) instead of "full SEH".
|
/// 64-bit MinGW) instead of "full SEH".
|
||||||
pub fn wants_msvc_seh(sess: &Session) -> bool {
|
pub fn wants_msvc_seh(sess: &Session) -> bool {
|
||||||
sess.target.target.options.is_like_msvc
|
sess.target.options.is_like_msvc
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn memcpy_ty<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
pub fn memcpy_ty<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
||||||
@ -393,7 +393,7 @@ pub fn maybe_create_entry_wrapper<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||||||
) -> Bx::Function {
|
) -> Bx::Function {
|
||||||
// The entry function is either `int main(void)` or `int main(int argc, char **argv)`,
|
// The entry function is either `int main(void)` or `int main(int argc, char **argv)`,
|
||||||
// depending on whether the target needs `argc` and `argv` to be passed in.
|
// depending on whether the target needs `argc` and `argv` to be passed in.
|
||||||
let llfty = if cx.sess().target.target.options.main_needs_argc_argv {
|
let llfty = if cx.sess().target.options.main_needs_argc_argv {
|
||||||
cx.type_func(&[cx.type_int(), cx.type_ptr_to(cx.type_i8p())], cx.type_int())
|
cx.type_func(&[cx.type_int(), cx.type_ptr_to(cx.type_i8p())], cx.type_int())
|
||||||
} else {
|
} else {
|
||||||
cx.type_func(&[], cx.type_int())
|
cx.type_func(&[], cx.type_int())
|
||||||
@ -464,7 +464,7 @@ fn get_argc_argv<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
|
|||||||
cx: &'a Bx::CodegenCx,
|
cx: &'a Bx::CodegenCx,
|
||||||
bx: &mut Bx,
|
bx: &mut Bx,
|
||||||
) -> (Bx::Value, Bx::Value) {
|
) -> (Bx::Value, Bx::Value) {
|
||||||
if cx.sess().target.target.options.main_needs_argc_argv {
|
if cx.sess().target.options.main_needs_argc_argv {
|
||||||
// Params from native `main()` used as args for rust start function
|
// Params from native `main()` used as args for rust start function
|
||||||
let param_argc = bx.get_param(0);
|
let param_argc = bx.get_param(0);
|
||||||
let param_argv = bx.get_param(1);
|
let param_argv = bx.get_param(1);
|
||||||
|
@ -33,7 +33,7 @@ pub fn push_debuginfo_type_name<'tcx>(
|
|||||||
) {
|
) {
|
||||||
// When targeting MSVC, emit C++ style type names for compatibility with
|
// When targeting MSVC, emit C++ style type names for compatibility with
|
||||||
// .natvis visualizers (and perhaps other existing native debuggers?)
|
// .natvis visualizers (and perhaps other existing native debuggers?)
|
||||||
let cpp_like_names = tcx.sess.target.target.options.is_like_msvc;
|
let cpp_like_names = tcx.sess.target.options.is_like_msvc;
|
||||||
|
|
||||||
match *t.kind() {
|
match *t.kind() {
|
||||||
ty::Bool => output.push_str("bool"),
|
ty::Bool => output.push_str("bool"),
|
||||||
|
@ -872,7 +872,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
let string = match ty.kind() {
|
let string = match ty.kind() {
|
||||||
ty::Uint(_) => value.to_string(),
|
ty::Uint(_) => value.to_string(),
|
||||||
ty::Int(int_ty) => {
|
ty::Int(int_ty) => {
|
||||||
match int_ty.normalize(bx.tcx().sess.target.ptr_width) {
|
match int_ty.normalize(bx.tcx().sess.target.pointer_width) {
|
||||||
ast::IntTy::I8 => (value as i8).to_string(),
|
ast::IntTy::I8 => (value as i8).to_string(),
|
||||||
ast::IntTy::I16 => (value as i16).to_string(),
|
ast::IntTy::I16 => (value as i16).to_string(),
|
||||||
ast::IntTy::I32 => (value as i32).to_string(),
|
ast::IntTy::I32 => (value as i32).to_string(),
|
||||||
|
@ -580,8 +580,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
// stuffs.
|
// stuffs.
|
||||||
fn int_type_width_signed(ty: Ty<'_>, tcx: TyCtxt<'_>) -> Option<(u64, bool)> {
|
fn int_type_width_signed(ty: Ty<'_>, tcx: TyCtxt<'_>) -> Option<(u64, bool)> {
|
||||||
match ty.kind() {
|
match ty.kind() {
|
||||||
ty::Int(t) => Some((t.bit_width().unwrap_or(u64::from(tcx.sess.target.ptr_width)), true)),
|
ty::Int(t) => {
|
||||||
ty::Uint(t) => Some((t.bit_width().unwrap_or(u64::from(tcx.sess.target.ptr_width)), false)),
|
Some((t.bit_width().unwrap_or(u64::from(tcx.sess.target.pointer_width)), true))
|
||||||
|
}
|
||||||
|
ty::Uint(t) => {
|
||||||
|
Some((t.bit_width().unwrap_or(u64::from(tcx.sess.target.pointer_width)), false))
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -346,8 +346,8 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
|
|||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
if variant_index != dataful_variant {
|
if variant_index != dataful_variant {
|
||||||
if bx.cx().sess().target.target.arch == "arm"
|
if bx.cx().sess().target.arch == "arm"
|
||||||
|| bx.cx().sess().target.target.arch == "aarch64"
|
|| bx.cx().sess().target.arch == "aarch64"
|
||||||
{
|
{
|
||||||
// FIXME(#34427): as workaround for LLVM bug on ARM,
|
// FIXME(#34427): as workaround for LLVM bug on ARM,
|
||||||
// use memset of 0 before assigning niche value.
|
// use memset of 0 before assigning niche value.
|
||||||
|
@ -138,7 +138,7 @@ pub fn all_known_features() -> impl Iterator<Item = (&'static str, Option<Symbol
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn supported_target_features(sess: &Session) -> &'static [(&'static str, Option<Symbol>)] {
|
pub fn supported_target_features(sess: &Session) -> &'static [(&'static str, Option<Symbol>)] {
|
||||||
match &*sess.target.target.arch {
|
match &*sess.target.arch {
|
||||||
"arm" => ARM_ALLOWED_FEATURES,
|
"arm" => ARM_ALLOWED_FEATURES,
|
||||||
"aarch64" => AARCH64_ALLOWED_FEATURES,
|
"aarch64" => AARCH64_ALLOWED_FEATURES,
|
||||||
"x86" | "x86_64" => X86_ALLOWED_FEATURES,
|
"x86" | "x86_64" => X86_ALLOWED_FEATURES,
|
||||||
|
@ -51,7 +51,7 @@ pub trait DerivedTypeMethods<'tcx>: BaseTypeMethods<'tcx> + MiscMethods<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn type_int(&self) -> Self::Type {
|
fn type_int(&self) -> Self::Type {
|
||||||
match &self.sess().target.target.target_c_int_width[..] {
|
match &self.sess().target.target_c_int_width[..] {
|
||||||
"16" => self.type_i16(),
|
"16" => self.type_i16(),
|
||||||
"32" => self.type_i32(),
|
"32" => self.type_i32(),
|
||||||
"64" => self.type_i64(),
|
"64" => self.type_i64(),
|
||||||
|
@ -670,7 +670,7 @@ impl RustcDefaultCalls {
|
|||||||
Input::File(ref ifile) => {
|
Input::File(ref ifile) => {
|
||||||
let path = &(*ifile);
|
let path = &(*ifile);
|
||||||
let mut v = Vec::new();
|
let mut v = Vec::new();
|
||||||
locator::list_file_metadata(&sess.target.target, path, metadata_loader, &mut v)
|
locator::list_file_metadata(&sess.target, path, metadata_loader, &mut v)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
println!("{}", String::from_utf8(v).unwrap());
|
println!("{}", String::from_utf8(v).unwrap());
|
||||||
}
|
}
|
||||||
@ -724,7 +724,7 @@ impl RustcDefaultCalls {
|
|||||||
"{}",
|
"{}",
|
||||||
sess.target_tlib_path.as_ref().unwrap_or(&sess.host_tlib_path).dir.display()
|
sess.target_tlib_path.as_ref().unwrap_or(&sess.host_tlib_path).dir.display()
|
||||||
),
|
),
|
||||||
TargetSpec => println!("{}", sess.target.target.to_json().pretty()),
|
TargetSpec => println!("{}", sess.target.to_json().pretty()),
|
||||||
FileNames | CrateName => {
|
FileNames | CrateName => {
|
||||||
let input = input.unwrap_or_else(|| {
|
let input = input.unwrap_or_else(|| {
|
||||||
early_error(ErrorOutputType::default(), "no input file provided")
|
early_error(ErrorOutputType::default(), "no input file provided")
|
||||||
|
@ -304,7 +304,7 @@ fn lint_int_literal<'tcx>(
|
|||||||
t: ast::IntTy,
|
t: ast::IntTy,
|
||||||
v: u128,
|
v: u128,
|
||||||
) {
|
) {
|
||||||
let int_type = t.normalize(cx.sess().target.ptr_width);
|
let int_type = t.normalize(cx.sess().target.pointer_width);
|
||||||
let (min, max) = int_ty_range(int_type);
|
let (min, max) = int_ty_range(int_type);
|
||||||
let max = max as u128;
|
let max = max as u128;
|
||||||
let negative = type_limits.negated_expr_id == Some(e.hir_id);
|
let negative = type_limits.negated_expr_id == Some(e.hir_id);
|
||||||
@ -352,7 +352,7 @@ fn lint_uint_literal<'tcx>(
|
|||||||
lit: &hir::Lit,
|
lit: &hir::Lit,
|
||||||
t: ast::UintTy,
|
t: ast::UintTy,
|
||||||
) {
|
) {
|
||||||
let uint_type = t.normalize(cx.sess().target.ptr_width);
|
let uint_type = t.normalize(cx.sess().target.pointer_width);
|
||||||
let (min, max) = uint_ty_range(uint_type);
|
let (min, max) = uint_ty_range(uint_type);
|
||||||
let lit_val: u128 = match lit.node {
|
let lit_val: u128 = match lit.node {
|
||||||
// _v is u8, within range by definition
|
// _v is u8, within range by definition
|
||||||
|
@ -127,7 +127,7 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {
|
|||||||
if ty == CrateType::Staticlib
|
if ty == CrateType::Staticlib
|
||||||
|| (ty == CrateType::Executable
|
|| (ty == CrateType::Executable
|
||||||
&& sess.crt_static(Some(ty))
|
&& sess.crt_static(Some(ty))
|
||||||
&& !sess.target.target.options.crt_static_allows_dylibs)
|
&& !sess.target.options.crt_static_allows_dylibs)
|
||||||
{
|
{
|
||||||
for &cnum in tcx.crates().iter() {
|
for &cnum in tcx.crates().iter() {
|
||||||
if tcx.dep_kind(cnum).macros_only() {
|
if tcx.dep_kind(cnum).macros_only() {
|
||||||
|
@ -325,7 +325,7 @@ impl<'a> CrateLocator<'a> {
|
|||||||
hash,
|
hash,
|
||||||
host_hash,
|
host_hash,
|
||||||
extra_filename,
|
extra_filename,
|
||||||
target: if is_host { &sess.host } else { &sess.target.target },
|
target: if is_host { &sess.host } else { &sess.target },
|
||||||
triple: if is_host {
|
triple: if is_host {
|
||||||
TargetTriple::from_triple(config::host_triple())
|
TargetTriple::from_triple(config::host_triple())
|
||||||
} else {
|
} else {
|
||||||
|
@ -149,7 +149,7 @@ impl Collector<'tcx> {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let is_osx = self.tcx.sess.target.target.options.is_like_osx;
|
let is_osx = self.tcx.sess.target.options.is_like_osx;
|
||||||
if lib.kind == NativeLibKind::Framework && !is_osx {
|
if lib.kind == NativeLibKind::Framework && !is_osx {
|
||||||
let msg = "native frameworks are only available on macOS targets";
|
let msg = "native frameworks are only available on macOS targets";
|
||||||
match span {
|
match span {
|
||||||
|
@ -1079,7 +1079,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
crate_name: &str,
|
crate_name: &str,
|
||||||
output_filenames: &OutputFilenames,
|
output_filenames: &OutputFilenames,
|
||||||
) -> GlobalCtxt<'tcx> {
|
) -> GlobalCtxt<'tcx> {
|
||||||
let data_layout = TargetDataLayout::parse(&s.target.target).unwrap_or_else(|err| {
|
let data_layout = TargetDataLayout::parse(&s.target).unwrap_or_else(|err| {
|
||||||
s.fatal(&err);
|
s.fatal(&err);
|
||||||
});
|
});
|
||||||
let interners = CtxtInterners::new(arena);
|
let interners = CtxtInterners::new(arena);
|
||||||
@ -1522,7 +1522,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||||||
/// Determines whether identifiers in the assembly have strict naming rules.
|
/// Determines whether identifiers in the assembly have strict naming rules.
|
||||||
/// Currently, only NVPTX* targets need it.
|
/// Currently, only NVPTX* targets need it.
|
||||||
pub fn has_strict_asm_symbol_naming(self) -> bool {
|
pub fn has_strict_asm_symbol_naming(self) -> bool {
|
||||||
self.sess.target.target.arch.contains("nvptx")
|
self.sess.target.arch.contains("nvptx")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns `&'static core::panic::Location<'static>`.
|
/// Returns `&'static core::panic::Location<'static>`.
|
||||||
|
@ -106,7 +106,7 @@ impl IntegerExt for Integer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if repr.c() {
|
if repr.c() {
|
||||||
match &tcx.sess.target.target.arch[..] {
|
match &tcx.sess.target.arch[..] {
|
||||||
// WARNING: the ARM EABI has two variants; the one corresponding
|
// WARNING: the ARM EABI has two variants; the one corresponding
|
||||||
// to `at_least == I32` appears to be used on Linux and NetBSD,
|
// to `at_least == I32` appears to be used on Linux and NetBSD,
|
||||||
// but some systems may use the variant corresponding to no
|
// but some systems may use the variant corresponding to no
|
||||||
@ -2548,7 +2548,7 @@ where
|
|||||||
let sig = cx.tcx().normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig);
|
let sig = cx.tcx().normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), &sig);
|
||||||
|
|
||||||
use rustc_target::spec::abi::Abi::*;
|
use rustc_target::spec::abi::Abi::*;
|
||||||
let conv = match cx.tcx().sess.target.target.adjust_abi(sig.abi) {
|
let conv = match cx.tcx().sess.target.adjust_abi(sig.abi) {
|
||||||
RustIntrinsic | PlatformIntrinsic | Rust | RustCall => Conv::Rust,
|
RustIntrinsic | PlatformIntrinsic | Rust | RustCall => Conv::Rust,
|
||||||
|
|
||||||
// It's the ABI's job to select this, not ours.
|
// It's the ABI's job to select this, not ours.
|
||||||
@ -2600,7 +2600,7 @@ where
|
|||||||
extra_args.to_vec()
|
extra_args.to_vec()
|
||||||
};
|
};
|
||||||
|
|
||||||
let target = &cx.tcx().sess.target.target;
|
let target = &cx.tcx().sess.target;
|
||||||
let target_env_gnu_like = matches!(&target.target_env[..], "gnu" | "musl");
|
let target_env_gnu_like = matches!(&target.target_env[..], "gnu" | "musl");
|
||||||
let win_x64_gnu =
|
let win_x64_gnu =
|
||||||
target.target_os == "windows" && target.arch == "x86_64" && target.target_env == "gnu";
|
target.target_os == "windows" && target.arch == "x86_64" && target.target_env == "gnu";
|
||||||
@ -2775,7 +2775,7 @@ where
|
|||||||
// anyway, we control all calls to it in libstd.
|
// anyway, we control all calls to it in libstd.
|
||||||
Abi::Vector { .. }
|
Abi::Vector { .. }
|
||||||
if abi != SpecAbi::PlatformIntrinsic
|
if abi != SpecAbi::PlatformIntrinsic
|
||||||
&& cx.tcx().sess.target.target.options.simd_types_indirect =>
|
&& cx.tcx().sess.target.options.simd_types_indirect =>
|
||||||
{
|
{
|
||||||
arg.make_indirect();
|
arg.make_indirect();
|
||||||
return;
|
return;
|
||||||
|
@ -532,7 +532,7 @@ fn mono_item_visibility(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn default_visibility(tcx: TyCtxt<'_>, id: DefId, is_generic: bool) -> Visibility {
|
fn default_visibility(tcx: TyCtxt<'_>, id: DefId, is_generic: bool) -> Visibility {
|
||||||
if !tcx.sess.target.target.options.default_hidden_visibility {
|
if !tcx.sess.target.options.default_hidden_visibility {
|
||||||
return Visibility::Default;
|
return Visibility::Default;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ impl ExprVisitor<'tcx> {
|
|||||||
) -> Option<InlineAsmType> {
|
) -> Option<InlineAsmType> {
|
||||||
// Check the type against the allowed types for inline asm.
|
// Check the type against the allowed types for inline asm.
|
||||||
let ty = self.typeck_results.expr_ty_adjusted(expr);
|
let ty = self.typeck_results.expr_ty_adjusted(expr);
|
||||||
let asm_ty_isize = match self.tcx.sess.target.ptr_width {
|
let asm_ty_isize = match self.tcx.sess.target.pointer_width {
|
||||||
16 => InlineAsmType::I16,
|
16 => InlineAsmType::I16,
|
||||||
32 => InlineAsmType::I32,
|
32 => InlineAsmType::I32,
|
||||||
64 => InlineAsmType::I64,
|
64 => InlineAsmType::I64,
|
||||||
@ -184,7 +184,7 @@ impl ExprVisitor<'tcx> {
|
|||||||
Some(InlineAsmType::VecI128(fields.len() as u64))
|
Some(InlineAsmType::VecI128(fields.len() as u64))
|
||||||
}
|
}
|
||||||
ty::Int(IntTy::Isize) | ty::Uint(UintTy::Usize) => {
|
ty::Int(IntTy::Isize) | ty::Uint(UintTy::Usize) => {
|
||||||
Some(match self.tcx.sess.target.ptr_width {
|
Some(match self.tcx.sess.target.pointer_width {
|
||||||
16 => InlineAsmType::VecI16(fields.len() as u64),
|
16 => InlineAsmType::VecI16(fields.len() as u64),
|
||||||
32 => InlineAsmType::VecI32(fields.len() as u64),
|
32 => InlineAsmType::VecI32(fields.len() as u64),
|
||||||
64 => InlineAsmType::VecI64(fields.len() as u64),
|
64 => InlineAsmType::VecI64(fields.len() as u64),
|
||||||
|
@ -26,7 +26,7 @@ pub fn check_crate<'tcx>(tcx: TyCtxt<'tcx>, items: &mut lang_items::LanguageItem
|
|||||||
if items.eh_personality().is_none() {
|
if items.eh_personality().is_none() {
|
||||||
items.missing.push(LangItem::EhPersonality);
|
items.missing.push(LangItem::EhPersonality);
|
||||||
}
|
}
|
||||||
if tcx.sess.target.target.options.is_like_emscripten && items.eh_catch_typeinfo().is_none() {
|
if tcx.sess.target.options.is_like_emscripten && items.eh_catch_typeinfo().is_none() {
|
||||||
items.missing.push(LangItem::EhCatchTypeinfo);
|
items.missing.push(LangItem::EhCatchTypeinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -740,16 +740,16 @@ pub const fn default_lib_output() -> CrateType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn default_configuration(sess: &Session) -> CrateConfig {
|
pub fn default_configuration(sess: &Session) -> CrateConfig {
|
||||||
let end = &sess.target.target.target_endian;
|
let end = &sess.target.target_endian;
|
||||||
let arch = &sess.target.target.arch;
|
let arch = &sess.target.arch;
|
||||||
let wordsz = sess.target.target.pointer_width.to_string();
|
let wordsz = sess.target.pointer_width.to_string();
|
||||||
let os = &sess.target.target.target_os;
|
let os = &sess.target.target_os;
|
||||||
let env = &sess.target.target.target_env;
|
let env = &sess.target.target_env;
|
||||||
let vendor = &sess.target.target.target_vendor;
|
let vendor = &sess.target.target_vendor;
|
||||||
let min_atomic_width = sess.target.target.min_atomic_width();
|
let min_atomic_width = sess.target.min_atomic_width();
|
||||||
let max_atomic_width = sess.target.target.max_atomic_width();
|
let max_atomic_width = sess.target.max_atomic_width();
|
||||||
let atomic_cas = sess.target.target.options.atomic_cas;
|
let atomic_cas = sess.target.options.atomic_cas;
|
||||||
let layout = TargetDataLayout::parse(&sess.target.target).unwrap_or_else(|err| {
|
let layout = TargetDataLayout::parse(&sess.target).unwrap_or_else(|err| {
|
||||||
sess.fatal(&err);
|
sess.fatal(&err);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -757,7 +757,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
|
|||||||
ret.reserve(6); // the minimum number of insertions
|
ret.reserve(6); // the minimum number of insertions
|
||||||
// Target bindings.
|
// Target bindings.
|
||||||
ret.insert((sym::target_os, Some(Symbol::intern(os))));
|
ret.insert((sym::target_os, Some(Symbol::intern(os))));
|
||||||
if let Some(ref fam) = sess.target.target.options.target_family {
|
if let Some(ref fam) = sess.target.options.target_family {
|
||||||
ret.insert((sym::target_family, Some(Symbol::intern(fam))));
|
ret.insert((sym::target_family, Some(Symbol::intern(fam))));
|
||||||
if fam == "windows" {
|
if fam == "windows" {
|
||||||
ret.insert((sym::windows, None));
|
ret.insert((sym::windows, None));
|
||||||
@ -770,7 +770,7 @@ pub fn default_configuration(sess: &Session) -> CrateConfig {
|
|||||||
ret.insert((sym::target_pointer_width, Some(Symbol::intern(&wordsz))));
|
ret.insert((sym::target_pointer_width, Some(Symbol::intern(&wordsz))));
|
||||||
ret.insert((sym::target_env, Some(Symbol::intern(env))));
|
ret.insert((sym::target_env, Some(Symbol::intern(env))));
|
||||||
ret.insert((sym::target_vendor, Some(Symbol::intern(vendor))));
|
ret.insert((sym::target_vendor, Some(Symbol::intern(vendor))));
|
||||||
if sess.target.target.options.has_elf_tls {
|
if sess.target.options.has_elf_tls {
|
||||||
ret.insert((sym::target_thread_local, None));
|
ret.insert((sym::target_thread_local, None));
|
||||||
}
|
}
|
||||||
for &(i, align) in &[
|
for &(i, align) in &[
|
||||||
|
@ -151,18 +151,16 @@ pub fn filename_for_input(
|
|||||||
CrateType::Rlib => outputs.out_directory.join(&format!("lib{}.rlib", libname)),
|
CrateType::Rlib => outputs.out_directory.join(&format!("lib{}.rlib", libname)),
|
||||||
CrateType::Cdylib | CrateType::ProcMacro | CrateType::Dylib => {
|
CrateType::Cdylib | CrateType::ProcMacro | CrateType::Dylib => {
|
||||||
let (prefix, suffix) =
|
let (prefix, suffix) =
|
||||||
(&sess.target.target.options.dll_prefix, &sess.target.target.options.dll_suffix);
|
(&sess.target.options.dll_prefix, &sess.target.options.dll_suffix);
|
||||||
outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
|
outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
|
||||||
}
|
}
|
||||||
CrateType::Staticlib => {
|
CrateType::Staticlib => {
|
||||||
let (prefix, suffix) = (
|
let (prefix, suffix) =
|
||||||
&sess.target.target.options.staticlib_prefix,
|
(&sess.target.options.staticlib_prefix, &sess.target.options.staticlib_suffix);
|
||||||
&sess.target.target.options.staticlib_suffix,
|
|
||||||
);
|
|
||||||
outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
|
outputs.out_directory.join(&format!("{}{}{}", prefix, libname, suffix))
|
||||||
}
|
}
|
||||||
CrateType::Executable => {
|
CrateType::Executable => {
|
||||||
let suffix = &sess.target.target.options.exe_suffix;
|
let suffix = &sess.target.options.exe_suffix;
|
||||||
let out_filename = outputs.path(OutputType::Exe);
|
let out_filename = outputs.path(OutputType::Exe);
|
||||||
if suffix.is_empty() { out_filename } else { out_filename.with_extension(&suffix[1..]) }
|
if suffix.is_empty() { out_filename } else { out_filename.with_extension(&suffix[1..]) }
|
||||||
}
|
}
|
||||||
@ -179,35 +177,29 @@ pub fn filename_for_input(
|
|||||||
/// interaction with Rust code through static library is the only
|
/// interaction with Rust code through static library is the only
|
||||||
/// option for now
|
/// option for now
|
||||||
pub fn default_output_for_target(sess: &Session) -> CrateType {
|
pub fn default_output_for_target(sess: &Session) -> CrateType {
|
||||||
if !sess.target.target.options.executables {
|
if !sess.target.options.executables { CrateType::Staticlib } else { CrateType::Executable }
|
||||||
CrateType::Staticlib
|
|
||||||
} else {
|
|
||||||
CrateType::Executable
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if target supports crate_type as output
|
/// Checks if target supports crate_type as output
|
||||||
pub fn invalid_output_for_target(sess: &Session, crate_type: CrateType) -> bool {
|
pub fn invalid_output_for_target(sess: &Session, crate_type: CrateType) -> bool {
|
||||||
match crate_type {
|
match crate_type {
|
||||||
CrateType::Cdylib | CrateType::Dylib | CrateType::ProcMacro => {
|
CrateType::Cdylib | CrateType::Dylib | CrateType::ProcMacro => {
|
||||||
if !sess.target.target.options.dynamic_linking {
|
if !sess.target.options.dynamic_linking {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if sess.crt_static(Some(crate_type))
|
if sess.crt_static(Some(crate_type)) && !sess.target.options.crt_static_allows_dylibs {
|
||||||
&& !sess.target.target.options.crt_static_allows_dylibs
|
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
if sess.target.target.options.only_cdylib {
|
if sess.target.options.only_cdylib {
|
||||||
match crate_type {
|
match crate_type {
|
||||||
CrateType::ProcMacro | CrateType::Dylib => return true,
|
CrateType::ProcMacro | CrateType::Dylib => return true,
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !sess.target.target.options.executables {
|
if !sess.target.options.executables {
|
||||||
if crate_type == CrateType::Executable {
|
if crate_type == CrateType::Executable {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -614,7 +614,7 @@ impl Session {
|
|||||||
/// Calculates the flavor of LTO to use for this compilation.
|
/// Calculates the flavor of LTO to use for this compilation.
|
||||||
pub fn lto(&self) -> config::Lto {
|
pub fn lto(&self) -> config::Lto {
|
||||||
// If our target has codegen requirements ignore the command line
|
// If our target has codegen requirements ignore the command line
|
||||||
if self.target.target.options.requires_lto {
|
if self.target.options.requires_lto {
|
||||||
return config::Lto::Fat;
|
return config::Lto::Fat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,7 +682,7 @@ impl Session {
|
|||||||
/// Returns the panic strategy for this compile session. If the user explicitly selected one
|
/// Returns the panic strategy for this compile session. If the user explicitly selected one
|
||||||
/// using '-C panic', use that, otherwise use the panic strategy defined by the target.
|
/// using '-C panic', use that, otherwise use the panic strategy defined by the target.
|
||||||
pub fn panic_strategy(&self) -> PanicStrategy {
|
pub fn panic_strategy(&self) -> PanicStrategy {
|
||||||
self.opts.cg.panic.unwrap_or(self.target.target.options.panic_strategy)
|
self.opts.cg.panic.unwrap_or(self.target.options.panic_strategy)
|
||||||
}
|
}
|
||||||
pub fn fewer_names(&self) -> bool {
|
pub fn fewer_names(&self) -> bool {
|
||||||
let more_names = self.opts.output_types.contains_key(&OutputType::LlvmAssembly)
|
let more_names = self.opts.output_types.contains_key(&OutputType::LlvmAssembly)
|
||||||
@ -706,9 +706,9 @@ impl Session {
|
|||||||
|
|
||||||
/// Check whether this compile session and crate type use static crt.
|
/// Check whether this compile session and crate type use static crt.
|
||||||
pub fn crt_static(&self, crate_type: Option<CrateType>) -> bool {
|
pub fn crt_static(&self, crate_type: Option<CrateType>) -> bool {
|
||||||
if !self.target.target.options.crt_static_respected {
|
if !self.target.options.crt_static_respected {
|
||||||
// If the target does not opt in to crt-static support, use its default.
|
// If the target does not opt in to crt-static support, use its default.
|
||||||
return self.target.target.options.crt_static_default;
|
return self.target.options.crt_static_default;
|
||||||
}
|
}
|
||||||
|
|
||||||
let requested_features = self.opts.cg.target_feature.split(',');
|
let requested_features = self.opts.cg.target_feature.split(',');
|
||||||
@ -725,20 +725,20 @@ impl Session {
|
|||||||
// We can't check `#![crate_type = "proc-macro"]` here.
|
// We can't check `#![crate_type = "proc-macro"]` here.
|
||||||
false
|
false
|
||||||
} else {
|
} else {
|
||||||
self.target.target.options.crt_static_default
|
self.target.options.crt_static_default
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn relocation_model(&self) -> RelocModel {
|
pub fn relocation_model(&self) -> RelocModel {
|
||||||
self.opts.cg.relocation_model.unwrap_or(self.target.target.options.relocation_model)
|
self.opts.cg.relocation_model.unwrap_or(self.target.options.relocation_model)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn code_model(&self) -> Option<CodeModel> {
|
pub fn code_model(&self) -> Option<CodeModel> {
|
||||||
self.opts.cg.code_model.or(self.target.target.options.code_model)
|
self.opts.cg.code_model.or(self.target.options.code_model)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tls_model(&self) -> TlsModel {
|
pub fn tls_model(&self) -> TlsModel {
|
||||||
self.opts.debugging_opts.tls_model.unwrap_or(self.target.target.options.tls_model)
|
self.opts.debugging_opts.tls_model.unwrap_or(self.target.options.tls_model)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn must_not_eliminate_frame_pointers(&self) -> bool {
|
pub fn must_not_eliminate_frame_pointers(&self) -> bool {
|
||||||
@ -749,7 +749,7 @@ impl Session {
|
|||||||
} else if let Some(x) = self.opts.cg.force_frame_pointers {
|
} else if let Some(x) = self.opts.cg.force_frame_pointers {
|
||||||
x
|
x
|
||||||
} else {
|
} else {
|
||||||
!self.target.target.options.eliminate_frame_pointer
|
!self.target.options.eliminate_frame_pointer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -773,7 +773,7 @@ impl Session {
|
|||||||
// value, if it is provided, or disable them, if not.
|
// value, if it is provided, or disable them, if not.
|
||||||
if self.panic_strategy() == PanicStrategy::Unwind {
|
if self.panic_strategy() == PanicStrategy::Unwind {
|
||||||
true
|
true
|
||||||
} else if self.target.target.options.requires_uwtable {
|
} else if self.target.options.requires_uwtable {
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
self.opts.cg.force_unwind_tables.unwrap_or(false)
|
self.opts.cg.force_unwind_tables.unwrap_or(false)
|
||||||
@ -944,7 +944,7 @@ impl Session {
|
|||||||
if let Some(n) = self.opts.cli_forced_codegen_units {
|
if let Some(n) = self.opts.cli_forced_codegen_units {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
if let Some(n) = self.target.target.options.default_codegen_units {
|
if let Some(n) = self.target.options.default_codegen_units {
|
||||||
return n as usize;
|
return n as usize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1029,11 +1029,11 @@ impl Session {
|
|||||||
pub fn needs_plt(&self) -> bool {
|
pub fn needs_plt(&self) -> bool {
|
||||||
// Check if the current target usually needs PLT to be enabled.
|
// Check if the current target usually needs PLT to be enabled.
|
||||||
// The user can use the command line flag to override it.
|
// The user can use the command line flag to override it.
|
||||||
let needs_plt = self.target.target.options.needs_plt;
|
let needs_plt = self.target.options.needs_plt;
|
||||||
|
|
||||||
let dbg_opts = &self.opts.debugging_opts;
|
let dbg_opts = &self.opts.debugging_opts;
|
||||||
|
|
||||||
let relro_level = dbg_opts.relro_level.unwrap_or(self.target.target.options.relro_level);
|
let relro_level = dbg_opts.relro_level.unwrap_or(self.target.options.relro_level);
|
||||||
|
|
||||||
// Only enable this optimization by default if full relro is also enabled.
|
// Only enable this optimization by default if full relro is also enabled.
|
||||||
// In this case, lazy binding was already unavailable, so nothing is lost.
|
// In this case, lazy binding was already unavailable, so nothing is lost.
|
||||||
@ -1057,8 +1057,7 @@ impl Session {
|
|||||||
match self.opts.cg.link_dead_code {
|
match self.opts.cg.link_dead_code {
|
||||||
Some(explicitly_set) => explicitly_set,
|
Some(explicitly_set) => explicitly_set,
|
||||||
None => {
|
None => {
|
||||||
self.opts.debugging_opts.instrument_coverage
|
self.opts.debugging_opts.instrument_coverage && !self.target.options.is_like_msvc
|
||||||
&& !self.target.target.options.is_like_msvc
|
|
||||||
// Issue #76038: (rustc `-Clink-dead-code` causes MSVC linker to produce invalid
|
// Issue #76038: (rustc `-Clink-dead-code` causes MSVC linker to produce invalid
|
||||||
// binaries when LLVM InstrProf counters are enabled). As described by this issue,
|
// binaries when LLVM InstrProf counters are enabled). As described by this issue,
|
||||||
// the "link dead code" option produces incorrect binaries when compiled and linked
|
// the "link dead code" option produces incorrect binaries when compiled and linked
|
||||||
@ -1438,7 +1437,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
|||||||
// the `dllimport` attributes and `__imp_` symbols in that case.
|
// the `dllimport` attributes and `__imp_` symbols in that case.
|
||||||
if sess.opts.cg.linker_plugin_lto.enabled()
|
if sess.opts.cg.linker_plugin_lto.enabled()
|
||||||
&& sess.opts.cg.prefer_dynamic
|
&& sess.opts.cg.prefer_dynamic
|
||||||
&& sess.target.target.options.is_like_windows
|
&& sess.target.options.is_like_windows
|
||||||
{
|
{
|
||||||
sess.err(
|
sess.err(
|
||||||
"Linker plugin based LTO is not supported together with \
|
"Linker plugin based LTO is not supported together with \
|
||||||
@ -1466,7 +1465,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if sess.target.target.options.requires_uwtable && !include_uwtables {
|
if sess.target.options.requires_uwtable && !include_uwtables {
|
||||||
sess.err(
|
sess.err(
|
||||||
"target requires unwind tables, they cannot be disabled with \
|
"target requires unwind tables, they cannot be disabled with \
|
||||||
`-C force-unwind-tables=no`.",
|
`-C force-unwind-tables=no`.",
|
||||||
@ -1481,7 +1480,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
|
|||||||
// We should only display this error if we're actually going to run PGO.
|
// We should only display this error if we're actually going to run PGO.
|
||||||
// If we're just supposed to print out some data, don't show the error (#61002).
|
// If we're just supposed to print out some data, don't show the error (#61002).
|
||||||
if sess.opts.cg.profile_generate.enabled()
|
if sess.opts.cg.profile_generate.enabled()
|
||||||
&& sess.target.target.options.is_like_msvc
|
&& sess.target.options.is_like_msvc
|
||||||
&& sess.panic_strategy() == PanicStrategy::Unwind
|
&& sess.panic_strategy() == PanicStrategy::Unwind
|
||||||
&& sess.opts.prints.iter().all(|&p| p == PrintRequest::NativeStaticLibs)
|
&& sess.opts.prints.iter().all(|&p| p == PrintRequest::NativeStaticLibs)
|
||||||
{
|
{
|
||||||
|
@ -201,7 +201,7 @@ fn compute_symbol_name(
|
|||||||
//
|
//
|
||||||
// [1]: https://bugs.llvm.org/show_bug.cgi?id=44316
|
// [1]: https://bugs.llvm.org/show_bug.cgi?id=44316
|
||||||
if is_foreign {
|
if is_foreign {
|
||||||
if tcx.sess.target.target.arch != "wasm32"
|
if tcx.sess.target.arch != "wasm32"
|
||||||
|| !tcx.wasm_import_module_map(def_id.krate).contains_key(&def_id)
|
|| !tcx.wasm_import_module_map(def_id.krate).contains_key(&def_id)
|
||||||
{
|
{
|
||||||
if let Some(name) = attrs.link_name {
|
if let Some(name) = attrs.link_name {
|
||||||
|
@ -1619,10 +1619,7 @@ impl ToJson for Target {
|
|||||||
|
|
||||||
target_val!(llvm_target);
|
target_val!(llvm_target);
|
||||||
target_val!(target_endian);
|
target_val!(target_endian);
|
||||||
d.insert(
|
d.insert("target-pointer-width".to_string(), self.pointer_width.to_string().to_json());
|
||||||
"target-pointer-width".to_string(),
|
|
||||||
self.pointer_width.to_string().to_json(),
|
|
||||||
);
|
|
||||||
target_val!(target_c_int_width);
|
target_val!(target_c_int_width);
|
||||||
target_val!(arch);
|
target_val!(arch);
|
||||||
target_val!(target_os, "os");
|
target_val!(target_os, "os");
|
||||||
|
@ -29,7 +29,7 @@ pub fn check_wf_new(tcx: TyCtxt<'_>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn check_abi(tcx: TyCtxt<'_>, span: Span, abi: Abi) {
|
pub(super) fn check_abi(tcx: TyCtxt<'_>, span: Span, abi: Abi) {
|
||||||
if !tcx.sess.target.target.is_abi_supported(abi) {
|
if !tcx.sess.target.is_abi_supported(abi) {
|
||||||
struct_span_err!(
|
struct_span_err!(
|
||||||
tcx.sess,
|
tcx.sess,
|
||||||
span,
|
span,
|
||||||
|
@ -2555,7 +2555,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
|
|||||||
)
|
)
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
if !tcx.sess.target.target.llvm_target.contains("thumbv8m") {
|
if !tcx.sess.target.llvm_target.contains("thumbv8m") {
|
||||||
struct_span_err!(tcx.sess, attr.span, E0775, "`#[cmse_nonsecure_entry]` is only valid for targets with the TrustZone-M extension")
|
struct_span_err!(tcx.sess, attr.span, E0775, "`#[cmse_nonsecure_entry]` is only valid for targets with the TrustZone-M extension")
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
@ -2655,7 +2655,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs {
|
|||||||
set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
|
set.path.segments.iter().map(|x| x.ident.name).collect::<Vec<_>>();
|
||||||
match segments.as_slice() {
|
match segments.as_slice() {
|
||||||
[sym::arm, sym::a32] | [sym::arm, sym::t32] => {
|
[sym::arm, sym::a32] | [sym::arm, sym::t32] => {
|
||||||
if !tcx.sess.target.target.options.has_thumb_interworking {
|
if !tcx.sess.target.options.has_thumb_interworking {
|
||||||
struct_span_err!(
|
struct_span_err!(
|
||||||
tcx.sess.diagnostic(),
|
tcx.sess.diagnostic(),
|
||||||
attr.span,
|
attr.span,
|
||||||
|
Loading…
Reference in New Issue
Block a user