diff options
| author | Edmund Grimley Evans <Edmund.Grimley.Evans@gmail.com> | 2015-03-06 21:01:14 +0000 |
|---|---|---|
| committer | Edmund Grimley Evans <Edmund.Grimley.Evans@gmail.com> | 2015-03-06 21:01:14 +0000 |
| commit | 238e760a294ca74e46d8545f0fb80ea2af522f2b (patch) | |
| tree | 58f575ac0fa1d1d5bda2b4479d479d1359367a65 /tccgen.c | |
| parent | 8764993c0d23d11102dc548eb318e489a665391f (diff) | |
| download | tinycc-238e760a294ca74e46d8545f0fb80ea2af522f2b.tar.gz tinycc-238e760a294ca74e46d8545f0fb80ea2af522f2b.tar.bz2 | |
Add __builtin_return_address.
Implementation is mostly shared with __builtin_frame_address.
It seems to work on arm64, i386 and x86_64. It may need to be
adapted for other targets.
Diffstat (limited to 'tccgen.c')
| -rw-r--r-- | tccgen.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -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 |
