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

Reply via email to