aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Preud'homme <thomas.preudhomme@celest.fr>2011-02-04 15:19:54 +0100
committerThomas Preud'homme <thomas.preudhomme@celest.fr>2011-02-04 15:24:48 +0100
commite3e5d4ad7a475e30ea13ad1ba9f23e6210d5d431 (patch)
treeff852b2c8ccc461dcdcbcbe7b870134fa31c511c
parentaf26ac56bfc584b70e20158e67f7035024076ec8 (diff)
downloadtinycc-e3e5d4ad7a475e30ea13ad1ba9f23e6210d5d431.tar.gz
tinycc-e3e5d4ad7a475e30ea13ad1ba9f23e6210d5d431.tar.bz2
Disable C99 VLA when alloca is unavailable.
* Disable C99 VLA detection when alloca is unavailable and protect the new reference to TOK_alloca in decl_initializer in order to compile and run for architecture without working alloca. Not all code of C99 VLA is commented as it would required many ifdef stanza. Just the detection is commented so that VT_VLA is never set any type and the C99 VLA code is compiled but never called. However vpush_global_sym(&func_old_type, TOK_alloca) in decl_initializer needs to be protected by an ifdef stanza as well because it uses TOK_alloca. * include alloca and C99 VLA tests according to availability of TOK_alloca instead of relying on the current architecture
-rw-r--r--tccgen.c8
-rw-r--r--tests/tcctest.c4
2 files changed, 10 insertions, 2 deletions
diff --git a/tccgen.c b/tccgen.c
index 7fb7cfe..f573dff 100644
--- a/tccgen.c
+++ b/tccgen.c
@@ -3162,17 +3162,21 @@ static void post_type(CType *type, AttributeDef *ad)
n = -1;
if (tok != ']') {
gexpr();
+#ifdef TOK_alloca
if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {
+#endif
n = vtop->c.i;
last_vtop = vtop;
if (n < 0)
error("invalid array size");
+#ifdef TOK_alloca
} else {
if (!is_integer_btype(vtop->type.t & VT_BTYPE))
error("size of variable length array should be an integer");
type->t |= VT_VLA;
last_vtop = vtop;
}
+#endif
}
skip(']');
/* parse next post type */
@@ -4864,7 +4868,11 @@ static void decl_initializer(CType *type, Section *sec, unsigned long c,
int a;
CValue retcval;
+/* No need to coment all the block as it will never be called without
+ TOK_alloca defined (See ifdef TOK_alloca stanza in post_type */
+#ifdef TOK_alloca
vpush_global_sym(&func_old_type, TOK_alloca);
+#endif
vla_runtime_type_size(type, &a);
gfunc_call(1);
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 499a071..a8ec2fa 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2010,7 +2010,7 @@ void old_style_function(void)
void alloca_test()
{
-#if defined __i386__ || defined __x86_64__
+#ifdef TOK_alloca
char *p = alloca(16);
strcpy(p,"123456789012345");
printf("alloca: p is %s\n", p);
@@ -2022,7 +2022,7 @@ void alloca_test()
void c99_vla_test(int size1, int size2)
{
-#if defined __i386__ || defined __x86_64__
+#ifdef TOK_alloca
int tab1[size1 * size2][2], tab2[10][2];
void *tab1_ptr, *tab2_ptr;