Unified · Split
| @@ -409,6 +409,9 @@ ST_FUNC void gfunc_call(int nb_args) · 408 unmodified lines | ||
| 409 | 409 | args_size = 0; |
| 410 | 410 | for(i = 0;i < nb_args; i++) { |
| 411 | 411 | if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) { |
| 412 | + /* fetch cpu flag before generating any code */ | |
| 413 | + if ((vtop->r & VT_VALMASK) == VT_CMP) | |
| 414 | + gv(RC_INT); | |
| 412 | 415 | size = type_size(&vtop->type, &align); |
| 413 | 416 | /* align to stack align size */ |
| 414 | 417 | size = (size + 3) & ~3; |
| @@ -0,0 +1,23 @@ | ||
| 1 | +// https://lists.nongnu.org/archive/html/tinycc-devel/2024-12/msg00019.html | |
| 2 | +// x86_64/i386 void gfunc_call(int nb_args), when push struct args, need fetch cpu flag before generating any code | |
| 3 | + | |
| 4 | +#include <stdio.h> | |
| 5 | + | |
| 6 | +struct string { | |
| 7 | + char *str; | |
| 8 | + int len; | |
| 9 | +}; | |
| 10 | + | |
| 11 | +void dummy(struct string fpath, int dump_arg) { | |
| 12 | +} | |
| 13 | + | |
| 14 | +int main() { | |
| 15 | + int a = 1; | |
| 16 | + struct string x; | |
| 17 | + x.str = "gg.v"; | |
| 18 | + x.len = 4; | |
| 19 | + dummy(x, a == 0); | |
| 20 | + printf("done\n"); | |
| 21 | + return 0; | |
| 22 | +} | |
| 23 | + | |
| @@ -0,0 +1 @@ | ||
| 1 | +done | |
| @@ -828,7 +828,10 @@ void gfunc_call(int nb_args) · 827 unmodified lines | ||
| 828 | 828 | continue; /* arguments smaller than 8 bytes passed in registers or on stack */ |
| 829 | 829 | |
| 830 | 830 | if (bt == VT_STRUCT) { |
| 831 | − /* align to stack align size */ | |
| 831 | + /* fetch cpu flag before generating any code */ | |
| 832 | + if ((vtop->r & VT_VALMASK) == VT_CMP) | |
| 833 | + gv(RC_INT); | |
| 834 | + /* align to stack align size */ | |
| 832 | 835 | size = (size + 15) & ~15; |
| 833 | 836 | /* generate structure store */ |
| 834 | 837 | r = get_reg(RC_INT); |