mirror of
https://github.com/mirror/tinycc.git
synced 2025-02-04 06:30:10 +08:00
tcc: re-enable correct option -r support
Forgot about it. It allows to compile several sources (and other .o's) to one single .o file; tcc -r -o all.o f1.c f2.c f3.S o4.o ... Also: - option -fold-struct-init-code removed, no effect anymore - (tcc_)set_environment() moved to tcc.c - win32/lib/(win)crt1 minor fix & add dependency - debug line output for asm (tcc -c -g xxx.S) enabled - configure/Makefiles: x86-64 -> x86_64 changes - README: cleanup
This commit is contained in:
parent
399237850d
commit
5f33d313c8
@ -16,14 +16,14 @@ Platforms:
|
|||||||
- vastly improved support for ARM hard float calling convention
|
- vastly improved support for ARM hard float calling convention
|
||||||
(Thomas Preud'homme, Daniel Glöckner)
|
(Thomas Preud'homme, Daniel Glöckner)
|
||||||
- provide a runtime library for ARM (Thomas Preud'homme)
|
- provide a runtime library for ARM (Thomas Preud'homme)
|
||||||
- many x86-64 ABI fixes incl. XMM register passing and tests (James Lyon)
|
- many x86_64 ABI fixes incl. XMM register passing and tests (James Lyon)
|
||||||
- ABI tests with native compiler using libtcc (James Lyon)
|
- ABI tests with native compiler using libtcc (James Lyon)
|
||||||
- UNICODE startup code supports wmain and wWinMain (YX Hao)
|
- UNICODE startup code supports wmain and wWinMain (YX Hao)
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
- VLA (variable length array) improved (James Lyon, Pip Cet)
|
- VLA (variable length array) improved (James Lyon, Pip Cet)
|
||||||
- import functions by ordinal in .def files on windows (YX Hao)
|
- import functions by ordinal in .def files on windows (YX Hao)
|
||||||
- x86/x86-64 assembler much improved (Michael Matz)
|
- x86/x86_64 assembler much improved (Michael Matz)
|
||||||
- simple dead code suppression (Edmund Grimley Evans, Michael Matz, grischka)
|
- simple dead code suppression (Edmund Grimley Evans, Michael Matz, grischka)
|
||||||
- implement round/fmin/fmax etc. math on windows (Avi Halachmi)
|
- implement round/fmin/fmax etc. math on windows (Avi Halachmi)
|
||||||
- #pragma once support (Sergey Korshunoff, Vlad Vissoultchev, ...)
|
- #pragma once support (Sergey Korshunoff, Vlad Vissoultchev, ...)
|
||||||
|
6
Makefile
6
Makefile
@ -56,7 +56,7 @@ LDFLAGS_P = $(LDFLAGS)
|
|||||||
|
|
||||||
CONFIG_$(ARCH) = yes
|
CONFIG_$(ARCH) = yes
|
||||||
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
||||||
NATIVE_DEFINES_$(CONFIG_x86-64) += -DTCC_TARGET_X86_64
|
NATIVE_DEFINES_$(CONFIG_x86_64) += -DTCC_TARGET_X86_64
|
||||||
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
||||||
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
||||||
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
||||||
@ -95,7 +95,7 @@ ARM64_FILES = $(CORE_FILES) arm64-gen.c arm64-link.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
|
||||||
|
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
ifeq ($(ARCH),x86-64)
|
ifeq ($(ARCH),x86_64)
|
||||||
NATIVE_FILES=$(WIN64_FILES)
|
NATIVE_FILES=$(WIN64_FILES)
|
||||||
PROGS_CROSS=$(WIN32_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
PROGS_CROSS=$(WIN32_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a
|
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a
|
||||||
@ -110,7 +110,7 @@ NATIVE_FILES=$(I386_FILES)
|
|||||||
PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
PROGS_CROSS=$(X64_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
|
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
|
||||||
|
|
||||||
else ifeq ($(ARCH),x86-64)
|
else ifeq ($(ARCH),x86_64)
|
||||||
NATIVE_FILES=$(X86_64_FILES)
|
NATIVE_FILES=$(X86_64_FILES)
|
||||||
PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
PROGS_CROSS=$(I386_CROSS) $(WIN32_CROSS) $(WIN64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||||
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
|
LIBTCC1_CROSS=lib/i386-win32/libtcc1.a lib/x86_64-win32/libtcc1.a
|
||||||
|
21
README
21
README
@ -28,28 +28,19 @@ Features:
|
|||||||
Documentation:
|
Documentation:
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host (for Windows read tcc-win32.txt)
|
1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host
|
||||||
|
|
||||||
Note: For OSX and FreeBSD, gmake should be used instead of make.
|
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
make test
|
make test
|
||||||
make install
|
make install
|
||||||
|
|
||||||
Alternatively, out-of-tree builds are supported: you may use different
|
Notes: For OSX and FreeBSD, gmake should be used instead of make.
|
||||||
directories to hold build objects, kept separate from your source tree:
|
For Windows read tcc-win32.txt.
|
||||||
|
|
||||||
mkdir _build
|
makeinfo must be installed to compile the doc. By default, tcc is
|
||||||
cd _build
|
installed in /usr/local/bin. ./configure --help shows configuration
|
||||||
../configure
|
options.
|
||||||
make
|
|
||||||
make test
|
|
||||||
make install
|
|
||||||
|
|
||||||
Texi2html must be installed to compile the doc.
|
|
||||||
By default, tcc is installed in /usr/local/bin.
|
|
||||||
./configure --help shows configuration options.
|
|
||||||
|
|
||||||
|
|
||||||
2) Introduction
|
2) Introduction
|
||||||
|
10
configure
vendored
10
configure
vendored
@ -163,8 +163,8 @@ case "$cpu" in
|
|||||||
x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
|
x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
|
||||||
cpu="x86"
|
cpu="x86"
|
||||||
;;
|
;;
|
||||||
x86_64|amd64)
|
x86_64|amd64|x86-64)
|
||||||
cpu="x86-64"
|
cpu="x86_64"
|
||||||
;;
|
;;
|
||||||
arm*)
|
arm*)
|
||||||
case "$cpu" in
|
case "$cpu" in
|
||||||
@ -332,7 +332,7 @@ if test -z "$cross_prefix" ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test -z "$triplet"; then
|
if test -z "$triplet"; then
|
||||||
if test $cpu = "x86-64" -o $cpu = "aarch64" ; then
|
if test $cpu = "x86_64" -o $cpu = "aarch64" ; then
|
||||||
if test -f "/usr/lib64/crti.o" ; then
|
if test -f "/usr/lib64/crti.o" ; then
|
||||||
tcc_lddir="lib64"
|
tcc_lddir="lib64"
|
||||||
fi
|
fi
|
||||||
@ -453,8 +453,8 @@ echo "#define GCC_MINOR $gcc_minor" >> $TMPH
|
|||||||
|
|
||||||
if test "$cpu" = "x86" ; then
|
if test "$cpu" = "x86" ; then
|
||||||
echo "ARCH=i386" >> config.mak
|
echo "ARCH=i386" >> config.mak
|
||||||
elif test "$cpu" = "x86-64" ; then
|
elif test "$cpu" = "x86_64" ; then
|
||||||
echo "ARCH=x86-64" >> config.mak
|
echo "ARCH=x86_64" >> config.mak
|
||||||
elif test "$cpu" = "armv4l" ; then
|
elif test "$cpu" = "armv4l" ; then
|
||||||
echo "ARCH=arm" >> config.mak
|
echo "ARCH=arm" >> config.mak
|
||||||
echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
|
echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
|
||||||
|
@ -9,14 +9,14 @@ VPATH = $(TOPSRC)/lib $(TOPSRC)/win32/lib
|
|||||||
ifndef TARGET
|
ifndef TARGET
|
||||||
# we're building the native libtcc1.a
|
# we're building the native libtcc1.a
|
||||||
ifdef CONFIG_WIN32
|
ifdef CONFIG_WIN32
|
||||||
ifeq ($(ARCH),x86-64)
|
ifeq ($(ARCH),x86_64)
|
||||||
TARGET = x86_64-win32
|
TARGET = x86_64-win32
|
||||||
else
|
else
|
||||||
TARGET = i386-win32
|
TARGET = i386-win32
|
||||||
endif
|
endif
|
||||||
else ifeq ($(ARCH),i386)
|
else ifeq ($(ARCH),i386)
|
||||||
TARGET = i386
|
TARGET = i386
|
||||||
else ifeq ($(ARCH),x86-64)
|
else ifeq ($(ARCH),x86_64)
|
||||||
TARGET = x86_64
|
TARGET = x86_64
|
||||||
else ifeq ($(ARCH),arm)
|
else ifeq ($(ARCH),arm)
|
||||||
TARGET = arm
|
TARGET = arm
|
||||||
@ -83,6 +83,9 @@ $(DIR)/%.o : %.c
|
|||||||
$(DIR)/%.o : %.S
|
$(DIR)/%.o : %.S
|
||||||
$(XCC) -c $< -o $@ $(TGT) $(XFLAGS)
|
$(XCC) -c $< -o $@ $(TGT) $(XFLAGS)
|
||||||
|
|
||||||
|
$(DIR)/crt1w.o : crt1.c
|
||||||
|
$(DIR)/wincrt1w.o : wincrt1.c
|
||||||
|
|
||||||
$(OBJ) : $(DIR)/exists
|
$(OBJ) : $(DIR)/exists
|
||||||
|
|
||||||
%/exists :
|
%/exists :
|
||||||
|
19
libtcc.c
19
libtcc.c
@ -1572,7 +1572,6 @@ static const FlagDef options_f[] = {
|
|||||||
{ offsetof(TCCState, nocommon), FD_INVERT, "common" },
|
{ offsetof(TCCState, nocommon), FD_INVERT, "common" },
|
||||||
{ offsetof(TCCState, leading_underscore), 0, "leading-underscore" },
|
{ offsetof(TCCState, leading_underscore), 0, "leading-underscore" },
|
||||||
{ offsetof(TCCState, ms_extensions), 0, "ms-extensions" },
|
{ offsetof(TCCState, ms_extensions), 0, "ms-extensions" },
|
||||||
{ offsetof(TCCState, old_struct_init_code), 0, "old-struct-init-code" },
|
|
||||||
{ offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" },
|
{ offsetof(TCCState, dollars_in_identifiers), 0, "dollars-in-identifiers" },
|
||||||
{ 0, 0, NULL }
|
{ 0, 0, NULL }
|
||||||
};
|
};
|
||||||
@ -1984,21 +1983,3 @@ PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time)
|
|||||||
fprintf(stderr, "* %d bytes memory used\n", mem_max_size);
|
fprintf(stderr, "* %d bytes memory used\n", mem_max_size);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PUB_FUNC void tcc_set_environment(TCCState *s)
|
|
||||||
{
|
|
||||||
char * path;
|
|
||||||
|
|
||||||
path = getenv("C_INCLUDE_PATH");
|
|
||||||
if(path != NULL) {
|
|
||||||
tcc_add_include_path(s, path);
|
|
||||||
}
|
|
||||||
path = getenv("CPATH");
|
|
||||||
if(path != NULL) {
|
|
||||||
tcc_add_include_path(s, path);
|
|
||||||
}
|
|
||||||
path = getenv("LIBRARY_PATH");
|
|
||||||
if(path != NULL) {
|
|
||||||
tcc_add_library_path(s, path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -387,10 +387,10 @@ gcc's algorithm.
|
|||||||
Select the float ABI. Possible values: @code{softfp} and @code{hard}
|
Select the float ABI. Possible values: @code{softfp} and @code{hard}
|
||||||
|
|
||||||
@item -mno-sse
|
@item -mno-sse
|
||||||
Do not use sse registers on x86-64
|
Do not use sse registers on x86_64
|
||||||
|
|
||||||
@item -m32, -m64
|
@item -m32, -m64
|
||||||
Pass command line to the i386/x86-64 cross compiler.
|
Pass command line to the i386/x86_64 cross compiler.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
52
tcc.c
52
tcc.c
@ -104,9 +104,8 @@ static const char help2[] =
|
|||||||
" signed-char default char is signed\n"
|
" signed-char default char is signed\n"
|
||||||
" common use common section instead of bss\n"
|
" common use common section instead of bss\n"
|
||||||
" leading-underscore decorate extern symbols\n"
|
" leading-underscore decorate extern symbols\n"
|
||||||
" ms-extensions allow struct w/o identifier\n"
|
" ms-extensions allow anonymous struct in struct\n"
|
||||||
" dollars-in-identifiers allow '$' in C symbols\n"
|
" dollars-in-identifiers allow '$' in C symbols\n"
|
||||||
" old-struct-init-code some hack for parsing initializers\n"
|
|
||||||
"-m... target specific options:\n"
|
"-m... target specific options:\n"
|
||||||
" ms-bitfields use MSVC bitfield layout\n"
|
" ms-bitfields use MSVC bitfield layout\n"
|
||||||
#ifdef TCC_TARGET_ARM
|
#ifdef TCC_TARGET_ARM
|
||||||
@ -151,32 +150,18 @@ static const char version[] =
|
|||||||
"C67"
|
"C67"
|
||||||
#elif defined TCC_TARGET_ARM
|
#elif defined TCC_TARGET_ARM
|
||||||
"ARM"
|
"ARM"
|
||||||
# ifdef TCC_ARM_HARDFLOAT
|
|
||||||
" Hard Float"
|
|
||||||
# endif
|
|
||||||
#elif defined TCC_TARGET_ARM64
|
#elif defined TCC_TARGET_ARM64
|
||||||
"AArch64"
|
"AArch64"
|
||||||
# ifdef TCC_ARM_HARDFLOAT
|
#endif
|
||||||
|
#ifdef TCC_ARM_HARDFLOAT
|
||||||
" Hard Float"
|
" Hard Float"
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef TCC_TARGET_PE
|
#ifdef TCC_TARGET_PE
|
||||||
" Windows"
|
" Windows"
|
||||||
#elif defined(__APPLE__)
|
|
||||||
/* Current Apple OS name as of 2016 */
|
|
||||||
" macOS"
|
|
||||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||||
" FreeBSD"
|
" FreeBSD"
|
||||||
#elif defined(__DragonFly__)
|
|
||||||
" DragonFly BSD"
|
|
||||||
#elif defined(__NetBSD__)
|
|
||||||
" NetBSD"
|
|
||||||
#elif defined(__OpenBSD__)
|
|
||||||
" OpenBSD"
|
|
||||||
#elif defined(__linux__)
|
|
||||||
" Linux"
|
|
||||||
#else
|
#else
|
||||||
" Unidentified system"
|
" Linux"
|
||||||
#endif
|
#endif
|
||||||
")\n"
|
")\n"
|
||||||
;
|
;
|
||||||
@ -201,6 +186,24 @@ static void print_search_dirs(TCCState *s)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_environment(TCCState *s)
|
||||||
|
{
|
||||||
|
char * path;
|
||||||
|
|
||||||
|
path = getenv("C_INCLUDE_PATH");
|
||||||
|
if(path != NULL) {
|
||||||
|
tcc_add_include_path(s, path);
|
||||||
|
}
|
||||||
|
path = getenv("CPATH");
|
||||||
|
if(path != NULL) {
|
||||||
|
tcc_add_include_path(s, path);
|
||||||
|
}
|
||||||
|
path = getenv("LIBRARY_PATH");
|
||||||
|
if(path != NULL) {
|
||||||
|
tcc_add_library_path(s, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static char *default_outputfile(TCCState *s, const char *first_file)
|
static char *default_outputfile(TCCState *s, const char *first_file)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
@ -265,9 +268,6 @@ redo:
|
|||||||
#endif
|
#endif
|
||||||
if (opt == OPT_V)
|
if (opt == OPT_V)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
tcc_set_environment(s);
|
|
||||||
|
|
||||||
if (opt == OPT_PRINT_DIRS) {
|
if (opt == OPT_PRINT_DIRS) {
|
||||||
/* initialize search dirs */
|
/* initialize search dirs */
|
||||||
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
|
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
|
||||||
@ -287,8 +287,8 @@ redo:
|
|||||||
if (!s->ppfp)
|
if (!s->ppfp)
|
||||||
tcc_error("could not write '%s'", s->outfile);
|
tcc_error("could not write '%s'", s->outfile);
|
||||||
}
|
}
|
||||||
} else if (s->output_type == TCC_OUTPUT_OBJ) {
|
} else if (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) {
|
||||||
if (s->nb_libraries != 0 && !s->option_r)
|
if (s->nb_libraries)
|
||||||
tcc_error("cannot specify libraries with -c");
|
tcc_error("cannot specify libraries with -c");
|
||||||
if (n > 1 && s->outfile)
|
if (n > 1 && s->outfile)
|
||||||
tcc_error("cannot specify output file with -c many files");
|
tcc_error("cannot specify output file with -c many files");
|
||||||
@ -301,6 +301,7 @@ redo:
|
|||||||
start_time = getclock_ms();
|
start_time = getclock_ms();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
set_environment(s);
|
||||||
if (s->output_type == 0)
|
if (s->output_type == 0)
|
||||||
s->output_type = TCC_OUTPUT_EXE;
|
s->output_type = TCC_OUTPUT_EXE;
|
||||||
tcc_set_output_type(s, s->output_type);
|
tcc_set_output_type(s, s->output_type);
|
||||||
@ -323,7 +324,8 @@ redo:
|
|||||||
}
|
}
|
||||||
s->filetype = 0;
|
s->filetype = 0;
|
||||||
s->alacarte_link = 1;
|
s->alacarte_link = 1;
|
||||||
if (ret || --n == 0 || s->output_type == TCC_OUTPUT_OBJ)
|
if (ret || --n == 0
|
||||||
|
|| (s->output_type == TCC_OUTPUT_OBJ && !s->option_r))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
13
tcc.h
13
tcc.h
@ -615,9 +615,7 @@ struct TCCState {
|
|||||||
/* C language options */
|
/* C language options */
|
||||||
int char_is_unsigned;
|
int char_is_unsigned;
|
||||||
int leading_underscore;
|
int leading_underscore;
|
||||||
int ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */
|
int ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */
|
||||||
int old_struct_init_code; /* use old algorithm to init array in struct when there is no '{' used.
|
|
||||||
Liuux 2.4.26 can't find initrd when compiled with a new algorithm */
|
|
||||||
int dollars_in_identifiers; /* allows '$' char in indentifiers */
|
int dollars_in_identifiers; /* allows '$' char in indentifiers */
|
||||||
int ms_bitfields; /* if true, emulate MS algorithm for aligning bitfields */
|
int ms_bitfields; /* if true, emulate MS algorithm for aligning bitfields */
|
||||||
|
|
||||||
@ -1147,10 +1145,8 @@ ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags);
|
|||||||
|
|
||||||
ST_FUNC void tcc_add_pragma_libs(TCCState *s1);
|
ST_FUNC void tcc_add_pragma_libs(TCCState *s1);
|
||||||
PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f);
|
PUB_FUNC int tcc_add_library_err(TCCState *s, const char *f);
|
||||||
|
|
||||||
PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time);
|
PUB_FUNC void tcc_print_stats(TCCState *s, unsigned total_time);
|
||||||
PUB_FUNC int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind);
|
PUB_FUNC int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind);
|
||||||
PUB_FUNC void tcc_set_environment(TCCState *s);
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
ST_FUNC char *normalize_slashes(char *path);
|
ST_FUNC char *normalize_slashes(char *path);
|
||||||
#endif
|
#endif
|
||||||
@ -1276,8 +1272,15 @@ ST_DATA int func_vc;
|
|||||||
ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */
|
ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */
|
||||||
ST_DATA const char *funcname;
|
ST_DATA const char *funcname;
|
||||||
|
|
||||||
|
ST_FUNC void tcc_debug_start(TCCState *s1);
|
||||||
|
ST_FUNC void tcc_debug_end(TCCState *s1);
|
||||||
|
ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym);
|
||||||
|
ST_FUNC void tcc_debug_funcend(TCCState *s1, int size);
|
||||||
|
ST_FUNC void tcc_debug_line(TCCState *s1);
|
||||||
|
|
||||||
ST_FUNC void tccgen_start(TCCState *s1);
|
ST_FUNC void tccgen_start(TCCState *s1);
|
||||||
ST_FUNC void tccgen_end(TCCState *s1);
|
ST_FUNC void tccgen_end(TCCState *s1);
|
||||||
|
|
||||||
ST_FUNC void free_inline_functions(TCCState *s);
|
ST_FUNC void free_inline_functions(TCCState *s);
|
||||||
ST_FUNC void check_vstack(void);
|
ST_FUNC void check_vstack(void);
|
||||||
|
|
||||||
|
19
tccasm.c
19
tccasm.c
@ -926,10 +926,13 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global)
|
|||||||
set_idnum('.', IS_ID);
|
set_idnum('.', IS_ID);
|
||||||
if (do_preprocess)
|
if (do_preprocess)
|
||||||
parse_flags |= PARSE_FLAG_PREPROCESS;
|
parse_flags |= PARSE_FLAG_PREPROCESS;
|
||||||
next();
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
next();
|
||||||
if (tok == TOK_EOF)
|
if (tok == TOK_EOF)
|
||||||
break;
|
break;
|
||||||
|
/* generate line number info */
|
||||||
|
if (global && s1->do_debug)
|
||||||
|
tcc_debug_line(s1);
|
||||||
parse_flags |= PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
parse_flags |= PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
||||||
redo:
|
redo:
|
||||||
if (tok == '#') {
|
if (tok == '#') {
|
||||||
@ -981,15 +984,12 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* end of line */
|
/* end of line */
|
||||||
if (tok != ';' && tok != TOK_LINEFEED){
|
if (tok != ';' && tok != TOK_LINEFEED)
|
||||||
expect("end of line");
|
expect("end of line");
|
||||||
}
|
|
||||||
parse_flags &= ~PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
parse_flags &= ~PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
||||||
next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asm_free_labels(s1);
|
asm_free_labels(s1);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1001,24 +1001,19 @@ ST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess)
|
|||||||
|
|
||||||
define_start = define_stack;
|
define_start = define_stack;
|
||||||
preprocess_start(s1);
|
preprocess_start(s1);
|
||||||
|
tcc_debug_start(s1);
|
||||||
|
|
||||||
/* default section is text */
|
/* default section is text */
|
||||||
cur_text_section = text_section;
|
cur_text_section = text_section;
|
||||||
ind = cur_text_section->data_offset;
|
ind = cur_text_section->data_offset;
|
||||||
nocode_wanted = 0;
|
nocode_wanted = 0;
|
||||||
|
|
||||||
/* an elf symbol of type STT_FILE must be put so that STB_LOCAL
|
|
||||||
symbols can be safely used */
|
|
||||||
put_elf_sym(symtab_section, 0, 0,
|
|
||||||
ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
|
|
||||||
SHN_ABS, file->filename);
|
|
||||||
|
|
||||||
ret = tcc_assemble_internal(s1, do_preprocess, 1);
|
ret = tcc_assemble_internal(s1, do_preprocess, 1);
|
||||||
|
|
||||||
cur_text_section->data_offset = ind;
|
cur_text_section->data_offset = ind;
|
||||||
|
|
||||||
|
tcc_debug_end(s1);
|
||||||
free_defines(define_start);
|
free_defines(define_start);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
143
tccgen.c
143
tccgen.c
@ -139,6 +139,88 @@ void pv (const char *lbl, int a, int b)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* start of translation unit info */
|
||||||
|
ST_FUNC void tcc_debug_start(TCCState *s1)
|
||||||
|
{
|
||||||
|
if (s1->do_debug) {
|
||||||
|
char buf[512];
|
||||||
|
|
||||||
|
/* file info: full path + filename */
|
||||||
|
section_sym = put_elf_sym(symtab_section, 0, 0,
|
||||||
|
ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0,
|
||||||
|
text_section->sh_num, NULL);
|
||||||
|
getcwd(buf, sizeof(buf));
|
||||||
|
#ifdef _WIN32
|
||||||
|
normalize_slashes(buf);
|
||||||
|
#endif
|
||||||
|
pstrcat(buf, sizeof(buf), "/");
|
||||||
|
put_stabs_r(buf, N_SO, 0, 0,
|
||||||
|
text_section->data_offset, text_section, section_sym);
|
||||||
|
put_stabs_r(file->filename, N_SO, 0, 0,
|
||||||
|
text_section->data_offset, text_section, section_sym);
|
||||||
|
last_ind = 0;
|
||||||
|
last_line_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* an elf symbol of type STT_FILE must be put so that STB_LOCAL
|
||||||
|
symbols can be safely used */
|
||||||
|
put_elf_sym(symtab_section, 0, 0,
|
||||||
|
ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
|
||||||
|
SHN_ABS, file->filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put end of translation unit info */
|
||||||
|
ST_FUNC void tcc_debug_end(TCCState *s1)
|
||||||
|
{
|
||||||
|
if (!s1->do_debug)
|
||||||
|
return;
|
||||||
|
put_stabs_r(NULL, N_SO, 0, 0,
|
||||||
|
text_section->data_offset, text_section, section_sym);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* generate line number info */
|
||||||
|
ST_FUNC void tcc_debug_line(TCCState *s1)
|
||||||
|
{
|
||||||
|
if (!s1->do_debug)
|
||||||
|
return;
|
||||||
|
if ((last_line_num != file->line_num || last_ind != ind)) {
|
||||||
|
put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
|
||||||
|
last_ind = ind;
|
||||||
|
last_line_num = file->line_num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put function symbol */
|
||||||
|
ST_FUNC void tcc_debug_funcstart(TCCState *s1, Sym *sym)
|
||||||
|
{
|
||||||
|
char buf[512];
|
||||||
|
|
||||||
|
if (!s1->do_debug)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* stabs info */
|
||||||
|
/* XXX: we put here a dummy type */
|
||||||
|
snprintf(buf, sizeof(buf), "%s:%c1",
|
||||||
|
funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
|
||||||
|
put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
|
||||||
|
cur_text_section, sym->c);
|
||||||
|
/* //gr gdb wants a line at the function */
|
||||||
|
put_stabn(N_SLINE, 0, file->line_num, 0);
|
||||||
|
|
||||||
|
last_ind = 0;
|
||||||
|
last_line_num = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put function size */
|
||||||
|
ST_FUNC void tcc_debug_funcend(TCCState *s1, int size)
|
||||||
|
{
|
||||||
|
if (!s1->do_debug)
|
||||||
|
return;
|
||||||
|
put_stabn(N_FUN, 0, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
ST_FUNC void tccgen_start(TCCState *s1)
|
ST_FUNC void tccgen_start(TCCState *s1)
|
||||||
{
|
{
|
||||||
@ -161,28 +243,7 @@ ST_FUNC void tccgen_start(TCCState *s1)
|
|||||||
func_old_type.t = VT_FUNC;
|
func_old_type.t = VT_FUNC;
|
||||||
func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);
|
func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);
|
||||||
|
|
||||||
if (s1->do_debug) {
|
tcc_debug_start(s1);
|
||||||
char buf[512];
|
|
||||||
|
|
||||||
/* file info: full path + filename */
|
|
||||||
section_sym = put_elf_sym(symtab_section, 0, 0,
|
|
||||||
ELFW(ST_INFO)(STB_LOCAL, STT_SECTION), 0,
|
|
||||||
text_section->sh_num, NULL);
|
|
||||||
getcwd(buf, sizeof(buf));
|
|
||||||
#ifdef _WIN32
|
|
||||||
normalize_slashes(buf);
|
|
||||||
#endif
|
|
||||||
pstrcat(buf, sizeof(buf), "/");
|
|
||||||
put_stabs_r(buf, N_SO, 0, 0,
|
|
||||||
text_section->data_offset, text_section, section_sym);
|
|
||||||
put_stabs_r(file->filename, N_SO, 0, 0,
|
|
||||||
text_section->data_offset, text_section, section_sym);
|
|
||||||
}
|
|
||||||
/* an elf symbol of type STT_FILE must be put so that STB_LOCAL
|
|
||||||
symbols can be safely used */
|
|
||||||
put_elf_sym(symtab_section, 0, 0,
|
|
||||||
ELFW(ST_INFO)(STB_LOCAL, STT_FILE), 0,
|
|
||||||
SHN_ABS, file->filename);
|
|
||||||
|
|
||||||
#ifdef TCC_TARGET_ARM
|
#ifdef TCC_TARGET_ARM
|
||||||
arm_init(s1);
|
arm_init(s1);
|
||||||
@ -194,10 +255,7 @@ ST_FUNC void tccgen_end(TCCState *s1)
|
|||||||
gen_inline_functions(s1);
|
gen_inline_functions(s1);
|
||||||
check_vstack();
|
check_vstack();
|
||||||
/* end of translation unit info */
|
/* end of translation unit info */
|
||||||
if (s1->do_debug) {
|
tcc_debug_end(s1);
|
||||||
put_stabs_r(NULL, N_SO, 0, 0,
|
|
||||||
text_section->data_offset, text_section, section_sym);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
@ -5567,12 +5625,8 @@ static void block(int *bsym, int *csym, int is_expr)
|
|||||||
Sym *s;
|
Sym *s;
|
||||||
|
|
||||||
/* generate line number info */
|
/* generate line number info */
|
||||||
if (tcc_state->do_debug &&
|
if (tcc_state->do_debug)
|
||||||
(last_line_num != file->line_num || last_ind != ind)) {
|
tcc_debug_line(tcc_state);
|
||||||
put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
|
|
||||||
last_ind = ind;
|
|
||||||
last_line_num = file->line_num;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_expr) {
|
if (is_expr) {
|
||||||
/* default return value is (void) */
|
/* default return value is (void) */
|
||||||
@ -6741,22 +6795,6 @@ static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void put_func_debug(Sym *sym)
|
|
||||||
{
|
|
||||||
char buf[512];
|
|
||||||
|
|
||||||
/* stabs info */
|
|
||||||
/* XXX: we put here a dummy type */
|
|
||||||
snprintf(buf, sizeof(buf), "%s:%c1",
|
|
||||||
funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
|
|
||||||
put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
|
|
||||||
cur_text_section, sym->c);
|
|
||||||
/* //gr gdb wants a line at the function */
|
|
||||||
put_stabn(N_SLINE, 0, file->line_num, 0);
|
|
||||||
last_ind = 0;
|
|
||||||
last_line_num = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse an old style function declaration list */
|
/* parse an old style function declaration list */
|
||||||
/* XXX: check multiple parameter */
|
/* XXX: check multiple parameter */
|
||||||
static void func_decl_list(Sym *func_sym)
|
static void func_decl_list(Sym *func_sym)
|
||||||
@ -6820,15 +6858,12 @@ static void gen_function(Sym *sym)
|
|||||||
vla_sp_loc = -1;
|
vla_sp_loc = -1;
|
||||||
vla_sp_root_loc = -1;
|
vla_sp_root_loc = -1;
|
||||||
/* put debug symbol */
|
/* put debug symbol */
|
||||||
if (tcc_state->do_debug)
|
tcc_debug_funcstart(tcc_state, sym);
|
||||||
put_func_debug(sym);
|
|
||||||
|
|
||||||
/* push a dummy symbol to enable local sym storage */
|
/* push a dummy symbol to enable local sym storage */
|
||||||
sym_push2(&local_stack, SYM_FIELD, 0, 0);
|
sym_push2(&local_stack, SYM_FIELD, 0, 0);
|
||||||
local_scope = 1; /* for function parameters */
|
local_scope = 1; /* for function parameters */
|
||||||
gfunc_prolog(&sym->type);
|
gfunc_prolog(&sym->type);
|
||||||
local_scope = 0;
|
local_scope = 0;
|
||||||
|
|
||||||
rsym = 0;
|
rsym = 0;
|
||||||
block(NULL, NULL, 0);
|
block(NULL, NULL, 0);
|
||||||
nocode_wanted = 0;
|
nocode_wanted = 0;
|
||||||
@ -6847,9 +6882,7 @@ static void gen_function(Sym *sym)
|
|||||||
if (sym->type.t & VT_WEAK)
|
if (sym->type.t & VT_WEAK)
|
||||||
weaken_symbol(sym);
|
weaken_symbol(sym);
|
||||||
apply_visibility(sym, &sym->type);
|
apply_visibility(sym, &sym->type);
|
||||||
if (tcc_state->do_debug) {
|
tcc_debug_funcend(tcc_state, ind - func_ind);
|
||||||
put_stabn(N_FUN, 0, 0, ind - func_ind);
|
|
||||||
}
|
|
||||||
/* It's better to crash than to generate wrong code */
|
/* It's better to crash than to generate wrong code */
|
||||||
cur_text_section = NULL;
|
cur_text_section = NULL;
|
||||||
funcname = ""; /* for safety */
|
funcname = ""; /* for safety */
|
||||||
|
@ -36,13 +36,13 @@ endif
|
|||||||
ifeq ($(TARGETOS),Darwin)
|
ifeq ($(TARGETOS),Darwin)
|
||||||
TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
|
TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
|
||||||
endif
|
endif
|
||||||
ifeq (,$(filter arm64 i386 x86-64,$(ARCH)))
|
ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
|
||||||
TESTS := $(filter-out vla_test-run,$(TESTS))
|
TESTS := $(filter-out vla_test-run,$(TESTS))
|
||||||
endif
|
endif
|
||||||
ifeq ($(CONFIG_arm_eabi),yes)
|
ifeq ($(CONFIG_arm_eabi),yes)
|
||||||
TESTS := $(filter-out test3,$(TESTS))
|
TESTS := $(filter-out test3,$(TESTS))
|
||||||
endif
|
endif
|
||||||
ifeq (,$(filter i386 x86-64,$(ARCH)))
|
ifeq (,$(filter i386 x86_64,$(ARCH)))
|
||||||
TESTS := $(filter-out dlltest,$(TESTS))
|
TESTS := $(filter-out dlltest,$(TESTS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -22,10 +22,10 @@ endif
|
|||||||
ifeq ($(TARGETOS),Darwin)
|
ifeq ($(TARGETOS),Darwin)
|
||||||
SKIP += 40_stdio.test
|
SKIP += 40_stdio.test
|
||||||
endif
|
endif
|
||||||
ifeq ($(ARCH),x86-64)
|
ifeq ($(ARCH),x86_64)
|
||||||
SKIP += 73_arm64.test
|
SKIP += 73_arm64.test
|
||||||
endif
|
endif
|
||||||
ifeq (,$(filter i386 x86-64,$(ARCH)))
|
ifeq (,$(filter i386 x86_64,$(ARCH)))
|
||||||
SKIP += 85_asm-outside-function.test
|
SKIP += 85_asm-outside-function.test
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -24,11 +24,9 @@ TARGET = $(CPU)
|
|||||||
ifeq ($(TARGET), 64)
|
ifeq ($(TARGET), 64)
|
||||||
TFLAGS = -m$(TARGET) -DTCC_TARGET_X86_64
|
TFLAGS = -m$(TARGET) -DTCC_TARGET_X86_64
|
||||||
TARCH = x86_64
|
TARCH = x86_64
|
||||||
CARCH = x86-64
|
|
||||||
else
|
else
|
||||||
TFLAGS = -m$(TARGET) -DTCC_TARGET_I386
|
TFLAGS = -m$(TARGET) -DTCC_TARGET_I386
|
||||||
TARCH = i386
|
TARCH = i386
|
||||||
CARCH = i386
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
all: pre bootstrap libs rebuild
|
all: pre bootstrap libs rebuild
|
||||||
@ -36,7 +34,7 @@ all: pre bootstrap libs rebuild
|
|||||||
@ls -ls *.exe
|
@ls -ls *.exe
|
||||||
|
|
||||||
pre:
|
pre:
|
||||||
@echo ARCH=$(CARCH) 1> ../config.mak
|
@echo ARCH=$(TARCH) 1> ../config.mak
|
||||||
@echo TARGETOS=Windows 1>> ../config.mak
|
@echo TARGETOS=Windows 1>> ../config.mak
|
||||||
@echo CONFIG_WIN32=yes 1>> ../config.mak
|
@echo CONFIG_WIN32=yes 1>> ../config.mak
|
||||||
@echo TOPSRC=$$\(TOP\) 1>> ../config.mak
|
@echo TOPSRC=$$\(TOP\) 1>> ../config.mak
|
||||||
|
@ -139,6 +139,18 @@ typedef struct localeinfo_struct _locale_tstruct,*_locale_t;
|
|||||||
#define NOSERVICE 1
|
#define NOSERVICE 1
|
||||||
#define NOMCX 1
|
#define NOMCX 1
|
||||||
#define NOIME 1
|
#define NOIME 1
|
||||||
|
#define __INTRIN_H_
|
||||||
|
#ifndef DUMMYUNIONNAME
|
||||||
|
# define DUMMYUNIONNAME
|
||||||
|
# define DUMMYUNIONNAME1
|
||||||
|
# define DUMMYUNIONNAME2
|
||||||
|
# define DUMMYUNIONNAME3
|
||||||
|
# define DUMMYUNIONNAME4
|
||||||
|
# define DUMMYUNIONNAME5
|
||||||
|
#endif
|
||||||
|
#ifndef DUMMYSTRUCTNAME
|
||||||
|
# define DUMMYSTRUCTNAME
|
||||||
|
#endif
|
||||||
#ifndef WINVER
|
#ifndef WINVER
|
||||||
# define WINVER 0x0502
|
# define WINVER 0x0502
|
||||||
#endif
|
#endif
|
||||||
|
@ -73,15 +73,18 @@ int _runtmain(int argc, /* as tcc passed in */ char **argv)
|
|||||||
_startupinfo start_info = {0};
|
_startupinfo start_info = {0};
|
||||||
|
|
||||||
__tgetmainargs(&wargc, &wargv, &wenv, _dowildcard, &start_info);
|
__tgetmainargs(&wargc, &wargv, &wenv, _dowildcard, &start_info);
|
||||||
|
/* may be wrong when tcc has received wildcards (*.c) */
|
||||||
if (argc < wargc)
|
if (argc < wargc)
|
||||||
wargv += wargc - argc;
|
wargv += wargc - argc;
|
||||||
|
else
|
||||||
|
argc = wargc;
|
||||||
#define argv wargv
|
#define argv wargv
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __i386
|
#ifdef __i386
|
||||||
_controlfp(_PC_53, _MCW_PC);
|
_controlfp(_PC_53, _MCW_PC);
|
||||||
#endif
|
#endif
|
||||||
return _tmain(argc, argv, NULL);
|
return _tmain(argc, argv, _tenviron);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============================================
|
// =============================================
|
||||||
|
@ -336,6 +336,10 @@ GetWindow
|
|||||||
GetWindowContextHelpId
|
GetWindowContextHelpId
|
||||||
GetWindowDC
|
GetWindowDC
|
||||||
GetWindowInfo
|
GetWindowInfo
|
||||||
|
GetWindowLongPtrA
|
||||||
|
GetWindowLongPtrW
|
||||||
|
SetWindowLongPtrA
|
||||||
|
SetWindowLongPtrW
|
||||||
GetWindowLongA
|
GetWindowLongA
|
||||||
GetWindowLongW
|
GetWindowLongW
|
||||||
GetWindowModuleFileNameA
|
GetWindowModuleFileNameA
|
||||||
|
@ -80,6 +80,8 @@ int _runtwinmain(int argc, /* as tcc passed in */ char **argv)
|
|||||||
__tgetmainargs(&wargc, &wargv, &wenv, 0, &start_info);
|
__tgetmainargs(&wargc, &wargv, &wenv, 0, &start_info);
|
||||||
if (argc < wargc)
|
if (argc < wargc)
|
||||||
wargv += wargc - argc;
|
wargv += wargc - argc;
|
||||||
|
else
|
||||||
|
argc = wargc;
|
||||||
#define argv wargv
|
#define argv wargv
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user