Target stack-probe support configurable finely
This adds capability to configure the target's stack probe support in a more precise manner than just on/off. In particular now we allow choosing between always inline-asm, always call or either one of those depending on the LLVM version on a per-target basis.
This commit is contained in:
parent
efdb859dcd
commit
007080b607
35 changed files with 203 additions and 87 deletions
|
@ -13,6 +13,7 @@ use rustc_middle::ty::query::Providers;
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
use rustc_session::config::{OptLevel, SanitizerSet};
|
use rustc_session::config::{OptLevel, SanitizerSet};
|
||||||
use rustc_session::Session;
|
use rustc_session::Session;
|
||||||
|
use rustc_target::spec::StackProbeType;
|
||||||
|
|
||||||
use crate::attributes;
|
use crate::attributes;
|
||||||
use crate::llvm::AttributePlace::Function;
|
use crate::llvm::AttributePlace::Function;
|
||||||
|
@ -98,12 +99,6 @@ 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
|
|
||||||
// should be using stack probes
|
|
||||||
if !cx.sess().target.stack_probes {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Currently stack probes seem somewhat incompatible with the address
|
// Currently stack probes seem somewhat incompatible with the address
|
||||||
// sanitizer and thread sanitizer. With asan we're already protected from
|
// sanitizer and thread sanitizer. With asan we're already protected from
|
||||||
// stack overflow anyway so we don't really need stack probes regardless.
|
// stack overflow anyway so we don't really need stack probes regardless.
|
||||||
|
@ -127,19 +122,31 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::AddFunctionAttrStringValue(
|
let attr_value = match cx.sess().target.stack_probes {
|
||||||
llfn,
|
StackProbeType::None => None,
|
||||||
llvm::AttributePlace::Function,
|
// Request LLVM to generate the probes inline. If the given LLVM version does not support
|
||||||
const_cstr!("probe-stack"),
|
// this, no probe is generated at all (even if the attribute is specified).
|
||||||
if llvm_util::get_version() < (11, 0, 1) {
|
StackProbeType::Inline => Some(const_cstr!("inline-asm")),
|
||||||
// Flag our internal `__rust_probestack` function as the stack probe symbol.
|
// Flag our internal `__rust_probestack` function as the stack probe symbol.
|
||||||
// This is defined in the `compiler-builtins` crate for each architecture.
|
// This is defined in the `compiler-builtins` crate for each architecture.
|
||||||
const_cstr!("__rust_probestack")
|
StackProbeType::Call => Some(const_cstr!("__rust_probestack")),
|
||||||
} else {
|
// Pick from the two above based on the LLVM version.
|
||||||
// On LLVM 11+, emit inline asm for stack probes instead of a function call.
|
StackProbeType::InlineOrCall { min_llvm_version_for_inline } => {
|
||||||
const_cstr!("inline-asm")
|
if llvm_util::get_version() < min_llvm_version_for_inline {
|
||||||
},
|
Some(const_cstr!("__rust_probestack"))
|
||||||
);
|
} else {
|
||||||
|
Some(const_cstr!("inline-asm"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(attr_value) = attr_value {
|
||||||
|
llvm::AddFunctionAttrStringValue(
|
||||||
|
llfn,
|
||||||
|
llvm::AttributePlace::Function,
|
||||||
|
const_cstr!("probe-stack"),
|
||||||
|
attr_value,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn llvm_target_features(sess: &Session) -> impl Iterator<Item = &str> {
|
pub fn llvm_target_features(sess: &Session) -> impl Iterator<Item = &str> {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use super::apple_sdk_base::{opts, Arch};
|
use super::apple_sdk_base::{opts, Arch};
|
||||||
use crate::spec::{Target, TargetOptions};
|
use crate::spec::{StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let base = opts("ios", Arch::I386);
|
let base = opts("ios", Arch::I386);
|
||||||
|
@ -10,6 +10,10 @@ pub fn target() -> Target {
|
||||||
f64:32:64-f80:128-n8:16:32-S128"
|
f64:32:64-f80:128-n8:16:32-S128"
|
||||||
.to_string(),
|
.to_string(),
|
||||||
arch: "x86".to_string(),
|
arch: "x86".to_string(),
|
||||||
options: TargetOptions { max_atomic_width: Some(64), stack_probes: true, ..base },
|
options: TargetOptions {
|
||||||
|
max_atomic_width: Some(64),
|
||||||
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
|
..base
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target, TargetOptions};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::apple_base::opts("macos");
|
let mut base = super::apple_base::opts("macos");
|
||||||
|
@ -6,7 +6,7 @@ pub fn target() -> Target {
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
||||||
base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
|
base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
base.eliminate_frame_pointer = false;
|
base.eliminate_frame_pointer = false;
|
||||||
|
|
||||||
// Clang automatically chooses a more specific target based on
|
// Clang automatically chooses a more specific target based on
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::Target;
|
use crate::spec::{StackProbeType, Target};
|
||||||
|
|
||||||
// See https://developer.android.com/ndk/guides/abis.html#x86
|
// See https://developer.android.com/ndk/guides/abis.html#x86
|
||||||
// for target ABI requirements.
|
// for target ABI requirements.
|
||||||
|
@ -11,7 +11,7 @@ pub fn target() -> Target {
|
||||||
// http://developer.android.com/ndk/guides/abis.html#x86
|
// http://developer.android.com/ndk/guides/abis.html#x86
|
||||||
base.cpu = "pentiumpro".to_string();
|
base.cpu = "pentiumpro".to_string();
|
||||||
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3".to_string();
|
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3".to_string();
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-linux-android".to_string(),
|
llvm_target: "i686-linux-android".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::freebsd_base::opts();
|
let mut base = super::freebsd_base::opts();
|
||||||
|
@ -7,7 +7,7 @@ pub fn target() -> Target {
|
||||||
let pre_link_args = base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap();
|
let pre_link_args = base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap();
|
||||||
pre_link_args.push("-m32".to_string());
|
pre_link_args.push("-m32".to_string());
|
||||||
pre_link_args.push("-Wl,-znotext".to_string());
|
pre_link_args.push("-Wl,-znotext".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-freebsd".to_string(),
|
llvm_target: "i686-unknown-freebsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::haiku_base::opts();
|
let mut base = super::haiku_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]);
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-haiku".to_string(),
|
llvm_target: "i686-unknown-haiku".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::linux_gnu_base::opts();
|
let mut base = super::linux_gnu_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::linux_musl_base::opts();
|
let mut base = super::linux_musl_base::opts();
|
||||||
|
@ -6,7 +6,7 @@ pub fn target() -> Target {
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,-melf_i386".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,-melf_i386".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
// The unwinder used by i686-unknown-linux-musl, the LLVM libunwind
|
// The unwinder used by i686-unknown-linux-musl, the LLVM libunwind
|
||||||
// implementation, apparently relies on frame pointers existing... somehow.
|
// implementation, apparently relies on frame pointers existing... somehow.
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target, TargetOptions};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-netbsdelf".to_string(),
|
llvm_target: "i686-unknown-netbsdelf".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::openbsd_base::opts();
|
let mut base = super::openbsd_base::opts();
|
||||||
|
@ -6,7 +6,7 @@ pub fn target() -> Target {
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-fuse-ld=lld".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-fuse-ld=lld".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-openbsd".to_string(),
|
llvm_target: "i686-unknown-openbsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::vxworks_base::opts();
|
let mut base = super::vxworks_base::opts();
|
||||||
base.cpu = "pentium4".to_string();
|
base.cpu = "pentium4".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
llvm_target: "i686-unknown-linux-gnu".to_string(),
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
use crate::spec::{LinkArgs, LinkerFlavor, PanicStrategy, RelocModel, RelroLevel, TargetOptions};
|
use crate::spec::{
|
||||||
|
LinkArgs, LinkerFlavor, PanicStrategy, RelocModel, RelroLevel, StackProbeType, TargetOptions,
|
||||||
|
};
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
let mut pre_link_args = LinkArgs::new();
|
let mut pre_link_args = LinkArgs::new();
|
||||||
|
@ -11,7 +13,7 @@ pub fn opts() -> TargetOptions {
|
||||||
env: "gnu".to_string(),
|
env: "gnu".to_string(),
|
||||||
disable_redzone: true,
|
disable_redzone: true,
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
stack_probes: true,
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
eliminate_frame_pointer: false,
|
eliminate_frame_pointer: false,
|
||||||
linker_is_gnu: true,
|
linker_is_gnu: true,
|
||||||
position_independent_executables: true,
|
position_independent_executables: true,
|
||||||
|
|
|
@ -40,6 +40,7 @@ use crate::spec::crt_objects::{CrtObjects, CrtObjectsFallback};
|
||||||
use rustc_serialize::json::{Json, ToJson};
|
use rustc_serialize::json::{Json, ToJson};
|
||||||
use rustc_span::symbol::{sym, Symbol};
|
use rustc_span::symbol::{sym, Symbol};
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::convert::TryFrom;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
@ -479,6 +480,83 @@ macro_rules! supported_targets {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
|
pub enum StackProbeType {
|
||||||
|
/// Don't emit any stack probes.
|
||||||
|
None,
|
||||||
|
/// It is harmless to use this option even on targets that do not have backend support for
|
||||||
|
/// stack probes as the failure mode is the same as if no stack-probe option was specified in
|
||||||
|
/// the first place.
|
||||||
|
Inline,
|
||||||
|
/// Call `__rust_probestack` whenever stack needs to be probed.
|
||||||
|
Call,
|
||||||
|
/// Use inline option for LLVM versions later than specified in `min_llvm_version_for_inline`
|
||||||
|
/// and call `__rust_probestack` otherwise.
|
||||||
|
InlineOrCall { min_llvm_version_for_inline: (u32, u32, u32) },
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StackProbeType {
|
||||||
|
fn from_json(json: &Json) -> Result<Self, String> {
|
||||||
|
let object = json.as_object().ok_or_else(|| "expected a JSON object")?;
|
||||||
|
let kind = object
|
||||||
|
.get("kind")
|
||||||
|
.and_then(|o| o.as_string())
|
||||||
|
.ok_or_else(|| "expected `kind` to be a string")?;
|
||||||
|
match kind {
|
||||||
|
"none" => Ok(StackProbeType::None),
|
||||||
|
"inline" => Ok(StackProbeType::Inline),
|
||||||
|
"call" => Ok(StackProbeType::Call),
|
||||||
|
"inline-or-call" => {
|
||||||
|
let min_version = object
|
||||||
|
.get("min-llvm-version-for-inline")
|
||||||
|
.and_then(|o| o.as_array())
|
||||||
|
.ok_or_else(|| "expected `min-llvm-version-for-inline` to be an array")?;
|
||||||
|
let mut iter = min_version.into_iter().map(|v| {
|
||||||
|
let int = v.as_u64().ok_or_else(
|
||||||
|
|| "expected `min-llvm-version-for-inline` values to be integers",
|
||||||
|
)?;
|
||||||
|
u32::try_from(int)
|
||||||
|
.map_err(|_| "`min-llvm-version-for-inline` values don't convert to u32")
|
||||||
|
});
|
||||||
|
let min_llvm_version_for_inline = (
|
||||||
|
iter.next().unwrap_or(Ok(11))?,
|
||||||
|
iter.next().unwrap_or(Ok(0))?,
|
||||||
|
iter.next().unwrap_or(Ok(0))?,
|
||||||
|
);
|
||||||
|
Ok(StackProbeType::InlineOrCall { min_llvm_version_for_inline })
|
||||||
|
}
|
||||||
|
_ => Err(String::from(
|
||||||
|
"`kind` expected to be one of `inline-or-none`, `call` or `inline-or-call`",
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToJson for StackProbeType {
|
||||||
|
fn to_json(&self) -> Json {
|
||||||
|
Json::Object(match self {
|
||||||
|
StackProbeType::None => {
|
||||||
|
vec![(String::from("kind"), "none".to_json())].into_iter().collect()
|
||||||
|
}
|
||||||
|
StackProbeType::Inline => {
|
||||||
|
vec![(String::from("kind"), "inline".to_json())].into_iter().collect()
|
||||||
|
}
|
||||||
|
StackProbeType::Call => {
|
||||||
|
vec![(String::from("kind"), "call".to_json())].into_iter().collect()
|
||||||
|
}
|
||||||
|
StackProbeType::InlineOrCall { min_llvm_version_for_inline } => vec![
|
||||||
|
(String::from("kind"), "inline-or-call".to_json()),
|
||||||
|
(
|
||||||
|
String::from("min-llvm-version-for-inline"),
|
||||||
|
min_llvm_version_for_inline.to_json(),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
.into_iter()
|
||||||
|
.collect(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
supported_targets! {
|
supported_targets! {
|
||||||
("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
|
("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
|
||||||
("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
|
("x86_64-unknown-linux-gnux32", x86_64_unknown_linux_gnux32),
|
||||||
|
@ -926,8 +1004,8 @@ pub struct TargetOptions {
|
||||||
/// Whether or not crt-static is respected by the compiler (or is a no-op).
|
/// Whether or not crt-static is respected by the compiler (or is a no-op).
|
||||||
pub crt_static_respected: bool,
|
pub crt_static_respected: bool,
|
||||||
|
|
||||||
/// Whether or not stack probes (__rust_probestack) are enabled
|
/// The implementation of stack probes to use.
|
||||||
pub stack_probes: bool,
|
pub stack_probes: StackProbeType,
|
||||||
|
|
||||||
/// The minimum alignment for global symbols.
|
/// The minimum alignment for global symbols.
|
||||||
pub min_global_align: Option<u64>,
|
pub min_global_align: Option<u64>,
|
||||||
|
@ -1085,7 +1163,7 @@ impl Default for TargetOptions {
|
||||||
crt_static_allows_dylibs: false,
|
crt_static_allows_dylibs: false,
|
||||||
crt_static_default: false,
|
crt_static_default: false,
|
||||||
crt_static_respected: false,
|
crt_static_respected: false,
|
||||||
stack_probes: false,
|
stack_probes: StackProbeType::None,
|
||||||
min_global_align: None,
|
min_global_align: None,
|
||||||
default_codegen_units: None,
|
default_codegen_units: None,
|
||||||
trap_unreachable: true,
|
trap_unreachable: true,
|
||||||
|
@ -1361,6 +1439,18 @@ impl Target {
|
||||||
Some(Ok(()))
|
Some(Ok(()))
|
||||||
})).unwrap_or(Ok(()))
|
})).unwrap_or(Ok(()))
|
||||||
} );
|
} );
|
||||||
|
($key_name:ident, StackProbeType) => ( {
|
||||||
|
let name = (stringify!($key_name)).replace("_", "-");
|
||||||
|
obj.find(&name[..]).and_then(|o| match StackProbeType::from_json(o) {
|
||||||
|
Ok(v) => {
|
||||||
|
base.$key_name = v;
|
||||||
|
Some(Ok(()))
|
||||||
|
},
|
||||||
|
Err(s) => Some(Err(
|
||||||
|
format!("`{:?}` is not a valid value for `{}`: {}", o, name, s)
|
||||||
|
)),
|
||||||
|
}).unwrap_or(Ok(()))
|
||||||
|
} );
|
||||||
($key_name:ident, crt_objects_fallback) => ( {
|
($key_name:ident, crt_objects_fallback) => ( {
|
||||||
let name = (stringify!($key_name)).replace("_", "-");
|
let name = (stringify!($key_name)).replace("_", "-");
|
||||||
obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
|
obj.find(&name[..]).and_then(|o| o.as_string().and_then(|s| {
|
||||||
|
@ -1516,7 +1606,7 @@ impl Target {
|
||||||
key!(crt_static_allows_dylibs, bool);
|
key!(crt_static_allows_dylibs, bool);
|
||||||
key!(crt_static_default, bool);
|
key!(crt_static_default, bool);
|
||||||
key!(crt_static_respected, bool);
|
key!(crt_static_respected, bool);
|
||||||
key!(stack_probes, bool);
|
key!(stack_probes, StackProbeType)?;
|
||||||
key!(min_global_align, Option<u64>);
|
key!(min_global_align, Option<u64>);
|
||||||
key!(default_codegen_units, Option<u64>);
|
key!(default_codegen_units, Option<u64>);
|
||||||
key!(trap_unreachable, bool);
|
key!(trap_unreachable, bool);
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
// the timer-interrupt. Device-drivers are required to use polling-based models. Furthermore, all
|
// the timer-interrupt. Device-drivers are required to use polling-based models. Furthermore, all
|
||||||
// code runs in the same environment, no process separation is supported.
|
// code runs in the same environment, no process separation is supported.
|
||||||
|
|
||||||
use crate::spec::{LinkerFlavor, LldFlavor, PanicStrategy, TargetOptions};
|
use crate::spec::{LinkerFlavor, LldFlavor, PanicStrategy, StackProbeType, TargetOptions};
|
||||||
|
|
||||||
pub fn opts() -> TargetOptions {
|
pub fn opts() -> TargetOptions {
|
||||||
let mut base = super::msvc_base::opts();
|
let mut base = super::msvc_base::opts();
|
||||||
|
@ -43,7 +43,7 @@ pub fn opts() -> TargetOptions {
|
||||||
exe_suffix: ".efi".to_string(),
|
exe_suffix: ".efi".to_string(),
|
||||||
allows_weak_linkage: false,
|
allows_weak_linkage: false,
|
||||||
panic_strategy: PanicStrategy::Abort,
|
panic_strategy: PanicStrategy::Abort,
|
||||||
stack_probes: true,
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
singlethread: true,
|
singlethread: true,
|
||||||
linker: Some("rust-lld".to_string()),
|
linker: Some("rust-lld".to_string()),
|
||||||
..base
|
..base
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target, TargetOptions};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::apple_base::opts("macos");
|
let mut base = super::apple_base::opts("macos");
|
||||||
|
@ -10,7 +10,7 @@ pub fn target() -> Target {
|
||||||
vec!["-m64".to_string(), "-arch".to_string(), "x86_64".to_string()],
|
vec!["-m64".to_string(), "-arch".to_string(), "x86_64".to_string()],
|
||||||
);
|
);
|
||||||
base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
|
base.link_env_remove.extend(super::apple_base::macos_link_env_remove());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
// Clang automatically chooses a more specific target based on
|
// Clang automatically chooses a more specific target based on
|
||||||
// MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work
|
// MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use super::apple_sdk_base::{opts, Arch};
|
use super::apple_sdk_base::{opts, Arch};
|
||||||
use crate::spec::{Target, TargetOptions};
|
use crate::spec::{StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let base = opts("ios", Arch::X86_64);
|
let base = opts("ios", Arch::X86_64);
|
||||||
|
@ -9,6 +9,10 @@ pub fn target() -> Target {
|
||||||
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
.to_string(),
|
.to_string(),
|
||||||
arch: "x86_64".to_string(),
|
arch: "x86_64".to_string(),
|
||||||
options: TargetOptions { max_atomic_width: Some(64), stack_probes: true, ..base },
|
options: TargetOptions {
|
||||||
|
max_atomic_width: Some(64),
|
||||||
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
|
..base
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use super::apple_sdk_base::{opts, Arch};
|
use super::apple_sdk_base::{opts, Arch};
|
||||||
use crate::spec::{Target, TargetOptions};
|
use crate::spec::{StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let base = opts("ios", Arch::X86_64_macabi);
|
let base = opts("ios", Arch::X86_64_macabi);
|
||||||
|
@ -9,6 +9,10 @@ pub fn target() -> Target {
|
||||||
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
data_layout: "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
.to_string(),
|
.to_string(),
|
||||||
arch: "x86_64".to_string(),
|
arch: "x86_64".to_string(),
|
||||||
options: TargetOptions { max_atomic_width: Some(64), stack_probes: true, ..base },
|
options: TargetOptions {
|
||||||
|
max_atomic_width: Some(64),
|
||||||
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
|
..base
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use super::apple_sdk_base::{opts, Arch};
|
use super::apple_sdk_base::{opts, Arch};
|
||||||
use crate::spec::{Target, TargetOptions};
|
use crate::spec::{StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let base = opts("tvos", Arch::X86_64);
|
let base = opts("tvos", Arch::X86_64);
|
||||||
|
@ -8,6 +8,10 @@ pub fn target() -> Target {
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "e-m:o-i64:64-f80:128-n8:16:32:64-S128".to_string(),
|
data_layout: "e-m:o-i64:64-f80:128-n8:16:32:64-S128".to_string(),
|
||||||
arch: "x86_64".to_string(),
|
arch: "x86_64".to_string(),
|
||||||
options: TargetOptions { max_atomic_width: Some(64), stack_probes: true, ..base },
|
options: TargetOptions {
|
||||||
|
max_atomic_width: Some(64),
|
||||||
|
stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) },
|
||||||
|
..base
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
use crate::spec::Target;
|
use crate::spec::{StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::fuchsia_base::opts();
|
let mut base = super::fuchsia_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-fuchsia".to_string(),
|
llvm_target: "x86_64-fuchsia".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::android_base::opts();
|
let mut base = super::android_base::opts();
|
||||||
|
@ -7,7 +7,7 @@ pub fn target() -> Target {
|
||||||
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".to_string();
|
base.features = "+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-linux-android".to_string(),
|
llvm_target: "x86_64-linux-android".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::{LinkerFlavor, Target, TargetOptions};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
|
@ -12,7 +12,7 @@ pub fn target() -> Target {
|
||||||
base.has_rpath = false;
|
base.has_rpath = false;
|
||||||
base.position_independent_executables = false;
|
base.position_independent_executables = false;
|
||||||
base.disable_redzone = true;
|
base.disable_redzone = true;
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-rumprun-netbsd".to_string(),
|
llvm_target: "x86_64-rumprun-netbsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::solaris_base::opts();
|
let mut base = super::solaris_base::opts();
|
||||||
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-pc-solaris".to_string(),
|
llvm_target: "x86_64-pc-solaris".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::dragonfly_base::opts();
|
let mut base = super::dragonfly_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-dragonfly".to_string(),
|
llvm_target: "x86_64-unknown-dragonfly".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::freebsd_base::opts();
|
let mut base = super::freebsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-freebsd".to_string(),
|
llvm_target: "x86_64-unknown-freebsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::haiku_base::opts();
|
let mut base = super::haiku_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]);
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
// This option is required to build executables on Haiku x86_64
|
// This option is required to build executables on Haiku x86_64
|
||||||
base.position_independent_executables = true;
|
base.position_independent_executables = true;
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::Target;
|
use crate::spec::{StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::hermit_base::opts();
|
let mut base = super::hermit_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.features = "+rdrnd,+rdseed".to_string();
|
base.features = "+rdrnd,+rdseed".to_string();
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-hermit".to_string(),
|
llvm_target: "x86_64-unknown-hermit".to_string(),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::spec::Target;
|
use crate::spec::{StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::hermit_kernel_base::opts();
|
let mut base = super::hermit_kernel_base::opts();
|
||||||
|
@ -7,7 +7,7 @@ pub fn target() -> Target {
|
||||||
base.features =
|
base.features =
|
||||||
"-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float"
|
"-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float"
|
||||||
.to_string();
|
.to_string();
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-hermit".to_string(),
|
llvm_target: "x86_64-unknown-hermit".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::linux_gnu_base::opts();
|
let mut base = super::linux_gnu_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-linux-gnu".to_string(),
|
llvm_target: "x86_64-unknown-linux-gnu".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::linux_gnu_base::opts();
|
let mut base = super::linux_gnu_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-mx32".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-mx32".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
base.has_elf_tls = false;
|
base.has_elf_tls = false;
|
||||||
// BUG(GabrielMajeri): disabling the PLT on x86_64 Linux with x32 ABI
|
// BUG(GabrielMajeri): disabling the PLT on x86_64 Linux with x32 ABI
|
||||||
// breaks code gen. See LLVM bug 36743
|
// breaks code gen. See LLVM bug 36743
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::linux_musl_base::opts();
|
let mut base = super::linux_musl_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
base.static_position_independent_executables = true;
|
base.static_position_independent_executables = true;
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target, TargetOptions};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::netbsd_base::opts();
|
let mut base = super::netbsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-netbsd".to_string(),
|
llvm_target: "x86_64-unknown-netbsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::openbsd_base::opts();
|
let mut base = super::openbsd_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-openbsd".to_string(),
|
llvm_target: "x86_64-unknown-openbsd".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::redox_base::opts();
|
let mut base = super::redox_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "x86_64-unknown-redox".to_string(),
|
llvm_target: "x86_64-unknown-redox".to_string(),
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use crate::spec::{LinkerFlavor, Target};
|
use crate::spec::{LinkerFlavor, StackProbeType, Target};
|
||||||
|
|
||||||
pub fn target() -> Target {
|
pub fn target() -> Target {
|
||||||
let mut base = super::vxworks_base::opts();
|
let mut base = super::vxworks_base::opts();
|
||||||
base.cpu = "x86-64".to_string();
|
base.cpu = "x86-64".to_string();
|
||||||
base.max_atomic_width = Some(64);
|
base.max_atomic_width = Some(64);
|
||||||
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string());
|
||||||
base.stack_probes = true;
|
base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) };
|
||||||
base.disable_redzone = true;
|
base.disable_redzone = true;
|
||||||
|
|
||||||
Target {
|
Target {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
// run-pass
|
// run-pass
|
||||||
|
|
||||||
// Tests that we can compare various kinds of extern fn signatures.
|
// Tests that we can compare various kinds of extern fn signatures.
|
||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue