small scopes cleanup etc.

tccgen.c:
- just track local_stack for small scopes (can't declare variables)
- fix a vla problem with nested scopes
- move debug N_L/RBRAC into curly braced block

Also:
- tccpp.c: move 'label_...' functions to tccgen.c
- tccpp.c: let get_tok_str() say "<no name>" for anonymous symbols
- tcctest.c: let __pa_symbol() work for memory > 2GB
- 119_random_stuff.c: revert strtoll test (no reason to test libc)
- tccdefs.h/tcctest.c: enable bit fncs for _WIN32
- Makefile:
  - use i686-linux-gnu instead of i386-linux-gnu for cross-i386
  - update 'make help'
  - revert umplicit 'make all' with 'make install' (but print warning)
This commit is contained in:
grischka 2023-03-06 02:04:17 +01:00
parent 5f08561e10
commit 19e3e10e4b
10 changed files with 131 additions and 170 deletions

View File

@ -155,8 +155,8 @@ cross: $(LIBTCC1_CROSS) $(PROGS_CROSS)
# build specific cross compiler & lib # build specific cross compiler & lib
cross-%: %-tcc$(EXESUF) %-libtcc1.a ; cross-%: %-tcc$(EXESUF) %-libtcc1.a ;
install: all ; @$(MAKE) --no-print-directory install$(CFG) install: ; @$(MAKE) --no-print-directory install$(CFG)
install-strip: all ; @$(MAKE) --no-print-directory install$(CFG) CONFIG_strip=yes install-strip: ; @$(MAKE) --no-print-directory install$(CFG) CONFIG_strip=yes
uninstall: ; @$(MAKE) --no-print-directory uninstall$(CFG) uninstall: ; @$(MAKE) --no-print-directory uninstall$(CFG)
ifdef CONFIG_cross ifdef CONFIG_cross
@ -190,10 +190,11 @@ endif
-include config-extra.mak -include config-extra.mak
ifneq ($(X),) ifneq ($(X),)
ifneq ($(T),$(NATIVE_TARGET))
# assume support files for cross-targets in "/usr/<triplet>" by default # assume support files for cross-targets in "/usr/<triplet>" by default
TRIPLET-i386 ?= i386-linux-gnu TRIPLET-i386 ?= i686-linux-gnu
TRIPLET-x86_64 ?= x86_64-linux-gnu TRIPLET-x86_64 ?= x86_64-linux-gnu
TRIPLET-arm ?= arm-linux-gnueabihf TRIPLET-arm ?= arm-linux-gnueabi
TRIPLET-arm64 ?= aarch64-linux-gnu TRIPLET-arm64 ?= aarch64-linux-gnu
TRIPLET-riscv64 ?= riscv64-linux-gnu TRIPLET-riscv64 ?= riscv64-linux-gnu
TR = $(if $(TRIPLET-$T),$T,ignored) TR = $(if $(TRIPLET-$T),$T,ignored)
@ -201,6 +202,7 @@ CRT-$(TR) ?= /usr/$(TRIPLET-$T)/lib
LIB-$(TR) ?= {B}:/usr/$(TRIPLET-$T)/lib LIB-$(TR) ?= {B}:/usr/$(TRIPLET-$T)/lib
INC-$(TR) ?= {B}/include:/usr/$(TRIPLET-$T)/include INC-$(TR) ?= {B}/include:/usr/$(TRIPLET-$T)/include
endif endif
endif
CORE_FILES = tcc.c tcctools.c libtcc.c tccpp.c tccgen.c tccdbg.c tccelf.c tccasm.c tccrun.c CORE_FILES = tcc.c tcctools.c libtcc.c tccpp.c tccgen.c tccdbg.c tccelf.c tccasm.c tccrun.c
CORE_FILES += tcc.h config.h libtcc.h tcctok.h CORE_FILES += tcc.h config.h libtcc.h tcctok.h
@ -364,12 +366,14 @@ IBw = $(call IB,$(wildcard $1),$2)
IF = $(if $1,$(IM) mkdir -p $2 && $(INSTALL) $1 $2) IF = $(if $1,$(IM) mkdir -p $2 && $(INSTALL) $1 $2)
IFw = $(call IF,$(wildcard $1),$2) IFw = $(call IF,$(wildcard $1),$2)
IR = $(IM) mkdir -p $2 && cp -r $1/. $2 IR = $(IM) mkdir -p $2 && cp -r $1/. $2
IM = $(info -> $2 : $1)@ IM = @echo "-> $2 : $1" ;
BINCHECK = $(if $(wildcard $(PROGS) *-tcc$(EXESUF)),,@echo "Makefile: nothing found to install" && exit 1)
B_O = bcheck.o bt-exe.o bt-log.o bt-dll.o B_O = bcheck.o bt-exe.o bt-log.o bt-dll.o
# install progs & libs # install progs & libs
install-unx: install-unx:
$(call BINCHECK)
$(call IBw,$(PROGS) *-tcc,"$(bindir)") $(call IBw,$(PROGS) *-tcc,"$(bindir)")
$(call IFw,$(LIBTCC1) $(B_O) $(LIBTCC1_U),"$(tccdir)") $(call IFw,$(LIBTCC1) $(B_O) $(LIBTCC1_U),"$(tccdir)")
$(call IF,$(TOPSRC)/include/*.h $(TOPSRC)/tcclib.h,"$(tccdir)/include") $(call IF,$(TOPSRC)/include/*.h $(TOPSRC)/tcclib.h,"$(tccdir)/include")
@ -394,14 +398,15 @@ uninstall-unx:
# install progs & libs on windows # install progs & libs on windows
install-win: install-win:
$(call IBw,$(PROGS) $(PROGS_CROSS) $(subst libtcc.a,,$(LIBTCC)),"$(bindir)") $(call BINCHECK)
$(call IBw,$(PROGS) *-tcc.exe libtcc.dll,"$(bindir)")
$(call IF,$(TOPSRC)/win32/lib/*.def,"$(tccdir)/lib") $(call IF,$(TOPSRC)/win32/lib/*.def,"$(tccdir)/lib")
$(call IFw,libtcc1.a $(B_O) $(LIBTCC1_W),"$(tccdir)/lib") $(call IFw,libtcc1.a $(B_O) $(LIBTCC1_W),"$(tccdir)/lib")
$(call IF,$(TOPSRC)/include/*.h $(TOPSRC)/tcclib.h,"$(tccdir)/include") $(call IF,$(TOPSRC)/include/*.h $(TOPSRC)/tcclib.h,"$(tccdir)/include")
$(call IR,$(TOPSRC)/win32/include,"$(tccdir)/include") $(call IR,$(TOPSRC)/win32/include,"$(tccdir)/include")
$(call IR,$(TOPSRC)/win32/examples,"$(tccdir)/examples") $(call IR,$(TOPSRC)/win32/examples,"$(tccdir)/examples")
$(call IF,$(TOPSRC)/tests/libtcc_test.c,"$(tccdir)/examples") $(call IF,$(TOPSRC)/tests/libtcc_test.c,"$(tccdir)/examples")
$(call IFw,$(TOPSRC)/libtcc.h $(subst .dll,.def,$(LIBTCC)),"$(libdir)") $(call IFw,$(TOPSRC)/libtcc.h libtcc.def,"$(libdir)")
$(call IFw,$(TOPSRC)/win32/tcc-win32.txt tcc-doc.html,"$(docdir)") $(call IFw,$(TOPSRC)/win32/tcc-win32.txt tcc-doc.html,"$(docdir)")
ifneq "$(wildcard $(LIBTCC1_U))" "" ifneq "$(wildcard $(LIBTCC1_U))" ""
$(call IFw,$(LIBTCC1_U),"$(tccdir)/lib") $(call IFw,$(LIBTCC1_U),"$(tccdir)/lib")
@ -500,14 +505,15 @@ help:
@echo " This file may contain some custom configuration. For example:" @echo " This file may contain some custom configuration. For example:"
@echo " NATIVE_DEFINES += -D..." @echo " NATIVE_DEFINES += -D..."
@echo " Or for example to configure the search paths for a cross-compiler" @echo " Or for example to configure the search paths for a cross-compiler"
@echo " that expects the linux files in <tccdir>/i386-linux:" @echo " assuming the support files in /usr/i686-linux-gnu:"
@echo " ROOT-i386 = {B}/i386-linux" @echo " ROOT-i386 = /usr/i686-linux-gnu"
@echo " CRT-i386 = {B}/i386-linux/usr/lib" @echo " CRT-i386 = {R}/lib"
@echo " LIB-i386 = {B}/i386-linux/lib:{B}/i386-linux/usr/lib" @echo " LIB-i386 = {B}:{R}/lib"
@echo " INC-i386 = {B}/lib/include:{B}/i386-linux/usr/include" @echo " INC-i386 = {B}/include:{R}/include (*)"
@echo " DEF-i386 += -D__linux__" @echo " DEF-i386 += -D__linux__"
@echo " Or to configure a cross compiler for system-files in /usr/<triplet>" @echo " Or also, for the cross platform files in /usr/<triplet>"
@echo " TRIPLET-arm-eabi = arm-linux-gnueabi" @echo " TRIPLET-i386 = i686-linux-gnu"
@echo " (*) tcc replaces {B} by 'tccdir' and {R} by 'CONFIG_SYSROOT'"
# -------------------------------------------------------------------------- # --------------------------------------------------------------------------
endif # ($(INCLUDED),no) endif # ($(INCLUDED),no)

View File

@ -309,12 +309,10 @@
#undef __MAYBE_REDIR #undef __MAYBE_REDIR
#undef __RENAME #undef __RENAME
#if !defined _WIN32
#define __BUILTIN_EXTERN(name,u) \ #define __BUILTIN_EXTERN(name,u) \
int __builtin_##name(u int); \ int __builtin_##name(u int); \
int __builtin_##name##l(u long); \ int __builtin_##name##l(u long); \
int __builtin_##name##ll(u long long); int __builtin_##name##ll(u long long);
__BUILTIN_EXTERN(ffs,) __BUILTIN_EXTERN(ffs,)
__BUILTIN_EXTERN(clz, unsigned) __BUILTIN_EXTERN(clz, unsigned)
__BUILTIN_EXTERN(ctz, unsigned) __BUILTIN_EXTERN(ctz, unsigned)
@ -322,6 +320,5 @@
__BUILTIN_EXTERN(popcount, unsigned) __BUILTIN_EXTERN(popcount, unsigned)
__BUILTIN_EXTERN(parity, unsigned) __BUILTIN_EXTERN(parity, unsigned)
#undef __BUILTIN_EXTERN #undef __BUILTIN_EXTERN
#endif
#endif /* ndef __TCC_PP__ */ #endif /* ndef __TCC_PP__ */

10
tcc.h
View File

@ -65,13 +65,9 @@ extern long double strtold (const char *__nptr, char **__endptr);
# ifndef __GNUC__ # ifndef __GNUC__
# define strtold (long double)strtod # define strtold (long double)strtod
# define strtof (float)strtod # define strtof (float)strtod
# ifndef strtoll
# define strtoll _strtoi64 # define strtoll _strtoi64
# endif
# ifndef strtoull
# define strtoull _strtoui64 # define strtoull _strtoui64
# endif # endif
# endif
# ifdef LIBTCC_AS_DLL # ifdef LIBTCC_AS_DLL
# define LIBTCCAPI __declspec(dllexport) # define LIBTCCAPI __declspec(dllexport)
# define PUB_FUNC LIBTCCAPI # define PUB_FUNC LIBTCCAPI
@ -1372,9 +1368,6 @@ ST_INLN void define_push(int v, int macro_type, int *str, Sym *first_arg);
ST_FUNC void define_undef(Sym *s); ST_FUNC void define_undef(Sym *s);
ST_INLN Sym *define_find(int v); ST_INLN Sym *define_find(int v);
ST_FUNC void free_defines(Sym *b); ST_FUNC void free_defines(Sym *b);
ST_FUNC Sym *label_find(int v);
ST_FUNC Sym *label_push(Sym **ptop, int v, int flags);
ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep);
ST_FUNC void parse_define(void); ST_FUNC void parse_define(void);
ST_FUNC void preprocess(int is_bof); ST_FUNC void preprocess(int is_bof);
ST_FUNC void next(void); ST_FUNC void next(void);
@ -1452,6 +1445,9 @@ ST_FUNC void sym_pop(Sym **ptop, Sym *b, int keep);
ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, int c); ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, int c);
ST_FUNC Sym *sym_find2(Sym *s, int v); ST_FUNC Sym *sym_find2(Sym *s, int v);
ST_INLN Sym *sym_find(int v); ST_INLN Sym *sym_find(int v);
ST_FUNC Sym *label_find(int v);
ST_FUNC Sym *label_push(Sym **ptop, int v, int flags);
ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep);
ST_INLN Sym *struct_find(int v); ST_INLN Sym *struct_find(int v);
ST_FUNC Sym *global_identifier_push(int v, int t, int c); ST_FUNC Sym *global_identifier_push(int v, int t, int c);

