diff --git a/tcc.h b/tcc.h index f5080973..093e7584 100644 --- a/tcc.h +++ b/tcc.h @@ -55,18 +55,27 @@ # ifndef CONFIG_TCC_STATIC # include # endif -#else +/* XXX: need to define this to use them in non ISOC99 context */ + extern float strtof (const char *__nptr, char **__endptr); + extern long double strtold (const char *__nptr, char **__endptr); +#else /* on _WIN32: */ # include # include # include /* open, close etc. */ # include /* getcwd */ # ifdef __GNUC__ # include -# else - typedef UINT_PTR uintptr_t; # endif # define inline __inline # define inp next_inp +# define snprintf _snprintf +# define vsnprintf _vsnprintf +# ifndef __GNUC__ +# define strtold (long double)strtod +# define strtof (float)strtod +# define strtoll _strtoi64 +# define strtoull _strtoui64 +# endif # ifdef LIBTCC_AS_DLL # define LIBTCCAPI __declspec(dllexport) # define PUB_FUNC LIBTCCAPI @@ -79,6 +88,30 @@ # define O_BINARY 0 #endif +#ifdef __GNUC__ +# define NORETURN __attribute__ ((noreturn)) +#elif defined _MSC_VER +# define NORETURN __declspec(noreturn) +#else +# define NORETURN +#endif + +#ifdef _WIN32 +# define IS_DIRSEP(c) (c == '/' || c == '\\') +# define IS_ABSPATH(p) (IS_DIRSEP(p[0]) || (p[0] && p[1] == ':' && IS_DIRSEP(p[2]))) +# define PATHCMP stricmp +#else +# define IS_DIRSEP(c) (c == '/') +# define IS_ABSPATH(p) IS_DIRSEP(p[0]) +# define PATHCMP strcmp +#endif + +#ifdef TCC_TARGET_PE +#define PATHSEP ';' +#else +#define PATHSEP ':' +#endif + #include "elf.h" #ifdef TCC_TARGET_X86_64 # define ELFCLASSW ELFCLASS64 @@ -315,7 +348,7 @@ typedef union CValue { long long ll; unsigned long long ull; struct CString *cstr; - void *ptr; + addr_t ptr_offset; int tab[LDOUBLE_SIZE/4]; } CValue; @@ -938,37 +971,6 @@ enum tcc_token { #define TOK_UIDENT TOK_DEFINE -#ifdef _WIN32 -#define snprintf _snprintf -#define vsnprintf _vsnprintf -#ifndef __GNUC__ -# define strtold (long double)strtod -# define strtof (float)strtod -# define strtoll _strtoi64 -# define strtoull _strtoui64 -#endif -#else -/* XXX: need to define this to use them in non ISOC99 context */ -extern float strtof (const char *__nptr, char **__endptr); -extern long double strtold (const char *__nptr, char **__endptr); -#endif - -#ifdef _WIN32 -#define IS_DIRSEP(c) (c == '/' || c == '\\') -#define IS_ABSPATH(p) (IS_DIRSEP(p[0]) || (p[0] && p[1] == ':' && IS_DIRSEP(p[2]))) -#define PATHCMP stricmp -#else -#define IS_DIRSEP(c) (c == '/') -#define IS_ABSPATH(p) IS_DIRSEP(p[0]) -#define PATHCMP strcmp -#endif - -#ifdef TCC_TARGET_PE -#define PATHSEP ';' -#else -#define PATHSEP ':' -#endif - /* space exlcuding newline */ static inline int is_space(int ch) { @@ -1045,7 +1047,7 @@ PUB_FUNC char *tcc_strdup(const char *str); #define strdup(s) use_tcc_strdup(s) PUB_FUNC void tcc_memstats(void); PUB_FUNC void tcc_error_noabort(const char *fmt, ...); -PUB_FUNC void tcc_error(const char *fmt, ...) __attribute__ ((noreturn)); +PUB_FUNC NORETURN void tcc_error(const char *fmt, ...); PUB_FUNC void tcc_warning(const char *fmt, ...); /* other utilities */ @@ -1143,7 +1145,7 @@ ST_FUNC void preprocess_init(TCCState *s1); ST_FUNC void preprocess_new(void); ST_FUNC int tcc_preprocess(TCCState *s1); ST_FUNC void skip(int c); -ST_FUNC void expect(const char *msg) __attribute__ ((noreturn)); +ST_FUNC NORETURN void expect(const char *msg); /* ------------ tccgen.c ------------ */ diff --git a/tccgen.c b/tccgen.c index 84188ad3..b698da9b 100644 --- a/tccgen.c +++ b/tccgen.c @@ -329,7 +329,6 @@ static void vsetc(CType *type, int r, CValue *vc) void vpush(CType *type) { CValue cval; - memset(&cval, 0, sizeof(CValue)); vsetc(type, VT_CONST, &cval); } @@ -337,29 +336,23 @@ void vpush(CType *type) ST_FUNC void vpushi(int v) { CValue cval; - memset(&cval, 0, sizeof(CValue)); cval.i = v; vsetc(&int_type, VT_CONST, &cval); } /* push a pointer sized constant */ -static void vpushs(long long v) +static void vpushs(addr_t v) { CValue cval; - memset(&cval, 0, sizeof(CValue)); - if (PTR_SIZE == 4) - cval.i = (int)v; - else - cval.ull = v; + cval.ptr_offset = v; vsetc(&size_type, VT_CONST, &cval); } /* push arbitrary 64bit constant */ void vpush64(int ty, unsigned long long v) { - CType ctype; CValue cval; - memset(&cval, 0, sizeof(CValue)); + CType ctype; ctype.t = ty; ctype.ref = NULL; cval.ull = v; @@ -376,9 +369,7 @@ static inline void vpushll(long long v) static inline void vpushsym(CType *type, Sym *sym) { CValue cval; - memset(&cval, 0, sizeof(CValue)); - - cval.ull = 0; + cval.ptr_offset = 0; vsetc(type, VT_CONST | VT_SYM, &cval); vtop->sym = sym; } @@ -451,7 +442,6 @@ ST_FUNC void vpush_global_sym(CType *type, int v) ST_FUNC void vset(CType *type, int r, int v) { CValue cval; - memset(&cval, 0, sizeof(CValue)); cval.i = v; vsetc(type, r, &cval); @@ -737,7 +727,6 @@ ST_FUNC int gv(int rc) unsigned long offset; #if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP) CValue check; - memset(&check, 0, sizeof(CValue)); #endif /* XXX: unify with initializers handling ? */ @@ -770,7 +759,7 @@ ST_FUNC int gv(int rc) sym = get_sym_ref(&vtop->type, data_section, offset, size << 2); vtop->r |= VT_LVAL | VT_SYM; vtop->sym = sym; - vtop->c.ull = 0; + vtop->c.ptr_offset = 0; } #ifdef CONFIG_TCC_BCHECK if (vtop->r & VT_MUSTBOUND) @@ -1581,7 +1570,7 @@ static inline int is_null_pointer(SValue *p) return 0; return ((p->type.t & VT_BTYPE) == VT_INT && p->c.i == 0) || ((p->type.t & VT_BTYPE) == VT_LLONG && p->c.ll == 0) || - ((p->type.t & VT_BTYPE) == VT_PTR && p->c.ptr == 0); + ((p->type.t & VT_BTYPE) == VT_PTR && p->c.ptr_offset == 0); } static inline int is_integer_btype(int bt) @@ -3886,8 +3875,7 @@ ST_FUNC void unary(void) mk_pointer(&s->type); s->type.t |= VT_STATIC; } - vset(&s->type, VT_CONST | VT_SYM, 0); - vtop->sym = s; + vpushsym(&s->type, s); next(); break; @@ -3939,7 +3927,7 @@ ST_FUNC void unary(void) /* if forward reference, we must point to s */ if (vtop->r & VT_SYM) { vtop->sym = s; - vtop->c.ull = 0; + vtop->c.ptr_offset = 0; } break; } @@ -5157,7 +5145,7 @@ static void init_putv(CType *type, Section *sec, unsigned long c, if (vtop->r & VT_SYM) { greloc(sec, vtop->sym, c, R_DATA_PTR); } - *(addr_t *)ptr |= (vtop->c.ull & bit_mask) << bit_pos; + *(addr_t *)ptr |= (vtop->c.ptr_offset & bit_mask) << bit_pos; break; default: if (vtop->r & VT_SYM) { diff --git a/tccpp.c b/tccpp.c index fbf109bd..7144ee43 100644 --- a/tccpp.c +++ b/tccpp.c @@ -974,7 +974,6 @@ static void tok_str_add2(TokenString *s, int t, CValue *cv) ST_FUNC void tok_str_add_tok(TokenString *s) { CValue cval; - memset(&cval, 0, sizeof(CValue)); /* save line number info */ if (file->line_num != s->last_line_num) { @@ -1038,9 +1037,8 @@ static inline void TOK_GET(int *t, const int **pp, CValue *cv) static int macro_is_equal(const int *a, const int *b) { char buf[STRING_MAX_SIZE + 1]; - int t; CValue cv; - memset(&cv, 0, sizeof(CValue)); + int t; while (*a && *b) { TOK_GET(&t, &a, &cv); pstrcpy(buf, sizeof buf, get_tok_str(t, &cv)); @@ -1199,7 +1197,6 @@ static void tok_print(int *str) { int t; CValue cval; - memset(&cval, 0, sizeof(CValue)); printf("<"); while (1) { @@ -2566,10 +2563,9 @@ static int *macro_arg_subst(Sym **nested_list, const int *macro_str, Sym *args) int last_tok, t, spc; const int *st; Sym *s; + CValue cval; TokenString str; CString cstr; - CValue cval; - memset(&cval, 0, sizeof(CValue)); tok_str_new(&str); last_tok = 0; @@ -2671,10 +2667,9 @@ static int macro_subst_tok(TokenString *tok_str, const int *p; TokenString str; char *cstrval; + CValue cval; CString cstr; char buf[32]; - CValue cval; - memset(&cval, 0, sizeof(CValue)); /* if symbol is a macro, prepare substitution */ /* special macros */ @@ -2849,7 +2844,6 @@ static inline int *macro_twosharps(const int *macro_str) /* we search the first '##' */ for(ptr = macro_str;;) { CValue cval; - memset(&cval, 0, sizeof(CValue)); TOK_GET(&t, &ptr, &cval); if (t == TOK_TWOSHARPS) break; @@ -2880,7 +2874,6 @@ static inline int *macro_twosharps(const int *macro_str) t = *++ptr; if (t && t != TOK_TWOSHARPS) { CValue cval; - memset(&cval, 0, sizeof(CValue)); TOK_GET(&t, &ptr, &cval); /* We concatenate the two tokens */ cstr_new(&cstr); @@ -2922,10 +2915,9 @@ static void macro_subst(TokenString *tok_str, Sym **nested_list, int *macro_str1; const int *ptr; int t, ret, spc; + CValue cval; struct macro_level ml; int force_blank; - CValue cval; - memset(&cval, 0, sizeof(CValue)); /* first scan for '##' operator handling */ ptr = macro_str;