From 1c2dfa1f4bb162678c293788678f6790514cb7ba Mon Sep 17 00:00:00 2001 From: Edmund Grimley Evans Date: Sat, 21 Nov 2015 11:23:53 +0000 Subject: Change the way struct CStrings are handled. A CString used to be copied into a token string, which is an int array. On a 64-bit architecture the pointers were misaligned, so ASan gave lots of warnings. On a 64-bit architecture that required memory accesses to be correctly aligned it would not work at all. The CString is now included in CValue instead. --- tccasm.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'tccasm.c') diff --git a/tccasm.c b/tccasm.c index 044db83..28e07fd 100644 --- a/tccasm.c +++ b/tccasm.c @@ -44,7 +44,7 @@ static void asm_expr_unary(TCCState *s1, ExprValue *pe) switch(tok) { case TOK_PPNUM: - p = tokc.cstr->data; + p = tokc.str.data; n = strtoul(p, (char **)&p, 0); if (*p == 'b' || *p == 'f') { /* backward or forward label */ @@ -378,7 +378,7 @@ static void asm_parse_directive(TCCState *s1) uint64_t vl; const char *p; - p = tokc.cstr->data; + p = tokc.str.data; if (tok != TOK_PPNUM) { error_constant: tcc_error("64 bit constant"); @@ -523,8 +523,8 @@ static void asm_parse_directive(TCCState *s1) for(;;) { if (tok != TOK_STR) expect("string constant"); - p = tokc.cstr->data; - size = tokc.cstr->size; + p = tokc.str.data; + size = tokc.str.size; if (t == TOK_ASM_ascii && size > 0) size--; for(i = 0; i < size; i++) @@ -565,7 +565,7 @@ static void asm_parse_directive(TCCState *s1) next(); if (tok == TOK_STR) - pstrcat(filename, sizeof(filename), tokc.cstr->data); + pstrcat(filename, sizeof(filename), tokc.str.data); else pstrcat(filename, sizeof(filename), get_tok_str(tok, NULL)); @@ -583,7 +583,7 @@ static void asm_parse_directive(TCCState *s1) next(); if (tok == TOK_STR) - pstrcat(ident, sizeof(ident), tokc.cstr->data); + pstrcat(ident, sizeof(ident), tokc.str.data); else pstrcat(ident, sizeof(ident), get_tok_str(tok, NULL)); @@ -629,7 +629,7 @@ static void asm_parse_directive(TCCState *s1) next(); skip(','); if (tok == TOK_STR) { - newtype = tokc.cstr->data; + newtype = tokc.str.data; } else { if (tok == '@' || tok == '%') skip(tok); @@ -655,7 +655,7 @@ static void asm_parse_directive(TCCState *s1) sname[0] = '\0'; while (tok != ';' && tok != TOK_LINEFEED && tok != ',') { if (tok == TOK_STR) - pstrcat(sname, sizeof(sname), tokc.cstr->data); + pstrcat(sname, sizeof(sname), tokc.str.data); else pstrcat(sname, sizeof(sname), get_tok_str(tok, NULL)); next(); @@ -768,7 +768,7 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess) } else if (tok == TOK_PPNUM) { const char *p; int n; - p = tokc.cstr->data; + p = tokc.str.data; n = strtoul(p, (char **)&p, 10); if (*p != '\0') expect("':'"); @@ -970,8 +970,8 @@ static void parse_asm_operands(ASMOperand *operands, int *nb_operands_ptr, } if (tok != TOK_STR) expect("string constant"); - op->constraint = tcc_malloc(tokc.cstr->size); - strcpy(op->constraint, tokc.cstr->data); + op->constraint = tcc_malloc(tokc.str.size); + strcpy(op->constraint, tokc.str.data); next(); skip('('); gexpr(); @@ -1038,7 +1038,7 @@ ST_FUNC void asm_instr(void) for(;;) { if (tok != TOK_STR) expect("string constant"); - asm_clobber(clobber_regs, tokc.cstr->data); + asm_clobber(clobber_regs, tokc.str.data); next(); if (tok == ',') { next(); -- cgit v1.3.1