Skip to content

Commit 04835ea

Browse files
committed
Add #[cfg(target_has_atomic)] to get atomic support for the current target
1 parent 50909f2 commit 04835ea

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+90
-10
lines changed

src/doc/reference.md

+5
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,8 @@ The following configurations must be defined by the implementation:
20912091
* `target_pointer_width = "..."` - Target pointer width in bits. This is set
20922092
to `"32"` for targets with 32-bit pointers, and likewise set to `"64"` for
20932093
64-bit pointers.
2094+
* `target_has_atomic = "..."` - Set of integer sizes on which the target can perform
2095+
atomic operations. Values are `"8"`, `"16"`, `"32"`, `"64"` and `"ptr"`.
20942096
* `target_vendor = "..."` - Vendor of the target, for example `apple`, `pc`, or
20952097
simply `"unknown"`.
20962098
* `test` - Enabled when compiling the test harness (using the `--test` flag).
@@ -2295,6 +2297,9 @@ The currently implemented features of the reference compiler are:
22952297
* `cfg_target_vendor` - Allows conditional compilation using the `target_vendor`
22962298
matcher which is subject to change.
22972299

2300+
* `cfg_target_has_atomic` - Allows conditional compilation using the `target_has_atomic`
2301+
matcher which is subject to change.
2302+
22982303
* `concat_idents` - Allows use of the `concat_idents` macro, which is in many
22992304
ways insufficient for concatenating identifiers, and may be
23002305
removed entirely for something more wholesome.

src/libcore/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
#![feature(associated_type_defaults)]
6464
#![feature(concat_idents)]
6565
#![feature(const_fn)]
66+
#![feature(cfg_target_has_atomic)]
6667
#![feature(custom_attribute)]
6768
#![feature(fundamental)]
6869
#![feature(inclusive_range_syntax)]

src/librustc/session/config.rs

+10
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
695695
let os = &sess.target.target.target_os;
696696
let env = &sess.target.target.target_env;
697697
let vendor = &sess.target.target.target_vendor;
698+
let max_atomic_width = sess.target.target.options.max_atomic_width;
698699

