aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tcc.h76
-rw-r--r--tccgen.c30
-rw-r--r--tccpp.c16
3 files changed, 52 insertions, 70 deletions
diff --git a/tcc.h b/tcc.h
index f508097..093e758 100644
--- a/tcc.h
+++ b/tcc.h
@@ -55,18 +55,27 @@
# ifndef CONFIG_TCC_STATIC
# include <dlfcn.h>
# 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 <windows.h>
# include <sys/timeb.h>
# include <io.h> /* open, close etc. */
# include <direct.h> /* getcwd */
# ifdef __GNUC__
# include <stdint.h>
-# 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 84188ad..b698da9 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 fbf109b..7144ee4 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;