diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-12-21 14:32:02 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-12-21 14:32:02 -0700 |
| commit | 8b6ea9ffe78480f9c73e9dee24edc5975c7f064e (patch) | |
| tree | fbd338ce3434338ab29336fae2022037db1514b7 | |
| parent | 4cb2f11693b1bf13770b8ad6a8b8a1e37101a516 (diff) | |
| download | zig-8b6ea9ffe78480f9c73e9dee24edc5975c7f064e.tar.gz zig-8b6ea9ffe78480f9c73e9dee24edc5975c7f064e.zip | |
C backend: implement `ret_addr`
| -rw-r--r-- | src/codegen/c.zig | 4 | ||||
| -rw-r--r-- | src/link/C/zig.h | 14 |
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) |
