Auto merge of #28612 - gandro:targetvendor, r=alexcrichton

This adds a new target property, `target_vendor`. It is to be be used as a matcher for conditional compilation. The vendor is part of the [autoconf target triple](http://llvm.org/docs/doxygen/html/classllvm_1_1Triple.html#details): `<arch><sub>-<vendor>-<os>-<env>`. `arch`, `target_os` and `target_env` are already supported by Rust.

This change was suggested in PR #28593. It enables conditional compilation based on the vendor. This is needed for the rumprun target, which needs to match against both, target_os and target_vendor.

The default value for `target_vendor` is "unknown", "apple" and "pc" are other common values.

Matching against the `target_vendor` is introduced behind the feature gate `#![feature(cfg_target_vendor)]`.

This is the first time I messed around with rustc internals. I just added the my code where I found the existing `target_*` variables, hopefully I haven't missed anything. Please review with care. :)

r? @alexcrichton
This commit is contained in:
bors
2015-09-26 00:14:39 +00:00
36 changed files with 95 additions and 3 deletions

View File

@@ -2093,6 +2093,8 @@ The following configurations must be defined by the implementation:
* `target_pointer_width = "..."` - Target pointer width in bits. This is set * `target_pointer_width = "..."` - Target pointer width in bits. This is set
to `"32"` for targets with 32-bit pointers, and likewise set to `"64"` for to `"32"` for targets with 32-bit pointers, and likewise set to `"64"` for
64-bit pointers. 64-bit pointers.
* `target_vendor = "..."` - Vendor of the target, for example `apple`, `pc`, or
simply `"unknown"`.
* `test` - Enabled when compiling the test harness (using the `--test` flag). * `test` - Enabled when compiling the test harness (using the `--test` flag).
* `unix` - See `target_family`. * `unix` - See `target_family`.
* `windows` - See `target_family`. * `windows` - See `target_family`.
@@ -2269,7 +2271,7 @@ The currently implemented features of the reference compiler are:
* `advanced_slice_patterns` - See the [match expressions](#match-expressions) * `advanced_slice_patterns` - See the [match expressions](#match-expressions)
section for discussion; the exact semantics of section for discussion; the exact semantics of
slice patterns are subject to change, so some types slice patterns are subject to change, so some types
are still unstable. are still unstable.
* `slice_patterns` - OK, actually, slice patterns are just scary and * `slice_patterns` - OK, actually, slice patterns are just scary and
completely unstable. completely unstable.
@@ -2290,6 +2292,9 @@ The currently implemented features of the reference compiler are:
* `box_syntax` - Allows use of `box` expressions, the exact semantics of which * `box_syntax` - Allows use of `box` expressions, the exact semantics of which
is subject to change. is subject to change.
* `cfg_target_vendor` - Allows conditional compilation using the `target_vendor`
matcher which is subject to change.
* `concat_idents` - Allows use of the `concat_idents` macro, which is in many * `concat_idents` - Allows use of the `concat_idents` macro, which is in many
ways insufficient for concatenating identifiers, and may be ways insufficient for concatenating identifiers, and may be
removed entirely for something more wholesome. removed entirely for something more wholesome.

View File

@@ -617,6 +617,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
let wordsz = &sess.target.target.target_pointer_width; let wordsz = &sess.target.target.target_pointer_width;
let os = &sess.target.target.target_os; let os = &sess.target.target.target_os;
let env = &sess.target.target.target_env; let env = &sess.target.target.target_env;
let vendor = &sess.target.target.target_vendor;
let fam = match sess.target.target.options.is_like_windows { let fam = match sess.target.target.options.is_like_windows {
true => InternedString::new("windows"), true => InternedString::new("windows"),
@@ -632,6 +633,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
mk(InternedString::new("target_endian"), intern(end)), mk(InternedString::new("target_endian"), intern(end)),
mk(InternedString::new("target_pointer_width"), intern(wordsz)), mk(InternedString::new("target_pointer_width"), intern(wordsz)),
mk(InternedString::new("target_env"), intern(env)), mk(InternedString::new("target_env"), intern(env)),
mk(InternedString::new("target_vendor"), intern(vendor)),
]; ];
if sess.opts.debug_assertions { if sess.opts.debug_assertions {
ret.push(attr::mk_word_item(InternedString::new("debug_assertions"))); ret.push(attr::mk_word_item(InternedString::new("debug_assertions")));

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "aarch64".to_string(), arch: "aarch64".to_string(),
target_os: "ios".to_string(), target_os: "ios".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: TargetOptions { options: TargetOptions {
features: "+neon,+fp-armv8,+cyclone".to_string(), features: "+neon,+fp-armv8,+cyclone".to_string(),
eliminate_frame_pointer: false, eliminate_frame_pointer: false,

View File

@@ -18,6 +18,7 @@ pub fn target() -> Target {
arch: "aarch64".to_string(), arch: "aarch64".to_string(),
target_os: "android".to_string(), target_os: "android".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: super::android_base::opts(), options: super::android_base::opts(),
} }
} }

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
arch: "aarch64".to_string(), arch: "aarch64".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "arm".to_string(), arch: "arm".to_string(),
target_os: "android".to_string(), target_os: "android".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "arm".to_string(), arch: "arm".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnueabi".to_string(), target_env: "gnueabi".to_string(),
target_vendor: "unknown".to_string(),
options: TargetOptions { options: TargetOptions {
features: "+v6".to_string(), features: "+v6".to_string(),

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "arm".to_string(), arch: "arm".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnueabihf".to_string(), target_env: "gnueabihf".to_string(),
target_vendor: "unknown".to_string(),
options: TargetOptions { options: TargetOptions {
features: "+v6,+vfp2".to_string(), features: "+v6,+vfp2".to_string(),

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "arm".to_string(), arch: "arm".to_string(),
target_os: "ios".to_string(), target_os: "ios".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: TargetOptions { options: TargetOptions {
features: "+v7,+vfp3,+neon".to_string(), features: "+v7,+vfp3,+neon".to_string(),
.. opts(Arch::Armv7) .. opts(Arch::Armv7)

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "arm".to_string(), arch: "arm".to_string(),
target_os: "ios".to_string(), target_os: "ios".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: TargetOptions { options: TargetOptions {
features: "+v7,+vfp4,+neon".to_string(), features: "+v7,+vfp4,+neon".to_string(),
.. opts(Arch::Armv7s) .. opts(Arch::Armv7s)

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "ios".to_string(), target_os: "ios".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: opts(Arch::I386) options: opts(Arch::I386)
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "macos".to_string(), target_os: "macos".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: base, options: base,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "android".to_string(), target_os: "android".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -30,6 +30,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "windows".to_string(), target_os: "windows".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "pc".to_string(),
options: options, options: options,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "windows".to_string(), target_os: "windows".to_string(),
target_env: "msvc".to_string(), target_env: "msvc".to_string(),
target_vendor: "pc".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "dragonfly".to_string(), target_os: "dragonfly".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "freebsd".to_string(), target_os: "freebsd".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86".to_string(), arch: "x86".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -18,6 +18,7 @@ pub fn target() -> Target {
arch: "mips".to_string(), arch: "mips".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: super::linux_base::opts() options: super::linux_base::opts()
} }
} }

View File

@@ -18,6 +18,7 @@ pub fn target() -> Target {
arch: "mips".to_string(), arch: "mips".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: super::linux_base::opts() options: super::linux_base::opts()
} }

View File

@@ -77,6 +77,8 @@ pub struct Target {
pub target_os: String, pub target_os: String,
/// Environment name to use for conditional compilation. /// Environment name to use for conditional compilation.
pub target_env: String, pub target_env: String,
/// Vendor name to use for conditional compilation.
pub target_vendor: String,
/// Architecture to use for ABI considerations. Valid options: "x86", "x86_64", "arm", /// Architecture to use for ABI considerations. Valid options: "x86", "x86_64", "arm",
/// "aarch64", "mips", and "powerpc". "mips" includes "mipsel". /// "aarch64", "mips", and "powerpc". "mips" includes "mipsel".
pub arch: String, pub arch: String,
@@ -260,14 +262,20 @@ impl Target {
} }
}; };
let get_opt_field = |name: &str, default: &str| {
obj.find(name).and_then(|s| s.as_string())
.map(|s| s.to_string())
.unwrap_or(default.to_string())
};
let mut base = Target { let mut base = Target {
llvm_target: get_req_field("llvm-target"), llvm_target: get_req_field("llvm-target"),
target_endian: get_req_field("target-endian"), target_endian: get_req_field("target-endian"),
target_pointer_width: get_req_field("target-pointer-width"), target_pointer_width: get_req_field("target-pointer-width"),
arch: get_req_field("arch"), arch: get_req_field("arch"),
target_os: get_req_field("os"), target_os: get_req_field("os"),
target_env: obj.find("env").and_then(|s| s.as_string()) target_env: get_opt_field("env", ""),
.map(|s| s.to_string()).unwrap_or(String::new()), target_vendor: get_opt_field("vendor", "unknown"),
options: Default::default(), options: Default::default(),
}; };

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "powerpc".to_string(), arch: "powerpc".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -23,6 +23,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "macos".to_string(), target_os: "macos".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: base, options: base,
} }
} }

