After several days searching why my code refactoring to remove globals was crashing,

I found the problem it was because CValue stack variables have rubish as it inital values
and assigning to a member that is smaller than the big union item and trying to
recover it later as a different member gives bak garbage.

ST_FUNC void vset(TCCState* tcc_state, CType *type, int r, int v)
{
    CValue cval;
    memset(&cval, 0, sizeof(CValue));

    cval.i = v; //,<<<<<<<<<<< here is the main bug that mix with garbage
    vsetc(tcc_state, type, r, &cval);
}

/* store a value or an expression directly in global data or in local array */
static void init_putv(TCCState* tcc_state, CType *type, Section *sec, unsigned long c,
                      int v, int expr_type)
{
...
        case VT_PTR:
            if (tcc_state->tccgen_vtop->r & VT_SYM) {
                greloc(tcc_state, sec, tcc_state->tccgen_vtop->sym, c, R_DATA_PTR);
            }

//<<< on the next line is where we try to get the assigned value to cvalue.i as cvalue.ull

            *(addr_t *)ptr |= (tcc_state->tccgen_vtop->c.ull & bit_mask) << bit_pos;
            break;

Also this patch makes vla tests pass on linux 32 bits
This commit is contained in:
mingodad
2014-03-26 20:14:39 +00:00
parent aa561d7011
commit 4bc83ac393
2 changed files with 20 additions and 5 deletions

16
tccpp.c
View File

@ -936,6 +936,7 @@ 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) {
@ -999,8 +1000,9 @@ 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];
CValue cv;
int t;
CValue cv;
memset(&cv, 0, sizeof(CValue));
while (*a && *b) {
TOK_GET(&t, &a, &cv);
pstrcpy(buf, sizeof buf, get_tok_str(t, &cv));
@ -1159,6 +1161,7 @@ static void tok_print(int *str)
{
int t;
CValue cval;
memset(&cval, 0, sizeof(CValue));
printf("<");
while (1) {
@ -2525,9 +2528,10 @@ 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;
@ -2629,9 +2633,10 @@ 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 */
@ -2806,6 +2811,7 @@ 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;
@ -2836,6 +2842,7 @@ 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);
@ -2877,9 +2884,10 @@ 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;