100
tccgen.c
View File

@ -751,6 +751,63 @@ ST_FUNC void sym_pop(Sym **ptop, Sym *b, int keep)
*ptop = b; *ptop = b;
} }
/* label lookup */
ST_FUNC Sym *label_find(int v)
{
v -= TOK_IDENT;
if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))
return NULL;
return table_ident[v]->sym_label;
}
ST_FUNC Sym *label_push(Sym **ptop, int v, int flags)
{
Sym *s, **ps;
s = sym_push2(ptop, v, VT_STATIC, 0);
s->r = flags;
ps = &table_ident[v - TOK_IDENT]->sym_label;
if (ptop == &global_label_stack) {
/* modify the top most local identifier, so that
sym_identifier will point to 's' when popped */
while (*ps != NULL)
ps = &(*ps)->prev_tok;
}
s->prev_tok = *ps;
*ps = s;
return s;
}
/* pop labels until element last is reached. Look if any labels are
undefined. Define symbols if '&&label' was used. */
ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep)
{
Sym *s, *s1;
for(s = *ptop; s != slast; s = s1) {
s1 = s->prev;
if (s->r == LABEL_DECLARED) {
tcc_warning_c(warn_all)("label '%s' declared but not used", get_tok_str(s->v, NULL));
} else if (s->r == LABEL_FORWARD) {
tcc_error("label '%s' used but not defined",
get_tok_str(s->v, NULL));
} else {
if (s->c) {
/* define corresponding symbol. A size of
1 is put. */
put_extern_sym(s, cur_text_section, s->jnext, 1);
}
}
/* remove label */
if (s->r != LABEL_GONE)
table_ident[s->v - TOK_IDENT]->sym_label = s->prev_tok;
if (!keep)
sym_free(s);
else
s->r = LABEL_GONE;
}
if (!keep)
*ptop = slast;
}
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
static void vcheck_cmp(void) static void vcheck_cmp(void)
{ {
@ -6762,9 +6819,6 @@ static void new_scope(struct scope *o)
o->lstk = local_stack; o->lstk = local_stack;
o->llstk = local_label_stack; o->llstk = local_label_stack;
++local_scope; ++local_scope;
if (debug_modes)
tcc_debug_stabn(tcc_state, N_LBRAC, ind - func_ind);
} }
static void prev_scope(struct scope *o, int is_expr) static void prev_scope(struct scope *o, int is_expr)
@ -6789,9 +6843,6 @@ static void prev_scope(struct scope *o, int is_expr)
pop_local_syms(o->lstk, is_expr); pop_local_syms(o->lstk, is_expr);
cur_scope = o->prev; cur_scope = o->prev;
--local_scope; --local_scope;
if (debug_modes)
tcc_debug_stabn(tcc_state, N_RBRAC, ind - func_ind);
} }
/* leave a scope via break/continue(/goto) */ /* leave a scope via break/continue(/goto) */
@ -6803,6 +6854,20 @@ static void leave_scope(struct scope *o)
vla_leave(o); vla_leave(o);
} }
/* short versiona for scopes with 'if/do/while/switch' which can
declare only types (of struct/union/enum) */
static void new_scope_s(struct scope *o)
{
o->lstk = local_stack;
++local_scope;
}
static void prev_scope_s(struct scope *o)
{
sym_pop(&local_stack, o->lstk, 0);
--local_scope;
}
/* ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------- */
/* call block from 'for do while' loops */ /* call block from 'for do while' loops */
@ -6847,7 +6912,7 @@ again:
tcc_tcov_check_line (tcc_state, 0), tcc_tcov_block_begin (tcc_state); tcc_tcov_check_line (tcc_state, 0), tcc_tcov_block_begin (tcc_state);
if (t == TOK_IF) { if (t == TOK_IF) {
//new_scope(&o); //?? breaks tests2.122 new_scope_s(&o);
skip('('); skip('(');
gexpr(); gexpr();
skip(')'); skip(')');
@ -6862,10 +6927,10 @@ again:
} else { } else {
gsym(a); gsym(a);
} }
//prev_scope(&o,0); //?? breaks tests2.122 prev_scope_s(&o);
} else if (t == TOK_WHILE) { } else if (t == TOK_WHILE) {
new_scope(&o); new_scope_s(&o);
d = gind(); d = gind();
skip('('); skip('(');
gexpr(); gexpr();
@ -6876,8 +6941,11 @@ again:
gjmp_addr(d); gjmp_addr(d);
gsym_addr(b, d); gsym_addr(b, d);
gsym(a); gsym(a);
prev_scope(&o,0); prev_scope_s(&o);
} else if (t == '{') { } else if (t == '{') {
if (debug_modes)
tcc_debug_stabn(tcc_state, N_LBRAC, ind - func_ind);
new_scope(&o); new_scope(&o);
/* handle local labels declarations */ /* handle local labels declarations */
@ -6902,6 +6970,8 @@ again:
} }
prev_scope(&o, is_expr); prev_scope(&o, is_expr);
if (debug_modes)
tcc_debug_stabn(tcc_state, N_RBRAC, ind - func_ind);
if (local_scope) if (local_scope)
next(); next();
else if (!nocode_wanted) else if (!nocode_wanted)
@ -6988,7 +7058,7 @@ again:
prev_scope(&o, 0); prev_scope(&o, 0);
} else if (t == TOK_DO) { } else if (t == TOK_DO) {
new_scope(&o); new_scope_s(&o);
a = b = 0; a = b = 0;
d = gind(); d = gind();
lblock(&a, &b); lblock(&a, &b);
@ -6998,15 +7068,14 @@ again:
gexpr(); gexpr();
skip(')'); skip(')');
skip(';'); skip(';');
prev_scope(&o,0);
c = gvtst(0, 0); c = gvtst(0, 0);
gsym_addr(c, d); gsym_addr(c, d);
gsym(a); gsym(a);
prev_scope_s(&o);
} else if (t == TOK_SWITCH) { } else if (t == TOK_SWITCH) {
struct switch_t *sw; struct switch_t *sw;
new_scope(&o);
sw = tcc_mallocz(sizeof *sw); sw = tcc_mallocz(sizeof *sw);
sw->bsym = &a; sw->bsym = &a;
sw->scope = cur_scope; sw->scope = cur_scope;
@ -7014,17 +7083,18 @@ again:
sw->nocode_wanted = nocode_wanted; sw->nocode_wanted = nocode_wanted;
cur_switch = sw; cur_switch = sw;
new_scope_s(&o);
skip('('); skip('(');
gexpr(); gexpr();
skip(')'); skip(')');
sw->sv = *vtop--; /* save switch value */ sw->sv = *vtop--; /* save switch value */
a = 0; a = 0;
b = gjmp(0); /* jump to first case */ b = gjmp(0); /* jump to first case */
lblock(&a, NULL); lblock(&a, NULL);
a = gjmp(a); /* add implicit break */ a = gjmp(a); /* add implicit break */
/* case lookup */ /* case lookup */
gsym(b); gsym(b);
prev_scope_s(&o);
if (sw->nocode_wanted) if (sw->nocode_wanted)
goto skip_switch; goto skip_switch;
@ -7052,7 +7122,6 @@ again:
dynarray_reset(&sw->p, &sw->n); dynarray_reset(&sw->p, &sw->n);
cur_switch = sw->prev; cur_switch = sw->prev;
tcc_free(sw); tcc_free(sw);
prev_scope(&o,0);
} else if (t == TOK_CASE) { } else if (t == TOK_CASE) {
struct case_t *cr = tcc_malloc(sizeof(struct case_t)); struct case_t *cr = tcc_malloc(sizeof(struct case_t));
@ -7085,7 +7154,6 @@ again:
goto block_after_label; goto block_after_label;
} else if (t == TOK_GOTO) { } else if (t == TOK_GOTO) {
if (cur_scope->vla.num)
vla_restore(cur_scope->vla.locorig); vla_restore(cur_scope->vla.locorig);
if (tok == '*' && gnu_ext) { if (tok == '*' && gnu_ext) {
/* computed goto */ /* computed goto */

78
tccpp.c
View File

@ -577,17 +577,13 @@ ST_FUNC const char *get_tok_str(int v, CValue *cv)
break; break;
case TOK_CFLOAT: case TOK_CFLOAT:
cstr_cat(&cstr_buf, "<float>", 0); return strcpy(p, "<float>");
break;
case TOK_CDOUBLE: case TOK_CDOUBLE:
cstr_cat(&cstr_buf, "<double>", 0); return strcpy(p, "<double>");
break;
case TOK_CLDOUBLE: case TOK_CLDOUBLE:
cstr_cat(&cstr_buf, "<long double>", 0); return strcpy(p, "<long double>");
break;
case TOK_LINENUM: case TOK_LINENUM:
cstr_cat(&cstr_buf, "<linenumber>", 0); return strcpy(p, "<linenumber");
break;
/* above tokens have value, the ones below don't */ /* above tokens have value, the ones below don't */
case TOK_LT: case TOK_LT:
@ -604,6 +600,8 @@ ST_FUNC const char *get_tok_str(int v, CValue *cv)
return strcpy(p, ">>="); return strcpy(p, ">>=");
case TOK_EOF: case TOK_EOF:
return strcpy(p, "<eof>"); return strcpy(p, "<eof>");
case 0: /* anonymous nameless symbols */
return strcpy(p, "<no name>");
default: default:
if (v < TOK_IDENT) { if (v < TOK_IDENT) {
/* search in two bytes table */ /* search in two bytes table */
@ -617,13 +615,12 @@ ST_FUNC const char *get_tok_str(int v, CValue *cv)
} }
q += 3; q += 3;
} }
if (v >= 127) { if (v >= 127 || (v < 32 && !is_space(v) && v != '\n')) {
sprintf(cstr_buf.data, "<%02x>", v); sprintf(p, "<\\x%02x>", v);
return cstr_buf.data; break;
} }
addv: addv:
*p++ = v; *p++ = v;
case 0: /* nameless anonymous symbol */
*p = '\0'; *p = '\0';
} else if (v < tok_ident) { } else if (v < tok_ident) {
return table_ident[v - TOK_IDENT]->str; return table_ident[v - TOK_IDENT]->str;
@ -1327,63 +1324,6 @@ ST_FUNC void free_defines(Sym *b)
} }
} }
/* label lookup */
ST_FUNC Sym *label_find(int v)
{
v -= TOK_IDENT;
if ((unsigned)v >= (unsigned)(tok_ident - TOK_IDENT))
return NULL;
return table_ident[v]->sym_label;
}
ST_FUNC Sym *label_push(Sym **ptop, int v, int flags)
{
Sym *s, **ps;
s = sym_push2(ptop, v, VT_STATIC, 0);
s->r = flags;
ps = &table_ident[v - TOK_IDENT]->sym_label;
if (ptop == &global_label_stack) {
/* modify the top most local identifier, so that
sym_identifier will point to 's' when popped */
while (*ps != NULL)
ps = &(*ps)->prev_tok;
}
s->prev_tok = *ps;
*ps = s;
return s;
}
/* pop labels until element last is reached. Look if any labels are
undefined. Define symbols if '&&label' was used. */
ST_FUNC void label_pop(Sym **ptop, Sym *slast, int keep)
{
Sym *s, *s1;
for(s = *ptop; s != slast; s = s1) {
s1 = s->prev;
if (s->r == LABEL_DECLARED) {
tcc_warning_c(warn_all)("label '%s' declared but not used", get_tok_str(s->v, NULL));
} else if (s->r == LABEL_FORWARD) {
tcc_error("label '%s' used but not defined",
get_tok_str(s->v, NULL));
} else {
if (s->c) {
/* define corresponding symbol. A size of
1 is put. */
put_extern_sym(s, cur_text_section, s->jnext, 1);
}
}
/* remove label */
if (s->r != LABEL_GONE)
table_ident[s->v - TOK_IDENT]->sym_label = s->prev_tok;
if (!keep)
sym_free(s);
else
s->r = LABEL_GONE;
}
if (!keep)
*ptop = slast;
}
/* fake the nth "#if defined test_..." for tcc -dt -run */ /* fake the nth "#if defined test_..." for tcc -dt -run */
static void maybe_run_test(TCCState *s) static void maybe_run_test(TCCState *s)
{ {

View File

@ -2889,7 +2889,8 @@ void relocation_test(void)
printf("*rel2=%d\n", *rel2); printf("*rel2=%d\n", *rel2);
fptr(); fptr();
#ifdef __LP64__ #ifdef __LP64__
printf("pa_symbol=0x%lx\n", __pa_symbol() >> 63); // compare 'addend' displacement versus conventional arithmetics
printf("pa_symbol: %d\n", (long)&rel1 == __pa_symbol() - 0x80000000);
#endif #endif
} }
@ -3857,10 +3858,11 @@ int constant_p_var;
int func(void); int func(void);
#if !defined _WIN32
/* __builtin_clz and __builtin_ctz return random values for 0 */ /* __builtin_clz and __builtin_ctz return random values for 0 */
static void builtin_test_bits(unsigned long long x, int cnt[]) static void builtin_test_bits(unsigned long long x, int cnt[])
{ {
#if GCC_MAJOR >= 4
cnt[0] += __builtin_ffs(x); cnt[0] += __builtin_ffs(x);
cnt[1] += __builtin_ffsl(x); cnt[1] += __builtin_ffsl(x);
cnt[2] += __builtin_ffsll(x); cnt[2] += __builtin_ffsll(x);
@ -3884,8 +3886,8 @@ static void builtin_test_bits(unsigned long long x, int cnt[])
cnt[15] += __builtin_parity(x); cnt[15] += __builtin_parity(x);
cnt[16] += __builtin_parityl(x); cnt[16] += __builtin_parityl(x);
cnt[17] += __builtin_parityll(x); cnt[17] += __builtin_parityll(x);
}
#endif #endif
}
void builtin_test(void) void builtin_test(void)
{ {
@ -3941,7 +3943,6 @@ void builtin_test(void)
//printf("bera: %p\n", __builtin_extract_return_addr((void*)43)); //printf("bera: %p\n", __builtin_extract_return_addr((void*)43));
#if !defined _WIN32
{ {
int cnt[18]; int cnt[18];
unsigned long long r = 0; unsigned long long r = 0;
@ -3958,7 +3959,6 @@ void builtin_test(void)
for (i = 0; i < 18; i++) for (i = 0; i < 18; i++)
printf ("%d %d\n", i, cnt[i]); printf ("%d %d\n", i, cnt[i]);
} }
#endif
} }
#if defined _WIN32 #if defined _WIN32

