aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMichael Matz <matz@suse.de>2017-11-22 17:57:43 +0100
committerMichael Matz <matz@suse.de>2017-11-22 17:57:43 +0100
commite7c71e24730ae07241980812c8b747963f216260 (patch)
tree6fc0609791b351c7f83da07c3f8d2548d747094c /tests
parent330c01bfc6fa6721fd455911a966bce041df31d8 (diff)
downloadtinycc-e7c71e24730ae07241980812c8b747963f216260.tar.gz
tinycc-e7c71e24730ae07241980812c8b747963f216260.tar.bz2
tccasm: synch C and asm symtab tighter
See testcase. The C and asm symtab are still separate, but integrated tighter: the asm labels are only synched at file end, not after each asm snippet (this fixes references from one to another asm block), the C and asm syms are synched both ways, so defining things in asm and refering from C, or the other way around works. In effect this model reflects what happens with GCC better. For this the asm labels aren't using the C label namespace anymore, but their own, which increases the size of each TokenSym by a pointer.
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile11
-rw-r--r--tests/asm-c-connect-1.c31
-rw-r--r--tests/asm-c-connect-2.c7
3 files changed, 48 insertions, 1 deletions
diff --git a/tests/Makefile b/tests/Makefile
index 6a61717..61b585e 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -16,6 +16,7 @@ TESTS = \
memtest \
dlltest \
abitest \
+ asm-c-connect-test \
vla_test-run \
cross-test \
tests2-dir \
@@ -44,7 +45,7 @@ ifeq ($(CONFIG_arm_eabi),yes)
TESTS := $(filter-out test3,$(TESTS))
endif
ifeq (,$(filter i386 x86_64,$(ARCH)))
- TESTS := $(filter-out dlltest,$(TESTS))
+ TESTS := $(filter-out dlltest asm-c-connect-test,$(TESTS))
endif
ifndef CONFIG_cross
TESTS := $(filter-out cross-%,$(TESTS))
@@ -231,6 +232,13 @@ vla_test-run: vla_test$(EXESUF)
@echo ------------ $@ ------------
./vla_test$(EXESUF)
+asm-c-connect$(EXESUF): asm-c-connect-1.c asm-c-connect-2.c
+ $(TCC) -o $@ $^
+
+asm-c-connect-test: asm-c-connect$(EXESUF)
+ @echo ------------ $@ ------------
+ ./asm-c-connect$(EXESUF)
+
cross-test :
@echo ------------ $@ ------------
$(TOP)/i386-tcc$(EXESUF) $(TCCFLAGS-unx) -c $(TOPSRC)/examples/ex3.c && echo "ok"
@@ -264,6 +272,7 @@ cache: tcc_g
clean:
rm -f *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.cc *.gcc
rm -f *-cc *-gcc *-tcc *.exe hello libtcc_test vla_test tcctest[1234]
+ rm -f asm-c-connect$(EXESUF)
rm -f ex? tcc_g weaktest.*.txt *.def
@$(MAKE) -C tests2 $@
@$(MAKE) -C pp $@
diff --git a/tests/asm-c-connect-1.c b/tests/asm-c-connect-1.c
new file mode 100644
index 0000000..3f7b010
--- /dev/null
+++ b/tests/asm-c-connect-1.c
@@ -0,0 +1,31 @@
+#include <stdio.h>
+
+#if defined _WIN32 && !defined __TINYC__
+# define U "_"
+#else
+# define U
+#endif
+
+const char str[] = "x1\n";
+#ifdef __x86_64__
+asm(U"x1: push %rbp; mov $"U"str, %rdi; call "U"printf; pop %rbp; ret");
+#elif defined (__i386__)
+asm(U"x1: push $"U"str; call "U"printf; pop %eax; ret");
+#endif
+
+int main(int argc, char *argv[])
+{
+ asm("call "U"x1");
+ asm("call "U"x2");
+ asm("call "U"x3");
+ return 0;
+}
+
+static
+int x2(void)
+{
+ printf("x2\n");
+ return 2;
+}
+
+extern int x3(void);
diff --git a/tests/asm-c-connect-2.c b/tests/asm-c-connect-2.c
new file mode 100644
index 0000000..3a8cff2
--- /dev/null
+++ b/tests/asm-c-connect-2.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int x3(void)
+{
+ printf("x3\n");
+ return 3;
+}