mirror of
https://github.com/mirror/tinycc.git
synced 2025-03-28 12:10:05 +08:00
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.
This commit is contained in:
parent
68310299b6
commit
110a4edc15
2
Makefile
2
Makefile
@ -236,7 +236,7 @@ install: $(PROGS) $(LIBTCC1) libtcc.a tcc-doc.html
|
|||||||
$(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib"
|
$(INSTALL) -m644 $(LIBTCC1) win32/lib/*.def "$(tccdir)/lib"
|
||||||
cp -r win32/include/. "$(tccdir)/include"
|
cp -r win32/include/. "$(tccdir)/include"
|
||||||
cp -r win32/examples/. "$(tccdir)/examples"
|
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 tcc-doc.html win32/tcc-win32.txt "$(tccdir)/doc"
|
||||||
$(INSTALL) -m644 libtcc.a libtcc.h "$(tccdir)/libtcc"
|
$(INSTALL) -m644 libtcc.a libtcc.h "$(tccdir)/libtcc"
|
||||||
endif
|
endif
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
#define _STDARG_H
|
#define _STDARG_H
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
|
|
||||||
#ifdef __TINYC__
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* GCC compatible definition of va_list. */
|
/* GCC compatible definition of va_list. */
|
||||||
@ -53,19 +50,6 @@ typedef struct __va_list_struct *va_list;
|
|||||||
|
|
||||||
#else
|
#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;
|
typedef char *va_list;
|
||||||
|
|
||||||
/* only correct for i386 */
|
/* only correct for i386 */
|
||||||
|
@ -7,10 +7,7 @@ typedef __WCHAR_TYPE__ wchar_t;
|
|||||||
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
typedef __PTRDIFF_TYPE__ ptrdiff_t;
|
||||||
#define offsetof(type, field) ((size_t) &((type *)0)->field)
|
#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
|
#ifndef __int8_t_defined
|
||||||
presence of 'long long' without __GNUC__, or TCC should define
|
|
||||||
__GNUC__ ? */
|
|
||||||
#if !defined(__int8_t_defined) && !defined(__dietlibc__)
|
|
||||||
#define __int8_t_defined
|
#define __int8_t_defined
|
||||||
typedef char int8_t;
|
typedef char int8_t;
|
||||||
typedef short int int16_t;
|
typedef short int int16_t;
|
||||||
@ -18,9 +15,6 @@ typedef int int32_t;
|
|||||||
typedef long long int int64_t;
|
typedef long long int int64_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __i386__
|
void *alloca(size_t size);
|
||||||
void *_alloca(size_t);
|
|
||||||
#define alloca _alloca
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
|
|
||||||
.globl __bound__alloca
|
.globl __bound_alloca
|
||||||
|
|
||||||
__bound__alloca:
|
__bound_alloca:
|
||||||
pop %edx
|
pop %edx
|
||||||
pop %eax
|
pop %eax
|
||||||
mov %eax, %ecx
|
mov %eax, %ecx
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
#include "../config.h"
|
#include "../config.h"
|
||||||
|
|
||||||
.globl _alloca
|
.globl alloca
|
||||||
|
|
||||||
_alloca:
|
alloca:
|
||||||
pop %edx
|
pop %edx
|
||||||
pop %eax
|
pop %eax
|
||||||
add $3,%eax
|
add $3,%eax
|
||||||
|
2
libtcc.c
2
libtcc.c
@ -694,7 +694,7 @@ static void put_extern_sym2(Sym *sym, Section *section,
|
|||||||
case TOK_memset:
|
case TOK_memset:
|
||||||
case TOK_strlen:
|
case TOK_strlen:
|
||||||
case TOK_strcpy:
|
case TOK_strcpy:
|
||||||
case TOK__alloca:
|
case TOK_alloca:
|
||||||
strcpy(buf, "__bound_");
|
strcpy(buf, "__bound_");
|
||||||
strcat(buf, name);
|
strcat(buf, name);
|
||||||
name = buf;
|
name = buf;
|
||||||
|
2
tcctok.h
2
tcctok.h
@ -228,7 +228,7 @@
|
|||||||
DEF(TOK_memmove, "memmove")
|
DEF(TOK_memmove, "memmove")
|
||||||
DEF(TOK_strlen, "strlen")
|
DEF(TOK_strlen, "strlen")
|
||||||
DEF(TOK_strcpy, "strcpy")
|
DEF(TOK_strcpy, "strcpy")
|
||||||
DEF(TOK__alloca, "_alloca")
|
DEF(TOK_alloca, "alloca")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Tiny Assembler */
|
/* Tiny Assembler */
|
||||||
|
@ -37,7 +37,8 @@ libtcc_test$(EXESUF): libtcc_test.c ../libtcc.a
|
|||||||
|
|
||||||
# test.ref - generate using gcc
|
# test.ref - generate using gcc
|
||||||
test.ref: tcctest.c
|
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 > $@
|
./tcctest.gcc > $@
|
||||||
|
|
||||||
# auto test
|
# auto test
|
||||||
@ -141,4 +142,4 @@ cache: tcc_g
|
|||||||
# clean
|
# clean
|
||||||
clean:
|
clean:
|
||||||
rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.gcc \
|
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
|
||||||
|
@ -75,6 +75,7 @@ void stdarg_test(void);
|
|||||||
void whitespace_test(void);
|
void whitespace_test(void);
|
||||||
void relocation_test(void);
|
void relocation_test(void);
|
||||||
void old_style_function(void);
|
void old_style_function(void);
|
||||||
|
void alloca_test(void);
|
||||||
void sizeof_test(void);
|
void sizeof_test(void);
|
||||||
void typeof_test(void);
|
void typeof_test(void);
|
||||||
void local_label_test(void);
|
void local_label_test(void);
|
||||||
@ -529,6 +530,7 @@ int main(int argc, char **argv)
|
|||||||
whitespace_test();
|
whitespace_test();
|
||||||
relocation_test();
|
relocation_test();
|
||||||
old_style_function();
|
old_style_function();
|
||||||
|
alloca_test();
|
||||||
sizeof_test();
|
sizeof_test();
|
||||||
typeof_test();
|
typeof_test();
|
||||||
statement_expr_test();
|
statement_expr_test();
|
||||||
@ -1935,6 +1937,18 @@ void old_style_function(void)
|
|||||||
decl_func2(NULL);
|
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)
|
void sizeof_test(void)
|
||||||
{
|
{
|
||||||
int a;
|
int a;
|
||||||
|
@ -18,9 +18,6 @@ typedef int int32_t;
|
|||||||
typedef long long int int64_t;
|
typedef long long int int64_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __i386__
|
void *alloca(size_t);
|
||||||
void *_alloca(size_t);
|
|
||||||
#define alloca _alloca
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user