From 428165590e3eb67be225869a022a7d179b5bac09 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Tue, 22 Jul 2025 14:13:48 +0200 Subject: [PATCH] Add Volatile type. --- lib/std/core/mem.c3 | 15 +++++++++++++++ releasenotes.md | 1 + test/test_suite/stdlib/volatile.c3t | 24 ++++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 test/test_suite/stdlib/volatile.c3t diff --git a/lib/std/core/mem.c3 b/lib/std/core/mem.c3 index 4641442d6..06c6d8689 100644 --- a/lib/std/core/mem.c3 +++ b/lib/std/core/mem.c3 @@ -968,3 +968,18 @@ fn void* __memcpy(void* dst, void* src, usz n) @weak @export("memcpy") } return dst; } + + +module std::core::mem::volatile { Type }; + +typedef Volatile @structlike = Type; + +macro Type Volatile.get(&self) +{ + return @volatile_load(*(Type*)self); +} + +macro Type Volatile.set(&self, Type val) +{ + return @volatile_store(*(Type*)self, val); +} \ No newline at end of file diff --git a/releasenotes.md b/releasenotes.md index 6abd3f6db..9a2d613aa 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -85,6 +85,7 @@ - Add `ConditionVariable.wait_until` and `ConditionVariable.wait_for` - Added readline_to_stream that takes a stream. - Added `Ref` and `RefCounted` experimental functionality. +- Add `Volatile` generic type. ## 0.7.3 Change list diff --git a/test/test_suite/stdlib/volatile.c3t b/test/test_suite/stdlib/volatile.c3t new file mode 100644 index 000000000..608ea8d11 --- /dev/null +++ b/test/test_suite/stdlib/volatile.c3t @@ -0,0 +1,24 @@ +// #target: macos-x64 +module test; +import std; +fn void main() +{ + Volatile{int} y; + y.set(20); + y.get(); +} + +/* #expect: test.ll + +define void @test.main() #0 { +entry: + %y = alloca i32, align 4 + store i32 0, ptr %y, align 4 + %neq = icmp ne ptr %y, null + call void @llvm.assume(i1 %neq) + store volatile i32 20, ptr %y, align 4 + %neq1 = icmp ne ptr %y, null + call void @llvm.assume(i1 %neq1) + %0 = load volatile i32, ptr %y, align 4 + ret void +}