about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAntoni Boucher <bouanto@zoho.com>2024-04-24 20:01:57 -0400
committerAntoni Boucher <bouanto@zoho.com>2024-04-24 20:15:15 -0400
commit65e8717e4559bdfd30a0c6a05eb7f1241f53221e (patch)
treeff9003109090c705df1dd3630b867f34d56b16db
parent41839175b0ed5446c6b0564a04ecf0a6b83737f5 (diff)
downloadrust-65e8717e4559bdfd30a0c6a05eb7f1241f53221e.tar.gz
rust-65e8717e4559bdfd30a0c6a05eb7f1241f53221e.zip
Some fixes for aarch64
-rw-r--r--src/attributes.rs8
-rw-r--r--src/builder.rs2
-rw-r--r--src/intrinsic/llvm.rs22
3 files changed, 23 insertions, 9 deletions
diff --git a/src/attributes.rs b/src/attributes.rs
index 2ce0c83008f..27f21107eda 100644
--- a/src/attributes.rs
+++ b/src/attributes.rs
@@ -128,6 +128,12 @@ pub fn from_fn_attrs<'gcc, 'tcx>(
         .join(",");
     if !target_features.is_empty() {
         #[cfg(feature = "master")]
-        func.add_attribute(FnAttribute::Target(&target_features));
+        match cx.sess().target.arch.as_ref() {
+            "x86" | "x86_64" | "powerpc" => {
+                func.add_attribute(FnAttribute::Target(&target_features))
+            }
+            // The target attribute is not supported on other targets in GCC.
+            _ => (),
+        }
     }
 }
diff --git a/src/builder.rs b/src/builder.rs
index 385ca7a44a7..e9c16a0e4a7 100644
--- a/src/builder.rs
+++ b/src/builder.rs
@@ -1129,7 +1129,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
         // the following cast is required to avoid this error:
         // gcc_jit_context_new_call: mismatching types for argument 2 of function "__atomic_store_4": assignment to param arg1 (type: int) from loadedValue3577 (type: unsigned int  __attribute__((aligned(4))))
         let int_type = atomic_store.get_param(1).to_rvalue().get_type();
-        let value = self.context.new_cast(self.location, value, int_type);
+        let value = self.context.new_bitcast(self.location, value, int_type);
         self.llbb().add_eval(
             self.location,
             self.context.new_call(self.location, atomic_store, &[ptr, value, ordering]),
diff --git a/src/intrinsic/llvm.rs b/src/intrinsic/llvm.rs
index c845ee5fe5f..a1270482219 100644
--- a/src/intrinsic/llvm.rs
+++ b/src/intrinsic/llvm.rs
@@ -629,14 +629,22 @@ pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function
 
 #[cfg(feature = "master")]
 pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function<'gcc> {
-    if name == "llvm.prefetch" {
-        let gcc_name = "__builtin_prefetch";
-        let func = cx.context.get_builtin_function(gcc_name);
-        cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
-        return func;
-    }
-
     let gcc_name = match name {
+        "llvm.prefetch" => {
+            let gcc_name = "__builtin_prefetch";
+            let func = cx.context.get_builtin_function(gcc_name);
+            cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
+            return func;
+        }
+
+        "llvm.aarch64.isb" => {
+            // FIXME: GCC doesn't support __builtin_arm_isb yet, check if this builtin is OK.
+            let gcc_name = "__atomic_thread_fence";
+            let func = cx.context.get_builtin_function(gcc_name);
+            cx.functions.borrow_mut().insert(gcc_name.to_string(), func);
+            return func;
+        }
+
         "llvm.x86.xgetbv" => "__builtin_ia32_xgetbv",
         // NOTE: this doc specifies the equivalent GCC builtins: http://huonw.github.io/llvmint/llvmint/x86/index.html
         "llvm.sqrt.v2f64" => "__builtin_ia32_sqrtpd",