View File

@@ -19,6 +19,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "ios".to_string(), target_os: "ios".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "apple".to_string(),
options: opts(Arch::X86_64) options: opts(Arch::X86_64)
} }
} }

View File

@@ -25,6 +25,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "windows".to_string(), target_os: "windows".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "pc".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "windows".to_string(), target_os: "windows".to_string(),
target_env: "msvc".to_string(), target_env: "msvc".to_string(),
target_vendor: "pc".to_string(),
options: base, options: base,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "bitrig".to_string(), target_os: "bitrig".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "dragonfly".to_string(), target_os: "dragonfly".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "freebsd".to_string(), target_os: "freebsd".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -22,6 +22,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "gnu".to_string(), target_env: "gnu".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -76,6 +76,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "linux".to_string(), target_os: "linux".to_string(),
target_env: "musl".to_string(), target_env: "musl".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "netbsd".to_string(), target_os: "netbsd".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -21,6 +21,7 @@ pub fn target() -> Target {
arch: "x86_64".to_string(), arch: "x86_64".to_string(),
target_os: "openbsd".to_string(), target_os: "openbsd".to_string(),
target_env: "".to_string(), target_env: "".to_string(),
target_vendor: "unknown".to_string(),
options: base, options: base,
} }
} }

View File

@@ -203,6 +203,9 @@ const KNOWN_FEATURES: &'static [(&'static str, &'static str, Option<u32>, Status
// allow `#[omit_gdb_pretty_printer_section]` // allow `#[omit_gdb_pretty_printer_section]`
("omit_gdb_pretty_printer_section", "1.5.0", None, Active), ("omit_gdb_pretty_printer_section", "1.5.0", None, Active),
// Allows cfg(target_vendor = "...").
("cfg_target_vendor", "1.5.0", None, Active),
]; ];
// (changing above list without updating src/doc/reference.md makes @cmr sad) // (changing above list without updating src/doc/reference.md makes @cmr sad)
@@ -377,6 +380,7 @@ macro_rules! cfg_fn {
const GATED_CFGS: &'static [(&'static str, &'static str, fn(&Features) -> bool)] = &[ const GATED_CFGS: &'static [(&'static str, &'static str, fn(&Features) -> bool)] = &[
// (name in cfg, feature, function to check if the feature is enabled) // (name in cfg, feature, function to check if the feature is enabled)
("target_feature", "cfg_target_feature", cfg_fn!(|x| x.cfg_target_feature)), ("target_feature", "cfg_target_feature", cfg_fn!(|x| x.cfg_target_feature)),
("target_vendor", "cfg_target_vendor", cfg_fn!(|x| x.cfg_target_vendor)),
]; ];
#[derive(Debug, Eq, PartialEq)] #[derive(Debug, Eq, PartialEq)]
@@ -471,6 +475,7 @@ pub struct Features {
pub default_type_parameter_fallback: bool, pub default_type_parameter_fallback: bool,
pub type_macros: bool, pub type_macros: bool,
pub cfg_target_feature: bool, pub cfg_target_feature: bool,
pub cfg_target_vendor: bool,
pub augmented_assignments: bool, pub augmented_assignments: bool,
} }
@@ -500,6 +505,7 @@ impl Features {
default_type_parameter_fallback: false, default_type_parameter_fallback: false,
type_macros: false, type_macros: false,
cfg_target_feature: false, cfg_target_feature: false,
cfg_target_vendor: false,
augmented_assignments: false, augmented_assignments: false,
} }
} }
@@ -1069,6 +1075,7 @@ fn check_crate_inner<F>(cm: &CodeMap, span_handler: &SpanHandler,
default_type_parameter_fallback: cx.has_feature("default_type_parameter_fallback"), default_type_parameter_fallback: cx.has_feature("default_type_parameter_fallback"),
type_macros: cx.has_feature("type_macros"), type_macros: cx.has_feature("type_macros"),
cfg_target_feature: cx.has_feature("cfg_target_feature"), cfg_target_feature: cx.has_feature("cfg_target_feature"),
cfg_target_vendor: cx.has_feature("cfg_target_vendor"),
augmented_assignments: cx.has_feature("augmented_assignments"), augmented_assignments: cx.has_feature("augmented_assignments"),
} }
} }

View File

@@ -0,0 +1,21 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#[cfg(target_vendor = "x")] //~ ERROR `cfg(target_vendor)` is experimental
#[cfg_attr(target_vendor = "x", x)] //~ ERROR `cfg(target_vendor)` is experimental
struct Foo(u64, u64);
#[cfg(not(any(all(target_vendor = "x"))))] //~ ERROR `cfg(target_vendor)` is experimental
fn foo() {}
fn main() {
cfg!(target_vendor = "x");
//~^ ERROR `cfg(target_vendor)` is experimental and subject to change
}

View File

@@ -0,0 +1,19 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(cfg_target_vendor)]
#[cfg(target_vendor = "unknown")]
pub fn main() {
}
#[cfg(not(target_vendor = "unknown"))]
pub fn main() {
}