include/tccdefs.h: moved and use it
tcc_define_symbol(): now only for -D on command line include/tccdefs.h: converted to strings and compiled into the tcc executable. Can be disabled with ./configure --config-predefs=no In this case include/tccdefs.h is loaded at runtime. This is default for other build-methods (build-tcc.bat) also (to avoid some complexity). Also: - lib/Makefile: fix typo - tcc.h : avoid _strto(u)i64 (for TCC on WIN98/2K) - tccpp.h:cstr_printf() : workaround incompatible vsnprintf's (generally faster too)
This commit is contained in:
parent
8f8abcc756
commit
9f6b65230a
11 changed files with 503 additions and 521 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -20,6 +20,7 @@ tcc
|
||||||
libtcc*.def
|
libtcc*.def
|
||||||
|
|
||||||
config*.h
|
config*.h
|
||||||
|
*_.h
|
||||||
config*.mak
|
config*.mak
|
||||||
config.texi
|
config.texi
|
||||||
conftest*
|
conftest*
|
||||||
|
|
12
Makefile
12
Makefile
|
@ -191,6 +191,8 @@ arm64_FILES = $(CORE_FILES) arm64-gen.c arm64-link.c arm-asm.c
|
||||||
c67_FILES = $(CORE_FILES) c67-gen.c c67-link.c tcccoff.c
|
c67_FILES = $(CORE_FILES) c67-gen.c c67-link.c tcccoff.c
|
||||||
riscv64_FILES = $(CORE_FILES) riscv64-gen.c riscv64-link.c riscv64-asm.c
|
riscv64_FILES = $(CORE_FILES) riscv64-gen.c riscv64-link.c riscv64-asm.c
|
||||||
|
|
||||||
|
TCCDEFS_H$(subst yes,,$(CONFIG_predefs)) = tccdefs_.h
|
||||||
|
|
||||||
# libtcc sources
|
# libtcc sources
|
||||||
LIBTCC_SRC = $(filter-out tcc.c tcctools.c,$(filter %.c,$($T_FILES)))
|
LIBTCC_SRC = $(filter-out tcc.c tcctools.c,$(filter %.c,$($T_FILES)))
|
||||||
|
|
||||||
|
@ -199,11 +201,13 @@ LIBTCC_OBJ = $(X)libtcc.o
|
||||||
LIBTCC_INC = $($T_FILES)
|
LIBTCC_INC = $($T_FILES)
|
||||||
TCC_FILES = $(X)tcc.o
|
TCC_FILES = $(X)tcc.o
|
||||||
tcc.o : DEFINES += -DONE_SOURCE=0
|
tcc.o : DEFINES += -DONE_SOURCE=0
|
||||||
|
$(X)tcc.o $(X)libtcc.o : $(TCCDEFS_H)
|
||||||
else
|
else
|
||||||
LIBTCC_OBJ = $(patsubst %.c,$(X)%.o,$(LIBTCC_SRC))
|
LIBTCC_OBJ = $(patsubst %.c,$(X)%.o,$(LIBTCC_SRC))
|
||||||
LIBTCC_INC = $(filter %.h %-gen.c %-link.c,$($T_FILES))
|
LIBTCC_INC = $(filter %.h %-gen.c %-link.c,$($T_FILES))
|
||||||
TCC_FILES = $(X)tcc.o $(LIBTCC_OBJ)
|
TCC_FILES = $(X)tcc.o $(LIBTCC_OBJ)
|
||||||
$(TCC_FILES) : DEFINES += -DONE_SOURCE=0
|
$(TCC_FILES) : DEFINES += -DONE_SOURCE=0
|
||||||
|
$(X)tccpp.o : $(TCCDEFS_H)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_strip),no)
|
ifeq ($(CONFIG_strip),no)
|
||||||
|
@ -216,6 +220,10 @@ LDFLAGS += -s
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# convert "include/tccdefs.h" to "tccdefs_.h"
|
||||||
|
%_.h : include/%.h tests/misc/c2str.c
|
||||||
|
$S$(CC) -o c2str.exe $(filter %.c,$^) && ./c2str.exe $< $@
|
||||||
|
|
||||||
# target specific object rule
|
# target specific object rule
|
||||||
$(X)%.o : %.c $(LIBTCC_INC)
|
$(X)%.o : %.c $(LIBTCC_INC)
|
||||||
$S$(CC) -o $@ -c $< $(DEFINES) $(CFLAGS)
|
$S$(CC) -o $@ -c $< $(DEFINES) $(CFLAGS)
|
||||||
|
@ -402,8 +410,8 @@ testspp.%:
|
||||||
@$(MAKE) -C tests/pp $@
|
@$(MAKE) -C tests/pp $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@rm -f tcc$(EXESUF) tcc_p$(EXESUF) *-tcc$(EXESUF) tcc.pod
|
@rm -f tcc$(EXESUF) tcc_p$(EXESUF) *-tcc$(EXESUF) tcc.pod tags ETAGS
|
||||||
@rm -f *.o *.a *.so* *.out *.log lib*.def *.exe *.dll a.out tags TAGS *.dylib
|
@rm -f *.o *.a *.so* *.out *.log lib*.def *.exe *.dll a.out *.dylib *_.h
|
||||||
@$(MAKE) -s -C lib $@
|
@$(MAKE) -s -C lib $@
|
||||||
@$(MAKE) -s -C tests $@
|
@$(MAKE) -s -C tests $@
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,12 @@ enum {
|
||||||
|
|
||||||
#define CHAR_IS_UNSIGNED
|
#define CHAR_IS_UNSIGNED
|
||||||
|
|
||||||
|
#ifdef TCC_ARM_HARDFLOAT
|
||||||
|
# define ARM_FLOAT_ABI ARM_HARD_FLOAT
|
||||||
|
#else
|
||||||
|
# define ARM_FLOAT_ABI ARM_SOFTFP_FLOAT
|
||||||
|
#endif
|
||||||
|
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
|
|
24
configure
vendored
24
configure
vendored
|
@ -313,6 +313,7 @@ Advanced options (experts only):
|
||||||
--triplet=... specify system library/include directory triplet
|
--triplet=... specify system library/include directory triplet
|
||||||
--config-uClibc,-musl,-mingw32... enable system specific configurations
|
--config-uClibc,-musl,-mingw32... enable system specific configurations
|
||||||
--config-bcheck=no/-backtrace=no disable bounds checker/stack backtraces
|
--config-bcheck=no/-backtrace=no disable bounds checker/stack backtraces
|
||||||
|
--config-predefs=no do not compile tccdefs.h, instead just include
|
||||||
EOF
|
EOF
|
||||||
#echo "NOTE: The object files are build at the place where configure is launched"
|
#echo "NOTE: The object files are build at the place where configure is launched"
|
||||||
exit 1
|
exit 1
|
||||||
|
@ -447,22 +448,20 @@ DLLSUF=$DLLSUF
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
print_inc() {
|
print_inc() {
|
||||||
if test -n "$2"; then
|
local v="$2"
|
||||||
|
if test -n "$v"; then
|
||||||
|
test "$3" = "num" || v="\"$v\""
|
||||||
echo "#ifndef $1" >> $TMPH
|
echo "#ifndef $1" >> $TMPH
|
||||||
echo "# define $1 \"$2\"" >> $TMPH
|
echo "# define $1 $v" >> $TMPH
|
||||||
echo "#endif" >> $TMPH
|
echo "#endif" >> $TMPH
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
print_mak() {
|
print_mak() {
|
||||||
if test -n "$2"; then
|
local v="$2"
|
||||||
echo "NATIVE_DEFINES+=-D$1=\"\\\"$2\\\"\"" >> config.mak
|
if test -n "$v"; then
|
||||||
fi
|
test "$3" = "num" || v="\"\\\"$v\\\"\""
|
||||||
}
|
echo "NATIVE_DEFINES+=-D$1=$v" >> config.mak
|
||||||
|
|
||||||
print_mak_int() {
|
|
||||||
if test -n "$2"; then
|
|
||||||
echo "NATIVE_DEFINES+=-D$1=$2" >> config.mak
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +476,7 @@ print_mak CONFIG_TCC_CRTPREFIX "$tcc_crtprefix"
|
||||||
print_mak CONFIG_TCC_ELFINTERP "$tcc_elfinterp"
|
print_mak CONFIG_TCC_ELFINTERP "$tcc_elfinterp"
|
||||||
print_mak CONFIG_LDDIR "$tcc_lddir"
|
print_mak CONFIG_LDDIR "$tcc_lddir"
|
||||||
print_mak CONFIG_TRIPLET "$triplet"
|
print_mak CONFIG_TRIPLET "$triplet"
|
||||||
print_mak_int TCC_CPU_VERSION "$cpuver"
|
print_mak TCC_CPU_VERSION "$cpuver" num
|
||||||
|
|
||||||
if test "$cpu" = "aarch64" ; then
|
if test "$cpu" = "aarch64" ; then
|
||||||
echo "ARCH=arm64" >> config.mak
|
echo "ARCH=arm64" >> config.mak
|
||||||
|
@ -486,13 +485,16 @@ else
|
||||||
fi
|
fi
|
||||||
echo "TARGETOS=$targetos" >> config.mak
|
echo "TARGETOS=$targetos" >> config.mak
|
||||||
|
|
||||||
|
predefs="1"
|
||||||
for v in $confvars ; do
|
for v in $confvars ; do
|
||||||
|
test "$v" = "predefs=no" && predefs=""
|
||||||
if test "${v%=*}" = "$v"; then
|
if test "${v%=*}" = "$v"; then
|
||||||
echo "CONFIG_$v=yes" >> config.mak
|
echo "CONFIG_$v=yes" >> config.mak
|
||||||
else
|
else
|
||||||
echo "CONFIG_$v" >> config.mak
|
echo "CONFIG_$v" >> config.mak
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
print_inc CONFIG_TCC_PREDEFS "$predefs" num
|
||||||
|
|
||||||
version=`head $source_path/VERSION`
|
version=`head $source_path/VERSION`
|
||||||
echo "VERSION = $version" >> config.mak
|
echo "VERSION = $version" >> config.mak
|
||||||
|
|
263
include/tccdefs.h
Normal file
263
include/tccdefs.h
Normal file
|
@ -0,0 +1,263 @@
|
||||||
|
/* tccdefs.h
|
||||||
|
*
|
||||||
|
* By using native platfórm macros this file may be included at runtime
|
||||||
|
* just as is.
|
||||||
|
*
|
||||||
|
* If converted to C-strings and included in tccpp.c, these are trahslated
|
||||||
|
* to tcc target macros accordingly.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if __SIZEOF_POINTER__ == 4
|
||||||
|
/* 32bit systems. */
|
||||||
|
#define __SIZE_TYPE__ unsigned int
|
||||||
|
#define __PTRDIFF_TYPE__ int
|
||||||
|
#define __ILP32__ 1
|
||||||
|
#elif __SIZEOF_LONG__ == 4
|
||||||
|
/* 64bit Windows. */
|
||||||
|
#define __SIZE_TYPE__ unsigned long long
|
||||||
|
#define __PTRDIFF_TYPE__ long long
|
||||||
|
#define __LLP64__ 1
|
||||||
|
#else
|
||||||
|
/* Other 64bit systems. */
|
||||||
|
#define __SIZE_TYPE__ unsigned long
|
||||||
|
#define __PTRDIFF_TYPE__ long
|
||||||
|
#define __LP64__ 1
|
||||||
|
#endif
|
||||||
|
#define __SIZEOF_INT__ 4
|
||||||
|
#define __INT_MAX__ 0x7fffffff
|
||||||
|
#if __SIZEOF_LONG__ == 4
|
||||||
|
#define __LONG_MAX__ 0x7fffffffL
|
||||||
|
#else
|
||||||
|
#define __LONG_MAX__ 0x7fffffffffffffffL
|
||||||
|
#endif
|
||||||
|
#define __SIZEOF_LONG_LONG__ 8
|
||||||
|
#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL
|
||||||
|
#define __CHAR_BIT__ 8
|
||||||
|
#define __ORDER_LITTLE_ENDIAN__ 1234
|
||||||
|
#define __ORDER_BIG_ENDIAN__ 4321
|
||||||
|
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
|
||||||
|
#if defined _WIN32
|
||||||
|
#define __WCHAR_TYPE__ unsigned short
|
||||||
|
#define __WINT_TYPE__ unsigned short
|
||||||
|
#elif defined __linux__
|
||||||
|
#define __WCHAR_TYPE__ int
|
||||||
|
#define __WINT_TYPE__ unsigned int
|
||||||
|
#else
|
||||||
|
#define __WCHAR_TYPE__ int
|
||||||
|
#define __WINT_TYPE__ int
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ == 201112L
|
||||||
|
# define __STDC_NO_ATOMICS__ 1
|
||||||
|
# define __STDC_NO_COMPLEX__ 1
|
||||||
|
# define __STDC_NO_THREADS__ 1
|
||||||
|
#if !defined _WIN32
|
||||||
|
# define __STDC_UTF_16__ 1
|
||||||
|
# define __STDC_UTF_32__ 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _WIN32
|
||||||
|
//#define _WIN32 1
|
||||||
|
# if __SIZEOF_POINTER__ == 8
|
||||||
|
#define _WIN64 1
|
||||||
|
# endif
|
||||||
|
#define __declspec(x) __attribute__((x))
|
||||||
|
#define __cdecl
|
||||||
|
|
||||||
|
#elif defined __FreeBSD__
|
||||||
|
//#define __FreeBSD__ 12
|
||||||
|
#define __GNUC__ 9
|
||||||
|
#define __GNUC_MINOR__ 3
|
||||||
|
#define __GNUC_PATCHLEVEL__ 0
|
||||||
|
#define __GNUC_STDC_INLINE__ 1
|
||||||
|
#define __NO_TLS 1
|
||||||
|
#define __amd64__ 1
|
||||||
|
# if __SIZEOF_POINTER__ == 8
|
||||||
|
/* FIXME, __int128_t is used by setjump */
|
||||||
|
#define __int128_t struct { unsigned char _dummy[16] __attribute((aligned(16))); }
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#elif defined __FreeBSD_kernel__
|
||||||
|
//#define __FreeBSD_kernel__ 1
|
||||||
|
|
||||||
|
#elif defined __NetBSD__
|
||||||
|
//#define __NetBSD__ 1
|
||||||
|
#define __GNUC__ 4
|
||||||
|
#define __GNUC_MINOR__ 0
|
||||||
|
#define __GNUC_PATCHLEVEL__ 0
|
||||||
|
#define _Pragma(x)
|
||||||
|
#define __ELF__ 1
|
||||||
|
|
||||||
|
#elif defined __OpenBSD__
|
||||||
|
//#define __OpenBSD__ 1
|
||||||
|
#define __GNUC__ 4
|
||||||
|
#define _ANSI_LIBRARY 1
|
||||||
|
|
||||||
|
#elif defined __APPLE__
|
||||||
|
//#define __APPLE__ 1
|
||||||
|
/* emulate APPLE-GCC to make libc's headerfiles compile: */
|
||||||
|
#define __GNUC__ 4 /* darwin emits warning on GCC<4 */
|
||||||
|
#define __APPLE_CC__ 1 /* for <TargetConditionals.h> */
|
||||||
|
#define _DONT_USE_CTYPE_INLINE_ 1
|
||||||
|
/* avoids usage of GCC/clang specific builtins in libc-headerfiles: */
|
||||||
|
#define __FINITE_MATH_ONLY__ 1
|
||||||
|
#define _FORTIFY_SOURCE 0
|
||||||
|
|
||||||
|
#else
|
||||||
|
//#define __linux__ 1
|
||||||
|
//#define __linux 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined _WIN32
|
||||||
|
/* glibc defines */
|
||||||
|
#define __REDIRECT(name, proto, alias) name proto __asm__ (#alias)
|
||||||
|
#define __REDIRECT_NTH(name, proto, alias) name proto __asm__ (#alias) __THROW
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* skip __builtin... with -E */
|
||||||
|
#ifndef __TCC_PP__
|
||||||
|
|
||||||
|
#define __builtin_offsetof(type, field) ((__SIZE_TYPE__)&((type*)0)->field)
|
||||||
|
#define __builtin_extract_return_addr(x) x
|
||||||
|
#if !defined __linux__ && !defined _WIN32
|
||||||
|
/* used by math.h */
|
||||||
|
#define __builtin_huge_val() 1e500
|
||||||
|
#define __builtin_huge_valf() 1e50f
|
||||||
|
#define __builtin_huge_vall() 1e5000L
|
||||||
|
# if defined __APPLE__
|
||||||
|
#define __builtin_nanf(ignored_string) __nan()
|
||||||
|
/* used by floats.h to implement FLT_ROUNDS C99 macro. 1 == to nearest */
|
||||||
|
#define __builtin_flt_rounds() 1
|
||||||
|
/* used by _fd_def.h */
|
||||||
|
#define __builtin_bzero(p, ignored_size) bzero(p, sizeof(*(p)))
|
||||||
|
# else
|
||||||
|
#define __builtin_nanf(ignored_string) (0.0F/0.0F)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __builtin_va_list */
|
||||||
|
#if defined __x86_64__
|
||||||
|
#if !defined _WIN32
|
||||||
|
/* GCC compatible definition of va_list. */
|
||||||
|
/* This should be in sync with the declaration in our lib/libtcc1.c */
|
||||||
|
typedef struct {
|
||||||
|
unsigned gp_offset, fp_offset;
|
||||||
|
union {
|
||||||
|
unsigned overflow_offset;
|
||||||
|
char *overflow_arg_area;
|
||||||
|
};
|
||||||
|
char *reg_save_area;
|
||||||
|
} __builtin_va_list[1];
|
||||||
|
|
||||||
|
void *__va_arg(__builtin_va_list ap, int arg_type, int size, int align);
|
||||||
|
#define __builtin_va_start(ap, last) \
|
||||||
|
(*(ap) = *(__builtin_va_list)((char*)__builtin_frame_address(0) - 24))
|
||||||
|
#define __builtin_va_arg(ap, t) \
|
||||||
|
(*(t *)(__va_arg(ap, __builtin_va_arg_types(t), sizeof(t), __alignof__(t))))
|
||||||
|
#define __builtin_va_copy(dest, src) (*(dest) = *(src))
|
||||||
|
|
||||||
|
#else /* _WIN64 */
|
||||||
|
typedef char *__builtin_va_list;
|
||||||
|
#define __builtin_va_arg(ap, t) ((sizeof(t) > 8 || (sizeof(t) & (sizeof(t) - 1))) \
|
||||||
|
? **(t **)((ap += 8) - 8) : *(t *)((ap += 8) - 8))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined __arm__
|
||||||
|
typedef char *__builtin_va_list;
|
||||||
|
#define _tcc_alignof(type) ((int)&((struct {char c;type x;} *)0)->x)
|
||||||
|
#define _tcc_align(addr,type) (((unsigned)addr + _tcc_alignof(type) - 1) \
|
||||||
|
& ~(_tcc_alignof(type) - 1))
|
||||||
|
#define __builtin_va_start(ap,last) (ap = ((char *)&(last)) + ((sizeof(last)+3)&~3))
|
||||||
|
#define __builtin_va_arg(ap,type) (ap = (void *) ((_tcc_align(ap,type)+sizeof(type)+3) \
|
||||||
|
&~3), *(type *)(ap - ((sizeof(type)+3)&~3)))
|
||||||
|
|
||||||
|
#elif defined __aarch64__
|
||||||
|
typedef struct {
|
||||||
|
void *__stack, *__gr_top, *__vr_top;
|
||||||
|
int __gr_offs, __vr_offs;
|
||||||
|
} __builtin_va_list;
|
||||||
|
|
||||||
|
#elif defined __riscv
|
||||||
|
typedef char *__builtin_va_list;
|
||||||
|
#define __va_reg_size (__riscv_xlen >> 3)
|
||||||
|
#define _tcc_align(addr,type) (((unsigned long)addr + __alignof__(type) - 1) \
|
||||||
|
& -(__alignof__(type)))
|
||||||
|
#define __builtin_va_arg(ap,type) (*(sizeof(type) > (2*__va_reg_size) ? *(type **)((ap += __va_reg_size) - __va_reg_size) : (ap = (va_list)(_tcc_align(ap,type) + (sizeof(type)+__va_reg_size - 1)& -__va_reg_size), (type *)(ap - ((sizeof(type)+ __va_reg_size - 1)& -__va_reg_size)))))
|
||||||
|
|
||||||
|
#else /* __i386__ */
|
||||||
|
typedef char *__builtin_va_list;
|
||||||
|
#define __builtin_va_start(ap,last) (ap = ((char *)&(last)) + ((sizeof(last)+3)&~3))
|
||||||
|
#define __builtin_va_arg(ap,t) (*(t*)((ap+=(sizeof(t)+3)&~3)-((sizeof(t)+3)&~3)))
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#define __builtin_va_end(ap) (void)(ap)
|
||||||
|
#ifndef __builtin_va_copy
|
||||||
|
# define __builtin_va_copy(dest, src) (dest) = (src)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* TCC BBUILTIN AND BOUNDS ALIASES */
|
||||||
|
#ifdef __leading_underscore
|
||||||
|
# define __RENAME(X) __asm__("_"X)
|
||||||
|
#else
|
||||||
|
# define __RENAME(X) __asm__(X)
|
||||||
|
#endif
|
||||||
|
#ifdef __BOUNDS_CHECKING_ON
|
||||||
|
# define __BUILTINBC(ret,name,params) ret __builtin_##name params __RENAME("__bound_"#name);
|
||||||
|
# define __BOUND(ret,name,params) ret name params __RENAME("__bound_"#name);
|
||||||
|
#else
|
||||||
|
# define __BUILTINBC(ret,name,params) ret __builtin_##name params __RENAME(#name);
|
||||||
|
# define __BOUND(ret,name,params)
|
||||||
|
#endif
|
||||||
|
#define __BOTH(ret,name,params) __BUILTINBC(ret,name,params)__BOUND(ret,name,params)
|
||||||
|
#define __BUILTIN(ret,name,params) ret __builtin_##name params __RENAME(#name);
|
||||||
|
|
||||||
|
__BOTH(void*, memcpy, (void *, const void*, __SIZE_TYPE__))
|
||||||
|
__BOTH(void*, memmove, (void *, const void*, __SIZE_TYPE__))
|
||||||
|
__BOTH(void*, memset, (void *, int, __SIZE_TYPE__))
|
||||||
|
__BOTH(int, memcmp, (const void *, const void*, __SIZE_TYPE__))
|
||||||
|
__BOTH(__SIZE_TYPE__, strlen, (const char *))
|
||||||
|
__BOTH(char*, strcpy, (char *, const char *))
|
||||||
|
__BOTH(char*, strncpy, (char *, const char*, __SIZE_TYPE__))
|
||||||
|
__BOTH(int, strcmp, (const char*, const char*))
|
||||||
|
__BOTH(int, strncmp, (const char*, const char*, __SIZE_TYPE__))
|
||||||
|
__BOTH(char*, strcat, (char*, const char*))
|
||||||
|
__BOTH(char*, strchr, (const char*, int))
|
||||||
|
__BOTH(char*, strdup, (const char*))
|
||||||
|
#if defined __ARM_EABI__
|
||||||
|
__BOUND(void*,__aeabi_memcpy,(void*,const void*,__SIZE_TYPE__))
|
||||||
|
__BOUND(void*,__aeabi_memmove,(void*,const void*,__SIZE_TYPE__))
|
||||||
|
__BOUND(void*,__aeabi_memmove4,(void*,const void*,__SIZE_TYPE__))
|
||||||
|
__BOUND(void*,__aeabi_memmove8,(void*,const void*,__SIZE_TYPE__))
|
||||||
|
__BOUND(void*,__aeabi_memset,(void*,int,__SIZE_TYPE__))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __linux__ // HAVE MALLOC_REDIR
|
||||||
|
#define __MAYBE_REDIR __BUILTIN
|
||||||
|
#else
|
||||||
|
#define __MAYBE_REDIR __BOTH
|
||||||
|
#endif
|
||||||
|
__MAYBE_REDIR(void*, malloc, (__SIZE_TYPE__))
|
||||||
|
__MAYBE_REDIR(void*, realloc, (void *, __SIZE_TYPE__))
|
||||||
|
__MAYBE_REDIR(void*, calloc, (__SIZE_TYPE__, __SIZE_TYPE__))
|
||||||
|
__MAYBE_REDIR(void*, memalign, (__SIZE_TYPE__, __SIZE_TYPE__))
|
||||||
|
__MAYBE_REDIR(void, free, (void*))
|
||||||
|
#if defined __i386__ || defined __x86_64__
|
||||||
|
__BOTH(void*, alloca, (__SIZE_TYPE__))
|
||||||
|
#else
|
||||||
|
__BUILTIN(void*, alloca, (__SIZE_TYPE__))
|
||||||
|
#endif
|
||||||
|
__BUILTIN(void, abort, (void))
|
||||||
|
__BOUND(void, longjmp, ())
|
||||||
|
#if !defined _WIN32
|
||||||
|
__BOUND(void*, mmap, ())
|
||||||
|
__BOUND(int, munmap, ())
|
||||||
|
#endif
|
||||||
|
#undef __BUILTINBC
|
||||||
|
#undef __BUILTIN
|
||||||
|
#undef __BOUND
|
||||||
|
#undef __BOTH
|
||||||
|
#undef __MAYBE_REDIR
|
||||||
|
#undef __RENAME
|
||||||
|
|
||||||
|
#endif /* ndef __TCC_PP__ */
|
|
@ -82,7 +82,7 @@ $(X)%.o : %.S
|
||||||
$(TOP)/%.o : %.c
|
$(TOP)/%.o : %.c
|
||||||
$S$(XCC) -c $< -o $@ $(XFLAGS)
|
$S$(XCC) -c $< -o $@ $(XFLAGS)
|
||||||
|
|
||||||
$(TOP)/bcheck.o : XFLAGS += -g $(if (CONFIG_musl),-DTCC_MUSL)
|
$(TOP)/bcheck.o : XFLAGS += -g $(if $(CONFIG_musl),-DTCC_MUSL)
|
||||||
$(TOP)/bt-exe.o : $(TOP)/tccrun.c
|
$(TOP)/bt-exe.o : $(TOP)/tccrun.c
|
||||||
|
|
||||||
$(X)crt1w.o : crt1.c
|
$(X)crt1w.o : crt1.c
|
||||||
|
|
241
libtcc.c
241
libtcc.c
|
@ -118,7 +118,7 @@ BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/********************************************************/
|
/********************************************************/
|
||||||
#ifndef CONFIG_TCC_SEMLOCK
|
#if CONFIG_TCC_SEMLOCK == 0
|
||||||
#define WAIT_SEM()
|
#define WAIT_SEM()
|
||||||
#define POST_SEM()
|
#define POST_SEM()
|
||||||
#elif defined _WIN32
|
#elif defined _WIN32
|
||||||
|
@ -799,6 +799,10 @@ LIBTCCAPI TCCState *tcc_new(void)
|
||||||
#if defined TCC_TARGET_MACHO /* || defined TCC_TARGET_PE */
|
#if defined TCC_TARGET_MACHO /* || defined TCC_TARGET_PE */
|
||||||
s->leading_underscore = 1;
|
s->leading_underscore = 1;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef TCC_TARGET_ARM
|
||||||
|
s->float_abi = ARM_FLOAT_ABI;
|
||||||
|
#endif
|
||||||
|
|
||||||
s->ppfp = stdout;
|
s->ppfp = stdout;
|
||||||
/* might be used in error() before preprocess_start() */
|
/* might be used in error() before preprocess_start() */
|
||||||
s->include_stack_ptr = s->include_stack;
|
s->include_stack_ptr = s->include_stack;
|
||||||
|
@ -810,211 +814,6 @@ LIBTCCAPI TCCState *tcc_new(void)
|
||||||
#else
|
#else
|
||||||
tcc_set_lib_path(s, CONFIG_TCCDIR);
|
tcc_set_lib_path(s, CONFIG_TCCDIR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
{
|
|
||||||
/* define __TINYC__ 92X */
|
|
||||||
char buffer[32]; int a,b,c;
|
|
||||||
sscanf(TCC_VERSION, "%d.%d.%d", &a, &b, &c);
|
|
||||||
sprintf(buffer, "%d", a*10000 + b*100 + c);
|
|
||||||
tcc_define_symbol(s, "__TINYC__", buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* standard defines */
|
|
||||||
tcc_define_symbol(s, "__STDC__", NULL);
|
|
||||||
tcc_define_symbol(s, "__STDC_VERSION__", "199901L");
|
|
||||||
tcc_define_symbol(s, "__STDC_HOSTED__", NULL);
|
|
||||||
|
|
||||||
/* target defines */
|
|
||||||
#if defined(TCC_TARGET_I386)
|
|
||||||
tcc_define_symbol(s, "__i386__", NULL);
|
|
||||||
tcc_define_symbol(s, "__i386", NULL);
|
|
||||||
tcc_define_symbol(s, "i386", NULL);
|
|
||||||
#elif defined(TCC_TARGET_X86_64)
|
|
||||||
tcc_define_symbol(s, "__x86_64__", NULL);
|
|
||||||
#elif defined(TCC_TARGET_ARM)
|
|
||||||
tcc_define_symbol(s, "__ARM_ARCH_4__", NULL);
|
|
||||||
tcc_define_symbol(s, "__arm_elf__", NULL);
|
|
||||||
tcc_define_symbol(s, "__arm_elf", NULL);
|
|
||||||
tcc_define_symbol(s, "arm_elf", NULL);
|
|
||||||
tcc_define_symbol(s, "__arm__", NULL);
|
|
||||||
tcc_define_symbol(s, "__arm", NULL);
|
|
||||||
tcc_define_symbol(s, "arm", NULL);
|
|
||||||
tcc_define_symbol(s, "__APCS_32__", NULL);
|
|
||||||
tcc_define_symbol(s, "__ARMEL__", NULL);
|
|
||||||
#if defined(TCC_ARM_EABI)
|
|
||||||
tcc_define_symbol(s, "__ARM_EABI__", NULL);
|
|
||||||
#endif
|
|
||||||
#if defined(TCC_ARM_HARDFLOAT)
|
|
||||||
s->float_abi = ARM_HARD_FLOAT;
|
|
||||||
tcc_define_symbol(s, "__ARM_PCS_VFP", NULL);
|
|
||||||
#else
|
|
||||||
s->float_abi = ARM_SOFTFP_FLOAT;
|
|
||||||
#endif
|
|
||||||
#elif defined(TCC_TARGET_ARM64)
|
|
||||||
tcc_define_symbol(s, "__aarch64__", NULL);
|
|
||||||
#elif defined TCC_TARGET_C67
|
|
||||||
tcc_define_symbol(s, "__C67__", NULL);
|
|
||||||
#elif defined TCC_TARGET_RISCV64
|
|
||||||
tcc_define_symbol(s, "__riscv", NULL);
|
|
||||||
tcc_define_symbol(s, "__riscv_xlen", "64");
|
|
||||||
tcc_define_symbol(s, "__riscv_flen", "64");
|
|
||||||
tcc_define_symbol(s, "__riscv_div", NULL);
|
|
||||||
tcc_define_symbol(s, "__riscv_mul", NULL);
|
|
||||||
tcc_define_symbol(s, "__riscv_fdiv", NULL);
|
|
||||||
tcc_define_symbol(s, "__riscv_fsqrt", NULL);
|
|
||||||
tcc_define_symbol(s, "__riscv_float_abi_double", NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TCC_TARGET_PE
|
|
||||||
tcc_define_symbol(s, "_WIN32", NULL);
|
|
||||||
tcc_define_symbol(s, "__declspec(x)", "__attribute__((x))");
|
|
||||||
tcc_define_symbol(s, "__cdecl", "");
|
|
||||||
# ifdef TCC_TARGET_X86_64
|
|
||||||
tcc_define_symbol(s, "_WIN64", NULL);
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
tcc_define_symbol(s, "__unix__", NULL);
|
|
||||||
tcc_define_symbol(s, "__unix", NULL);
|
|
||||||
tcc_define_symbol(s, "unix", NULL);
|
|
||||||
# if defined(__linux__)
|
|
||||||
tcc_define_symbol(s, "__linux__", NULL);
|
|
||||||
tcc_define_symbol(s, "__linux", NULL);
|
|
||||||
# endif
|
|
||||||
# if TARGETOS_FreeBSD
|
|
||||||
tcc_define_symbol(s, "__FreeBSD__", "12");
|
|
||||||
/* No 'Thread Storage Local' on FreeBSD with tcc */
|
|
||||||
tcc_define_symbol(s, "__NO_TLS", NULL);
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_val()", "1e500");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L");
|
|
||||||
tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)");
|
|
||||||
# if defined(__aarch64__)
|
|
||||||
/* FIXME, __int128_t is used by setjump */
|
|
||||||
tcc_define_symbol(s, "__int128_t", "struct { unsigned char _dummy[16] __attribute((aligned(16))); }");
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# if TARGETOS_FreeBSD_kernel
|
|
||||||
tcc_define_symbol(s, "__FreeBSD_kernel__", NULL);
|
|
||||||
# endif
|
|
||||||
# if TARGETOS_NetBSD
|
|
||||||
tcc_define_symbol(s, "__NetBSD__", "1");
|
|
||||||
tcc_define_symbol(s, "__GNUC__", "4");
|
|
||||||
tcc_define_symbol(s, "__GNUC_MINOR__", "0");
|
|
||||||
tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0");
|
|
||||||
tcc_define_symbol(s, "_Pragma(x)", "");
|
|
||||||
tcc_define_symbol(s, "__ELF__", "1");
|
|
||||||
#if PTR_SIZE == 4
|
|
||||||
tcc_define_symbol(s, "__i386__", "1");
|
|
||||||
#else
|
|
||||||
tcc_define_symbol(s, "__amd64__", "1");
|
|
||||||
#endif
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_val()", "1e500");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L");
|
|
||||||
tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)");
|
|
||||||
# endif
|
|
||||||
# if TARGETOS_OpenBSD
|
|
||||||
tcc_define_symbol(s, "__OpenBSD__", "1");
|
|
||||||
tcc_define_symbol(s, "_ANSI_LIBRARY", "1");
|
|
||||||
tcc_define_symbol(s, "__GNUC__", "4");
|
|
||||||
/* used by math.h */
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_val()", "1e500");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L");
|
|
||||||
tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "(0.0F/0.0F)");
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TinyCC & gcc defines */
|
|
||||||
#if PTR_SIZE == 4
|
|
||||||
/* 32bit systems. */
|
|
||||||
tcc_define_symbol(s, "__SIZE_TYPE__", "unsigned int");
|
|
||||||
tcc_define_symbol(s, "__PTRDIFF_TYPE__", "int");
|
|
||||||
tcc_define_symbol(s, "__ILP32__", NULL);
|
|
||||||
#elif LONG_SIZE == 4
|
|
||||||
/* 64bit Windows. */
|
|
||||||
tcc_define_symbol(s, "__SIZE_TYPE__", "unsigned long long");
|
|
||||||
tcc_define_symbol(s, "__PTRDIFF_TYPE__", "long long");
|
|
||||||
tcc_define_symbol(s, "__LLP64__", NULL);
|
|
||||||
#else
|
|
||||||
/* Other 64bit systems. */
|
|
||||||
tcc_define_symbol(s, "__SIZE_TYPE__", "unsigned long");
|
|
||||||
tcc_define_symbol(s, "__PTRDIFF_TYPE__", "long");
|
|
||||||
tcc_define_symbol(s, "__LP64__", NULL);
|
|
||||||
#endif
|
|
||||||
tcc_define_symbol(s, "__SIZEOF_POINTER__", PTR_SIZE == 4 ? "4" : "8");
|
|
||||||
|
|
||||||
#ifdef TCC_TARGET_PE
|
|
||||||
tcc_define_symbol(s, "__WCHAR_TYPE__", "unsigned short");
|
|
||||||
tcc_define_symbol(s, "__WINT_TYPE__", "unsigned short");
|
|
||||||
#else
|
|
||||||
tcc_define_symbol(s, "__WCHAR_TYPE__", "int");
|
|
||||||
/* wint_t is unsigned int by default, but (signed) int on BSDs
|
|
||||||
and unsigned short on windows. Other OSes might have still
|
|
||||||
other conventions, sigh. */
|
|
||||||
# if TARGETOS_FreeBSD || TARGETOS_FreeBSD_kernel || TARGETOS_NetBSD || TARGETOS_OpenBSD
|
|
||||||
tcc_define_symbol(s, "__WINT_TYPE__", "int");
|
|
||||||
# if TARGETOS_FreeBSD
|
|
||||||
/* define __GNUC__ to have some useful stuff from sys/cdefs.h
|
|
||||||
that are unconditionally used in FreeBSDs other system headers :/ */
|
|
||||||
tcc_define_symbol(s, "__GNUC__", "9");
|
|
||||||
tcc_define_symbol(s, "__GNUC_MINOR__", "3");
|
|
||||||
tcc_define_symbol(s, "__GNUC_PATCHLEVEL__", "0");
|
|
||||||
tcc_define_symbol(s, "__GNUC_STDC_INLINE__", "1");
|
|
||||||
#if PTR_SIZE == 4
|
|
||||||
tcc_define_symbol(s, "__i386__", "1");
|
|
||||||
#else
|
|
||||||
tcc_define_symbol(s, "__amd64__", "1");
|
|
||||||
#endif
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
tcc_define_symbol(s, "__WINT_TYPE__", "unsigned int");
|
|
||||||
/* glibc defines */
|
|
||||||
tcc_define_symbol(s, "__REDIRECT(name, proto, alias)",
|
|
||||||
"name proto __asm__ (#alias)");
|
|
||||||
tcc_define_symbol(s, "__REDIRECT_NTH(name, proto, alias)",
|
|
||||||
"name proto __asm__ (#alias) __THROW");
|
|
||||||
# endif
|
|
||||||
/* Some GCC builtins that are simple to express as macros. */
|
|
||||||
tcc_define_symbol(s, "__builtin_extract_return_addr(x)", "x");
|
|
||||||
#endif /* ndef TCC_TARGET_PE */
|
|
||||||
#ifdef TCC_TARGET_MACHO
|
|
||||||
/* emulate APPLE-GCC to make libc's headerfiles compile: */
|
|
||||||
tcc_define_symbol(s, "__APPLE__", "1");
|
|
||||||
tcc_define_symbol(s, "__GNUC__", "4"); /* darwin emits warning on GCC<4 */
|
|
||||||
tcc_define_symbol(s, "__APPLE_CC__", "1"); /* for <TargetConditionals.h> */
|
|
||||||
tcc_define_symbol(s, "_DONT_USE_CTYPE_INLINE_", "1");
|
|
||||||
/* used by math.h */
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_val()", "1e500");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_valf()", "1e50f");
|
|
||||||
tcc_define_symbol(s, "__builtin_huge_vall()", "1e5000L");
|
|
||||||
tcc_define_symbol(s, "__builtin_nanf(ignored_string)", "__nan()");
|
|
||||||
/* used by _fd_def.h */
|
|
||||||
tcc_define_symbol(s, "__builtin_bzero(p, ignored_size)", "bzero(p, sizeof(*(p)))");
|
|
||||||
/* used by floats.h to implement FLT_ROUNDS C99 macro. 1 == to nearest */
|
|
||||||
tcc_define_symbol(s, "__builtin_flt_rounds()", "1");
|
|
||||||
|
|
||||||
/* avoids usage of GCC/clang specific builtins in libc-headerfiles: */
|
|
||||||
tcc_define_symbol(s, "__FINITE_MATH_ONLY__", "1");
|
|
||||||
tcc_define_symbol(s, "_FORTIFY_SOURCE", "0");
|
|
||||||
#endif /* ndef TCC_TARGET_MACHO */
|
|
||||||
|
|
||||||
#if LONG_SIZE == 4
|
|
||||||
tcc_define_symbol(s, "__SIZEOF_LONG__", "4");
|
|
||||||
tcc_define_symbol(s, "__LONG_MAX__", "0x7fffffffL");
|
|
||||||
#else
|
|
||||||
tcc_define_symbol(s, "__SIZEOF_LONG__", "8");
|
|
||||||
tcc_define_symbol(s, "__LONG_MAX__", "0x7fffffffffffffffL");
|
|
||||||
#endif
|
|
||||||
tcc_define_symbol(s, "__SIZEOF_INT__", "4");
|
|
||||||
tcc_define_symbol(s, "__SIZEOF_LONG_LONG__", "8");
|
|
||||||
tcc_define_symbol(s, "__CHAR_BIT__", "8");
|
|
||||||
tcc_define_symbol(s, "__ORDER_LITTLE_ENDIAN__", "1234");
|
|
||||||
tcc_define_symbol(s, "__ORDER_BIG_ENDIAN__", "4321");
|
|
||||||
tcc_define_symbol(s, "__BYTE_ORDER__", "__ORDER_LITTLE_ENDIAN__");
|
|
||||||
tcc_define_symbol(s, "__INT_MAX__", "0x7fffffff");
|
|
||||||
tcc_define_symbol(s, "__LONG_LONG_MAX__", "0x7fffffffffffffffLL");
|
|
||||||
tcc_define_symbol(s, "__builtin_offsetof(type,field)", "((__SIZE_TYPE__) &((type *)0)->field)");
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1064,33 +863,6 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type)
|
||||||
if (output_type == TCC_OUTPUT_OBJ)
|
if (output_type == TCC_OUTPUT_OBJ)
|
||||||
s->output_format = TCC_OUTPUT_FORMAT_ELF;
|
s->output_format = TCC_OUTPUT_FORMAT_ELF;
|
||||||
|
|
||||||
if (s->char_is_unsigned)
|
|
||||||
tcc_define_symbol(s, "__CHAR_UNSIGNED__", NULL);
|
|
||||||
|
|
||||||
if (s->cversion == 201112) {
|
|
||||||
tcc_undefine_symbol(s, "__STDC_VERSION__");
|
|
||||||
tcc_define_symbol(s, "__STDC_VERSION__", "201112L");
|
|
||||||
tcc_define_symbol(s, "__STDC_NO_ATOMICS__", NULL);
|
|
||||||
tcc_define_symbol(s, "__STDC_NO_COMPLEX__", NULL);
|
|
||||||
tcc_define_symbol(s, "__STDC_NO_THREADS__", NULL);
|
|
||||||
#ifndef TCC_TARGET_PE
|
|
||||||
/* on Linux, this conflicts with a define introduced by
|
|
||||||
/usr/include/stdc-predef.h included by glibc libs
|
|
||||||
tcc_define_symbol(s, "__STDC_ISO_10646__", "201605L"); */
|
|
||||||
tcc_define_symbol(s, "__STDC_UTF_16__", NULL);
|
|
||||||
tcc_define_symbol(s, "__STDC_UTF_32__", NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->optimize > 0)
|
|
||||||
tcc_define_symbol(s, "__OPTIMIZE__", NULL);
|
|
||||||
|
|
||||||
if (s->option_pthread)
|
|
||||||
tcc_define_symbol(s, "_REENTRANT", NULL);
|
|
||||||
|
|
||||||
if (s->leading_underscore)
|
|
||||||
tcc_define_symbol(s, "__leading_underscore", NULL);
|
|
||||||
|
|
||||||
if (!s->nostdinc) {
|
if (!s->nostdinc) {
|
||||||
/* default include paths */
|
/* default include paths */
|
||||||
/* -isystem paths have already been handled */
|
/* -isystem paths have already been handled */
|
||||||
|
@ -1101,8 +873,6 @@ LIBTCCAPI int tcc_set_output_type(TCCState *s, int output_type)
|
||||||
if (s->do_bounds_check) {
|
if (s->do_bounds_check) {
|
||||||
/* if bound checking, then add corresponding sections */
|
/* if bound checking, then add corresponding sections */
|
||||||
tccelf_bounds_new(s);
|
tccelf_bounds_new(s);
|
||||||
/* define symbol */
|
|
||||||
tcc_define_symbol(s, "__BOUNDS_CHECKING_ON", NULL);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (s->do_debug) {
|
if (s->do_debug) {
|
||||||
|
@ -2046,7 +1816,6 @@ reparse:
|
||||||
/* tcc doesn't support soft float yet */
|
/* tcc doesn't support soft float yet */
|
||||||
if (!strcmp(optarg, "softfp")) {
|
if (!strcmp(optarg, "softfp")) {
|
||||||
s->float_abi = ARM_SOFTFP_FLOAT;
|
s->float_abi = ARM_SOFTFP_FLOAT;
|
||||||
tcc_undefine_symbol(s, "__ARM_PCS_VFP");
|
|
||||||
} else if (!strcmp(optarg, "hard"))
|
} else if (!strcmp(optarg, "hard"))
|
||||||
s->float_abi = ARM_HARD_FLOAT;
|
s->float_abi = ARM_HARD_FLOAT;
|
||||||
else
|
else
|
||||||
|
|
20
tcc.h
20
tcc.h
|
@ -40,7 +40,6 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
# define WIN32_LEAN_AND_MEAN 1
|
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# include <sys/time.h>
|
# include <sys/time.h>
|
||||||
# ifndef CONFIG_TCC_STATIC
|
# ifndef CONFIG_TCC_STATIC
|
||||||
|
@ -52,7 +51,7 @@ extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# define WIN32_LEAN_AND_MEAN
|
# define WIN32_LEAN_AND_MEAN 1
|
||||||
# include <windows.h>
|
# include <windows.h>
|
||||||
# include <io.h> /* open, close etc. */
|
# include <io.h> /* open, close etc. */
|
||||||
# include <direct.h> /* getcwd */
|
# include <direct.h> /* getcwd */
|
||||||
|
@ -65,8 +64,13 @@ extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
# ifndef __GNUC__
|
# ifndef __GNUC__
|
||||||
# define strtold (long double)strtod
|
# define strtold (long double)strtod
|
||||||
# define strtof (float)strtod
|
# define strtof (float)strtod
|
||||||
|
# ifdef _WIN64
|
||||||
# define strtoll _strtoi64
|
# define strtoll _strtoi64
|
||||||
# define strtoull _strtoui64
|
# define strtoull _strtoui64
|
||||||
|
# else
|
||||||
|
# define strtoll strtol
|
||||||
|
# define strtoull strtoul
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef LIBTCC_AS_DLL
|
# ifdef LIBTCC_AS_DLL
|
||||||
# define LIBTCCAPI __declspec(dllexport)
|
# define LIBTCCAPI __declspec(dllexport)
|
||||||
|
@ -197,6 +201,12 @@ extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if (TARGETOS_OpenBSD || TARGETOS_FreeBSD || TARGETOS_NetBSD || TARGETOS_FreeBSD_kernel)
|
||||||
|
# define TARGETOS_BSD 1
|
||||||
|
#elif !(TCC_TARGET_PE || TCC_TARGET_MACHO)
|
||||||
|
# define TARGETOS_Linux 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined TCC_TARGET_PE || defined TCC_TARGET_MACHO
|
#if defined TCC_TARGET_PE || defined TCC_TARGET_MACHO
|
||||||
# define ELF_OBJ_ONLY /* create elf .o but native executables */
|
# define ELF_OBJ_ONLY /* create elf .o but native executables */
|
||||||
#endif
|
#endif
|
||||||
|
@ -265,7 +275,7 @@ extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
# else
|
# else
|
||||||
# define CONFIG_TCC_ELFINTERP "/lib/ld.so.1"
|
# define CONFIG_TCC_ELFINTERP "/lib/ld.so.1"
|
||||||
# endif
|
# endif
|
||||||
# elif defined __DragonFly__
|
# elif TARGETOS_DragonFly
|
||||||
# define CONFIG_TCC_ELFINTERP "/usr/libexec/ld-elf.so.2"
|
# define CONFIG_TCC_ELFINTERP "/usr/libexec/ld-elf.so.2"
|
||||||
# elif TARGETOS_NetBSD
|
# elif TARGETOS_NetBSD
|
||||||
# define CONFIG_TCC_ELFINTERP "/usr/libexec/ld.elf_so"
|
# define CONFIG_TCC_ELFINTERP "/usr/libexec/ld.elf_so"
|
||||||
|
@ -340,7 +350,9 @@ extern long double strtold (const char *__nptr, char **__endptr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* support using libtcc from threads */
|
/* support using libtcc from threads */
|
||||||
#define CONFIG_TCC_SEMLOCK
|
#ifndef CONFIG_TCC_SEMLOCK
|
||||||
|
# define CONFIG_TCC_SEMLOCK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ONE_SOURCE
|
#if ONE_SOURCE
|
||||||
#define ST_INLN static inline
|
#define ST_INLN static inline
|
||||||
|
|
226
tccpp.c
226
tccpp.c
|
@ -89,6 +89,7 @@ static const unsigned char tok_two_chars[] =
|
||||||
'-','>', TOK_ARROW,
|
'-','>', TOK_ARROW,
|
||||||
'.','.', TOK_TWODOTS,
|
'.','.', TOK_TWODOTS,
|
||||||
'#','#', TOK_TWOSHARPS,
|
'#','#', TOK_TWOSHARPS,
|
||||||
|
'#','#', TOK_PPJOIN,
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -388,17 +389,19 @@ ST_FUNC void cstr_reset(CString *cstr)
|
||||||
ST_FUNC int cstr_printf(CString *cstr, const char *fmt, ...)
|
ST_FUNC int cstr_printf(CString *cstr, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list v;
|
va_list v;
|
||||||
int len, size;
|
int len, size = 80;
|
||||||
|
for (;;) {
|
||||||
va_start(v, fmt);
|
size += cstr->size;
|
||||||
len = vsnprintf(NULL, 0, fmt, v);
|
|
||||||
va_end(v);
|
|
||||||
size = cstr->size + len + 1;
|
|
||||||
if (size > cstr->size_allocated)
|
if (size > cstr->size_allocated)
|
||||||
cstr_realloc(cstr, size);
|
cstr_realloc(cstr, size);
|
||||||
|
size = cstr->size_allocated - cstr->size;
|
||||||
va_start(v, fmt);
|
va_start(v, fmt);
|
||||||
vsnprintf((char*)cstr->data + cstr->size, size, fmt, v);
|
len = vsnprintf((char*)cstr->data + cstr->size, size, fmt, v);
|
||||||
va_end(v);
|
va_end(v);
|
||||||
|
if (len > 0 && len < size)
|
||||||
|
break;
|
||||||
|
size *= 2;
|
||||||
|
}
|
||||||
cstr->size += len;
|
cstr->size += len;
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
@ -3622,119 +3625,108 @@ ST_INLN void unget_tok(int last_tok)
|
||||||
tok = last_tok;
|
tok = last_tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcc_predefs(CString *cstr)
|
static void tcc_predefs(TCCState *s1, CString *cs, int is_asm)
|
||||||
{
|
{
|
||||||
cstr_cat(cstr,
|
int a,b,c;
|
||||||
|
|
||||||
//"#include <tcc_predefs.h>\n"
|
sscanf(TCC_VERSION, "%d.%d.%d", &a, &b, &c);
|
||||||
|
cstr_printf(cs, "#define __TINYC__ %d\n", a*10000 + b*100 + c);
|
||||||
#if defined TCC_TARGET_X86_64
|
cstr_cat(cs,
|
||||||
#ifndef TCC_TARGET_PE
|
/* target machine */
|
||||||
/* GCC compatible definition of va_list. */
|
#if defined TCC_TARGET_I386
|
||||||
/* This should be in sync with the declaration in our lib/libtcc1.c */
|
"#define __i386__ 1\n"
|
||||||
"typedef struct{\n"
|
"#define __i386 1\n"
|
||||||
"unsigned gp_offset,fp_offset;\n"
|
#elif defined TCC_TARGET_X86_64
|
||||||
"union{\n"
|
"#define __x86_64__ 1\n"
|
||||||
"unsigned overflow_offset;\n"
|
"#define __amd64__ 1\n"
|
||||||
"char*overflow_arg_area;\n"
|
|
||||||
"};\n"
|
|
||||||
"char*reg_save_area;\n"
|
|
||||||
"}__builtin_va_list[1];\n"
|
|
||||||
"void*__va_arg(__builtin_va_list ap,int arg_type,int size,int align);\n"
|
|
||||||
"#define __builtin_va_start(ap,last) (*(ap)=*(__builtin_va_list)((char*)__builtin_frame_address(0)-24))\n"
|
|
||||||
"#define __builtin_va_arg(ap,t) (*(t*)(__va_arg(ap,__builtin_va_arg_types(t),sizeof(t),__alignof__(t))))\n"
|
|
||||||
"#define __builtin_va_copy(dest,src) (*(dest)=*(src))\n"
|
|
||||||
#else /* TCC_TARGET_PE */
|
|
||||||
"typedef char*__builtin_va_list;\n"
|
|
||||||
"#define __builtin_va_arg(ap,t) ((sizeof(t)>8||(sizeof(t)&(sizeof(t)-1)))?**(t**)((ap+=8)-8):*(t*)((ap+=8)-8))\n"
|
|
||||||
#endif
|
|
||||||
#elif defined TCC_TARGET_ARM
|
#elif defined TCC_TARGET_ARM
|
||||||
"typedef char*__builtin_va_list;\n"
|
"#define __ARM_ARCH_4__ 1\n"
|
||||||
"#define _tcc_alignof(type) ((int)&((struct{char c;type x;}*)0)->x)\n"
|
"#define __arm_elf__ 1\n"
|
||||||
"#define _tcc_align(addr,type) (((unsigned)addr+_tcc_alignof(type)-1)&~(_tcc_alignof(type)-1))\n"
|
"#define __arm_elf 1\n"
|
||||||
"#define __builtin_va_start(ap,last) (ap=((char*)&(last))+((sizeof(last)+3)&~3))\n"
|
"#define arm_elf 1\n"
|
||||||
"#define __builtin_va_arg(ap,type) (ap=(void*)((_tcc_align(ap,type)+sizeof(type)+3)&~3),*(type*)(ap-((sizeof(type)+3)&~3)))\n"
|
"#define __arm__ 1\n"
|
||||||
|
"#define __arm 1\n"
|
||||||
|
"#define arm 1\n"
|
||||||
|
"#define __APCS_32__ 1\n"
|
||||||
|
"#define __ARMEL__ 1\n"
|
||||||
|
# if defined TCC_ARM_EABI
|
||||||
|
"#define __ARM_EABI__ 1\n"
|
||||||
|
# endif
|
||||||
#elif defined TCC_TARGET_ARM64
|
#elif defined TCC_TARGET_ARM64
|
||||||
"typedef struct{\n"
|
"#define __aarch64__ 1\n"
|
||||||
"void*__stack,*__gr_top,*__vr_top;\n"
|
#elif defined TCC_TARGET_C67
|
||||||
"int __gr_offs,__vr_offs;\n"
|
"#define __C67__ 1\n"
|
||||||
"}__builtin_va_list;\n"
|
|
||||||
#elif defined TCC_TARGET_RISCV64
|
#elif defined TCC_TARGET_RISCV64
|
||||||
"typedef char*__builtin_va_list;\n"
|
"#define __riscv 1\n"
|
||||||
"#define __va_reg_size (__riscv_xlen>>3)\n"
|
"#define __riscv_xlen 64\n"
|
||||||
"#define _tcc_align(addr,type) (((unsigned long)addr+__alignof__(type)-1)&-(__alignof__(type)))\n"
|
"#define __riscv_flen 64\n"
|
||||||
"#define __builtin_va_arg(ap,type) (*(sizeof(type)>(2*__va_reg_size)?*(type**)((ap+=__va_reg_size)-__va_reg_size):(ap=(va_list)(_tcc_align(ap,type)+(sizeof(type)+__va_reg_size-1)&-__va_reg_size),(type*)(ap-((sizeof(type)+__va_reg_size-1)&-__va_reg_size)))))\n"
|
"#define __riscv_div 1\n"
|
||||||
#else /* TCC_TARGET_I386 */
|
"#define __riscv_mul 1\n"
|
||||||
"typedef char*__builtin_va_list;\n"
|
"#define __riscv_fdiv 1\n"
|
||||||
"#define __builtin_va_start(ap,last) (ap=((char*)&(last))+((sizeof(last)+3)&~3))\n"
|
"#define __riscv_fsqrt 1\n"
|
||||||
"#define __builtin_va_arg(ap,t) (*(t*)((ap+=(sizeof(t)+3)&~3)-((sizeof(t)+3)&~3)))\n"
|
"#define __riscv_float_abi_double 1\n"
|
||||||
#endif
|
#endif
|
||||||
"#define __builtin_va_end(ap) (void)(ap)\n"
|
|
||||||
"#ifndef __builtin_va_copy\n"
|
|
||||||
"#define __builtin_va_copy(dest,src) (dest)=(src)\n"
|
|
||||||
"#endif\n"
|
|
||||||
"#ifdef __leading_underscore\n"
|
|
||||||
"#define __RENAME(X) __asm__(\"_\"X)\n"
|
|
||||||
"#else\n"
|
|
||||||
"#define __RENAME(X) __asm__(X)\n"
|
|
||||||
"#endif\n"
|
|
||||||
/* TCC BBUILTIN AND BOUNDS ALIASES */
|
|
||||||
"#ifdef __BOUNDS_CHECKING_ON\n"
|
|
||||||
"#define __BUILTINBC(ret,name,params) ret __builtin_##name params __RENAME(\"__bound_\"#name);\n"
|
|
||||||
"#define __BOUND(ret,name,params) ret name params __RENAME(\"__bound_\"#name);\n"
|
|
||||||
"#else\n"
|
|
||||||
"#define __BUILTINBC(ret,name,params) ret __builtin_##name params __RENAME(#name);\n"
|
|
||||||
"#define __BOUND(ret,name,params)\n"
|
|
||||||
"#endif\n"
|
|
||||||
"#define __BOTH(ret,name,params) __BUILTINBC(ret,name,params)__BOUND(ret,name,params)\n"
|
|
||||||
"#define __BUILTIN(ret,name,params) ret __builtin_##name params __RENAME(#name);\n"
|
|
||||||
"__BOTH(void*,memcpy,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(void*,memmove,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(void*,memset,(void*,int,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(int,memcmp,(const void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(__SIZE_TYPE__,strlen,(const char*))\n"
|
|
||||||
"__BOTH(char*,strcpy,(char*,const char*))\n"
|
|
||||||
"__BOTH(char*,strncpy,(char*,const char*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(int,strcmp,(const char*,const char*))\n"
|
|
||||||
"__BOTH(int,strncmp,(const char*,const char*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOTH(char*,strcat,(char*,const char*))\n"
|
|
||||||
"__BOTH(char*,strchr,(const char*,int))\n"
|
|
||||||
"__BOTH(char*,strdup,(const char*))\n"
|
|
||||||
#if TCC_TARGET_PE || TARGETOS_OpenBSD || TARGETOS_FreeBSD || TARGETOS_NetBSD
|
|
||||||
"#define __MAYBE_REDIR __BOTH\n"
|
|
||||||
#else // HAVE MALLOC_REDIR
|
|
||||||
"#define __MAYBE_REDIR __BUILTIN\n"
|
|
||||||
#endif
|
|
||||||
"__MAYBE_REDIR(void*,malloc,(__SIZE_TYPE__))\n"
|
|
||||||
"__MAYBE_REDIR(void*,realloc,(void*,__SIZE_TYPE__))\n"
|
|
||||||
"__MAYBE_REDIR(void*,calloc,(__SIZE_TYPE__,__SIZE_TYPE__))\n"
|
|
||||||
"__MAYBE_REDIR(void*,memalign,(__SIZE_TYPE__,__SIZE_TYPE__))\n"
|
|
||||||
"__MAYBE_REDIR(void,free,(void*))\n"
|
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
|
||||||
"__BOTH(void*,alloca,(__SIZE_TYPE__))\n"
|
|
||||||
#else
|
|
||||||
"__BUILTIN(void*,alloca,(__SIZE_TYPE__))\n"
|
|
||||||
#endif
|
|
||||||
#if defined(TCC_TARGET_ARM) && defined(TCC_ARM_EABI)
|
|
||||||
"__BOUND(void*,__aeabi_memcpy,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOUND(void*,__aeabi_memmove,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOUND(void*,__aeabi_memmove4,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOUND(void*,__aeabi_memmove8,(void*,const void*,__SIZE_TYPE__))\n"
|
|
||||||
"__BOUND(void*,__aeabi_memset,(void*,int,__SIZE_TYPE__))\n"
|
|
||||||
#endif
|
|
||||||
"__BUILTIN(void,abort,(void))\n"
|
|
||||||
"__BOUND(void,longjmp,())\n"
|
|
||||||
#ifndef TCC_TARGET_PE
|
|
||||||
"__BOUND(void*,mmap,())\n"
|
|
||||||
"__BOUND(int,munmap,())\n"
|
|
||||||
#endif
|
|
||||||
"#undef __BUILTINBC\n"
|
|
||||||
"#undef __BUILTIN\n"
|
|
||||||
"#undef __BOUND\n"
|
|
||||||
"#undef __BOTH\n"
|
|
||||||
"#undef __MAYBE_REDIR\n"
|
|
||||||
"#undef __RENAME\n"
|
|
||||||
, -1);
|
, -1);
|
||||||
|
#ifdef TCC_TARGET_ARM
|
||||||
|
if (s1->float_abi == ARM_HARD_FLOAT)
|
||||||
|
cstr_printf(cs, "#define __ARM_PCS_VFP 1\n");
|
||||||
|
#endif
|
||||||
|
cstr_cat(cs,
|
||||||
|
/* target platform */
|
||||||
|
#ifdef TCC_TARGET_PE
|
||||||
|
"#define _WIN32 1\n"
|
||||||
|
#else
|
||||||
|
"#define __unix__ 1\n"
|
||||||
|
"#define __unix 1\n"
|
||||||
|
# if defined TCC_TARGET_MACHO
|
||||||
|
"#define __APPLE__ 1\n"
|
||||||
|
# elif TARGETOS_FreeBSD
|
||||||
|
"#define __FreeBSD__ 12\n"
|
||||||
|
# elif TARGETOS_FreeBSD_kernel
|
||||||
|
"#define __FreeBSD_kernel__ 1\n"
|
||||||
|
# elif TARGETOS_NetBSD
|
||||||
|
"#define __NetBSD__ 1\n"
|
||||||
|
# elif TARGETOS_OpenBSD
|
||||||
|
"#define __OpenBSD__ 1\n"
|
||||||
|
# else
|
||||||
|
"#define __linux__ 1\n"
|
||||||
|
"#define __linux 1\n"
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
, -1);
|
||||||
|
if (is_asm)
|
||||||
|
cstr_printf(cs, "#define __ASSEMBLER__ 1\n");
|
||||||
|
if (s1->output_type == TCC_OUTPUT_PREPROCESS)
|
||||||
|
cstr_printf(cs, "#define __TCC_PP__ 1\n");
|
||||||
|
if (s1->output_type == TCC_OUTPUT_MEMORY)
|
||||||
|
cstr_printf(cs, "#define __TCC_RUN__ 1\n");
|
||||||
|
if (s1->char_is_unsigned)
|
||||||
|
cstr_printf(cs, "#define __CHAR_UNSIGNED__ 1\n");
|
||||||
|
if (s1->optimize > 0)
|
||||||
|
cstr_printf(cs, "#define __OPTIMIZE__ 1\n");
|
||||||
|
if (s1->option_pthread)
|
||||||
|
cstr_printf(cs, "#define _REENTRANT 1\n");
|
||||||
|
if (s1->leading_underscore)
|
||||||
|
cstr_printf(cs, "#define __leading_underscore 1\n");
|
||||||
|
#ifdef CONFIG_TCC_BCHECK
|
||||||
|
if (s1->do_bounds_check)
|
||||||
|
cstr_printf(cs, "#define __BOUNDS_CHECKING_ON 1\n");
|
||||||
|
#endif
|
||||||
|
cstr_printf(cs, "#define __SIZEOF_POINTER__ %d\n", PTR_SIZE);
|
||||||
|
cstr_printf(cs, "#define __SIZEOF_LONG__ %d\n", LONG_SIZE);
|
||||||
|
if (!is_asm) {
|
||||||
|
cstr_printf(cs, "#define __STDC__ 1\n");
|
||||||
|
cstr_printf(cs, "#define __STDC_VERSION__ %dL\n", s1->cversion);
|
||||||
|
cstr_cat(cs,
|
||||||
|
/* load more predefs and __builtins */
|
||||||
|
#if CONFIG_TCC_PREDEFS
|
||||||
|
#include "tccdefs_.h" /* include as strings */
|
||||||
|
#else
|
||||||
|
"#include <tccdefs.h>\n" /* load at runtime */
|
||||||
|
#endif
|
||||||
|
, -1);
|
||||||
|
}
|
||||||
|
cstr_printf(cs, "#define __BASE_FILE__ \"%s\"\n", file->filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
ST_FUNC void preprocess_start(TCCState *s1, int filetype)
|
ST_FUNC void preprocess_start(TCCState *s1, int filetype)
|
||||||
|
@ -3759,15 +3751,9 @@ ST_FUNC void preprocess_start(TCCState *s1, int filetype)
|
||||||
|
|
||||||
if (!(filetype & AFF_TYPE_ASM)) {
|
if (!(filetype & AFF_TYPE_ASM)) {
|
||||||
cstr_new(&cstr);
|
cstr_new(&cstr);
|
||||||
|
tcc_predefs(s1, &cstr, is_asm);
|
||||||
if (s1->cmdline_defs.size)
|
if (s1->cmdline_defs.size)
|
||||||
cstr_cat(&cstr, s1->cmdline_defs.data, s1->cmdline_defs.size);
|
cstr_cat(&cstr, s1->cmdline_defs.data, s1->cmdline_defs.size);
|
||||||
cstr_printf(&cstr, "#define __BASE_FILE__ \"%s\"\n", file->filename);
|
|
||||||
if (is_asm)
|
|
||||||
cstr_printf(&cstr, "#define __ASSEMBLER__ 1\n");
|
|
||||||
if (s1->output_type == TCC_OUTPUT_MEMORY)
|
|
||||||
cstr_printf(&cstr, "#define __TCC_RUN__ 1\n");
|
|
||||||
if (!is_asm && s1->output_type != TCC_OUTPUT_PREPROCESS)
|
|
||||||
tcc_predefs(&cstr);
|
|
||||||
if (s1->cmdline_incl.size)
|
if (s1->cmdline_incl.size)
|
||||||
cstr_cat(&cstr, s1->cmdline_incl.data, s1->cmdline_incl.size);
|
cstr_cat(&cstr, s1->cmdline_incl.data, s1->cmdline_incl.size);
|
||||||
//printf("%s\n", (char*)cstr.data);
|
//printf("%s\n", (char*)cstr.data);
|
||||||
|
|
|
@ -1,6 +1,26 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
/* replace native host macros by compile-time versions */
|
||||||
|
const char *platform_macros[] = {
|
||||||
|
"__i386__", "TCC_TARGET_I386",
|
||||||
|
"__x86_64__", "TCC_TARGET_X86_64",
|
||||||
|
"_WIN32", "TCC_TARGET_PE",
|
||||||
|
"__arm__", "TCC_TARGET_ARM",
|
||||||
|
"__ARM_EABI__", "TCC_ARM_EABI",
|
||||||
|
"__aarch64__", "TCC_TARGET_ARM64",
|
||||||
|
"__riscv", "TCC_TARGET_RISCV64",
|
||||||
|
"__APPLE__", "TCC_TARGET_MACHO",
|
||||||
|
"__FreeBSD__", "TARGETOS_FreeBSD",
|
||||||
|
"__FreeBSD_kernel__", "TARGETOS_FreeBSD_kernel",
|
||||||
|
"__OpenBSD__", "TARGETOS_OpenBSD",
|
||||||
|
"__NetBSD__", "TARGETOS_NetBSD",
|
||||||
|
"__linux__", "TARGETOS_Linux",
|
||||||
|
"__SIZEOF_POINTER__", "PTR_SIZE",
|
||||||
|
"__SIZEOF_LONG__", "LONG_SIZE",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
int isid(int c)
|
int isid(int c)
|
||||||
{
|
{
|
||||||
return (c >= 'a' && c <= 'z')
|
return (c >= 'a' && c <= 'z')
|
||||||
|
@ -16,9 +36,10 @@ int isspc(int c)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
char l[1000], *p, l2[1000], *q;
|
unsigned char l[1000], l2[1000], *p, *q, *p0;
|
||||||
FILE *fp, *op;
|
FILE *fp, *op;
|
||||||
int c, e, f;
|
int c, e, f, cmt, cmt_n;
|
||||||
|
const char *r;
|
||||||
|
|
||||||
if (argc < 3)
|
if (argc < 3)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -30,79 +51,104 @@ int main(int argc, char **argv)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cmt = cmt_n = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
p = l;
|
p = l;
|
||||||
append:
|
append:
|
||||||
if (fgets(p, sizeof l - (p - l), fp)) {
|
if (fgets(p, sizeof l - (p - l), fp)) {
|
||||||
p = strchr(p, 0);
|
p = strchr(p, 0);
|
||||||
while (p > l && p[-1] == '\n')
|
while (p > l && p[-1] <= ' ')
|
||||||
--p;
|
--p;
|
||||||
*p = 0;
|
*p = 0;
|
||||||
} else if (p == l)
|
} else if (p == l)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* check for continuation */
|
||||||
if (p > l && p[-1] == '\\') {
|
if (p > l && p[-1] == '\\') {
|
||||||
--p;
|
p[-1] = ' ';
|
||||||
goto append;
|
goto append;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (l[0] == 0)
|
p = l, q = l2, f = 0;
|
||||||
continue;
|
/* count & skip leading spaces */
|
||||||
p = l, q = l2, f = e = 0;
|
|
||||||
while (*p && isspc(*p))
|
while (*p && isspc(*p))
|
||||||
++p, ++f;
|
++p, ++f;
|
||||||
|
|
||||||
|
/* handle comments */
|
||||||
|
if (p[0] == '/' && cmt == 0) {
|
||||||
|
if (p[1] == '*')
|
||||||
|
cmt = 2;
|
||||||
|
if (p[1] == '/')
|
||||||
|
cmt = 1;
|
||||||
|
}
|
||||||
|
if (cmt) {
|
||||||
|
fprintf(op, "%s", l);
|
||||||
|
if (++cmt_n == 1)
|
||||||
|
fprintf(op, " (converted, do not edit this file)", l);
|
||||||
|
fprintf(op, "\n");
|
||||||
|
if (cmt == 1)
|
||||||
|
cmt = 0;
|
||||||
|
if (cmt == 2) {
|
||||||
|
p = strchr(l, 0);
|
||||||
|
if (p >= l + 2 && p[-1] == '/' && p[-2] == '*')
|
||||||
|
cmt = 0;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (f < 4) {
|
if (f < 4) {
|
||||||
|
/* less than 4 leading spaces : no quotes but replace macros
|
||||||
|
by compile-time versions */
|
||||||
do {
|
do {
|
||||||
static const char *sr[] = {
|
for (f = 0; (r = platform_macros[f]); f += 2) {
|
||||||
"__x86_64__", "TCC_TARGET_X86_64",
|
c = strlen(r);
|
||||||
"_WIN64", "TCC_TARGET_PE",
|
e = 0;
|
||||||
"_WIN32", "TCC_TARGET_PE",
|
/*if (memcmp(p, "defined ", 8))
|
||||||
"__arm__", "TCC_TARGET_ARM",
|
e = 8;*/
|
||||||
"__aarch64__", "TCC_TARGET_ARM64",
|
if (0 == memcmp(p + e, r, c)) {
|
||||||
"__riscv", "TCC_TARGET_RISCV64",
|
p += e + c;
|
||||||
"__i386__", "TCC_TARGET_I386", 0 };
|
q = strchr(strcpy(q, platform_macros[f + 1]), 0);
|
||||||
for (f = 0; sr[f]; f += 2) {
|
|
||||||
c = strlen(sr[f]);
|
|
||||||
if (0 == memcmp(p, sr[f], c)) {
|
|
||||||
p += c, ++f;
|
|
||||||
q = strchr(strcpy(q, sr[f]), 0);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (sr[f])
|
if (r)
|
||||||
continue;
|
continue;
|
||||||
} while (!!(*q++ = *p++));
|
} while (!!(*q++ = *p++));
|
||||||
|
|
||||||
fprintf(op, "%s\n", l2);
|
fprintf(op, "%s\n", l2);
|
||||||
|
continue;
|
||||||
} else if (*p == '/') {
|
|
||||||
strcpy(q, p);
|
|
||||||
fprintf(op, " %s\n", l2);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
f = 0;
|
/* output line as C string */
|
||||||
|
e = f = 0, p0 = p;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
c = *p++;
|
c = *p++;
|
||||||
|
|
||||||
|
if (c == '/' && (p[0] == '/' || p[0] == '*'))
|
||||||
|
c = 0; /* trailing comment detected */
|
||||||
|
|
||||||
if (isspc(c)) {
|
if (isspc(c)) {
|
||||||
|
/* remove spaces if possible */
|
||||||
if (q == l2 || isspc(q[-1]))
|
if (q == l2 || isspc(q[-1]))
|
||||||
continue;
|
continue;
|
||||||
if ((f > 2 || e) || (q[-1] != ')' && *p != '(')) {
|
/* keep space after macro identifier */
|
||||||
if (!isid(q[-1]) || !isid(*p))
|
if ((f >= 2 || e) && (!isid(q[-1]) || !isid(*p)))
|
||||||
continue;
|
continue;
|
||||||
}
|
if (f == 1)
|
||||||
|
f = 2;
|
||||||
}
|
}
|
||||||
if (c == '(')
|
if (c == '(')
|
||||||
++e, ++f;
|
++e;
|
||||||
if (c == ')')
|
if (c == ')')
|
||||||
--e, ++f;
|
--e, f += e == 0;
|
||||||
if (c == '\\' || c == '\"')
|
if (c == '\\' || c == '\"')
|
||||||
*q++ = '\\';
|
*q++ = '\\';
|
||||||
*q++ = c;
|
*q++ = c;
|
||||||
if (c == 0)
|
if (c == 0)
|
||||||
break;
|
break;
|
||||||
|
p0 = p;
|
||||||
}
|
}
|
||||||
fprintf(op, " \"%s\\n\"\n", l2);
|
fprintf(op, " \"%s\\n\"%s\n", l2, p0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
#if defined __x86_64__
|
|
||||||
#ifndef _WIN64
|
|
||||||
/* GCC compatible definition of va_list. */
|
|
||||||
/* This should be in sync with the declaration in our lib/libtcc1.c */
|
|
||||||
typedef struct {
|
|
||||||
unsigned gp_offset, fp_offset;
|
|
||||||
union {
|
|
||||||
unsigned overflow_offset;
|
|
||||||
char *overflow_arg_area;
|
|
||||||
};
|
|
||||||
char *reg_save_area;
|
|
||||||
} __builtin_va_list[1];
|
|
||||||
|
|
||||||
void *__va_arg(__builtin_va_list ap, int arg_type, int size, int align);
|
|
||||||
#define __builtin_va_start(ap, last) \
|
|
||||||
(*(ap) = *(__builtin_va_list)((char*)__builtin_frame_address(0) - 24))
|
|
||||||
#define __builtin_va_arg(ap, t) \
|
|
||||||
(*(t *)(__va_arg(ap, __builtin_va_arg_types(t), sizeof(t), __alignof__(t))))
|
|
||||||
#define __builtin_va_copy(dest, src) (*(dest) = *(src))
|
|
||||||
|
|
||||||
#else /* _WIN64 */
|
|
||||||
typedef char *__builtin_va_list;
|
|
||||||
#define __builtin_va_arg(ap, t) ((sizeof(t) > 8 || (sizeof(t) & (sizeof(t) - 1))) \
|
|
||||||
? **(t **)((ap += 8) - 8) : *(t *)((ap += 8) - 8))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined __arm__
|
|
||||||
typedef char *__builtin_va_list;
|
|
||||||
#define _tcc_alignof(type) ((int)&((struct {char c;type x;} *)0)->x)
|
|
||||||
#define _tcc_align(addr,type) (((unsigned)addr + _tcc_alignof(type) - 1) \
|
|
||||||
& ~(_tcc_alignof(type) - 1))
|
|
||||||
#define __builtin_va_start(ap,last) (ap = ((char *)&(last)) + ((sizeof(last)+3)&~3))
|
|
||||||
#define __builtin_va_arg(ap,type) (ap = (void *) ((_tcc_align(ap,type)+sizeof(type)+3) \
|
|
||||||
&~3), *(type *)(ap - ((sizeof(type)+3)&~3)))
|
|
||||||
|
|
||||||
#elif defined __aarch64__
|
|
||||||
typedef struct {
|
|
||||||
void *__stack, *__gr_top, *__vr_top;
|
|
||||||
int __gr_offs, __vr_offs;
|
|
||||||
} __builtin_va_list;
|
|
||||||
|
|
||||||
#elif defined __riscv
|
|
||||||
typedef char *__builtin_va_list;
|
|
||||||
#define __va_reg_size (__riscv_xlen >> 3)
|
|
||||||
#define _tcc_align(addr,type) (((unsigned long)addr + __alignof__(type) - 1) \
|
|
||||||
& -(__alignof__(type)))
|
|
||||||
#define __builtin_va_arg(ap,type) (*(sizeof(type) > (2*__va_reg_size) ? *(type **)((ap += __va_reg_size) - __va_reg_size) : (ap = (va_list)(_tcc_align(ap,type) + (sizeof(type)+__va_reg_size - 1)& -__va_reg_size), (type *)(ap - ((sizeof(type)+ __va_reg_size - 1)& -__va_reg_size)))))
|
|
||||||
|
|
||||||
#else /* __i386__ */
|
|
||||||
typedef char *__builtin_va_list;
|
|
||||||
#define __builtin_va_start(ap,last) (ap = ((char *)&(last)) + ((sizeof(last)+3)&~3))
|
|
||||||
#define __builtin_va_arg(ap,t) (*(t*)((ap+=(sizeof(t)+3)&~3)-((sizeof(t)+3)&~3)))
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#define __builtin_va_end(ap) (void)(ap)
|
|
||||||
#ifndef __builtin_va_copy
|
|
||||||
# define __builtin_va_copy(dest, src) (dest) = (src)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* TCC BBUILTIN AND BOUNDS ALIASES */
|
|
||||||
#ifdef __BOUNDS_CHECKING_ON
|
|
||||||
# define __BUILTIN(ret,name,params) \
|
|
||||||
ret __builtin_##name params __attribute__((alias("__bound_" #name)));
|
|
||||||
# define __BOUND(ret,name,params) \
|
|
||||||
ret name params __attribute__((alias("__bound_" #name)));
|
|
||||||
#else
|
|
||||||
# define __BUILTIN(ret,name,params) \
|
|
||||||
ret __builtin_##name params __attribute__((alias(#name)));
|
|
||||||
# define __BOUND(ret,name,params)
|
|
||||||
#endif
|
|
||||||
# define __BOTH(ret,name,params) \
|
|
||||||
__BUILTIN(ret,name,params) __BOUND(ret,name,params)
|
|
||||||
|
|
||||||
__BOTH(void*, memcpy, (void *, const void*, __SIZE_TYPE__))
|
|
||||||
__BOTH(void*, memmove, (void *, const void*, __SIZE_TYPE__))
|
|
||||||
__BOTH(void*, memset, (void *, int, __SIZE_TYPE__))
|
|
||||||
__BOTH(int, memcmp, (const void *, const void*, __SIZE_TYPE__))
|
|
||||||
__BOTH(__SIZE_TYPE__, strlen, (const char *))
|
|
||||||
__BOTH(char*, strcpy, (char *, const char *))
|
|
||||||
__BOTH(char*, strncpy, (char *, const char*, __SIZE_TYPE__))
|
|
||||||
__BOTH(int, strcmp, (const char*, const char*))
|
|
||||||
__BOTH(int, strncmp, (const char*, const char*, __SIZE_TYPE__))
|
|
||||||
__BOTH(char*, strcat, (char*, const char*))
|
|
||||||
__BOTH(char*, strchr, (const char*, int))
|
|
||||||
__BOTH(char*, strdup, (const char*))
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define __MAYBE_REDIR __BOTH
|
|
||||||
#else // HAVE MALLOC_REDIR
|
|
||||||
#define __MAYBE_REDIR __BUILTIN
|
|
||||||
#endif
|
|
||||||
__MAYBE_REDIR(void*, malloc, (__SIZE_TYPE__))
|
|
||||||
__MAYBE_REDIR(void*, realloc, (void *, __SIZE_TYPE__))
|
|
||||||
__MAYBE_REDIR(void*, calloc, (__SIZE_TYPE__, __SIZE_TYPE__))
|
|
||||||
__MAYBE_REDIR(void*, memalign, (__SIZE_TYPE__, __SIZE_TYPE__))
|
|
||||||
__MAYBE_REDIR(void, free, (void*))
|
|
||||||
|
|
||||||
#if defined __i386__ || defined __x86_64__
|
|
||||||
__BOTH(void*, alloca, (__SIZE_TYPE__))
|
|
||||||
#endif
|
|
||||||
__BUILTIN(void, abort, (void))
|
|
||||||
__BOUND(int, longjmp, ())
|
|
||||||
#ifndef _WIN32
|
|
||||||
__BOUND(void*, mmap, ())
|
|
||||||
__BOUND(void*, munmap, ())
|
|
||||||
#endif
|
|
||||||
#undef __BUILTIN
|
|
||||||
#undef __BOUND
|
|
||||||
#undef __BOTH
|
|
||||||
#undef __MAYBE_REDIR
|
|
Loading…
Reference in a new issue