View File

@ -1,15 +1,4 @@
#if defined(_WIN32)
/*
* strtoll and strtoull require the following define.
* Not really needed in our case
*/
#if !defined(_ISOC99_SOURCE)
#define _ISOC99_SOURCE 1
#endif
#endif
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
struct big_struct { char a[262144]; }; struct big_struct { char a[262144]; };
@ -99,33 +88,6 @@ void tst_cast(void)
printf ("schar to ushort cast: %x\n", r); printf ("schar to ushort cast: %x\n", r);
} }
void tst_strtoll_strtoull(void)
{
/*
* It probably makes sense to run this test on all systems,
* not just on Windows.
*/
#if defined(_WIN32)
const unsigned int shift = 32;
{
long long x = strtoll("0x100000000", NULL, 0);
x = (x >> shift);
if (x != 1LL) {
printf("Windows: strtoll error\n");
}
}
{
unsigned long long x = strtoull("0x100000000", NULL, 0);
x = (x >> shift);
if (x != 1) {
printf ("Windows: strtoull error\n");
}
}
#endif
}
struct { struct {
int (*print)(const char *format, ...); int (*print)(const char *format, ...);
} tst_indir = { } tst_indir = {
@ -154,6 +116,5 @@ main (void)
tst_compare(); tst_compare();
tst_pack(); tst_pack();
tst_cast(); tst_cast();
tst_strtoll_strtoull();
tst_indir_func(); tst_indir_func();
} }