699700
let fam = if let Some(ref fam) = sess.target.target.options.target_family {
700701
intern(fam)
@@ -721,6 +722,15 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
721722
if sess.target.target.options.has_elf_tls {
722723
ret.push(attr::mk_word_item(InternedString::new("target_thread_local")));
723724
}
725+
for &i in &[8, 16, 32, 64, 128] {
726+
if i <= max_atomic_width {
727+
let s = i.to_string();
728+
ret.push(mk(InternedString::new("target_has_atomic"), intern(&s)));
729+
if &s == wordsz {
730+
ret.push(mk(InternedString::new("target_has_atomic"), intern("ptr")));
731+
}
732+
}
733+
}
724734
if sess.opts.debug_assertions {
725735
ret.push(attr::mk_word_item(InternedString::new("debug_assertions")));
726736
}

src/librustc_back/target/aarch64_apple_ios.rs

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn target() -> Target {
2424
options: TargetOptions {
2525
features: "+neon,+fp-armv8,+cyclone".to_string(),
2626
eliminate_frame_pointer: false,
27+
max_atomic_width: 128,
2728
.. opts(Arch::Arm64)
2829
},
2930
}

src/librustc_back/target/aarch64_linux_android.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use target::Target;
1212

1313
pub fn target() -> Target {
14+
let mut base = super::android_base::opts();
15+
base.max_atomic_width = 128;
1416
Target {
1517
llvm_target: "aarch64-linux-android".to_string(),
1618
target_endian: "little".to_string(),
@@ -20,6 +22,6 @@ pub fn target() -> Target {
2022
target_os: "android".to_string(),
2123
target_env: "".to_string(),
2224
target_vendor: "unknown".to_string(),
23-
options: super::android_base::opts(),
25+
options: base,
2426
}
2527
}

src/librustc_back/target/aarch64_unknown_linux_gnu.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
use target::Target;
1212

1313
pub fn target() -> Target {
14-
let base = super::linux_base::opts();
14+
let mut base = super::linux_base::opts();
15+
base.max_atomic_width = 128;
1516
Target {
1617
llvm_target: "aarch64-unknown-linux-gnu".to_string(),
1718
target_endian: "little".to_string(),

src/librustc_back/target/arm_linux_androideabi.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::android_base::opts();
1515
base.features = "+v7,+vfp3,+d16".to_string();
16+
base.max_atomic_width = 64;
1617

1718
Target {
1819
llvm_target: "arm-linux-androideabi".to_string(),

src/librustc_back/target/arm_unknown_linux_gnueabi.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
use target::{Target, TargetOptions};
1212

1313
pub fn target() -> Target {
14-
let base = super::linux_base::opts();
14+
let mut base = super::linux_base::opts();
15+
base.max_atomic_width = 64;
1516
Target {
1617
llvm_target: "arm-unknown-linux-gnueabi".to_string(),
1718
target_endian: "little".to_string(),

src/librustc_back/target/arm_unknown_linux_gnueabihf.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
use target::{Target, TargetOptions};
1212

1313
pub fn target() -> Target {
14-
let base = super::linux_base::opts();
14+
let mut base = super::linux_base::opts();
15+
base.max_atomic_width = 64;
1516
Target {
1617
llvm_target: "arm-unknown-linux-gnueabihf".to_string(),
1718
target_endian: "little".to_string(),

src/librustc_back/target/armv7_apple_ios.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn target() -> Target {
2323
target_vendor: "apple".to_string(),
2424
options: TargetOptions {
2525
features: "+v7,+vfp3,+neon".to_string(),
26+
max_atomic_width: 64,
2627
.. opts(Arch::Armv7)
2728
}
2829
}

src/librustc_back/target/armv7_unknown_linux_gnueabihf.rs

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub fn target() -> Target {
2525
options: TargetOptions {
2626
features: "+v7,+vfp3,+neon".to_string(),
2727
cpu: "cortex-a8".to_string(),
28+
max_atomic_width: 64,
2829
.. base
2930
}
3031
}

src/librustc_back/target/armv7s_apple_ios.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn target() -> Target {
2323
target_vendor: "apple".to_string(),
2424
options: TargetOptions {
2525
features: "+v7,+vfp4,+neon".to_string(),
26+
max_atomic_width: 64,
2627
.. opts(Arch::Armv7s)
2728
}
2829
}

src/librustc_back/target/asmjs_unknown_emscripten.rs

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ pub fn target() -> Target {
2222
linker_is_gnu: true,
2323
allow_asm: false,
2424
obj_is_bitcode: true,
25+
max_atomic_width: 32,
2526
.. Default::default()
2627
};
2728
Target {

src/librustc_back/target/i386_apple_ios.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use target::Target;
11+
use target::{Target, TargetOptions};
1212
use super::apple_ios_base::{opts, Arch};
1313

1414
pub fn target() -> Target {
@@ -21,6 +21,9 @@ pub fn target() -> Target {
2121
target_os: "ios".to_string(),
2222
target_env: "".to_string(),
2323
target_vendor: "apple".to_string(),
24-
options: opts(Arch::I386)
24+
options: TargetOptions {
25+
max_atomic_width: 64,
26+
.. opts(Arch::I386)
27+
}
2528
}
2629
}

src/librustc_back/target/i686_apple_darwin.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::apple_base::opts();
1515
base.cpu = "yonah".to_string();
16+
base.max_atomic_width = 64;
1617
base.pre_link_args.push("-m32".to_string());
1718

1819
Target {

src/librustc_back/target/i686_linux_android.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::android_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617

1718
Target {
1819
llvm_target: "i686-linux-android".to_string(),

src/librustc_back/target/i686_pc_windows_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::windows_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617

1718
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
1819
// space available to x86 Windows binaries on x86_64.

src/librustc_back/target/i686_pc_windows_msvc.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::windows_msvc_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617

1718
// Mark all dynamic libraries and executables as compatible with the larger 4GiB address
1819
// space available to x86 Windows binaries on x86_64.

src/librustc_back/target/i686_unknown_dragonfly.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::dragonfly_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617
base.pre_link_args.push("-m32".to_string());
1718

1819
Target {

src/librustc_back/target/i686_unknown_freebsd.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::freebsd_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617
base.pre_link_args.push("-m32".to_string());
1718

1819
Target {

src/librustc_back/target/i686_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::linux_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617
base.pre_link_args.push("-m32".to_string());
1718

1819
Target {

src/librustc_back/target/i686_unknown_linux_musl.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::linux_musl_base::opts();
1515
base.cpu = "pentium4".to_string();
16+
base.max_atomic_width = 64;
1617
base.pre_link_args.push("-m32".to_string());
1718
base.pre_link_args.push("-Wl,-melf_i386".to_string());
1819

src/librustc_back/target/le32_unknown_nacl.rs

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ pub fn target() -> Target {
2525
no_compiler_rt: false,
2626
linker_is_gnu: true,
2727
allow_asm: false,
28+
max_atomic_width: 32,
2829
.. Default::default()
2930
};
3031
Target {

src/librustc_back/target/mips_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn target() -> Target {
2323
options: TargetOptions {
2424
cpu: "mips32r2".to_string(),
2525
features: "+mips32r2,+soft-float".to_string(),
26+
max_atomic_width: 32,
2627
..super::linux_base::opts()
2728
},
2829
}

src/librustc_back/target/mips_unknown_linux_musl.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn target() -> Target {
2323
options: TargetOptions {
2424
cpu: "mips32r2".to_string(),
2525
features: "+mips32r2,+soft-float".to_string(),
26+
max_atomic_width: 32,
2627
..super::linux_base::opts()
2728
}
2829
}

src/librustc_back/target/mipsel_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pub fn target() -> Target {
2424
options: TargetOptions {
2525
cpu: "mips32".to_string(),
2626
features: "+mips32".to_string(),
27+
max_atomic_width: 32,
2728
..super::linux_base::opts()
2829
},
2930
}

src/librustc_back/target/mipsel_unknown_linux_musl.rs

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub fn target() -> Target {
2323
options: TargetOptions {
2424
cpu: "mips32".to_string(),
2525
features: "+mips32".to_string(),
26+
max_atomic_width: 32,
2627
..super::linux_base::opts()
2728
}
2829
}

src/librustc_back/target/mod.rs

+15
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,10 @@ pub struct TargetOptions {
292292
// If we give emcc .o files that are actually .bc files it
293293
// will 'just work'.
294294
pub obj_is_bitcode: bool,
295+
296+
/// Maximum integer size in bits that this target can perform atomic
297+
/// operations on.
298+
pub max_atomic_width: u64,
295299
}
296300

297301
impl Default for TargetOptions {
@@ -340,6 +344,7 @@ impl Default for TargetOptions {
340344
allow_asm: true,
341345
has_elf_tls: false,
342346
obj_is_bitcode: false,
347+
max_atomic_width: 0,
343348
}
344349
}
345350
}
@@ -392,6 +397,9 @@ impl Target {
392397
options: Default::default(),
393398
};
394399

400+
// Default max-atomic-width to target-pointer-width
401+
base.options.max_atomic_width = base.target_pointer_width.parse().unwrap();
402+
395403
macro_rules! key {
396404
($key_name:ident) => ( {
397405
let name = (stringify!($key_name)).replace("_", "-");
@@ -404,6 +412,12 @@ impl Target {
404412
.map(|o| o.as_boolean()
405413
.map(|s| base.options.$key_name = s));
406414
} );
415+
($key_name:ident, u64) => ( {
416+
let name = (stringify!($key_name)).replace("_", "-");
417+
obj.find(&name[..])
418+
.map(|o| o.as_u64()
419+
.map(|s| base.options.$key_name = s));
420+
} );
407421
($key_name:ident, list) => ( {
408422
let name = (stringify!($key_name)).replace("_", "-");
409423
obj.find(&name[..]).map(|o| o.as_array()
@@ -451,6 +465,7 @@ impl Target {
451465
key!(archive_format);
452466
key!(allow_asm, bool);
453467
key!(custom_unwind_resume, bool);
468+
key!(max_atomic_width, u64);
454469

455470
base
456471
}

src/librustc_back/target/powerpc64_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub fn target() -> Target {
1414
let mut base = super::linux_base::opts();
1515
base.cpu = "ppc64".to_string();
1616
base.pre_link_args.push("-m64".to_string());
17+
base.max_atomic_width = 64;
1718

1819
Target {
1920
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),

src/librustc_back/target/powerpc64le_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub fn target() -> Target {
1414
let mut base = super::linux_base::opts();
1515
base.cpu = "ppc64le".to_string();
1616
base.pre_link_args.push("-m64".to_string());
17+
base.max_atomic_width = 64;
1718

1819
Target {
1920
llvm_target: "powerpc64le-unknown-linux-gnu".to_string(),

src/librustc_back/target/powerpc_unknown_linux_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::linux_base::opts();
1515
base.pre_link_args.push("-m32".to_string());
16+
base.max_atomic_width = 32;
1617

1718
Target {
1819
llvm_target: "powerpc-unknown-linux-gnu".to_string(),

src/librustc_back/target/x86_64_apple_darwin.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::apple_base::opts();
1515
base.cpu = "core2".to_string();
16+
base.max_atomic_width = 128; // core2 support cmpxchg16b
1617
base.eliminate_frame_pointer = false;
1718
base.pre_link_args.push("-m64".to_string());
1819

src/librustc_back/target/x86_64_apple_ios.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use target::Target;
11+
use target::{Target, TargetOptions};
1212
use super::apple_ios_base::{opts, Arch};
1313

1414
pub fn target() -> Target {
@@ -21,6 +21,9 @@ pub fn target() -> Target {
2121
target_os: "ios".to_string(),
2222
target_env: "".to_string(),
2323
target_vendor: "apple".to_string(),
24-
options: opts(Arch::X86_64)
24+
options: TargetOptions {
25+
max_atomic_width: 64,
26+
.. opts(Arch::X86_64)
27+
}
2528
}
2629
}

src/librustc_back/target/x86_64_pc_windows_gnu.rs

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub fn target() -> Target {
1414
let mut base = super::windows_base::opts();
1515
base.cpu = "x86-64".to_string();
1616
base.pre_link_args.push("-m64".to_string());
17+
base.max_atomic_width = 64;
1718

1819
Target {
1920
llvm_target: "x86_64-pc-windows-gnu".to_string(),

src/librustc_back/target/x86_64_pc_windows_msvc.rs

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use target::Target;
1313
pub fn target() -> Target {
1414
let mut base = super::windows_msvc_base::opts();
1515
base.cpu = "x86-64".to_string();
16+
base.max_atomic_width = 64;
1617

1718
Target {
1819
llvm_target: "x86_64-pc-windows-msvc".to_string(),

src/librustc_back/target/x86_64_rumprun_netbsd.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub fn target() -> Target {
1515
base.pre_link_args.push("-m64".to_string());
1616
base.linker = "x86_64-rumprun-netbsd-gcc".to_string();
1717
base.ar = "x86_64-rumprun-netbsd-ar".to_string();
18+
base.max_atomic_width = 64;
1819

1920
base.dynamic_linking = false;
2021
base.has_rpath = false;

0 commit comments

Comments
 (0)