aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Makefile4
-rw-r--r--lib/alloca-arm.S11
-rw-r--r--tests/tcctest.c4
3 files changed, 15 insertions, 4 deletions
diff --git a/lib/Makefile b/lib/Makefile
index 7ef267f..cf3cd71 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -45,7 +45,7 @@ cross : TCC = $(TOP)/$(TARGET)-tcc$(EXESUF)
I386_O = libtcc1.o alloca86.o alloca86-bt.o $(BCHECK_O)
X86_64_O = libtcc1.o alloca86_64.o
-ARM_O = libtcc1.o armeabi.o
+ARM_O = libtcc1.o armeabi.o alloca-arm.o
WIN32_O = $(I386_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o
WIN64_O = $(X86_64_O) crt1.o wincrt1.o dllcrt1.o dllmain.o chkstk.o
@@ -104,7 +104,7 @@ $(DIR)/libtcc1.a ../libtcc1.a : $(OBJ) $(XAR)
$(DIR)/%.o : %.c
$(XCC) -c $< -o $@ $(XFLAGS)
$(DIR)/%.o : %.S
- $(XCC) -c $< -o $@ $(XFLAGS)
+ $(CC) -c $< -o $@ $(XFLAGS)
$(DIR)/%$(EXESUF) : $(TOP)/win32/tools/%.c
$(CC) -o $@ $< $(XFLAGS) $(LDFLAGS)
diff --git a/lib/alloca-arm.S b/lib/alloca-arm.S
new file mode 100644
index 0000000..9deae63
--- /dev/null
+++ b/lib/alloca-arm.S
@@ -0,0 +1,11 @@
+ .text
+ .align 2
+ .global alloca
+ .type alloca, %function
+alloca:
+ rsb sp, r0, sp
+ bic sp, sp, #7
+ mov r0, sp
+ mov pc, lr
+ .size alloca, .-alloca
+ .section .note.GNU-stack,"",%progbits
diff --git a/tests/tcctest.c b/tests/tcctest.c
index 1653927..c48c1bc 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -2221,7 +2221,7 @@ void old_style_function(void)
void alloca_test()
{
-#if defined __i386__ || defined __x86_64__
+#if defined __i386__ || defined __x86_64__ || defined __arm__
char *p = alloca(16);
strcpy(p,"123456789012345");
printf("alloca: p is %s\n", p);
@@ -2794,7 +2794,7 @@ double get100 () { return 100.0; }
void callsave_test(void)
{
-#if defined __i386__ || defined __x86_64__
+#if defined __i386__ || defined __x86_64__ || defined __arm__
int i, s; double *d; double t;
s = sizeof (double);
printf ("callsavetest: %d\n", s);