diff options
Diffstat (limited to 'src')
| -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) |
