aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-12-21 14:32:02 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-12-21 14:32:02 -0700
commit8b6ea9ffe78480f9c73e9dee24edc5975c7f064e (patch)
treefbd338ce3434338ab29336fae2022037db1514b7
parent4cb2f11693b1bf13770b8ad6a8b8a1e37101a516 (diff)
downloadzig-8b6ea9ffe78480f9c73e9dee24edc5975c7f064e.tar.gz
zig-8b6ea9ffe78480f9c73e9dee24edc5975c7f064e.zip
C backend: implement `ret_addr`
-rw-r--r--src/codegen/c.zig4
-rw-r--r--src/link/C/zig.h14
2 files changed, 17 insertions, 1 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 12ce813a0f..86ec58457f 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -2214,7 +2214,9 @@ fn airBreakpoint(f: *Function) !CValue {
}
fn airRetAddr(f: *Function) !CValue {
- return f.fail("TODO implement codegen for airRetAddr", .{});
+ const local = try f.allocLocal(Type.usize, .Const);
+ try f.object.writer().writeAll(" = zig_return_address();\n");
+ return local;
}
fn airFence(f: *Function, inst: Air.Inst.Index) !CValue {
diff --git a/src/link/C/zig.h b/src/link/C/zig.h
index fec8c912ce..b14aaaaf34 100644
--- a/src/link/C/zig.h
+++ b/src/link/C/zig.h
@@ -60,6 +60,20 @@
#define zig_breakpoint() raise(SIGTRAP)
#endif
+#if defined(_MSC_VER)
+#define zig_return_address() _ReturnAddress()
+#elif defined(__GNUC__)
+#define zig_return_address() __builtin_extract_return_addr(__builtin_return_address(0))
+#else
+#define zig_return_address() 0
+#endif
+
+#if defined(__GNUC__)
+#define zig_frame_address() __builtin_frame_address(0)
+#else
+#define zig_frame_address() 0
+#endif
+
#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__)
#include <stdatomic.h>
#define zig_cmpxchg_strong(obj, expected, desired, succ, fail) atomic_compare_exchange_strong_explicit(obj, &(expected), desired, succ, fail)