From 9ae10cad1fecc2be27691de0a37a1ed25abc9639 Mon Sep 17 00:00:00 2001 From: Michael Matz Date: Sun, 7 Aug 2016 05:37:43 +0200 Subject: tccasm: Lookup C symbols from ASM blocks It's now possible to use symbols defined in C code to be used from later inline asm blocks. See testcase. --- tests/tcctest.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'tests') diff --git a/tests/tcctest.c b/tests/tcctest.c index d8c8bcf..30d78b8 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -2647,6 +2647,24 @@ void other_constraints_test(void) printf ("oc1: %d\n", ret == (unsigned long)&var); } +/* Test global asm blocks playing with aliases. */ +void base_func(void) +{ + printf ("asmc: base\n"); +} + +extern void override_func1 (void); +extern void override_func2 (void); + +asm(".weak override_func1\n.set override_func1, base_func"); +asm(".set override_func1, base_func"); +asm(".set override_func2, base_func"); + +void override_func2 (void) +{ + printf ("asmc: override2\n"); +} + unsigned int set; void asm_test(void) @@ -2655,6 +2673,10 @@ void asm_test(void) unsigned int val; struct struct123 s1; struct struct1231 s2 = { (unsigned long)&s1 }; + /* Hide the outer base_func, but check later that the inline + asm block gets the outer one. */ + int base_func = 42; + void override_func3 (void); printf("inline asm:\n"); @@ -2692,6 +2714,12 @@ void asm_test(void) printf("set=0x%x\n", set); val = 0x01020304; printf("swab32(0x%08x) = 0x%0x\n", val, swab32(val)); + override_func1(); + override_func2(); + /* The base_func ref from the following inline asm should find + the global one, not the local decl from this function. */ + asm volatile(".weak override_func3\n.set override_func3, base_func"); + override_func3(); return; label1: goto label2; -- cgit v1.3.1