History

some cleanups related to recent commits

- configure/Makefile : cleanup, really use CC_NAME - tccasm.c : remove C99 construct that MSVC doesn't compile - arm-gen.c, x86_64-gen.c, riscv64-gen.c, tccmacho.c : ditto - arm64-gen.c: commit 383acf8eff2818f8f0c5 wrote: "Instead of a cast, it would be better to pass the exact type." It is true that there are better solutions but it is not passing the exact type (I think). - tcctest.c: revert "fix cast test for clang" 03646ad46ff5d9a6d946 this obviously wants to test non-portable conversions - 114_bound_signal.test: clock_nanosleep is too new for older linuxes, just use sleep() instead

grischka committed 6 years ago

Commit 72277961 parent 0ee498916 files · +124 −155Browse files

Unified · Split

16 files
  1. Makefile +8 −11
  2. arm-gen.c +22 −31
  3. arm-link.c +2 −0
  4. arm64-gen.c +6 −6
  5. configure +19 −12
  6. conftest.c +20 −11
  7. lib/Makefile +0 −4
  8. riscv64-gen.c +2 −1
  9. tccasm.c +2 −2
  10. tccgen.c +1 −1
  11. tccmacho.c +16 −11
  12. tests/Makefile +4 −1
  13. tests/tcctest.c +8 −2
  14. tests/tests2/114_bound_signal.c +5 −53
  15. tests/tests2/Makefile +1 −3
  16. x86_64-gen.c +8 −6
