diff options
| author | Michael Matz <matz@suse.de> | 2015-03-09 00:19:59 +0100 |
|---|---|---|
| committer | Michael Matz <matz@suse.de> | 2015-03-09 00:19:59 +0100 |
| commit | 50899e30abf3cbd71a09ecc03b2e172f6ba5d4f4 (patch) | |
| tree | 2451264d2ed2950fd232f5d4d4fed8ffe2f6538e /tcc.h | |
| parent | d73b48840115f0adc97d6a9e6fe2aeb88fcbfbdd (diff) | |
| download | tinycc-50899e30abf3cbd71a09ecc03b2e172f6ba5d4f4.tar.gz tinycc-50899e30abf3cbd71a09ecc03b2e172f6ba5d4f4.tar.bz2 | |
Fix stack overwrite on structure return
The common code to move a returned structure packed into
registers into memory on the caller side didn't take the
register size into account when allocating local storage,
so sometimes that lead to stack overwrites (e.g. in 73_arm64.c),
on x86_64. This fixes it by generally making gfunc_sret also return
the register size.
Diffstat (limited to 'tcc.h')
| -rw-r--r-- | tcc.h | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -1327,7 +1327,7 @@ ST_FUNC void gsym_addr(int t, int a); ST_FUNC void gsym(int t); ST_FUNC void load(int r, SValue *sv); ST_FUNC void store(int r, SValue *v); -ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *align); +ST_FUNC int gfunc_sret(CType *vt, int variadic, CType *ret, int *align, int *regsize); ST_FUNC void gfunc_call(int nb_args); ST_FUNC void gfunc_prolog(CType *func_type); ST_FUNC void gfunc_epilog(void); |