View File

@ -12,7 +12,7 @@ main (void)
int x[n % 100 + 1]; int x[n % 100 + 1];
if (first == 0) { if (first == 0) {
if (&x[0] != p[n % 100 + 1]) { if (&x[0] != p[n % 100 + 1]) {
printf ("ERROR: %d %p $p\n", &x[0], p[n % 100 + 1]); printf ("ERROR: %p %p\n", &x[0], p[n % 100 + 1]);
return(1); return(1);
} }
} }

View File

@ -2,13 +2,11 @@
enum{ in = 0}; enum{ in = 0};
#define myassert(X) do{ if(!X) printf("%d: assertion failed\n", __LINE__); }while(0) #define myassert(X) do{ if(!X) printf("%d: assertion failed\n", __LINE__); }while(0)
int main(){ int main(){
#if 0
{ {
myassert(!in); myassert(!in);
if(sizeof(enum{in=1})) myassert(in); if(sizeof(enum{in=1})) myassert(in);
myassert(!in); //OOPS myassert(!in); //OOPS
} }
#endif
{ {
myassert(!in); myassert(!in);
switch(sizeof(enum{in=1})) { default: myassert(in); } switch(sizeof(enum{in=1})) { default: myassert(in); }

View File

@ -536,7 +536,7 @@ extern "C" {
#endif #endif
#endif #endif
#if !defined __NO_ISOCEXT #if !defined __NO_ISOCEXT /* externs in static libmingwex.a */
typedef struct { long long quot, rem; } lldiv_t; typedef struct { long long quot, rem; } lldiv_t;
@ -544,18 +544,13 @@ extern "C" {
__CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); } __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); }
/* stro[u]ll do not properly map in Windows; use macros as VC++ does */ #ifdef __TINYC__ /* gr */
#if !defined(strtoll)
#define strtoll _strtoi64 #define strtoll _strtoi64
#endif
#if !defined(strtoull)
#define strtoull _strtoui64 #define strtoull _strtoui64
#endif #else
/*
long long __cdecl strtoll(const char* __restrict__, char** __restrict, int); long long __cdecl strtoll(const char* __restrict__, char** __restrict, int);
unsigned long long __cdecl strtoull(const char* __restrict__, char** __restrict__, int); unsigned long long __cdecl strtoull(const char* __restrict__, char** __restrict__, int);
*/ #endif
/* these are stubs for MS _i64 versions */ /* these are stubs for MS _i64 versions */
long long __cdecl atoll (const char *); long long __cdecl atoll (const char *);