Makefile+8−11
@@ -25,13 +25,14 @@ CFLAGS += $(CPPFLAGS) · 24 unmodified lines
25VPATH = $(TOPSRC)25VPATH = $(TOPSRC)
26 26
27ifdef CONFIG_WIN3227ifdef CONFIG_WIN32
28 CFG = -win
28 ifneq ($(CONFIG_static),yes)29 ifneq ($(CONFIG_static),yes)
29 LIBTCC = libtcc$(DLLSUF)30 LIBTCC = libtcc$(DLLSUF)
30 LIBTCCDEF = libtcc.def31 LIBTCCDEF = libtcc.def
31 endif32 endif
32 CFGWIN = -win
33 NATIVE_TARGET = $(ARCH)-win$(if $(findstring arm,$(ARCH)),ce,32)33 NATIVE_TARGET = $(ARCH)-win$(if $(findstring arm,$(ARCH)),ce,32)
34else34else
35 CFG = -unx
35 LIBS=-lm -lpthread36 LIBS=-lm -lpthread
36 ifneq ($(CONFIG_ldl),no)37 ifneq ($(CONFIG_ldl),no)
37 LIBS+=-ldl38 LIBS+=-ldl
@@ -44,21 +45,21 @@ else · 6 unmodified lines
44 LINK_LIBTCC += -Wl,-rpath,"$(libdir)"45 LINK_LIBTCC += -Wl,-rpath,"$(libdir)"
45 endif46 endif
46 endif47 endif
47 CFGWIN =-unx
48 NATIVE_TARGET = $(ARCH)48 NATIVE_TARGET = $(ARCH)
49 ifdef CONFIG_OSX49 ifdef CONFIG_OSX
50 NATIVE_TARGET = $(ARCH)-osx50 NATIVE_TARGET = $(ARCH)-osx
51 ifneq ($(CC),tcc)51 ifneq ($(CC_NAME),tcc)
52 LDFLAGS += -flat_namespace -undefined warning52 LDFLAGS += -flat_namespace -undefined warning
53 endif53 endif
54 export MACOSX_DEPLOYMENT_TARGET := 10.654 export MACOSX_DEPLOYMENT_TARGET := 10.6
55 export DYLD_LIBRARY_PATH := $(CURDIR)/$(TOP)
55 endif56 endif
56endif57endif
57 58
58# run local version of tcc with local libraries and includes59# run local version of tcc with local libraries and includes
59TCCFLAGS-unx = -B$(TOP) -I$(TOPSRC)/include -I$(TOPSRC) -I$(TOP)60TCCFLAGS-unx = -B$(TOP) -I$(TOPSRC)/include -I$(TOPSRC) -I$(TOP)
60TCCFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include -I$(TOPSRC) -I$(TOP) -L$(TOP)61TCCFLAGS-win = -B$(TOPSRC)/win32 -I$(TOPSRC)/include -I$(TOPSRC) -I$(TOP) -L$(TOP)
61TCCFLAGS = $(TCCFLAGS$(CFGWIN))62TCCFLAGS = $(TCCFLAGS$(CFG))
62TCC = $(TOP)/tcc$(EXESUF) $(TCCFLAGS)63TCC = $(TOP)/tcc$(EXESUF) $(TCCFLAGS)
63 64
64# cross compiler targets to build65# cross compiler targets to build
@@ -110,9 +111,9 @@ cross: $(LIBTCC1_CROSS) $(PROGS_CROSS) · 45 unmodified lines
110# build specific cross compiler & lib111# build specific cross compiler & lib
111cross-%: %-tcc$(EXESUF) %-libtcc1.a ;112cross-%: %-tcc$(EXESUF) %-libtcc1.a ;
112 113
113install: ; @$(MAKE) --no-print-directory install$(CFGWIN)114install: ; @$(MAKE) --no-print-directory install$(CFG)
114install-strip: ; @$(MAKE) --no-print-directory install$(CFGWIN) CONFIG_strip=yes115install-strip: ; @$(MAKE) --no-print-directory install$(CFG) CONFIG_strip=yes
115uninstall: ; @$(MAKE) --no-print-directory uninstall$(CFGWIN)116uninstall: ; @$(MAKE) --no-print-directory uninstall$(CFG)
116 117
117ifdef CONFIG_cross118ifdef CONFIG_cross
118all : cross119all : cross
@@ -228,11 +229,7 @@ tcc_p$(EXESUF): $($T_FILES) · 109 unmodified lines
228 229
229# static libtcc library230# static libtcc library
230libtcc.a: $(LIBTCC_OBJ)231libtcc.a: $(LIBTCC_OBJ)
231ifeq ($(CC),tcc)
232 $(CC) -ar rcs $@ $^
233else
234 $S$(AR) rcs $@ $^232 $S$(AR) rcs $@ $^
235endif
236 233
237# dynamic libtcc library234# dynamic libtcc library
238libtcc.so: $(LIBTCC_OBJ)235libtcc.so: $(LIBTCC_OBJ)
arm-gen.c+22−31
@@ -943,8 +943,6 @@ struct avail_regs { · 942 unmodified lines
943 int first_free_reg; /* next free register in the sequence, hole excluded */943 int first_free_reg; /* next free register in the sequence, hole excluded */
944};944};
945 945
946#define AVAIL_REGS_INITIALIZER (struct avail_regs) { { 0, 0, 0}, 0, 0, 0 }
947
948/* Find suitable registers for a VFP Co-Processor Register Candidate (VFP CPRC946/* Find suitable registers for a VFP Co-Processor Register Candidate (VFP CPRC
949 param) according to the rules described in the procedure call standard for947 param) according to the rules described in the procedure call standard for
950 the ARM architecture (AAPCS). If found, the registers are assigned to this948 the ARM architecture (AAPCS). If found, the registers are assigned to this
@@ -1060,14 +1058,16 @@ struct param_plan { · 109 unmodified lines
1060struct plan {1058struct plan {
1061 struct param_plan *pplans; /* array of all the param plans */1059 struct param_plan *pplans; /* array of all the param plans */
1062 struct param_plan *clsplans[NB_CLASSES]; /* per class lists of param plans */1060 struct param_plan *clsplans[NB_CLASSES]; /* per class lists of param plans */
1061 int nb_plans;
1063};1062};
1064 1063
1065#define add_param_plan(plan,pplan,class) \1064static void add_param_plan(struct plan* plan, int cls, int start, int end, SValue *v)
1066 do { \1065{
1067 pplan.prev = plan->clsplans[class]; \1066 struct param_plan *p = &plan->pplans[plan->nb_plans++];
1068 plan->pplans[plan ## _nb] = pplan; \1067 p->prev = plan->clsplans[cls];
1069 plan->clsplans[class] = &plan->pplans[plan ## _nb++]; \1068 plan->clsplans[cls] = p;
1070 } while(0)1069 p->start = start, p->end = end, p->sval = v;
1070}
1071 1071
1072/* Assign parameters to registers and stack with alignment according to the1072/* Assign parameters to registers and stack with alignment according to the
1073 rules in the procedure call standard for the ARM architecture (AAPCS).1073 rules in the procedure call standard for the ARM architecture (AAPCS).
@@ -1090,14 +1090,11 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) · 16 unmodified lines
1090{1090{
1091 int i, size, align;1091 int i, size, align;
1092 int ncrn /* next core register number */, nsaa /* next stacked argument address*/;1092 int ncrn /* next core register number */, nsaa /* next stacked argument address*/;
1093 int plan_nb = 0;1093 struct avail_regs avregs = {{0}};
1094 struct param_plan pplan;
1095 struct avail_regs avregs = AVAIL_REGS_INITIALIZER;
1096 1094
1097 ncrn = nsaa = 0;1095 ncrn = nsaa = 0;
1098 *todo = 0;1096 *todo = 0;
1099 plan->pplans = nb_args ? tcc_malloc(nb_args * sizeof(*plan->pplans)) : NULL;1097
1100 memset(plan->clsplans, 0, sizeof(plan->clsplans));
1101 for(i = nb_args; i-- ;) {1098 for(i = nb_args; i-- ;) {
1102 int j, start_vfpreg = 0;1099 int j, start_vfpreg = 0;
1103 CType type = vtop[-i].type;1100 CType type = vtop[-i].type;
@@ -1120,11 +1117,8 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) · 16 unmodified lines
1120 start_vfpreg = assign_vfpreg(&avregs, align, size);1117 start_vfpreg = assign_vfpreg(&avregs, align, size);
1121 end_vfpreg = start_vfpreg + ((size - 1) >> 2);1118 end_vfpreg = start_vfpreg + ((size - 1) >> 2);
1122 if (start_vfpreg >= 0) {1119 if (start_vfpreg >= 0) {
1123 pplan = (struct param_plan) {start_vfpreg, end_vfpreg, &vtop[-i]};1120 add_param_plan(plan, is_hfa ? VFP_STRUCT_CLASS : VFP_CLASS,
1124 if (is_hfa)1121 start_vfpreg, end_vfpreg, &vtop[-i]);
1125 add_param_plan(plan, pplan, VFP_STRUCT_CLASS);
1126 else
1127 add_param_plan(plan, pplan, VFP_CLASS);
1128 continue;1122 continue;
1129 } else1123 } else
1130 break;1124 break;
@@ -1137,8 +1131,7 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) · 6 unmodified lines
1137 * CORE_STRUCT_CLASS or the first of STACK_CLASS. */1131 * CORE_STRUCT_CLASS or the first of STACK_CLASS. */
1138 for (j = ncrn; j < 4 && j < ncrn + size / 4; j++)1132 for (j = ncrn; j < 4 && j < ncrn + size / 4; j++)
1139 *todo|=(1<<j);1133 *todo|=(1<<j);
1140 pplan = (struct param_plan) {ncrn, j, &vtop[-i]};1134 add_param_plan(plan, CORE_STRUCT_CLASS, ncrn, j, &vtop[-i]);
1141 add_param_plan(plan, pplan, CORE_STRUCT_CLASS);
1142 ncrn += size/4;1135 ncrn += size/4;
1143 if (ncrn > 4)1136 if (ncrn > 4)
1144 nsaa = (ncrn - 4) * 4;1137 nsaa = (ncrn - 4) * 4;
@@ -1156,24 +1149,18 @@ static int assign_regs(int nb_args, int float_abi, struct plan *plan, int *todo) · 11 unmodified lines
1156 if (ncrn == 4)1149 if (ncrn == 4)
1157 break;1150 break;
1158 }1151 }
1159 pplan = (struct param_plan) {ncrn, ncrn, &vtop[-i]};1152 add_param_plan(plan, CORE_CLASS, ncrn, ncrn + is_long, &vtop[-i]);
1160 ncrn++;1153 ncrn += 1 + is_long;
1161 if (is_long)
1162 pplan.end = ncrn++;
1163 add_param_plan(plan, pplan, CORE_CLASS);
1164 continue;1154 continue;
1165 }1155 }
1166 }1156 }
1167 nsaa = (nsaa + (align - 1)) & ~(align - 1);1157 nsaa = (nsaa + (align - 1)) & ~(align - 1);
1168 pplan = (struct param_plan) {nsaa, nsaa + size, &vtop[-i]};1158 add_param_plan(plan, STACK_CLASS, nsaa, nsaa + size, &vtop[-i]);
1169 add_param_plan(plan, pplan, STACK_CLASS);
1170 nsaa += size; /* size already rounded up before */1159 nsaa += size; /* size already rounded up before */
1171 }1160 }
1172 return nsaa;1161 return nsaa;
1173}1162}
1174 1163
1175#undef add_param_plan
1176
1177/* Copy parameters to their final destination (core reg, VFP reg or stack) for1164/* Copy parameters to their final destination (core reg, VFP reg or stack) for
1178 function call.1165 function call.
1179 1166
@@ -1378,6 +1365,10 @@ void gfunc_call(int nb_args) · 198 unmodified lines
1378 if (r == VT_CMP || (r & ~1) == VT_JMP)1365 if (r == VT_CMP || (r & ~1) == VT_JMP)
1379 gv(RC_INT);1366 gv(RC_INT);
1380 1367
1368 memset(&plan, 0, sizeof plan);
1369 if (nb_args)
1370 plan.pplans = tcc_malloc(nb_args * sizeof(*plan.pplans));
1371
1381 args_size = assign_regs(nb_args, float_abi, &plan, &todo);1372 args_size = assign_regs(nb_args, float_abi, &plan, &todo);
1382 1373
1383#ifdef TCC_ARM_EABI1374#ifdef TCC_ARM_EABI
@@ -1420,7 +1411,7 @@ void gfunc_prolog(Sym *func_sym) · 36 unmodified lines
1420 CType ret_type;1411 CType ret_type;
1421 1412
1422#ifdef TCC_ARM_EABI1413#ifdef TCC_ARM_EABI
1423 struct avail_regs avregs = AVAIL_REGS_INITIALIZER;1414 struct avail_regs avregs = {{0}};
1424#endif1415#endif
1425 1416
1426 sym = func_type->ref;1417 sym = func_type->ref;
@@ -1471,7 +1462,7 @@ void gfunc_prolog(Sym *func_sym) · 44 unmodified lines
1471#ifdef TCC_ARM_EABI1462#ifdef TCC_ARM_EABI
1472 if (float_abi == ARM_HARD_FLOAT) {1463 if (float_abi == ARM_HARD_FLOAT) {
1473 func_vc += nf * 4;1464 func_vc += nf * 4;
1474 avregs = AVAIL_REGS_INITIALIZER;1465 memset(&avregs, 0, sizeof avregs);
1475 }1466 }
1476#endif1467#endif
1477 pn = struct_ret, sn = 0;1468 pn = struct_ret, sn = 0;
arm-link.c+2−0
@@ -98,6 +98,7 @@ int gotplt_entry_type (int reloc_type) · 97 unmodified lines
98 return -1;98 return -1;
99}99}
100 100
101#ifndef TCC_TARGET_PE
101ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr)102ST_FUNC unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr)
102{103{
103 Section *plt = s1->plt;104 Section *plt = s1->plt;
@@ -160,6 +161,7 @@ ST_FUNC void relocate_plt(TCCState *s1) · 56 unmodified lines
160 }161 }
161 }162 }
162}163}
164#endif
163 165
164void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val)166void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val)
165{167{
arm64-gen.c+6−6
@@ -802,7 +802,7 @@ static int arm64_hfa_aux(CType *type, int *fsize, int num) · 801 unmodified lines
802 return -1;802 return -1;
803}803}
804 804
805static int arm64_hfa(CType *type, int *fsize)805static int arm64_hfa(CType *type, unsigned *fsize)
806{806{
807 if ((type->t & VT_BTYPE) == VT_STRUCT ||807 if ((type->t & VT_BTYPE) == VT_STRUCT ||
808 ((type->t & VT_ARRAY) && ((type->t & VT_BTYPE) != VT_PTR))) {808 ((type->t & VT_ARRAY) && ((type->t & VT_BTYPE) != VT_PTR))) {
@@ -1086,7 +1086,7 @@ ST_FUNC void gfunc_call(int nb_args) · 277 unmodified lines
1086 else if (a[i] < 32) {1086 else if (a[i] < 32) {
1087 // value in floating-point registers1087 // value in floating-point registers
1088 if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {1088 if ((vtop->type.t & VT_BTYPE) == VT_STRUCT) {
1089 uint32_t j, sz, n = arm64_hfa(&vtop->type, (int *)&sz);1089 uint32_t j, sz, n = arm64_hfa(&vtop->type, &sz);
1090 vtop->type.t = VT_PTR;1090 vtop->type.t = VT_PTR;
1091 gaddrof();1091 gaddrof();
1092 gv(RC_R30);1092 gv(RC_R30);
@@ -1137,7 +1137,7 @@ ST_FUNC void gfunc_call(int nb_args) · 44 unmodified lines
1137 1137
1138 }1138 }
1139 else if (a[0] == 16) {1139 else if (a[0] == 16) {
1140 uint32_t j, sz, n = arm64_hfa(return_type, (int *)&sz);1140 uint32_t j, sz, n = arm64_hfa(return_type, &sz);
1141 for (j = 0; j < n; j++)1141 for (j = 0; j < n; j++)
1142 o(0x3d000100 |1142 o(0x3d000100 |
1143 (sz & 16) << 19 | -(sz & 8) << 27 | (sz & 4) << 29 |1143 (sz & 16) << 19 | -(sz & 8) << 27 | (sz & 4) << 29 |
@@ -1213,7 +1213,7 @@ ST_FUNC void gfunc_prolog(Sym *func_sym) · 69 unmodified lines
1213 1213
1214 // HFAs of float and double need to be written differently:1214 // HFAs of float and double need to be written differently:
1215 if (16 <= a[i] && a[i] < 32 && (sym->type.t & VT_BTYPE) == VT_STRUCT) {1215 if (16 <= a[i] && a[i] < 32 && (sym->type.t & VT_BTYPE) == VT_STRUCT) {
1216 uint32_t j, sz, k = arm64_hfa(&sym->type, (int *)&sz);1216 uint32_t j, sz, k = arm64_hfa(&sym->type, &sz);
1217 if (sz < 16)1217 if (sz < 16)
1218 for (j = 0; j < k; j++) {1218 for (j = 0; j < k; j++) {
1219 o(0x3d0003e0 | -(sz & 8) << 27 | (sz & 4) << 29 |1219 o(0x3d0003e0 | -(sz & 8) << 27 | (sz & 4) << 29 |
@@ -1277,7 +1277,7 @@ ST_FUNC void gen_va_start(void) · 57 unmodified lines
1277ST_FUNC void gen_va_arg(CType *t)1277ST_FUNC void gen_va_arg(CType *t)
1278{1278{
1279 int align, size = type_size(t, &align);1279 int align, size = type_size(t, &align);
1280 int fsize, hfa = arm64_hfa(t, (int *)&fsize);1280 unsigned fsize, hfa = arm64_hfa(t, &fsize);
1281 uint32_t r0, r1;1281 uint32_t r0, r1;
1282 1282
1283 if (is_float(t->t)) {1283 if (is_float(t->t)) {
@@ -1387,7 +1387,7 @@ ST_FUNC void gfunc_return(CType *func_type) · 103 unmodified lines
1387 }1387 }
1388 case 16:1388 case 16:
1389 if ((func_type->t & VT_BTYPE) == VT_STRUCT) {1389 if ((func_type->t & VT_BTYPE) == VT_STRUCT) {
1390 uint32_t j, sz, n = arm64_hfa(&vtop->type, (int *)&sz);1390 uint32_t j, sz, n = arm64_hfa(&vtop->type, &sz);
1391 gaddrof();1391 gaddrof();
1392 gv(RC_R(0));1392 gv(RC_R(0));
1393 for (j = 0; j < n; j++)1393 for (j = 0; j < n; j++)
configure+19−12
@@ -48,7 +48,8 @@ cpu= · 47 unmodified lines
48cpuver=48cpuver=
49gcc_major=049gcc_major=0
50gcc_minor=050gcc_minor=0
51gcc_name="gcc"51cc_name="gcc"
52ar_set=
52 53
53# OS specific54# OS specific
54targetos=`uname`55targetos=`uname`
@@ -110,7 +111,7 @@ for opt do · 55 unmodified lines
110 ;;111 ;;
111 --cc=*) cc=`echo $opt | cut -d '=' -f 2`112 --cc=*) cc=`echo $opt | cut -d '=' -f 2`
112 ;;113 ;;
113 --ar=*) ar=`echo $opt | cut -d '=' -f 2`114 --ar=*) ar=`echo $opt | cut -d '=' -f 2` ; ar_set="yes"
114 ;;115 ;;
115 --extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"116 --extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"
116 ;;117 ;;
@@ -226,9 +227,6 @@ if test "$mingw32" = "yes" ; then · 109 unmodified lines
226 if test "$source_path_used" = "no"; then227 if test "$source_path_used" = "no"; then
227 source_path="."228 source_path="."
228 fi229 fi
229 if test "${cc%% *}" = "gcc"; then
230 test -z "$LDFLAGS" && LDFLAGS="-static"
231 fi
232 test -z "$prefix" && prefix="C:/Program Files/tcc"230 test -z "$prefix" && prefix="C:/Program Files/tcc"
233 test -z "$tccdir" && tccdir="${prefix}"231 test -z "$tccdir" && tccdir="${prefix}"
234 test -z "$bindir" && bindir="${tccdir}"232 test -z "$bindir" && bindir="${tccdir}"
@@ -323,17 +321,17 @@ if test -z "$cross_prefix" ; then · 88 unmodified lines
323 if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then321 if ! $cc -o $CONFTEST $source_path/conftest.c 2>/dev/null ; then
324 echo "configure: error: '$cc' failed to compile conftest.c."322 echo "configure: error: '$cc' failed to compile conftest.c."
325 else323 else
324 cc_name="$($CONFTEST compiler)"
326 gcc_major="$($CONFTEST version)"325 gcc_major="$($CONFTEST version)"
327 gcc_minor="$($CONFTEST minor)"326 gcc_minor="$($CONFTEST minor)"
328 gcc_name="$($CONFTEST compiler)"327 bigendian="$($CONFTEST bigendian)"
328 _triplet="$($CONFTEST triplet)"
329 fi329 fi
330 bigendian="$($CONFTEST bigendian)"
331 if test "$mingw32" = "no" ; then330 if test "$mingw32" = "no" ; then
332 331
333 if test -z "$triplet"; then332 if test -z "$triplet"; then
334 tt="$($CONFTEST triplet)"333 if test -n "$_triplet" -a -f "/usr/lib/$_triplet/crti.o" ; then
335 if test -n "$tt" -a -f "/usr/lib/$tt/crti.o" ; then334 triplet="$_triplet"
336 triplet="$tt"
337 fi335 fi
338 fi336 fi
339 337
@@ -364,6 +362,11 @@ if test -z "$cross_prefix" ; then · 24 unmodified lines
364 echo "Perhaps you want ./configure --config-musl"362 echo "Perhaps you want ./configure --config-musl"
365 fi363 fi
366 fi364 fi
365 else # mingw32 = yes
366 if test "$cc_name" = "gcc"; then
367 # avoid mingw dependencies such as 'libgcc_s_dw2-1.dll'
368 test -z "$LDFLAGS" && LDFLAGS="-static"
369 fi
367 fi370 fi
368else371else
369 # if cross compiling, cannot launch a program, so make a static guess372 # if cross compiling, cannot launch a program, so make a static guess
@@ -377,11 +380,11 @@ if test "$bigendian" = "yes" ; then · 7 unmodified lines
377fi380fi
378 381
379# a final configuration tuning382# a final configuration tuning
380if ! echo "$cc" | grep -q "tcc"; then383if test "$cc_name" != "tcc"; then
381 OPT1="-Wdeclaration-after-statement -fno-strict-aliasing"384 OPT1="-Wdeclaration-after-statement -fno-strict-aliasing"
382 # we want -Wno- but gcc does not always reject unknown -Wno- options385 # we want -Wno- but gcc does not always reject unknown -Wno- options
383 OPT2="-Wpointer-sign -Wsign-compare -Wunused-result -Wformat-truncation"386 OPT2="-Wpointer-sign -Wsign-compare -Wunused-result -Wformat-truncation"
384 if $cc --version 2>&1 | grep -q "clang"; then387 if test "$cc_name" = "clang"; then
385 OPT1="$OPT1 -fheinous-gnu-extensions"388 OPT1="$OPT1 -fheinous-gnu-extensions"
386 OPT2="$OPT2 -Wstring-plus-int"389 OPT2="$OPT2 -Wstring-plus-int"
387 fi390 fi
@@ -395,6 +398,8 @@ if ! echo "$cc" | grep -q "tcc"; then · 7 unmodified lines
395 # cat cc_msg.txt398 # cat cc_msg.txt
396 # echo $CFLAGS399 # echo $CFLAGS
397 rm -f cc_msg.txt a.out400 rm -f cc_msg.txt a.out
401else # cc is tcc
402 test "$ar_set" || ar="$cc -ar"
398fi403fi
399 404
400fcho() { if test -n "$2"; then echo "$1$2"; fi }405fcho() { if test -n "$2"; then echo "$1$2"; fi }
@@ -427,6 +432,7 @@ mandir=\$(DESTDIR)$mandir · 26 unmodified lines
427infodir=\$(DESTDIR)$infodir432infodir=\$(DESTDIR)$infodir
428docdir=\$(DESTDIR)$docdir433docdir=\$(DESTDIR)$docdir
429CC=$cc434CC=$cc
435CC_NAME=$cc_name
430GCC_MAJOR=$gcc_major436GCC_MAJOR=$gcc_major
431GCC_MINOR=$gcc_minor437GCC_MINOR=$gcc_minor
432AR=$ar438AR=$ar
@@ -502,6 +508,7 @@ fi · 69 unmodified lines
502cat >>$TMPH <<EOF508cat >>$TMPH <<EOF
503#define GCC_MAJOR $gcc_major509#define GCC_MAJOR $gcc_major
504#define GCC_MINOR $gcc_minor510#define GCC_MINOR $gcc_minor
511#define CC_NAME CC_${cc_name}
505EOF512EOF
506 513
507diff $TMPH config.h >/dev/null 2>&1514diff $TMPH config.h >/dev/null 2>&1
conftest.c+20−11
@@ -61,48 +61,57 @@ int main(int argc, char *argv[]) · 60 unmodified lines
61 _setmode(_fileno(stdout), _O_BINARY); /* don't translate \n to \r\n */61 _setmode(_fileno(stdout), _O_BINARY); /* don't translate \n to \r\n */
62#endif62#endif
63 switch(argc == 2 ? argv[1][0] : 0) {63 switch(argc == 2 ? argv[1][0] : 0) {
64 case 'b':64 case 'b'://igendian
65 {65 {
66 volatile unsigned foo = 0x01234567;66 volatile unsigned foo = 0x01234567;
67 puts(*(unsigned char*)&foo == 0x67 ? "no" : "yes");67 puts(*(unsigned char*)&foo == 0x67 ? "no" : "yes");
68 break;68 break;
69 }69 }
70#if defined(__clang__)70#if defined(__clang__)
71 case 'm':71 case 'm'://inor
72 printf("%d\n", __clang_minor__);72 printf("%d\n", __clang_minor__);
73 break;73 break;
74 case 'v':74 case 'v'://ersion
75 printf("%d\n", __clang_major__);75 printf("%d\n", __clang_major__);
76 break;76 break;
77#elif defined(__TINYC__)77#elif defined(__TINYC__)
78 case 'v':78 case 'v'://ersion
79 puts("0");79 puts("0");
80 break;80 break;
81 case 'm':81 case 'm'://inor
82 printf("%d\n", __TINYC__);82 printf("%d\n", __TINYC__);
83 break;83 break;
84#elif defined(_MSC_VER)
85 case 'v'://ersion
86 puts("0");
87 break;
88 case 'm'://inor
89 printf("%d\n", _MSC_VER);
90 break;
84#elif defined(__GNUC__) && defined(__GNUC_MINOR__)91#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
85 /* GNU comes last as other compilers may add 'GNU' compatibility */92 /* GNU comes last as other compilers may add 'GNU' compatibility */
86 case 'm':93 case 'm'://inor
87 printf("%d\n", __GNUC_MINOR__);94 printf("%d\n", __GNUC_MINOR__);
88 break;95 break;
89 case 'v':96 case 'v'://ersion
90 printf("%d\n", __GNUC__);97 printf("%d\n", __GNUC__);
91 break;98 break;
92#else99#else
93 case 'm':100 case 'm'://inor
94 case 'v':101 case 'v'://ersion
95 puts("0");102 puts("0");
96 break;103 break;
97#endif104#endif
98 case 't':105 case 't'://riplet
99 puts(TRIPLET);106 puts(TRIPLET);
100 break;107 break;
101 case 'c':108 case 'c'://ompiler
102#if defined(__clang__)109#if defined(__clang__)
103 puts("clang");110 puts("clang");
104#elif defined(__TINYC__)111#elif defined(__TINYC__)
105 puts("tcc");112 puts("tcc");
113#elif defined(_MSC_VER)
114 puts("msvc");
106#elif defined(__GNUC__)115#elif defined(__GNUC__)
107 puts("gcc");116 puts("gcc");
108#else117#else
lib/Makefile+0−4
@@ -8,11 +8,7 @@ VPATH = $(TOPSRC)/lib $(TOPSRC)/win32/lib · 7 unmodified lines
8T = $(or $(CROSS_TARGET),$(NATIVE_TARGET),unknown)8T = $(or $(CROSS_TARGET),$(NATIVE_TARGET),unknown)
9X = $(if $(CROSS_TARGET),$(CROSS_TARGET)-)9X = $(if $(CROSS_TARGET),$(CROSS_TARGET)-)
10 10
11ifdef CONFIG_OSX
12XTCC ?= DYLD_LIBRARY_PATH=$(TOP) $(TOP)/$(X)tcc$(EXESUF)
13else
14XTCC ?= $(TOP)/$(X)tcc$(EXESUF)11XTCC ?= $(TOP)/$(X)tcc$(EXESUF)
15endif
16XCC = $(XTCC)12XCC = $(XTCC)
17XAR = $(XTCC) -ar13XAR = $(XTCC) -ar
18XFLAGS-unx = -B$(TOPSRC)14XFLAGS-unx = -B$(TOPSRC)
riscv64-gen.c+2−1
@@ -578,7 +578,7 @@ static void reg_pass(CType *type, int *prc, int *fieldofs, int named) · 577 unmodified lines
578ST_FUNC void gfunc_call(int nb_args)578ST_FUNC void gfunc_call(int nb_args)
579{579{
580 int i, align, size, areg[2];580 int i, align, size, areg[2];
581 int info[nb_args ? nb_args : 1];581 int *info = tcc_malloc((nb_args + 1) * sizeof (int));
582 int stack_adj = 0, tempspace = 0, stack_add, ofs, splitofs = 0;582 int stack_adj = 0, tempspace = 0, stack_add, ofs, splitofs = 0;
583 SValue *sv;583 SValue *sv;
584 Sym *sa;584 Sym *sa;
@@ -775,6 +775,7 @@ ST_FUNC void gfunc_call(int nb_args) · 190 unmodified lines
775 else775 else
776 EI(0x13, 0, 2, 2, stack_add); // addi sp, sp, adj776 EI(0x13, 0, 2, 2, stack_add); // addi sp, sp, adj
777 }777 }
778 tcc_free(info);
778}779}
779 780
780static int func_sub_sp_offset, num_va_regs, func_va_list_ofs;781static int func_sub_sp_offset, num_va_regs, func_va_list_ofs;
tccasm.c+2−2
@@ -57,8 +57,8 @@ static int asm2cname(int v, int *addeddot) · 56 unmodified lines
57 v = tok_alloc(name + 1, strlen(name) - 1)->tok;57 v = tok_alloc(name + 1, strlen(name) - 1)->tok;
58 } else if (!strchr(name, '.')) {58 } else if (!strchr(name, '.')) {
59 int n = strlen(name) + 2;59 int n = strlen(name) + 2;
60 char newname[n];60 char newname[256];
61 snprintf(newname, n, ".%s", name);61 snprintf(newname, sizeof newname, ".%s", name);
62 v = tok_alloc(newname, n - 1)->tok;62 v = tok_alloc(newname, n - 1)->tok;
63 *addeddot = 1;63 *addeddot = 1;
64 }64 }
tccgen.c+1−1
@@ -4978,7 +4978,7 @@ the_end: · 4977 unmodified lines
4978 bt = t & (VT_BTYPE|VT_LONG);4978 bt = t & (VT_BTYPE|VT_LONG);
4979 if (bt == VT_LONG)4979 if (bt == VT_LONG)
4980 t |= LONG_SIZE == 8 ? VT_LLONG : VT_INT;4980 t |= LONG_SIZE == 8 ? VT_LLONG : VT_INT;
4981#ifdef TCC_TARGET_PE4981#if defined TCC_TARGET_PE || (defined _WIN32 && defined _MSC_VER)
4982 if (bt == VT_LDOUBLE)4982 if (bt == VT_LDOUBLE)
4983 t = (t & ~(VT_BTYPE|VT_LONG)) | (VT_DOUBLE|VT_LONG);4983 t = (t & ~(VT_BTYPE|VT_LONG)) | (VT_DOUBLE|VT_LONG);
4984#endif4984#endif
tccmacho.c+16−11
@@ -530,15 +530,20 @@ struct { · 529 unmodified lines
530 uint32_t flags;530 uint32_t flags;
531 char *name;531 char *name;
532} skinfo[sk_last] = {532} skinfo[sk_last] = {
533 [sk_text] = { 1, S_REGULAR | S_ATTR_PURE_INSTRUCTIONS533 /*[sk_unknown] =*/ { 0 },
534 /*[sk_discard] =*/ { 0 },
535 /*[sk_text] =*/ { 1, S_REGULAR | S_ATTR_PURE_INSTRUCTIONS
534 | S_ATTR_SOME_INSTRUCTIONS, "__text" },536 | S_ATTR_SOME_INSTRUCTIONS, "__text" },
535 [sk_ro_data] = { 1, S_REGULAR, "__rodata" },537 /*[sk_stubs] =*/ { 0 },
536 [sk_nl_ptr] = { 2, S_NON_LAZY_SYMBOL_POINTERS, "__got" },538 /*[sk_ro_data] =*/ { 1, S_REGULAR, "__rodata" },
537 [sk_init] = { 2, S_MOD_INIT_FUNC_POINTERS, "__mod_init_func" },539 /*[sk_uw_info] =*/ { 0 },
538 [sk_fini] = { 2, S_MOD_TERM_FUNC_POINTERS, "__mod_term_func" },540 /*[sk_nl_ptr] =*/ { 2, S_NON_LAZY_SYMBOL_POINTERS, "__got" },
539 [sk_rw_data] = { 2, S_REGULAR, "__data" },541 /*[sk_la_ptr] =*/ { 0 },
540 [sk_bss] = { 2, S_ZEROFILL, "__bss" },542 /*[sk_init] =*/ { 2, S_MOD_INIT_FUNC_POINTERS, "__mod_init_func" },
541 [sk_linkedit] = { 3, S_REGULAR, NULL },543 /*[sk_fini] =*/ { 2, S_MOD_TERM_FUNC_POINTERS, "__mod_term_func" },
544 /*[sk_rw_data] =*/ { 2, S_REGULAR, "__data" },
545 /*[sk_bss] =*/ { 2, S_ZEROFILL, "__bss" },
546 /*[sk_linkedit] =*/ { 3, S_REGULAR, NULL },
542};547};
543 548
544static void collect_sections(TCCState *s1, struct macho *mo)549static void collect_sections(TCCState *s1, struct macho *mo)
@@ -663,7 +668,7 @@ static void collect_sections(TCCState *s1, struct macho *mo) · 118 unmodified lines
663 }668 }
664 if (sec)669 if (sec)
665 sec->align = al;670 sec->align = al;
666 al = 1U << al;671 al = 1ULL << al;
667 if (al > 4096)672 if (al > 4096)
668 tcc_warning("alignment > 4096"), sec->align = 12, al = 4096;673 tcc_warning("alignment > 4096"), sec->align = 12, al = 4096;
669 curaddr = (curaddr + al - 1) & -al;674 curaddr = (curaddr + al - 1) & -al;
@@ -779,7 +784,7 @@ ST_FUNC int macho_output_file(TCCState *s1, const char *filename) · 109 unmodified lines
779 int fd, mode, file_type;784 int fd, mode, file_type;
780 FILE *fp;785 FILE *fp;
781 int i, ret = -1;786 int i, ret = -1;
782 struct macho mo = {};787 struct macho mo = {0};
783 788
784 file_type = s1->output_type;789 file_type = s1->output_type;
785 if (file_type == TCC_OUTPUT_OBJ)790 if (file_type == TCC_OUTPUT_OBJ)
@@ -912,8 +917,8 @@ ST_FUNC int macho_load_dll(TCCState *s1, int fd, const char *filename, int lev) · 126 unmodified lines
912 {917 {
913 struct dylib_command *dc = (struct dylib_command*)lc;918 struct dylib_command *dc = (struct dylib_command*)lc;
914 char *name = (char*)lc + dc->name;919 char *name = (char*)lc + dc->name;
915 dprintf(" REEXPORT %s\n", name);
916 int subfd = open(name, O_RDONLY | O_BINARY);920 int subfd = open(name, O_RDONLY | O_BINARY);
921 dprintf(" REEXPORT %s\n", name);
917 if (subfd < 0)922 if (subfd < 0)
918 tcc_warning("can't open %s (reexported from %s)", name, filename);923 tcc_warning("can't open %s (reexported from %s)", name, filename);
919 else {924 else {
tests/Makefile+4−1
@@ -73,6 +73,9 @@ ifeq ($(ARCH),i386) · 72 unmodified lines
73# by GCC in 32bit mode when PIC is enabled.73# by GCC in 32bit mode when PIC is enabled.
74test.ref: CFLAGS+=-fno-PIC -fno-PIE74test.ref: CFLAGS+=-fno-PIC -fno-PIE
75endif75endif
76ifeq ($(CC_NAME),msvc)
77test.ref abitest : CC = gcc
78endif
76 79
77RUN_TCC = $(NATIVE_DEFINES) -run $(TOPSRC)/tcc.c $(TCCFLAGS)80RUN_TCC = $(NATIVE_DEFINES) -run $(TOPSRC)/tcc.c $(TCCFLAGS)
78DISAS = objdump -d81DISAS = objdump -d
@@ -302,7 +305,7 @@ clean: · 223 unmodified lines
302 rm -f *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.cc *.gcc305 rm -f *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.cc *.gcc
303 rm -f *-cc *-gcc *-tcc *.exe hello libtcc_test vla_test tcctest[1234]306 rm -f *-cc *-gcc *-tcc *.exe hello libtcc_test vla_test tcctest[1234]
304 rm -f asm-c-connect$(EXESUF) asm-c-connect-sep$(EXESUF)307 rm -f asm-c-connect$(EXESUF) asm-c-connect-sep$(EXESUF)
305 rm -f ex? tcc_g weaktest.*.txt *.def libtcc_test_mt308 rm -f ex? tcc_g weaktest.*.txt *.def *.pdb *.obj libtcc_test_mt
306 @$(MAKE) -C tests2 $@309 @$(MAKE) -C tests2 $@
307 @$(MAKE) -C pp $@310 @$(MAKE) -C pp $@
308 311
tests/tcctest.c+8−2
@@ -2,6 +2,10 @@ · 1 unmodified line
2 * TCC auto test program2 * TCC auto test program
3 */3 */
4#include "config.h"4#include "config.h"
5#define CC_gcc 1
6#define CC_clang 2
7#define CC_tcc 3
8#define CC_msvc 4 /* cannot compile this file */
5 9
6/* Unfortunately, gcc version < 3 does not handle that! */10/* Unfortunately, gcc version < 3 does not handle that! */
7#define ALL_ISOC9911#define ALL_ISOC99
@@ -1829,11 +1833,13 @@ void cast_test() · 1821 unmodified lines
1829 printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a'));1833 printf("sizeof(-(char)'a') = %d\n", sizeof(-(char)'a'));
1830 printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a'));1834 printf("sizeof(~(char)'a') = %d\n", sizeof(-(char)'a'));
1831 1835
1836#if CC_NAME != CC_clang /* doesn't like non-portable conversions */
1832 /* from pointer to integer types */1837 /* from pointer to integer types */
1833 printf("%d %d %ld %ld %lld %lld\n",1838 printf("%d %d %ld %ld %lld %lld\n",
1834 (int)(long)p, (unsigned int)(long)p,1839 (int)p, (unsigned int)p,
1835 (long)p, (unsigned long)p,1840 (long)p, (unsigned long)p,
1836 (long long)(long)p, (unsigned long long)(long)p);1841 (long long)p, (unsigned long long)p);
1842#endif
1837 1843
1838 /* from integers to pointers */1844 /* from integers to pointers */
1839 printf("%p %p %p %p\n",1845 printf("%p %p %p %p\n",
tests/tests2/114_bound_signal.c+5−53
@@ -8,52 +8,6 @@ · 7 unmodified lines
8#include <errno.h>8#include <errno.h>
9#include <setjmp.h>9#include <setjmp.h>
10 10
11#if defined(__APPLE__)
12/*
13 * clock_nanosleep is missing on all macOS version, add emulation.
14 */
15
16/* scale factors */
17#define TIMING_GIGA 1000000000
18#define TIMER_ABSTIME 0 /* not used */
19
20/* timespec difference (monotonic) right - left */
21static inline void
22timespec_monodiff_rml(struct timespec *ts_out, const struct timespec *ts_in) {
23 /*
24 * out = in - out,
25 * where in > out
26 */
27 ts_out->tv_sec = ts_in->tv_sec - ts_out->tv_sec;
28 ts_out->tv_nsec = ts_in->tv_nsec - ts_out->tv_nsec;
29 if (ts_out->tv_sec < 0) {
30 ts_out->tv_sec = 0;
31 ts_out->tv_nsec = 0;
32 } else if (ts_out->tv_nsec < 0) {
33 if (ts_out->tv_sec == 0) {
34 ts_out->tv_sec = 0;
35 ts_out->tv_nsec = 0;
36 } else {
37 ts_out->tv_sec = ts_out->tv_sec - 1;
38 ts_out->tv_nsec = ts_out->tv_nsec + TIMING_GIGA;
39 }
40 }
41}
42
43static inline int
44clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *req, struct timespec *remain) {
45 struct timespec ts_delta;
46 int retval = clock_gettime(clock_id, &ts_delta);
47 (void)remain;
48 (void)flags;
49 if (retval == 0) {
50 timespec_monodiff_rml(&ts_delta, req);
51 retval = nanosleep(&ts_delta, NULL);
52 }
53 return retval;
54}
55#endif
56
57static volatile int run = 1;11static volatile int run = 1;
58static int dummy[10];12static int dummy[10];
59static sem_t sem;13static sem_t sem;
@@ -116,7 +70,6 @@ main (void) · 56 unmodified lines
116 int i;70 int i;
117 pthread_t id1, id2;71 pthread_t id1, id2;
118 struct sigaction act;72 struct sigaction act;
119 struct timespec request;
120 sigjmp_buf sj;73 sigjmp_buf sj;
121 sigset_t m;74 sigset_t m;
122 75
@@ -125,17 +78,16 @@ main (void) · 2 unmodified lines
125 act.sa_flags = 0;78 act.sa_flags = 0;
126 sigemptyset (&act.sa_mask);79 sigemptyset (&act.sa_mask);
127 sigaction (SIGUSR1, &act, NULL);80 sigaction (SIGUSR1, &act, NULL);
81
128 sem_init (&sem, 1, 0);82 sem_init (&sem, 1, 0);
129 pthread_create(&id1, NULL, high_load, NULL);83 pthread_create(&id1, NULL, high_load, NULL);
130 pthread_create(&id2, NULL, do_signal, NULL);84 pthread_create(&id2, NULL, do_signal, NULL);
131 clock_gettime (CLOCK_MONOTONIC, &request);85
132 request.tv_sec += 1;
133 request.tv_nsec += 0;
134 printf ("start\n");86 printf ("start\n");
135 while (clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME, &request, NULL)) {87 sleep(1);
136 }
137 printf ("end\n");
138 run = 0;88 run = 0;
89 printf ("end\n");
90
139 pthread_join(id1, NULL);91 pthread_join(id1, NULL);
140 pthread_join(id2, NULL);92 pthread_join(id2, NULL);
141 sem_destroy (&sem);93 sem_destroy (&sem);
tests/tests2/Makefile+1−3
@@ -43,9 +43,7 @@ ifeq (-$(CONFIG_WIN32)-$(CONFIG_i386)$(CONFIG_arm)-,--yes-) · 42 unmodified lines
43endif43endif
44ifeq (-$(CONFIG_WIN32)-,-yes-)44ifeq (-$(CONFIG_WIN32)-,-yes-)
45 SKIP += 106_pthread.test # No pthread support45 SKIP += 106_pthread.test # No pthread support
46endif46 SKIP += 114_bound_signal.test # No pthread support
47ifneq (-$(CONFIG_WIN32)-$(findstring $(GCC_MAJOR),3 4)-,---)
48 SKIP += 114_bound_signal.test # not on windows or older linuxes
49endif47endif
50 48
51# Some tests might need arguments49# Some tests might need arguments
x86_64-gen.c+8−6
@@ -1289,11 +1289,11 @@ void gfunc_call(int nb_args) · 1288 unmodified lines
1289{1289{
1290 X86_64_Mode mode;1290 X86_64_Mode mode;
1291 CType type;1291 CType type;
1292 int size, align, r, args_size, stack_adjust, i, reg_count;1292 int size, align, r, args_size, stack_adjust, i, reg_count, k;
1293 int nb_reg_args = 0;1293 int nb_reg_args = 0;
1294 int nb_sse_args = 0;1294 int nb_sse_args = 0;
1295 int sse_reg, gen_reg;1295 int sse_reg, gen_reg;
1296 char _onstack[nb_args ? nb_args : 1], *onstack = _onstack;1296 char *onstack = tcc_malloc((nb_args + 1) * sizeof (char));
1297 1297
1298#ifdef CONFIG_TCC_BCHECK1298#ifdef CONFIG_TCC_BCHECK
1299 if (tcc_state->do_bounds_check)1299 if (tcc_state->do_bounds_check)
@@ -1339,9 +1339,9 @@ void gfunc_call(int nb_args) · 39 unmodified lines
1339 sse_reg = nb_sse_args;1339 sse_reg = nb_sse_args;
1340 args_size = 0;1340 args_size = 0;
1341 stack_adjust &= 15;1341 stack_adjust &= 15;
1342 for (i = 0; i < nb_args;) {1342 for (i = k = 0; i < nb_args;) {
1343 mode = classify_x86_64_arg(&vtop[-i].type, NULL, &size, &align, &reg_count);1343 mode = classify_x86_64_arg(&vtop[-i].type, NULL, &size, &align, &reg_count);
1344 if (!onstack[i]) {1344 if (!onstack[i + k]) {
1345 ++i;1345 ++i;
1346 continue;1346 continue;
1347 }1347 }
@@ -1354,7 +1354,7 @@ void gfunc_call(int nb_args) · 6 unmodified lines
1354 args_size += 8;1354 args_size += 8;
1355 stack_adjust = 0;1355 stack_adjust = 0;
1356 }1356 }
1357 if (onstack[i] == 2)1357 if (onstack[i + k] == 2)
1358 stack_adjust = 1;1358 stack_adjust = 1;
1359 1359
1360 vrotb(i+1);1360 vrotb(i+1);
@@ -1404,9 +1404,11 @@ void gfunc_call(int nb_args) · 43 unmodified lines
1404 1404
1405 vpop();1405 vpop();
1406 --nb_args;1406 --nb_args;
1407 onstack++;1407 k++;
1408 }1408 }
1409 1409
1410 tcc_free(onstack);
1411
1410 /* XXX This should be superfluous. */1412 /* XXX This should be superfluous. */
1411 save_regs(0); /* save used temporary registers */1413 save_regs(0); /* save used temporary registers */
1412 1414

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t