From: Elle Rhumsaa <[email protected]>
Follows `rustc` more closely in naming of intrinsic functions, and the
supported memory orderings.
---
gcc/rust/backend/rust-compile-context.h | 1 -
gcc/rust/backend/rust-compile-intrinsic.cc | 6 +++--
gcc/rust/backend/rust-intrinsic-handlers.h | 1 +
gcc/rust/util/rust-intrinsic-values.h | 10 +++----
.../rust/execute/torture/atomic_exchange.rs | 27 ++++++++++++-------
5 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/gcc/rust/backend/rust-compile-context.h
b/gcc/rust/backend/rust-compile-context.h
index 62e7a4ff218b..3fd686d81d1e 100644
--- a/gcc/rust/backend/rust-compile-context.h
+++ b/gcc/rust/backend/rust-compile-context.h
@@ -28,7 +28,6 @@
#include "rust-mangle.h"
#include "rust-tree.h"
#include "rust-immutable-name-resolution-context.h"
-#include "memmodel.h"
namespace Rust {
namespace Compile {
diff --git a/gcc/rust/backend/rust-compile-intrinsic.cc
b/gcc/rust/backend/rust-compile-intrinsic.cc
index 1bfc9630435a..a733f83e63d0 100644
--- a/gcc/rust/backend/rust-compile-intrinsic.cc
+++ b/gcc/rust/backend/rust-compile-intrinsic.cc
@@ -54,12 +54,14 @@ static const std::map<std::string,
handlers::HandlerBuilder> generic_intrinsics
{IValue::ATOMIC_LOAD_UNORDERED, handlers::atomic_load (__ATOMIC_RELAXED)},
{IValue::ATOMIC_EXCHANGE_SEQCST,
handlers::atomic_exchange (MEMMODEL_SEQ_CST)},
+ {IValue::ATOMIC_EXCHANGE_ACQUIRE,
+ handlers::atomic_exchange (MEMMODEL_ACQUIRE)},
{IValue::ATOMIC_EXCHANGE_RELEASE,
handlers::atomic_exchange (MEMMODEL_RELEASE)},
+ {IValue::ATOMIC_EXCHANGE_ACQREL,
+ handlers::atomic_exchange (MEMMODEL_ACQ_REL)},
{IValue::ATOMIC_EXCHANGE_RELAXED,
handlers::atomic_exchange (MEMMODEL_RELAXED)},
- {IValue::ATOMIC_EXCHANGE_UNORDERED,
- handlers::atomic_exchange (MEMMODEL_RELAXED)},
{IValue::UNCHECKED_ADD, handlers::unchecked_op (PLUS_EXPR)},
{IValue::UNCHECKED_SUB, handlers::unchecked_op (MINUS_EXPR)},
{IValue::UNCHECKED_MUL, handlers::unchecked_op (MULT_EXPR)},
diff --git a/gcc/rust/backend/rust-intrinsic-handlers.h
b/gcc/rust/backend/rust-intrinsic-handlers.h
index c169d901ef8e..96c62f0a1cae 100644
--- a/gcc/rust/backend/rust-intrinsic-handlers.h
+++ b/gcc/rust/backend/rust-intrinsic-handlers.h
@@ -20,6 +20,7 @@
#define RUST_INTRINSIC_HANDLERS_H
#include "rust-compile-context.h"
+#include "memmodel.h"
namespace Rust {
namespace Compile {
diff --git a/gcc/rust/util/rust-intrinsic-values.h
b/gcc/rust/util/rust-intrinsic-values.h
index eaa51928bacf..45f8286874c7 100644
--- a/gcc/rust/util/rust-intrinsic-values.h
+++ b/gcc/rust/util/rust-intrinsic-values.h
@@ -46,11 +46,11 @@ public:
static constexpr auto &ATOMIC_LOAD_RELAXED = "atomic_load_relaxed";
static constexpr auto &ATOMIC_LOAD_UNORDERED = "atomic_load_unordered";
- static constexpr auto &ATOMIC_EXCHANGE_SEQCST = "atomic_exchange_seqcst";
- static constexpr auto &ATOMIC_EXCHANGE_RELEASE = "atomic_exchange_release";
- static constexpr auto &ATOMIC_EXCHANGE_RELAXED = "atomic_exchange_relaxed";
- static constexpr auto &ATOMIC_EXCHANGE_UNORDERED
- = "atomic_exchange_unordered";
+ static constexpr auto &ATOMIC_EXCHANGE_SEQCST = "atomic_xchg";
+ static constexpr auto &ATOMIC_EXCHANGE_RELEASE = "atomic_xchg_rel";
+ static constexpr auto &ATOMIC_EXCHANGE_ACQUIRE = "atomic_xchg_acq";
+ static constexpr auto &ATOMIC_EXCHANGE_ACQREL = "atomic_xchg_acqrel";
+ static constexpr auto &ATOMIC_EXCHANGE_RELAXED = "atomic_xchg_relaxed";
static constexpr auto &UNCHECKED_ADD = "unchecked_add";
static constexpr auto &UNCHECKED_SUB = "unchecked_sub";
diff --git a/gcc/testsuite/rust/execute/torture/atomic_exchange.rs
b/gcc/testsuite/rust/execute/torture/atomic_exchange.rs
index 489413869811..b645ef17fe74 100644
--- a/gcc/testsuite/rust/execute/torture/atomic_exchange.rs
+++ b/gcc/testsuite/rust/execute/torture/atomic_exchange.rs
@@ -59,10 +59,11 @@ mod copy_impls {
}
extern "rust-intrinsic" {
- pub fn atomic_exchange_seqcst<T: Copy>(dst: *mut T, val: T) -> T;
- pub fn atomic_exchange_release<T: Copy>(dst: *mut T, val: T) -> T;
- pub fn atomic_exchange_relaxed<T: Copy>(dst: *mut T, val: T) -> T;
- pub fn atomic_exchange_unordered<T: Copy>(dst: *mut T, val: T) -> T;
+ pub fn atomic_xchg<T: Copy>(dst: *mut T, val: T) -> T;
+ pub fn atomic_xchg_acq<T: Copy>(dst: *mut T, val: T) -> T;
+ pub fn atomic_xchg_rel<T: Copy>(dst: *mut T, val: T) -> T;
+ pub fn atomic_xchg_acqrel<T: Copy>(dst: *mut T, val: T) -> T;
+ pub fn atomic_xchg_relaxed<T: Copy>(dst: *mut T, val: T) -> T;
}
fn main() -> u32 {
@@ -72,36 +73,44 @@ fn main() -> u32 {
let two;
let three;
let four;
+ let five;
unsafe {
- let mut ret = atomic_exchange_seqcst(&mut dst, 1);
+ let mut ret = atomic_xchg(&mut dst, 1);
one = dst;
if ret != init {
return ret;
}
- ret = atomic_exchange_release(&mut dst, 2);
+ ret = atomic_xchg_acq(&mut dst, 2);
two = dst;
if ret != one {
return ret;
}
- ret = atomic_exchange_relaxed(&mut dst, 3);
+ ret = atomic_xchg_rel(&mut dst, 3);
three = dst;
if ret != two {
return ret;
}
- ret = atomic_exchange_unordered(&mut dst, 4);
+ ret = atomic_xchg_acqrel(&mut dst, 4);
four = dst;
if ret != three {
return ret;
}
+
+ ret = atomic_xchg_relaxed(&mut dst, 5);
+ five = dst;
+
+ if ret != four {
+ return ret;
+ }
}
- (four + three + two + one) - 10
+ (five + four + three + two + one) - init
}
--
2.54.0