aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-02-19 12:47:14 +0000
committergingerBill <bill@gingerbill.org>2023-02-19 12:47:14 +0000
commit233f47cc995fe11f5c3207dbcc3584df3eabc2fd (patch)
treef3886693ab6176dcc55b2ae6b54046321efd6e51 /src/llvm_backend_proc.cpp
parentc386c72d10540a4a9af89755df7aa3a35a079b64 (diff)
Fix #2329
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index b9ee0eeb5..b9f2c2db2 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -2304,7 +2304,15 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
break;
case BuiltinProc_volatile_store: LLVMSetVolatile(instr, true); break;
case BuiltinProc_atomic_store: LLVMSetOrdering(instr, LLVMAtomicOrderingSequentiallyConsistent); break;
- case BuiltinProc_atomic_store_explicit: LLVMSetOrdering(instr, llvm_atomic_ordering_from_odin(ce->args[2])); break;
+ case BuiltinProc_atomic_store_explicit:
+ {
+ auto ordering = llvm_atomic_ordering_from_odin(ce->args[2]);
+ LLVMSetOrdering(instr, ordering);
+ if (ordering == LLVMAtomicOrderingUnordered) {
+ LLVMSetVolatile(instr, true);
+ }
+ }
+ break;
}
LLVMSetAlignment(instr, cast(unsigned)type_align_of(type_deref(dst.type)));
@@ -2330,7 +2338,15 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
break;
case BuiltinProc_volatile_load: LLVMSetVolatile(instr, true); break;
case BuiltinProc_atomic_load: LLVMSetOrdering(instr, LLVMAtomicOrderingSequentiallyConsistent); break;
- case BuiltinProc_atomic_load_explicit: LLVMSetOrdering(instr, llvm_atomic_ordering_from_odin(ce->args[1])); break;
+ case BuiltinProc_atomic_load_explicit:
+ {
+ auto ordering = llvm_atomic_ordering_from_odin(ce->args[1]);
+ LLVMSetOrdering(instr, ordering);
+ if (ordering == LLVMAtomicOrderingUnordered) {
+ LLVMSetVolatile(instr, true);
+ }
+ }
+ break;
}
LLVMSetAlignment(instr, cast(unsigned)type_align_of(type_deref(dst.type)));
@@ -2400,6 +2416,9 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
lbValue res = {};
res.value = LLVMBuildAtomicRMW(p->builder, op, dst.value, val.value, ordering, false);
res.type = tv.type;
+ if (ordering == LLVMAtomicOrderingUnordered) {
+ LLVMSetVolatile(res.value, true);
+ }
return res;
}
@@ -2425,7 +2444,6 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
case BuiltinProc_atomic_compare_exchange_weak_explicit: success_ordering = llvm_atomic_ordering_from_odin(ce->args[3]); failure_ordering = llvm_atomic_ordering_from_odin(ce->args[4]); weak = true; break;
}
- // TODO(bill): Figure out how to make it weak
LLVMBool single_threaded = false;
LLVMValueRef value = LLVMBuildAtomicCmpXchg(
@@ -2436,6 +2454,9 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
single_threaded
);
LLVMSetWeak(value, weak);
+ if (success_ordering == LLVMAtomicOrderingUnordered || failure_ordering == LLVMAtomicOrderingUnordered) {
+ LLVMSetVolatile(value, true);
+ }
if (is_type_tuple(tv.type)) {
Type *fix_typed = alloc_type_tuple();