From 110a4edc154f6fb73ef3d312630455f68641123f Mon Sep 17 00:00:00 2001 From: grischka Date: Sat, 16 May 2009 22:30:13 +0200 Subject: [PATCH] drop alloca #define (Because GNU's alloca.h unconditionally #undef's alloca) Also, remove gcc specific sections in headers. and instead change tests such that gcc does not use them. --- Makefile | 2 +- include/stdarg.h | 16 ---------------- {win32/include => include}/stddef.h | 10 ++-------- lib/alloca86-bt.S | 4 ++-- lib/alloca86.S | 4 ++-- libtcc.c | 2 +- tcctok.h | 2 +- tests/Makefile | 5 +++-- tests/tcctest.c | 14 ++++++++++++++ win32/include/stddef.h | 5 +---- 10 files changed, 27 insertions(+), 37 deletions(-) copy {win32/include => include}/stddef.h (56%) diff --git a/Makefile b/Makefile index 7289b678..1a2b5f76 100644 --- a/Makefile +++ b/Makefile @@ -236,7 +236,7 @@ install: $(PROGS) $(LIBTCC1) libtcc.a tcc-doc.html $(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib" cp -r win32/include/. "$(tccdir)/include" cp -r win32/examples/. "$(tccdir)/examples" - $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include" +# $(INSTALL) -m644 $(addprefix include/,$(TCC_INCLUDES)) "$(tccdir)/include" $(INSTALL) -m644 tcc-doc.html win32/tcc-win32.txt "$(tccdir)/doc" $(INSTALL) -m644 libtcc.a libtcc.h "$(tccdir)/libtcc" endif diff --git a/include/stdarg.h b/include/stdarg.h index c49e6dfd..86e556ca 100644 --- a/include/stdarg.h +++ b/include/stdarg.h @@ -2,9 +2,6 @@ #define _STDARG_H #ifdef __x86_64__ - -#ifdef __TINYC__ - #include /* GCC compatible definition of va_list. */ @@ -53,19 +50,6 @@ typedef struct __va_list_struct *va_list; #else -/* for GNU C */ - -typedef __builtin_va_list va_list; - -#define va_start(ap, last) __builtin_va_start(ap, last) -#define va_arg(ap, type) __builtin_va_arg(ap, type) -#define va_copy(dest, src) __builtin_va_copy(dest, src) -#define va_end(ap) __builtin_va_end(ap) - -#endif - -#else - typedef char *va_list; /* only correct for i386 */ diff --git a/win32/include/stddef.h b/include/stddef.h similarity index 56% copy from win32/include/stddef.h copy to include/stddef.h index 9965f89e..aef5b392 100644 --- a/win32/include/stddef.h +++ b/include/stddef.h @@ -7,10 +7,7 @@ typedef __WCHAR_TYPE__ wchar_t; typedef __PTRDIFF_TYPE__ ptrdiff_t; #define offsetof(type, field) ((size_t) &((type *)0)->field) -/* need to do that because of glibc 2.1 bug (should have a way to test - presence of 'long long' without __GNUC__, or TCC should define - __GNUC__ ? */ -#if !defined(__int8_t_defined) && !defined(__dietlibc__) +#ifndef __int8_t_defined #define __int8_t_defined typedef char int8_t; typedef short int int16_t; @@ -18,9 +15,6 @@ typedef int int32_t; typedef long long int int64_t; #endif -#ifdef __i386__ -void *_alloca(size_t); -#define alloca _alloca -#endif +void *alloca(size_t size); #endif diff --git a/lib/alloca86-bt.S b/lib/alloca86-bt.S index 037c8458..994da204 100644 --- a/lib/alloca86-bt.S +++ b/lib/alloca86-bt.S @@ -3,9 +3,9 @@ #include "../config.h" -.globl __bound__alloca +.globl __bound_alloca -__bound__alloca: +__bound_alloca: pop %edx pop %eax mov %eax, %ecx diff --git a/lib/alloca86.S b/lib/alloca86.S index 3d5eb618..fb208a0b 100644 --- a/lib/alloca86.S +++ b/lib/alloca86.S @@ -3,9 +3,9 @@ #include "../config.h" -.globl _alloca +.globl alloca -_alloca: +alloca: pop %edx pop %eax add $3,%eax diff --git a/libtcc.c b/libtcc.c index bca1946e..ade77c0d 100644 --- a/libtcc.c +++ b/libtcc.c @@ -694,7 +694,7 @@ static void put_extern_sym2(Sym *sym, Section *section, case TOK_memset: case TOK_strlen: case TOK_strcpy: - case TOK__alloca: + case TOK_alloca: strcpy(buf, "__bound_"); strcat(buf, name); name = buf; diff --git a/tcctok.h b/tcctok.h index 97d95076..6dc47782 100644 --- a/tcctok.h +++ b/tcctok.h @@ -228,7 +228,7 @@ DEF(TOK_memmove, "memmove") DEF(TOK_strlen, "strlen") DEF(TOK_strcpy, "strcpy") - DEF(TOK__alloca, "_alloca") + DEF(TOK_alloca, "alloca") #endif /* Tiny Assembler */ diff --git a/tests/Makefile b/tests/Makefile index 61df559f..ddd49322 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -37,7 +37,8 @@ libtcc_test$(EXESUF): libtcc_test.c ../libtcc.a # test.ref - generate using gcc test.ref: tcctest.c - $(CC) -o tcctest.gcc $< -w -I.. -I../include $(CFLAGS) + cp -u ../include/tcclib.h . + $(CC) -o tcctest.gcc $< -I. -w $(CFLAGS) ./tcctest.gcc > $@ # auto test @@ -141,4 +142,4 @@ cache: tcc_g # clean clean: rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.gcc \ - tcctest[1234] ex? libtcc_test$(EXESUF) tcc_g + tcctest[1234] ex? libtcc_test$(EXESUF) tcc_g tcclib.h diff --git a/tests/tcctest.c b/tests/tcctest.c index 55e356e7..a2d481a6 100644 --- a/tests/tcctest.c +++ b/tests/tcctest.c @@ -75,6 +75,7 @@ void stdarg_test(void); void whitespace_test(void); void relocation_test(void); void old_style_function(void); +void alloca_test(void); void sizeof_test(void); void typeof_test(void); void local_label_test(void); @@ -529,6 +530,7 @@ int main(int argc, char **argv) whitespace_test(); relocation_test(); old_style_function(); + alloca_test(); sizeof_test(); typeof_test(); statement_expr_test(); @@ -1935,6 +1937,18 @@ void old_style_function(void) decl_func2(NULL); } +void alloca_test() +{ +#if defined __i386__ || defined __x86_64__ + char *p = alloca(16); + strcpy(p,"123456789012345"); + printf("alloca: p is %s\n", p); + char *demo = "This is only a test.\n"; + /* Test alloca embedded in a larger expression */ + printf("alloca: %s\n", strcpy(alloca(strlen(demo)+1),demo) ); +#endif +} + void sizeof_test(void) { int a; diff --git a/win32/include/stddef.h b/win32/include/stddef.h index 9965f89e..6e4e2c88 100644 --- a/win32/include/stddef.h +++ b/win32/include/stddef.h @@ -18,9 +18,6 @@ typedef int int32_t; typedef long long int int64_t; #endif -#ifdef __i386__ -void *_alloca(size_t); -#define alloca _alloca -#endif +void *alloca(size_t); #endif -- 2.11.4.GIT