Skip to content

Commit 0807104

Browse files
committed
Auto merge of #38579 - whitequark:min_atomic_width, r=alexcrichton
Add a min_atomic_width target option, like max_atomic_width Rationale: some ISAs, e.g. OR1K, do not have atomic instructions for byte and halfword access, and at the same time do not have a fixed endianness, which makes it unreasonable to implement these through word-sized atomic accesses.
2 parents a9ab778 + 5b0700e commit 0807104

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

src/librustc/session/config.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -943,6 +943,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
943943
let os = &sess.target.target.target_os;
944944
let env = &sess.target.target.target_env;
945945
let vendor = &sess.target.target.target_vendor;
946+
let min_atomic_width = sess.target.target.min_atomic_width();
946947
let max_atomic_width = sess.target.target.max_atomic_width();
947948

948949
let mut ret = HashSet::new();
@@ -963,7 +964,7 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
963964
ret.insert((Symbol::intern("target_thread_local"), None));
964965
}
965966
for &i in &[8, 16, 32, 64, 128] {
966-
if i <= max_atomic_width {
967+
if i >= min_atomic_width && i <= max_atomic_width {
967968
let s = i.to_string();
968969
ret.insert((Symbol::intern("target_has_atomic"), Some(Symbol::intern(&s))));
969970
if &s == wordsz {

src/librustc_back/target/mod.rs

+12
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,9 @@ pub struct TargetOptions {
376376
// file
377377
pub no_integrated_as: bool,
378378

379+
/// Don't use this field; instead use the `.min_atomic_width()` method.
380+
pub min_atomic_width: Option<u64>,
381+
379382
/// Don't use this field; instead use the `.max_atomic_width()` method.
380383
pub max_atomic_width: Option<u64>,
381384

@@ -439,6 +442,7 @@ impl Default for TargetOptions {
439442
has_elf_tls: false,
440443
obj_is_bitcode: false,
441444
no_integrated_as: false,
445+
min_atomic_width: None,
442446
max_atomic_width: None,
443447
panic_strategy: PanicStrategy::Unwind,
444448
abi_blacklist: vec![],
@@ -462,6 +466,12 @@ impl Target {
462466
}
463467
}
464468

469+
/// Minimum integer size in bits that this target can perform atomic
470+
/// operations on.
471+
pub fn min_atomic_width(&self) -> u64 {
472+
self.options.min_atomic_width.unwrap_or(8)
473+
}
474+
465475
/// Maximum integer size in bits that this target can perform atomic
466476
/// operations on.
467477
pub fn max_atomic_width(&self) -> u64 {
@@ -604,6 +614,7 @@ impl Target {
604614
key!(obj_is_bitcode, bool);
605615
key!(no_integrated_as, bool);
606616
key!(max_atomic_width, Option<u64>);
617+
key!(min_atomic_width, Option<u64>);
607618
try!(key!(panic_strategy, PanicStrategy));
608619
key!(crt_static_default, bool);
609620

@@ -766,6 +777,7 @@ impl ToJson for Target {
766777
target_option_val!(has_elf_tls);
767778
target_option_val!(obj_is_bitcode);
768779
target_option_val!(no_integrated_as);
780+
target_option_val!(min_atomic_width);
769781
target_option_val!(max_atomic_width);
770782
target_option_val!(panic_strategy);
771783
target_option_val!(crt_static_default);

0 commit comments

Comments
 (0)