aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tccgen.c14
-rw-r--r--tcctok.h1
2 files changed, 14 insertions, 1 deletions
diff --git a/tccgen.c b/tccgen.c
index e86ff4a..3b1336c 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3874,13 +3874,18 @@ ST_FUNC void unary(void)
}
break;
case TOK_builtin_frame_address:
+ case TOK_builtin_return_address:
{
+ int tok1 = tok;
int level;
CType type;
next();
skip('(');
if (tok != TOK_CINT || tokc.i < 0) {
- tcc_error("__builtin_frame_address only takes positive integers");
+ tcc_error("%s only takes positive integers",
+ tok1 == TOK_builtin_return_address ?
+ "__builtin_return_address" :
+ "__builtin_frame_address");
}
level = tokc.i;
next();
@@ -3892,6 +3897,13 @@ ST_FUNC void unary(void)
mk_pointer(&vtop->type);
indir(); /* -> parent frame */
}
+ if (tok1 == TOK_builtin_return_address) {
+ // assume return address is just above frame pointer on stack
+ vpushi(PTR_SIZE);
+ gen_op('+');
+ mk_pointer(&vtop->type);
+ indir();
+ }
}
break;
#ifdef TCC_TARGET_X86_64
diff --git a/tcctok.h b/tcctok.h
index 9fba455..d78eb93 100644
--- a/tcctok.h
+++ b/tcctok.h
@@ -130,6 +130,7 @@
DEF(TOK_builtin_types_compatible_p, "__builtin_types_compatible_p")
DEF(TOK_builtin_constant_p, "__builtin_constant_p")
DEF(TOK_builtin_frame_address, "__builtin_frame_address")
+ DEF(TOK_builtin_return_address, "__builtin_return_address")
#ifdef TCC_TARGET_X86_64
#ifdef TCC_TARGET_PE
DEF(TOK_builtin_va_start, "__builtin_va_start")