diff --git a/tccasm.c b/tccasm.c index ba76c17..15f1e43 100644 --- a/tccasm.c +++ b/tccasm.c @@ -422,9 +422,10 @@ ST_FUNC void asm_free_labels(TCCState *st) for(s = st->asm_labels; s != NULL; s = s1) { ElfSym *esym = elfsym(s); s1 = s->prev; - /* Possibly update binding and visibility from asm directives. */ + /* Possibly update binding and visibility from asm directives + if the symbol has no C decl (type is VT_VOID).*/ s->type.t &= ~VT_EXTERN; - if (esym) { + if (esym && s->type.t == VT_VOID) { if (!s->a.asmexport && esym->st_shndx != SHN_UNDEF) s->type.t |= VT_STATIC; if (s->a.visibility) diff --git a/tests/Makefile b/tests/Makefile index 61b585e..f06f39c 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -235,9 +235,16 @@ vla_test-run: 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) +asm-c-connect-%.o: asm-c-connect-%.c + $(TCC) -c -o $@ $< + +asm-c-connect-sep$(EXESUF): asm-c-connect-1.o asm-c-connect-2.o + $(TCC) -o $@ $^ + +asm-c-connect-test: asm-c-connect$(EXESUF) asm-c-connect-sep$(EXESUF) @echo ------------ $@ ------------ ./asm-c-connect$(EXESUF) + ./asm-c-connect-sep$(EXESUF) cross-test : @echo ------------ $@ ------------ diff --git a/tests/asm-c-connect-1.c b/tests/asm-c-connect-1.c index c3dcf2b..1849b56 100644 --- a/tests/asm-c-connect-1.c +++ b/tests/asm-c-connect-1.c @@ -15,12 +15,15 @@ static int x1_c(void) asm(".text;"_"x1: call "_"x1_c; ret"); void callx4(void); +void callx5_again(void); int main(int argc, char *argv[]) { asm("call "_"x1"); asm("call "_"x2"); asm("call "_"x3"); callx4(); + asm("call "_"x5"); + callx5_again(); return 0; } @@ -37,3 +40,9 @@ void x4(void) { printf("x4\n"); } + +void x5(void); +void x5(void) +{ + printf("x5\n"); +} diff --git a/tests/asm-c-connect-2.c b/tests/asm-c-connect-2.c index 7ab9dc3..5dad26c 100644 --- a/tests/asm-c-connect-2.c +++ b/tests/asm-c-connect-2.c @@ -6,5 +6,14 @@ int x3(void) return 3; } +/* That callx4 is defined globally (as if ".globl callx4") + is a TCC extension. GCC doesn't behave like this. */ void callx4(void); __asm__("callx4: call x4; ret"); + +extern void x5(void); +void callx5_again(void); +void callx5_again(void) +{ + x5(); +}