mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-26 03:50:07 +08:00
fixes & cleanups
- tccgen.c/tcc.h: allow function declaration after use:
int f() { return g(); }
int g() { return 1; }
may be a warning but not an error
see also 76cb1144ef
- tccgen.c: redundant code related to inline functions removed
(functions used anywhere have sym->c set automatically)
- tccgen.c: make 32bit llop non-equal test portable
(probably not on C67)
- dynarray_add: change prototype to possibly avoid aliasing
problems or at least warnings
- lib/alloca*.S: ".section .note.GNU-stack,"",%progbits" removed
(has no effect)
- tccpe: set SizeOfCode field (for correct upx decompression)
- libtcc.c: fixed alternative -run invocation
tcc "-run -lxxx ..." file.c
(meant to load the library after file).
Also supported now:
tcc files ... options ... -run @ arguments ...
This commit is contained in:
parent
9817204d8a
commit
a4a20360e9
@ -341,7 +341,7 @@ void stuff_const_harder(uint32_t op, uint32_t v) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ST_FUNC uint32_t encbranch(int pos, int addr, int fail)
|
uint32_t encbranch(int pos, int addr, int fail)
|
||||||
{
|
{
|
||||||
addr-=pos+8;
|
addr-=pos+8;
|
||||||
addr/=4;
|
addr/=4;
|
||||||
|
@ -70,9 +70,6 @@ enum {
|
|||||||
/* maximum alignment (for aligned attribute support) */
|
/* maximum alignment (for aligned attribute support) */
|
||||||
#define MAX_ALIGN 8
|
#define MAX_ALIGN 8
|
||||||
|
|
||||||
/* generate jmp to a label */
|
|
||||||
#define gjmp2(instr,lbl) oad(instr,lbl)
|
|
||||||
|
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
#else /* ! TARGET_DEFS_ONLY */
|
#else /* ! TARGET_DEFS_ONLY */
|
||||||
/******************************************************/
|
/******************************************************/
|
||||||
@ -148,7 +145,7 @@ ST_FUNC void gsym(int t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* instruction + 4 bytes data. Return the address of the data */
|
/* instruction + 4 bytes data. Return the address of the data */
|
||||||
ST_FUNC int oad(int c, int s)
|
static int oad(int c, int s)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
if (nocode_wanted)
|
if (nocode_wanted)
|
||||||
@ -159,6 +156,9 @@ ST_FUNC int oad(int c, int s)
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* generate jmp to a label */
|
||||||
|
#define gjmp2(instr,lbl) oad(instr,lbl)
|
||||||
|
|
||||||
/* output constant with relocation if 'r & VT_SYM' is true */
|
/* output constant with relocation if 'r & VT_SYM' is true */
|
||||||
ST_FUNC void gen_addr32(int r, Sym *sym, long c)
|
ST_FUNC void gen_addr32(int r, Sym *sym, long c)
|
||||||
{
|
{
|
||||||
|
@ -8,4 +8,3 @@ alloca:
|
|||||||
mov r0, sp
|
mov r0, sp
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
.size alloca, .-alloca
|
.size alloca, .-alloca
|
||||||
.section .note.GNU-stack,"",%progbits
|
|
||||||
|
@ -28,8 +28,4 @@ p3:
|
|||||||
push %edx
|
push %edx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/* mark stack as nonexecutable */
|
|
||||||
#if defined __ELF__ && defined __linux__
|
|
||||||
.section .note.GNU-stack,"",@progbits
|
|
||||||
#endif
|
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
|
@ -53,8 +53,4 @@ p3:
|
|||||||
ret
|
ret
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* mark stack as nonexecutable */
|
|
||||||
#if defined __ELF__ && defined __linux__
|
|
||||||
.section .note.GNU-stack,"",@progbits
|
|
||||||
#endif
|
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
|
@ -35,8 +35,4 @@ p3:
|
|||||||
push %rdx
|
push %rdx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/* mark stack as nonexecutable */
|
|
||||||
#if defined __ELF__ && defined __linux__
|
|
||||||
.section .note.GNU-stack,"",@progbits
|
|
||||||
#endif
|
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
|
23
libtcc.c
23
libtcc.c
@ -403,13 +403,13 @@ PUB_FUNC void tcc_memstats(int bench)
|
|||||||
/********************************************************/
|
/********************************************************/
|
||||||
/* dynarrays */
|
/* dynarrays */
|
||||||
|
|
||||||
ST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data)
|
ST_FUNC void dynarray_add(void *ptab, int *nb_ptr, void *data)
|
||||||
{
|
{
|
||||||
int nb, nb_alloc;
|
int nb, nb_alloc;
|
||||||
void **pp;
|
void **pp;
|
||||||
|
|
||||||
nb = *nb_ptr;
|
nb = *nb_ptr;
|
||||||
pp = *ptab;
|
pp = *(void ***)ptab;
|
||||||
/* every power of two we double array size */
|
/* every power of two we double array size */
|
||||||
if ((nb & (nb - 1)) == 0) {
|
if ((nb & (nb - 1)) == 0) {
|
||||||
if (!nb)
|
if (!nb)
|
||||||
@ -417,7 +417,7 @@ ST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data)
|
|||||||
else
|
else
|
||||||
nb_alloc = nb * 2;
|
nb_alloc = nb * 2;
|
||||||
pp = tcc_realloc(pp, nb_alloc * sizeof(void *));
|
pp = tcc_realloc(pp, nb_alloc * sizeof(void *));
|
||||||
*ptab = pp;
|
*(void***)ptab = pp;
|
||||||
}
|
}
|
||||||
pp[nb++] = data;
|
pp[nb++] = data;
|
||||||
*nb_ptr = nb;
|
*nb_ptr = nb;
|
||||||
@ -1013,7 +1013,7 @@ ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* update target deps */
|
/* update target deps */
|
||||||
dynarray_add((void ***)&s1->target_deps, &s1->nb_target_deps,
|
dynarray_add(&s1->target_deps, &s1->nb_target_deps,
|
||||||
tcc_strdup(filename));
|
tcc_strdup(filename));
|
||||||
|
|
||||||
parse_flags = 0;
|
parse_flags = 0;
|
||||||
@ -1586,7 +1586,7 @@ static void args_parser_add_file(TCCState *s, const char* filename, int filetype
|
|||||||
struct filespec *f = tcc_malloc(sizeof *f + strlen(filename));
|
struct filespec *f = tcc_malloc(sizeof *f + strlen(filename));
|
||||||
f->type = filetype;
|
f->type = filetype;
|
||||||
strcpy(f->name, filename);
|
strcpy(f->name, filename);
|
||||||
dynarray_add((void ***)&s->files, &s->nb_files, f);
|
dynarray_add(&s->files, &s->nb_files, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read list file */
|
/* read list file */
|
||||||
@ -1611,8 +1611,8 @@ PUB_FUNC int tcc_parse_args(TCCState *s, int argc, char **argv)
|
|||||||
{
|
{
|
||||||
const TCCOption *popt;
|
const TCCOption *popt;
|
||||||
const char *optarg, *r;
|
const char *optarg, *r;
|
||||||
|
const char *run = NULL;
|
||||||
int optind = 0;
|
int optind = 0;
|
||||||
int run = 0;
|
|
||||||
int x;
|
int x;
|
||||||
int last_o = -1;
|
int last_o = -1;
|
||||||
CString linker_arg; /* collect -Wl options */
|
CString linker_arg; /* collect -Wl options */
|
||||||
@ -1631,8 +1631,10 @@ reparse:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (r[0] != '-' || r[1] == '\0') {
|
if (r[0] != '-' || r[1] == '\0') {
|
||||||
args_parser_add_file(s, r, s->filetype);
|
if (r[0] != '@') /* allow "tcc file(s) -run @ args ..." */
|
||||||
|
args_parser_add_file(s, r, s->filetype);
|
||||||
if (run) {
|
if (run) {
|
||||||
|
tcc_set_options(s, run);
|
||||||
optind--;
|
optind--;
|
||||||
/* argv[0] will be this file */
|
/* argv[0] will be this file */
|
||||||
break;
|
break;
|
||||||
@ -1753,7 +1755,7 @@ reparse:
|
|||||||
tcc_add_sysinclude_path(s, buf);
|
tcc_add_sysinclude_path(s, buf);
|
||||||
break;
|
break;
|
||||||
case TCC_OPTION_include:
|
case TCC_OPTION_include:
|
||||||
dynarray_add((void ***)&s->cmd_include_files,
|
dynarray_add(&s->cmd_include_files,
|
||||||
&s->nb_cmd_include_files, tcc_strdup(optarg));
|
&s->nb_cmd_include_files, tcc_strdup(optarg));
|
||||||
break;
|
break;
|
||||||
case TCC_OPTION_nostdinc:
|
case TCC_OPTION_nostdinc:
|
||||||
@ -1769,8 +1771,7 @@ reparse:
|
|||||||
#ifndef TCC_IS_NATIVE
|
#ifndef TCC_IS_NATIVE
|
||||||
tcc_error("-run is not available in a cross compiler");
|
tcc_error("-run is not available in a cross compiler");
|
||||||
#endif
|
#endif
|
||||||
tcc_set_options(s, optarg);
|
run = optarg;
|
||||||
run = 1;
|
|
||||||
x = TCC_OUTPUT_MEMORY;
|
x = TCC_OUTPUT_MEMORY;
|
||||||
goto set_output_type;
|
goto set_output_type;
|
||||||
case TCC_OPTION_v:
|
case TCC_OPTION_v:
|
||||||
@ -1903,7 +1904,7 @@ LIBTCCAPI int tcc_set_options(TCCState *s, const char *r)
|
|||||||
}
|
}
|
||||||
cstr_ccat(&str, 0);
|
cstr_ccat(&str, 0);
|
||||||
//printf("<%s>\n", str.data), fflush(stdout);
|
//printf("<%s>\n", str.data), fflush(stdout);
|
||||||
dynarray_add((void ***)&argv, &argc, tcc_strdup(str.data));
|
dynarray_add(&argv, &argc, tcc_strdup(str.data));
|
||||||
cstr_free(&str);
|
cstr_free(&str);
|
||||||
}
|
}
|
||||||
ret = tcc_parse_args(s, argc, argv);
|
ret = tcc_parse_args(s, argc, argv);
|
||||||
|
6
tcc.h
6
tcc.h
@ -388,7 +388,7 @@ struct Attribute {
|
|||||||
func_export : 1,
|
func_export : 1,
|
||||||
func_import : 1,
|
func_import : 1,
|
||||||
func_args : 5,
|
func_args : 5,
|
||||||
func_proto : 1,
|
func_body : 1,
|
||||||
mode : 4,
|
mode : 4,
|
||||||
weak : 1,
|
weak : 1,
|
||||||
visibility : 2,
|
visibility : 2,
|
||||||
@ -1096,7 +1096,7 @@ PUB_FUNC NORETURN void tcc_error(const char *fmt, ...);
|
|||||||
PUB_FUNC void tcc_warning(const char *fmt, ...);
|
PUB_FUNC void tcc_warning(const char *fmt, ...);
|
||||||
|
|
||||||
/* other utilities */
|
/* other utilities */
|
||||||
ST_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data);
|
ST_FUNC void dynarray_add(void *ptab, int *nb_ptr, void *data);
|
||||||
ST_FUNC void dynarray_reset(void *pp, int *n);
|
ST_FUNC void dynarray_reset(void *pp, int *n);
|
||||||
ST_INLN void cstr_ccat(CString *cstr, int ch);
|
ST_INLN void cstr_ccat(CString *cstr, int ch);
|
||||||
ST_FUNC void cstr_cat(CString *cstr, const char *str, int len);
|
ST_FUNC void cstr_cat(CString *cstr, const char *str, int len);
|
||||||
@ -1486,7 +1486,6 @@ static inline void add64le(unsigned char *p, int64_t x) {
|
|||||||
/* ------------ i386-gen.c ------------ */
|
/* ------------ i386-gen.c ------------ */
|
||||||
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64
|
||||||
ST_FUNC void g(int c);
|
ST_FUNC void g(int c);
|
||||||
ST_FUNC int oad(int c, int s);
|
|
||||||
ST_FUNC void gen_le16(int c);
|
ST_FUNC void gen_le16(int c);
|
||||||
ST_FUNC void gen_le32(int c);
|
ST_FUNC void gen_le32(int c);
|
||||||
ST_FUNC void gen_addr32(int r, Sym *sym, long c);
|
ST_FUNC void gen_addr32(int r, Sym *sym, long c);
|
||||||
@ -1510,7 +1509,6 @@ ST_FUNC void gen_opl(int op);
|
|||||||
ST_FUNC char *default_elfinterp(struct TCCState *s);
|
ST_FUNC char *default_elfinterp(struct TCCState *s);
|
||||||
#endif
|
#endif
|
||||||
ST_FUNC void arm_init(struct TCCState *s);
|
ST_FUNC void arm_init(struct TCCState *s);
|
||||||
ST_FUNC uint32_t encbranch(int pos, int addr, int fail);
|
|
||||||
ST_FUNC void gen_cvt_itof1(int t);
|
ST_FUNC void gen_cvt_itof1(int t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
15
tccelf.c
15
tccelf.c
@ -49,7 +49,7 @@ static int new_undef_sym = 0; /* Is there a new undefined sym since last new_und
|
|||||||
ST_FUNC void tccelf_new(TCCState *s)
|
ST_FUNC void tccelf_new(TCCState *s)
|
||||||
{
|
{
|
||||||
/* no section zero */
|
/* no section zero */
|
||||||
dynarray_add((void ***)&s->sections, &s->nb_sections, NULL);
|
dynarray_add(&s->sections, &s->nb_sections, NULL);
|
||||||
|
|
||||||
/* create standard sections */
|
/* create standard sections */
|
||||||
text_section = new_section(s, ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
|
text_section = new_section(s, ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR);
|
||||||
@ -153,10 +153,10 @@ ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sh_flags & SHF_PRIVATE) {
|
if (sh_flags & SHF_PRIVATE) {
|
||||||
dynarray_add((void ***)&s1->priv_sections, &s1->nb_priv_sections, sec);
|
dynarray_add(&s1->priv_sections, &s1->nb_priv_sections, sec);
|
||||||
} else {
|
} else {
|
||||||
sec->sh_num = s1->nb_sections;
|
sec->sh_num = s1->nb_sections;
|
||||||
dynarray_add((void ***)&s1->sections, &s1->nb_sections, sec);
|
dynarray_add(&s1->sections, &s1->nb_sections, sec);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sec;
|
return sec;
|
||||||
@ -1896,7 +1896,7 @@ static int tcc_write_elf_file(TCCState *s1, const char *filename, int phnum,
|
|||||||
static int elf_output_file(TCCState *s1, const char *filename)
|
static int elf_output_file(TCCState *s1, const char *filename)
|
||||||
{
|
{
|
||||||
int i, ret, phnum, shnum, file_type, file_offset, *sec_order;
|
int i, ret, phnum, shnum, file_type, file_offset, *sec_order;
|
||||||
struct dyn_inf dyninf;
|
struct dyn_inf dyninf = {0};
|
||||||
ElfW(Phdr) *phdr;
|
ElfW(Phdr) *phdr;
|
||||||
ElfW(Sym) *sym;
|
ElfW(Sym) *sym;
|
||||||
Section *strsec, *interp, *dynamic, *dynstr;
|
Section *strsec, *interp, *dynamic, *dynstr;
|
||||||
@ -1912,7 +1912,6 @@ static int elf_output_file(TCCState *s1, const char *filename)
|
|||||||
phdr = NULL;
|
phdr = NULL;
|
||||||
sec_order = NULL;
|
sec_order = NULL;
|
||||||
interp = dynamic = dynstr = NULL; /* avoid warning */
|
interp = dynamic = dynstr = NULL; /* avoid warning */
|
||||||
dyninf.dyn_rel_off = 0; /* avoid warning */
|
|
||||||
|
|
||||||
if (file_type != TCC_OUTPUT_OBJ) {
|
if (file_type != TCC_OUTPUT_OBJ) {
|
||||||
relocate_common_syms();
|
relocate_common_syms();
|
||||||
@ -2595,7 +2594,7 @@ ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level)
|
|||||||
dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname));
|
dllref = tcc_mallocz(sizeof(DLLReference) + strlen(soname));
|
||||||
dllref->level = level;
|
dllref->level = level;
|
||||||
strcpy(dllref->name, soname);
|
strcpy(dllref->name, soname);
|
||||||
dynarray_add((void ***)&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);
|
dynarray_add(&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);
|
||||||
|
|
||||||
/* add dynamic symbols in dynsym_section */
|
/* add dynamic symbols in dynsym_section */
|
||||||
for(i = 1, sym = dynsym + 1; i < nb_syms; i++, sym++) {
|
for(i = 1, sym = dynsym + 1; i < nb_syms; i++, sym++) {
|
||||||
@ -2825,9 +2824,9 @@ static int ld_add_file_list(TCCState *s1, const char *cmd, int as_needed)
|
|||||||
goto lib_parse_error;
|
goto lib_parse_error;
|
||||||
if (group) {
|
if (group) {
|
||||||
/* Add the filename *and* the libname to avoid future conversions */
|
/* Add the filename *and* the libname to avoid future conversions */
|
||||||
dynarray_add((void ***) &libs, &nblibs, tcc_strdup(filename));
|
dynarray_add(&libs, &nblibs, tcc_strdup(filename));
|
||||||
if (libname[0] != '\0')
|
if (libname[0] != '\0')
|
||||||
dynarray_add((void ***) &libs, &nblibs, tcc_strdup(libname));
|
dynarray_add(&libs, &nblibs, tcc_strdup(libname));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
64
tccgen.c
64
tccgen.c
@ -1608,23 +1608,15 @@ static void gen_opl(int op)
|
|||||||
a = 0;
|
a = 0;
|
||||||
b = 0;
|
b = 0;
|
||||||
gen_op(op1);
|
gen_op(op1);
|
||||||
if (op1 != TOK_NE) {
|
if (op == TOK_NE) {
|
||||||
|
b = gvtst(0, 0);
|
||||||
|
} else {
|
||||||
a = gvtst(1, 0);
|
a = gvtst(1, 0);
|
||||||
}
|
if (op != TOK_EQ) {
|
||||||
if (op != TOK_EQ) {
|
/* generate non equal test */
|
||||||
/* generate non equal test */
|
vpushi(TOK_NE);
|
||||||
/* XXX: NOT PORTABLE yet */
|
vtop->r = VT_CMP;
|
||||||
if (op1 == TOK_NE) {
|
|
||||||
b = gvtst(0, 0);
|
b = gvtst(0, 0);
|
||||||
} else {
|
|
||||||
#if defined(TCC_TARGET_I386)
|
|
||||||
b = gjmp2(0x850f, 0);
|
|
||||||
#elif defined(TCC_TARGET_ARM)
|
|
||||||
b = ind;
|
|
||||||
o(0x1A000000 | encbranch(ind, 0, 1));
|
|
||||||
#else
|
|
||||||
tcc_error("not implemented");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* compare low. Always unsigned */
|
/* compare low. Always unsigned */
|
||||||
@ -4724,23 +4716,13 @@ ST_FUNC void unary(void)
|
|||||||
tcc_warning("implicit declaration of function '%s'", name);
|
tcc_warning("implicit declaration of function '%s'", name);
|
||||||
s = external_global_sym(t, &func_old_type, 0);
|
s = external_global_sym(t, &func_old_type, 0);
|
||||||
}
|
}
|
||||||
if ((s->type.t & (VT_STATIC | VT_INLINE | VT_BTYPE)) ==
|
|
||||||
(VT_STATIC | VT_INLINE | VT_FUNC)) {
|
r = s->r;
|
||||||
/* if referencing an inline function, then we generate a
|
/* A symbol that has a register is a local register variable,
|
||||||
symbol to it if not already done. It will have the
|
which starts out as VT_LOCAL value. */
|
||||||
effect to generate code for it at the end of the
|
if ((r & VT_VALMASK) < VT_CONST)
|
||||||
compilation unit. Inline function as always
|
r = (r & ~VT_VALMASK) | VT_LOCAL;
|
||||||
generated in the text section. */
|
|
||||||
if (!s->c && !nocode_wanted)
|
|
||||||
put_extern_sym(s, text_section, 0, 0);
|
|
||||||
r = VT_SYM | VT_CONST;
|
|
||||||
} else {
|
|
||||||
r = s->r;
|
|
||||||
/* A symbol that has a register is a local register variable,
|
|
||||||
which starts out as VT_LOCAL value. */
|
|
||||||
if ((r & VT_VALMASK) < VT_CONST)
|
|
||||||
r = (r & ~VT_VALMASK) | VT_LOCAL;
|
|
||||||
}
|
|
||||||
vset(&s->type, r, s->c);
|
vset(&s->type, r, s->c);
|
||||||
/* Point to s as backpointer (even without r&VT_SYM).
|
/* Point to s as backpointer (even without r&VT_SYM).
|
||||||
Will be used by at least the x86 inline asm parser for
|
Will be used by at least the x86 inline asm parser for
|
||||||
@ -4822,7 +4804,7 @@ ST_FUNC void unary(void)
|
|||||||
s = vtop->type.ref;
|
s = vtop->type.ref;
|
||||||
next();
|
next();
|
||||||
sa = s->next; /* first parameter */
|
sa = s->next; /* first parameter */
|
||||||
nb_args = 0;
|
nb_args = regsize = 0;
|
||||||
ret.r2 = VT_CONST;
|
ret.r2 = VT_CONST;
|
||||||
/* compute first implicit argument if a structure is returned */
|
/* compute first implicit argument if a structure is returned */
|
||||||
if ((s->type.t & VT_BTYPE) == VT_STRUCT) {
|
if ((s->type.t & VT_BTYPE) == VT_STRUCT) {
|
||||||
@ -5849,7 +5831,7 @@ static void block(int *bsym, int *csym, int is_expr)
|
|||||||
tcc_warning("empty case range");
|
tcc_warning("empty case range");
|
||||||
}
|
}
|
||||||
cr->sym = ind;
|
cr->sym = ind;
|
||||||
dynarray_add((void***) &cur_switch->p, &cur_switch->n, cr);
|
dynarray_add(&cur_switch->p, &cur_switch->n, cr);
|
||||||
skip(':');
|
skip(':');
|
||||||
is_expr = 0;
|
is_expr = 0;
|
||||||
goto block_after_label;
|
goto block_after_label;
|
||||||
@ -6897,7 +6879,6 @@ static void gen_inline_functions(TCCState *s)
|
|||||||
fn->sym = NULL;
|
fn->sym = NULL;
|
||||||
if (file)
|
if (file)
|
||||||
pstrcpy(file->filename, sizeof file->filename, fn->filename);
|
pstrcpy(file->filename, sizeof file->filename, fn->filename);
|
||||||
sym->r = VT_SYM | VT_CONST;
|
|
||||||
sym->type.t &= ~VT_INLINE;
|
sym->type.t &= ~VT_INLINE;
|
||||||
|
|
||||||
begin_macro(fn->func_str, 1);
|
begin_macro(fn->func_str, 1);
|
||||||
@ -7038,8 +7019,6 @@ static int decl0(int l, int is_for_loop_init)
|
|||||||
goto func_error1;
|
goto func_error1;
|
||||||
|
|
||||||
ref = sym->type.ref;
|
ref = sym->type.ref;
|
||||||
if (0 == ref->a.func_proto)
|
|
||||||
tcc_error("redefinition of '%s'", get_tok_str(v, NULL));
|
|
||||||
|
|
||||||
/* use func_call from prototype if not defined */
|
/* use func_call from prototype if not defined */
|
||||||
if (ref->a.func_call != FUNC_CDECL
|
if (ref->a.func_call != FUNC_CDECL
|
||||||
@ -7064,15 +7043,20 @@ static int decl0(int l, int is_for_loop_init)
|
|||||||
tcc_error("incompatible types for redefinition of '%s'",
|
tcc_error("incompatible types for redefinition of '%s'",
|
||||||
get_tok_str(v, NULL));
|
get_tok_str(v, NULL));
|
||||||
}
|
}
|
||||||
type.ref->a.func_proto = 0;
|
if (ref->a.func_body)
|
||||||
|
tcc_error("redefinition of '%s'", get_tok_str(v, NULL));
|
||||||
/* if symbol is already defined, then put complete type */
|
/* if symbol is already defined, then put complete type */
|
||||||
sym->type = type;
|
sym->type = type;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* put function symbol */
|
/* put function symbol */
|
||||||
sym = global_identifier_push(v, type.t, 0);
|
sym = global_identifier_push(v, type.t, 0);
|
||||||
sym->type.ref = type.ref;
|
sym->type.ref = type.ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sym->type.ref->a.func_body = 1;
|
||||||
|
sym->r = VT_SYM | VT_CONST;
|
||||||
|
|
||||||
/* static inline functions are just recorded as a kind
|
/* static inline functions are just recorded as a kind
|
||||||
of macro. Their code will be emitted at the end of
|
of macro. Their code will be emitted at the end of
|
||||||
the compilation unit only if they are used */
|
the compilation unit only if they are used */
|
||||||
@ -7106,14 +7090,13 @@ static int decl0(int l, int is_for_loop_init)
|
|||||||
}
|
}
|
||||||
tok_str_add(fn->func_str, -1);
|
tok_str_add(fn->func_str, -1);
|
||||||
tok_str_add(fn->func_str, 0);
|
tok_str_add(fn->func_str, 0);
|
||||||
dynarray_add((void ***)&tcc_state->inline_fns, &tcc_state->nb_inline_fns, fn);
|
dynarray_add(&tcc_state->inline_fns, &tcc_state->nb_inline_fns, fn);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/* compute text section */
|
/* compute text section */
|
||||||
cur_text_section = ad.section;
|
cur_text_section = ad.section;
|
||||||
if (!cur_text_section)
|
if (!cur_text_section)
|
||||||
cur_text_section = text_section;
|
cur_text_section = text_section;
|
||||||
sym->r = VT_SYM | VT_CONST;
|
|
||||||
gen_function(sym);
|
gen_function(sym);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -7138,7 +7121,6 @@ static int decl0(int l, int is_for_loop_init)
|
|||||||
if ((type.t & VT_BTYPE) == VT_FUNC) {
|
if ((type.t & VT_BTYPE) == VT_FUNC) {
|
||||||
/* external function definition */
|
/* external function definition */
|
||||||
/* specific case for func_call attribute */
|
/* specific case for func_call attribute */
|
||||||
ad.a.func_proto = 1;
|
|
||||||
type.ref->a = ad.a;
|
type.ref->a = ad.a;
|
||||||
} else if (!(type.t & VT_ARRAY)) {
|
} else if (!(type.t & VT_ARRAY)) {
|
||||||
/* not lvalue if array */
|
/* not lvalue if array */
|
||||||
|
12
tccpe.c
12
tccpe.c
@ -691,6 +691,10 @@ static int pe_write(struct pe_info *pe)
|
|||||||
psh->PointerToRawData = file_offset;
|
psh->PointerToRawData = file_offset;
|
||||||
file_offset = pe_file_align(pe, file_offset + si->data_size);
|
file_offset = pe_file_align(pe, file_offset + si->data_size);
|
||||||
psh->SizeOfRawData = file_offset - psh->PointerToRawData;
|
psh->SizeOfRawData = file_offset - psh->PointerToRawData;
|
||||||
|
if (si->cls == sec_text)
|
||||||
|
pe_header.opthdr.SizeOfCode += psh->SizeOfRawData;
|
||||||
|
else
|
||||||
|
pe_header.opthdr.SizeOfInitializedData += psh->SizeOfRawData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -753,7 +757,7 @@ static struct import_symbol *pe_add_import(struct pe_info *pe, int sym_index)
|
|||||||
}
|
}
|
||||||
p = tcc_mallocz(sizeof *p);
|
p = tcc_mallocz(sizeof *p);
|
||||||
p->dll_index = dll_index;
|
p->dll_index = dll_index;
|
||||||
dynarray_add((void***)&pe->imp_info, &pe->imp_count, p);
|
dynarray_add(&pe->imp_info, &pe->imp_count, p);
|
||||||
|
|
||||||
found_dll:
|
found_dll:
|
||||||
i = dynarray_assoc ((void**)p->symbols, p->sym_count, sym_index);
|
i = dynarray_assoc ((void**)p->symbols, p->sym_count, sym_index);
|
||||||
@ -761,7 +765,7 @@ found_dll:
|
|||||||
return p->symbols[i];
|
return p->symbols[i];
|
||||||
|
|
||||||
s = tcc_mallocz(sizeof *s);
|
s = tcc_mallocz(sizeof *s);
|
||||||
dynarray_add((void***)&p->symbols, &p->sym_count, s);
|
dynarray_add(&p->symbols, &p->sym_count, s);
|
||||||
s->sym_index = sym_index;
|
s->sym_index = sym_index;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -904,7 +908,7 @@ static void pe_build_exports(struct pe_info *pe)
|
|||||||
p = tcc_malloc(sizeof *p);
|
p = tcc_malloc(sizeof *p);
|
||||||
p->index = sym_index;
|
p->index = sym_index;
|
||||||
p->name = name;
|
p->name = name;
|
||||||
dynarray_add((void***)&sorted, &sym_count, p);
|
dynarray_add(&sorted, &sym_count, p);
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
if (sym->st_other & ST_PE_EXPORT)
|
if (sym->st_other & ST_PE_EXPORT)
|
||||||
@ -1515,7 +1519,7 @@ static int add_dllref(TCCState *s1, const char *dllname)
|
|||||||
return i + 1;
|
return i + 1;
|
||||||
dllref = tcc_mallocz(sizeof(DLLReference) + strlen(dllname));
|
dllref = tcc_mallocz(sizeof(DLLReference) + strlen(dllname));
|
||||||
strcpy(dllref->name, dllname);
|
strcpy(dllref->name, dllname);
|
||||||
dynarray_add((void ***) &s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);
|
dynarray_add(&s1->loaded_dlls, &s1->nb_loaded_dlls, dllref);
|
||||||
return s1->nb_loaded_dlls;
|
return s1->nb_loaded_dlls;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
6
tccpp.c
6
tccpp.c
@ -1566,7 +1566,7 @@ static CachedInclude *search_cached_include(TCCState *s1, const char *filename,
|
|||||||
e = tcc_malloc(sizeof(CachedInclude) + strlen(filename));
|
e = tcc_malloc(sizeof(CachedInclude) + strlen(filename));
|
||||||
strcpy(e->filename, filename);
|
strcpy(e->filename, filename);
|
||||||
e->ifndef_macro = e->once = 0;
|
e->ifndef_macro = e->once = 0;
|
||||||
dynarray_add((void ***)&s1->cached_includes, &s1->nb_cached_includes, e);
|
dynarray_add(&s1->cached_includes, &s1->nb_cached_includes, e);
|
||||||
/* add in hash table */
|
/* add in hash table */
|
||||||
e->hash_next = s1->cached_includes_hash[h];
|
e->hash_next = s1->cached_includes_hash[h];
|
||||||
s1->cached_includes_hash[h] = s1->nb_cached_includes;
|
s1->cached_includes_hash[h] = s1->nb_cached_includes;
|
||||||
@ -1665,7 +1665,7 @@ static void pragma_parse(TCCState *s1)
|
|||||||
if (tok != TOK_STR)
|
if (tok != TOK_STR)
|
||||||
goto pragma_err;
|
goto pragma_err;
|
||||||
file = tcc_strdup((char *)tokc.str.data);
|
file = tcc_strdup((char *)tokc.str.data);
|
||||||
dynarray_add((void ***)&s1->pragma_libs, &s1->nb_pragma_libs, file);
|
dynarray_add(&s1->pragma_libs, &s1->nb_pragma_libs, file);
|
||||||
next();
|
next();
|
||||||
if (tok != ')')
|
if (tok != ')')
|
||||||
goto pragma_err;
|
goto pragma_err;
|
||||||
@ -1820,7 +1820,7 @@ ST_FUNC void preprocess(int is_bof)
|
|||||||
printf("%s: including %s\n", file->prev->filename, file->filename);
|
printf("%s: including %s\n", file->prev->filename, file->filename);
|
||||||
#endif
|
#endif
|
||||||
/* update target deps */
|
/* update target deps */
|
||||||
dynarray_add((void ***)&s1->target_deps, &s1->nb_target_deps,
|
dynarray_add(&s1->target_deps, &s1->nb_target_deps,
|
||||||
tcc_strdup(buf1));
|
tcc_strdup(buf1));
|
||||||
/* push current file in stack */
|
/* push current file in stack */
|
||||||
++s1->include_stack_ptr;
|
++s1->include_stack_ptr;
|
||||||
|
@ -224,7 +224,7 @@ static int is64_type(int t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* instruction + 4 bytes data. Return the address of the data */
|
/* instruction + 4 bytes data. Return the address of the data */
|
||||||
ST_FUNC int oad(int c, int s)
|
static int oad(int c, int s)
|
||||||
{
|
{
|
||||||
int t;
|
int t;
|
||||||
if (nocode_wanted)
|
if (nocode_wanted)
|
||||||
|
Loading…
Reference in New Issue
Block a user