mirror of
https://github.com/frida/tinycc
synced 2025-01-11 14:19:19 +03: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
|
||||
(Thomas Preud'homme, Daniel Glöckner)
|
||||
- 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)
|
||||
- UNICODE startup code supports wmain and wWinMain (YX Hao)
|
||||
|
||||
Features:
|
||||
- VLA (variable length array) improved (James Lyon, Pip Cet)
|
||||
- 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)
|
||||
- implement round/fmin/fmax etc. math on windows (Avi Halachmi)
|
||||
- #pragma once support (Sergey Korshunoff, Vlad Vissoultchev, ...)
|
||||
|
6
Makefile
6
Makefile
@ -56,7 +56,7 @@ LDFLAGS_P = $(LDFLAGS)
|
||||
|
||||
CONFIG_$(ARCH) = yes
|
||||
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_uClibc) += -DTCC_UCLIBC
|
||||
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
|
||||
|
||||
ifdef CONFIG_WIN32
|
||||
ifeq ($(ARCH),x86-64)
|
||||
ifeq ($(ARCH),x86_64)
|
||||
NATIVE_FILES=$(WIN64_FILES)
|
||||
PROGS_CROSS=$(WIN32_CROSS) $(X64_CROSS) $(ARM_CROSS) $(ARM64_CROSS) $(C67_CROSS) $(WINCE_CROSS)
|
||||
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)
|
||||
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)
|
||||
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
|
||||
|
21
README
21
README
@ -28,28 +28,19 @@ Features:
|
||||
Documentation:
|
||||
-------------
|
||||
|
||||
1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host (for Windows read tcc-win32.txt)
|
||||
|
||||
Note: For OSX and FreeBSD, gmake should be used instead of make.
|
||||
1) Installation on a i386/x86_64/arm Linux/OSX/FreeBSD host
|
||||
|
||||
./configure
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
Alternatively, out-of-tree builds are supported: you may use different
|
||||
directories to hold build objects, kept separate from your source tree:
|
||||
Notes: For OSX and FreeBSD, gmake should be used instead of make.
|
||||
For Windows read tcc-win32.txt.
|
||||
|
||||
mkdir _build
|
||||
cd _build
|
||||
../configure
|
||||
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.
|
||||
makeinfo must be installed to compile the doc. By default, tcc is
|
||||
installed in /usr/local/bin. ./configure --help shows configuration
|
||||
options.
|
||||
|
||||
|
||||
2) Introduction
|
||||
|
10
configure
vendored
10
configure
vendored
@ -163,8 +163,8 @@ case "$cpu" in
|
||||
x86|i386|i486|i586|i686|i86pc|BePC|i686-AT386)
|
||||
cpu="x86"
|
||||
;;
|
||||
x86_64|amd64)
|
||||
cpu="x86-64"
|
||||
x86_64|amd64|x86-64)
|
||||
cpu="x86_64"
|
||||
;;
|
||||
arm*)
|
||||
case "$cpu" in
|
||||
@ -332,7 +332,7 @@ if test -z "$cross_prefix" ; then
|
||||
fi
|
||||
|
||||
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
|
||||
tcc_lddir="lib64"
|
||||
fi
|
||||
@ -453,8 +453,8 @@ echo "#define GCC_MINOR $gcc_minor" >> $TMPH
|
||||
|
||||
if test "$cpu" = "x86" ; then
|
||||
echo "ARCH=i386" >> config.mak
|
||||
elif test "$cpu" = "x86-64" ; then
|
||||
echo "ARCH=x86-64" >> config.mak
|
||||
elif test "$cpu" = "x86_64" ; then
|
||||
echo "ARCH=x86_64" >> config.mak
|
||||
elif test "$cpu" = "armv4l" ; then
|
||||
echo "ARCH=arm" >> config.mak
|
||||
echo "#define TCC_ARM_VERSION $cpuver" >> $TMPH
|
||||
|
@ -9,14 +9,14 @@ VPATH = $(TOPSRC)/lib $(TOPSRC)/win32/lib
|
||||
ifndef TARGET
|
||||
# we're building the native libtcc1.a
|
||||
ifdef CONFIG_WIN32
|
||||
ifeq ($(ARCH),x86-64)
|
||||
ifeq ($(ARCH),x86_64)
|
||||
TARGET = x86_64-win32
|
||||
else
|
||||
TARGET = i386-win32
|
||||
endif
|
||||
else ifeq ($(ARCH),i386)
|
||||
TARGET = i386
|
||||
else ifeq ($(ARCH),x86-64)
|
||||
else ifeq ($(ARCH),x86_64)
|
||||
TARGET = x86_64
|
||||
else ifeq ($(ARCH),arm)
|
||||
TARGET = arm
|
||||
@ -83,6 +83,9 @@ $(DIR)/%.o : %.c
|
||||
$(DIR)/%.o : %.S
|
||||
$(XCC) -c $< -o $@ $(TGT) $(XFLAGS)
|
||||
|
||||
$(DIR)/crt1w.o : crt1.c
|
||||
$(DIR)/wincrt1w.o : wincrt1.c
|
||||
|
||||
$(OBJ) : $(DIR)/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, leading_underscore), 0, "leading-underscore" },
|
||||
{ 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" },
|
||||
{ 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);
|
||||
#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}
|
||||
|
||||
@item -mno-sse
|
||||
Do not use sse registers on x86-64
|
||||
Do not use sse registers on x86_64
|
||||
|
||||
@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
|
||||
|
||||
|
52
tcc.c
52
tcc.c
@ -104,9 +104,8 @@ static const char help2[] =
|
||||
" signed-char default char is signed\n"
|
||||
" common use common section instead of bss\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"
|
||||
" old-struct-init-code some hack for parsing initializers\n"
|
||||
"-m... target specific options:\n"
|
||||
" ms-bitfields use MSVC bitfield layout\n"
|
||||
#ifdef TCC_TARGET_ARM
|
||||
@ -151,32 +150,18 @@ static const char version[] =
|
||||
"C67"
|
||||
#elif defined TCC_TARGET_ARM
|
||||
"ARM"
|
||||
# ifdef TCC_ARM_HARDFLOAT
|
||||
" Hard Float"
|
||||
# endif
|
||||
#elif defined TCC_TARGET_ARM64
|
||||
"AArch64"
|
||||
# ifdef TCC_ARM_HARDFLOAT
|
||||
#endif
|
||||
#ifdef TCC_ARM_HARDFLOAT
|
||||
" Hard Float"
|
||||
# endif
|
||||
#endif
|
||||
#ifdef TCC_TARGET_PE
|
||||
" Windows"
|
||||
#elif defined(__APPLE__)
|
||||
/* Current Apple OS name as of 2016 */
|
||||
" macOS"
|
||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
" FreeBSD"
|
||||
#elif defined(__DragonFly__)
|
||||
" DragonFly BSD"
|
||||
#elif defined(__NetBSD__)
|
||||
" NetBSD"
|
||||
#elif defined(__OpenBSD__)
|
||||
" OpenBSD"
|
||||
#elif defined(__linux__)
|
||||
" Linux"
|
||||
#else
|
||||
" Unidentified system"
|
||||
" Linux"
|
||||
#endif
|
||||
")\n"
|
||||
;
|
||||
@ -201,6 +186,24 @@ static void print_search_dirs(TCCState *s)
|
||||
#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)
|
||||
{
|
||||
char buf[1024];
|
||||
@ -265,9 +268,6 @@ redo:
|
||||
#endif
|
||||
if (opt == OPT_V)
|
||||
return 0;
|
||||
|
||||
tcc_set_environment(s);
|
||||
|
||||
if (opt == OPT_PRINT_DIRS) {
|
||||
/* initialize search dirs */
|
||||
tcc_set_output_type(s, TCC_OUTPUT_MEMORY);
|
||||
@ -287,8 +287,8 @@ redo:
|
||||
if (!s->ppfp)
|
||||
tcc_error("could not write '%s'", s->outfile);
|
||||
}
|
||||
} else if (s->output_type == TCC_OUTPUT_OBJ) {
|
||||
if (s->nb_libraries != 0 && !s->option_r)
|
||||
} else if (s->output_type == TCC_OUTPUT_OBJ && !s->option_r) {
|
||||
if (s->nb_libraries)
|
||||
tcc_error("cannot specify libraries with -c");
|
||||
if (n > 1 && s->outfile)
|
||||
tcc_error("cannot specify output file with -c many files");
|
||||
@ -301,6 +301,7 @@ redo:
|
||||
start_time = getclock_ms();
|
||||
}
|
||||
|
||||
set_environment(s);
|
||||
if (s->output_type == 0)
|
||||
s->output_type = TCC_OUTPUT_EXE;
|
||||
tcc_set_output_type(s, s->output_type);
|
||||
@ -323,7 +324,8 @@ redo:
|
||||
}
|
||||
s->filetype = 0;
|
||||
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;
|
||||
}
|
||||
|
||||
|
13
tcc.h
13
tcc.h
@ -615,9 +615,7 @@ struct TCCState {
|
||||
/* C language options */
|
||||
int char_is_unsigned;
|
||||
int leading_underscore;
|
||||
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 ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */
|
||||
int dollars_in_identifiers; /* allows '$' char in indentifiers */
|
||||
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);
|
||||
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 int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind);
|
||||
PUB_FUNC void tcc_set_environment(TCCState *s);
|
||||
#ifdef _WIN32
|
||||
ST_FUNC char *normalize_slashes(char *path);
|
||||
#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 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_end(TCCState *s1);
|
||||
|
||||
ST_FUNC void free_inline_functions(TCCState *s);
|
||||
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);
|
||||
if (do_preprocess)
|
||||
parse_flags |= PARSE_FLAG_PREPROCESS;
|
||||
next();
|
||||
for(;;) {
|
||||
next();
|
||||
if (tok == TOK_EOF)
|
||||
break;
|
||||
/* generate line number info */
|
||||
if (global && s1->do_debug)
|
||||
tcc_debug_line(s1);
|
||||
parse_flags |= PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
||||
redo:
|
||||
if (tok == '#') {
|
||||
@ -981,15 +984,12 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess, int global)
|
||||
}
|
||||
}
|
||||
/* end of line */
|
||||
if (tok != ';' && tok != TOK_LINEFEED){
|
||||
if (tok != ';' && tok != TOK_LINEFEED)
|
||||
expect("end of line");
|
||||
}
|
||||
parse_flags &= ~PARSE_FLAG_LINEFEED; /* XXX: suppress that hack */
|
||||
next();
|
||||
}
|
||||
|
||||
asm_free_labels(s1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1001,24 +1001,19 @@ ST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess)
|
||||
|
||||
define_start = define_stack;
|
||||
preprocess_start(s1);
|
||||
tcc_debug_start(s1);
|
||||
|
||||
/* default section is text */
|
||||
cur_text_section = text_section;
|
||||
ind = cur_text_section->data_offset;
|
||||
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);
|
||||
|
||||
cur_text_section->data_offset = ind;
|
||||
|
||||
tcc_debug_end(s1);
|
||||
free_defines(define_start);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
143
tccgen.c
143
tccgen.c
@ -139,6 +139,88 @@ void pv (const char *lbl, int a, int b)
|
||||
}
|
||||
#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)
|
||||
{
|
||||
@ -161,28 +243,7 @@ ST_FUNC void tccgen_start(TCCState *s1)
|
||||
func_old_type.t = VT_FUNC;
|
||||
func_old_type.ref = sym_push(SYM_FIELD, &int_type, FUNC_CDECL, FUNC_OLD);
|
||||
|
||||
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);
|
||||
}
|
||||
/* 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);
|
||||
tcc_debug_start(s1);
|
||||
|
||||
#ifdef TCC_TARGET_ARM
|
||||
arm_init(s1);
|
||||
@ -194,10 +255,7 @@ ST_FUNC void tccgen_end(TCCState *s1)
|
||||
gen_inline_functions(s1);
|
||||
check_vstack();
|
||||
/* end of translation unit info */
|
||||
if (s1->do_debug) {
|
||||
put_stabs_r(NULL, N_SO, 0, 0,
|
||||
text_section->data_offset, text_section, section_sym);
|
||||
}
|
||||
tcc_debug_end(s1);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
@ -5567,12 +5625,8 @@ static void block(int *bsym, int *csym, int is_expr)
|
||||
Sym *s;
|
||||
|
||||
/* generate line number info */
|
||||
if (tcc_state->do_debug &&
|
||||
(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;
|
||||
}
|
||||
if (tcc_state->do_debug)
|
||||
tcc_debug_line(tcc_state);
|
||||
|
||||
if (is_expr) {
|
||||
/* 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 */
|
||||
/* XXX: check multiple parameter */
|
||||
static void func_decl_list(Sym *func_sym)
|
||||
@ -6820,15 +6858,12 @@ static void gen_function(Sym *sym)
|
||||
vla_sp_loc = -1;
|
||||
vla_sp_root_loc = -1;
|
||||
/* put debug symbol */
|
||||
if (tcc_state->do_debug)
|
||||
put_func_debug(sym);
|
||||
|
||||
tcc_debug_funcstart(tcc_state, sym);
|
||||
/* push a dummy symbol to enable local sym storage */
|
||||
sym_push2(&local_stack, SYM_FIELD, 0, 0);
|
||||
local_scope = 1; /* for function parameters */
|
||||
gfunc_prolog(&sym->type);
|
||||
local_scope = 0;
|
||||
|
||||
rsym = 0;
|
||||
block(NULL, NULL, 0);
|
||||
nocode_wanted = 0;
|
||||
@ -6847,9 +6882,7 @@ static void gen_function(Sym *sym)
|
||||
if (sym->type.t & VT_WEAK)
|
||||
weaken_symbol(sym);
|
||||
apply_visibility(sym, &sym->type);
|
||||
if (tcc_state->do_debug) {
|
||||
put_stabn(N_FUN, 0, 0, ind - func_ind);
|
||||
}
|
||||
tcc_debug_funcend(tcc_state, ind - func_ind);
|
||||
/* It's better to crash than to generate wrong code */
|
||||
cur_text_section = NULL;
|
||||
funcname = ""; /* for safety */
|
||||
|
@ -36,13 +36,13 @@ endif
|
||||
ifeq ($(TARGETOS),Darwin)
|
||||
TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
|
||||
endif
|
||||
ifeq (,$(filter arm64 i386 x86-64,$(ARCH)))
|
||||
ifeq (,$(filter arm64 i386 x86_64,$(ARCH)))
|
||||
TESTS := $(filter-out vla_test-run,$(TESTS))
|
||||
endif
|
||||
ifeq ($(CONFIG_arm_eabi),yes)
|
||||
TESTS := $(filter-out test3,$(TESTS))
|
||||
endif
|
||||
ifeq (,$(filter i386 x86-64,$(ARCH)))
|
||||
ifeq (,$(filter i386 x86_64,$(ARCH)))
|
||||
TESTS := $(filter-out dlltest,$(TESTS))
|
||||
endif
|
||||
|
||||
|
@ -22,10 +22,10 @@ endif
|
||||
ifeq ($(TARGETOS),Darwin)
|
||||
SKIP += 40_stdio.test
|
||||
endif
|
||||
ifeq ($(ARCH),x86-64)
|
||||
ifeq ($(ARCH),x86_64)
|
||||
SKIP += 73_arm64.test
|
||||
endif
|
||||
ifeq (,$(filter i386 x86-64,$(ARCH)))
|
||||
ifeq (,$(filter i386 x86_64,$(ARCH)))
|
||||
SKIP += 85_asm-outside-function.test
|
||||
endif
|
||||
|
||||
|
@ -24,11 +24,9 @@ TARGET = $(CPU)
|
||||
ifeq ($(TARGET), 64)
|
||||
TFLAGS = -m$(TARGET) -DTCC_TARGET_X86_64
|
||||
TARCH = x86_64
|
||||
CARCH = x86-64
|
||||
else
|
||||
TFLAGS = -m$(TARGET) -DTCC_TARGET_I386
|
||||
TARCH = i386
|
||||
CARCH = i386
|
||||
endif
|
||||
|
||||
all: pre bootstrap libs rebuild
|
||||
@ -36,7 +34,7 @@ all: pre bootstrap libs rebuild
|
||||
@ls -ls *.exe
|
||||
|
||||
pre:
|
||||
@echo ARCH=$(CARCH) 1> ../config.mak
|
||||
@echo ARCH=$(TARCH) 1> ../config.mak
|
||||
@echo TARGETOS=Windows 1>> ../config.mak
|
||||
@echo CONFIG_WIN32=yes 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 NOMCX 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
|
||||
# define WINVER 0x0502
|
||||
#endif
|
||||
|
@ -73,15 +73,18 @@ int _runtmain(int argc, /* as tcc passed in */ char **argv)
|
||||
_startupinfo start_info = {0};
|
||||
|
||||
__tgetmainargs(&wargc, &wargv, &wenv, _dowildcard, &start_info);
|
||||
/* may be wrong when tcc has received wildcards (*.c) */
|
||||
if (argc < wargc)
|
||||
wargv += wargc - argc;
|
||||
else
|
||||
argc = wargc;
|
||||
#define argv wargv
|
||||
#endif
|
||||
|
||||
#ifdef __i386
|
||||
_controlfp(_PC_53, _MCW_PC);
|
||||
#endif
|
||||
return _tmain(argc, argv, NULL);
|
||||
return _tmain(argc, argv, _tenviron);
|
||||
}
|
||||
|
||||
// =============================================
|
||||
|
@ -336,6 +336,10 @@ GetWindow
|
||||
GetWindowContextHelpId
|
||||
GetWindowDC
|
||||
GetWindowInfo
|
||||
GetWindowLongPtrA
|
||||
GetWindowLongPtrW
|
||||
SetWindowLongPtrA
|
||||
SetWindowLongPtrW
|
||||
GetWindowLongA
|
||||
GetWindowLongW
|
||||
GetWindowModuleFileNameA
|
||||
|
@ -80,6 +80,8 @@ int _runtwinmain(int argc, /* as tcc passed in */ char **argv)
|
||||
__tgetmainargs(&wargc, &wargv, &wenv, 0, &start_info);
|
||||
if (argc < wargc)
|
||||
wargv += wargc - argc;
|
||||
else
|
||||
argc = wargc;
|
||||
#define argv wargv
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user