From 88a3ccab9f3c877e2ffb8fecc3303006e0640907 Mon Sep 17 00:00:00 2001 From: grischka Date: Sun, 20 Dec 2009 01:53:49 +0100 Subject: allow tcc be build from separate objects If you want that, run: make NOTALLINONE=1 --- tcc.h | 434 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 406 insertions(+), 28 deletions(-) (limited to 'tcc.h') diff --git a/tcc.h b/tcc.h index 16aba53..ea4ae21 100644 --- a/tcc.h +++ b/tcc.h @@ -18,6 +18,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifndef _TCC_H +#define _TCC_H + #define _GNU_SOURCE #include "config.h" @@ -46,6 +49,7 @@ #include /* getcwd */ #define inline __inline #define inp next_inp +#define dlclose FreeLibrary #ifdef _WIN64 #define uplong unsigned long long #endif @@ -56,6 +60,7 @@ #include #include #include +#include #endif #endif /* !CONFIG_TCCBOOT */ @@ -766,11 +771,11 @@ enum tcc_token { #elif defined(TCC_UCLIBC) || defined(__FreeBSD__) || defined(__DragonFly__) \ || defined(__OpenBSD__) /* currently incorrect */ -long double strtold(const char *nptr, char **endptr) +static inline long double strtold(const char *nptr, char **endptr) { return (long double)strtod(nptr, endptr); } -float strtof(const char *nptr, char **endptr) +static inline float strtof(const char *nptr, char **endptr) { return (float)strtod(nptr, endptr); } @@ -790,38 +795,411 @@ extern long double strtold (const char *__nptr, char **__endptr); #define PATHCMP strcmp #endif -void error(const char *fmt, ...); -void error_noabort(const char *fmt, ...); -void warning(const char *fmt, ...); - -void tcc_set_lib_path_w32(TCCState *s); -int tcc_set_flag(TCCState *s, const char *flag_name, int value); -void tcc_print_stats(TCCState *s, int64_t total_time); +/* space exlcuding newline */ +static inline int is_space(int ch) +{ + return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r'; +} -void tcc_free(void *ptr); -void *tcc_malloc(unsigned long size); -void *tcc_mallocz(unsigned long size); -void *tcc_realloc(void *ptr, unsigned long size); -char *tcc_strdup(const char *str); +static inline int isid(int c) +{ + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; +} -char *tcc_basename(const char *name); -char *tcc_fileextension (const char *name); -char *pstrcpy(char *buf, int buf_size, const char *s); -char *pstrcat(char *buf, int buf_size, const char *s); -void dynarray_add(void ***ptab, int *nb_ptr, void *data); -void dynarray_reset(void *pp, int *n); +static inline int isnum(int c) +{ + return c >= '0' && c <= '9'; +} -/* true if float/double/long double type */ -static inline int is_float(int t) +static inline int isoct(int c) { - int bt; - bt = t & VT_BTYPE; - return bt == VT_LDOUBLE || bt == VT_DOUBLE || bt == VT_FLOAT; + return c >= '0' && c <= '7'; } -/* space exlcuding newline */ -static inline int is_space(int ch) +static inline int toup(int c) { - return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r'; + return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; } +#define PUB_FUNC + +#ifndef NOTALLINONE +#define ST_INLN static inline +#define ST_FUNC static +#define ST_DATA static +#else +#define ST_INLN +#define ST_FUNC +#define ST_DATA extern +#endif + +/* ------------ libtcc.c ------------ */ + +/* use GNU C extensions */ +ST_DATA int gnu_ext; +/* use Tiny C extensions */ +ST_DATA int tcc_ext; +/* XXX: get rid of this ASAP */ +ST_DATA struct TCCState *tcc_state; + +#ifdef CONFIG_TCC_BACKTRACE +ST_DATA int num_callers; +ST_DATA const char **rt_bound_error_msg; +ST_DATA void *rt_prog_main; +#endif + +#define AFF_PRINT_ERROR 0x0001 /* print error if file not found */ +#define AFF_REFERENCED_DLL 0x0002 /* load a referenced dll from another dll */ +#define AFF_PREPROCESS 0x0004 /* preprocess file */ + +/* public functions currently used by the tcc main function */ +PUB_FUNC char *pstrcpy(char *buf, int buf_size, const char *s); +PUB_FUNC char *pstrcat(char *buf, int buf_size, const char *s); +PUB_FUNC char *tcc_basename(const char *name); +PUB_FUNC char *tcc_fileextension (const char *name); +PUB_FUNC void tcc_free(void *ptr); +PUB_FUNC void *tcc_malloc(unsigned long size); +PUB_FUNC void *tcc_mallocz(unsigned long size); +PUB_FUNC void *tcc_realloc(void *ptr, unsigned long size); +PUB_FUNC char *tcc_strdup(const char *str); +#define free(p) use_tcc_free(p) +#define malloc(s) use_tcc_malloc(s) +#define realloc(p, s) use_tcc_realloc(p, s) +#undef strdup +#define strdup(s) use_tcc_strdup(s) +PUB_FUNC void tcc_memstats(void); +PUB_FUNC void dynarray_add(void ***ptab, int *nb_ptr, void *data); +PUB_FUNC void dynarray_reset(void *pp, int *n); +PUB_FUNC void error_noabort(const char *fmt, ...); +PUB_FUNC void error(const char *fmt, ...); +PUB_FUNC void expect(const char *msg); +PUB_FUNC void warning(const char *fmt, ...); + +/* other utilities */ +ST_INLN void cstr_ccat(CString *cstr, int ch); +ST_FUNC void cstr_cat(CString *cstr, const char *str); +ST_FUNC void cstr_wccat(CString *cstr, int ch); +ST_FUNC void cstr_new(CString *cstr); +ST_FUNC void cstr_free(CString *cstr); +ST_FUNC void add_char(CString *cstr, int c); +#define cstr_reset(cstr) cstr_free(cstr) + +ST_FUNC Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags); +ST_FUNC void section_realloc(Section *sec, unsigned long new_size); +ST_FUNC void *section_ptr_add(Section *sec, unsigned long size); +ST_FUNC Section *find_section(TCCState *s1, const char *name); + +ST_FUNC void put_extern_sym2(Sym *sym, Section *section, unsigned long value, unsigned long size, int can_add_underscore); +ST_FUNC void put_extern_sym(Sym *sym, Section *section, unsigned long value, unsigned long size); +ST_FUNC void greloc(Section *s, Sym *sym, unsigned long offset, int type); + +ST_INLN void sym_free(Sym *sym); +ST_FUNC Sym *sym_push2(Sym **ps, int v, int t, long c); +ST_FUNC Sym *sym_find2(Sym *s, int v); +ST_FUNC Sym *sym_push(int v, CType *type, int r, int c); +ST_FUNC void sym_pop(Sym **ptop, Sym *b); +ST_INLN Sym *struct_find(int v); +ST_INLN Sym *sym_find(int v); +ST_FUNC Sym *global_identifier_push(int v, int t, int c); + +ST_FUNC BufferedFile *tcc_open(TCCState *s1, const char *filename); +ST_FUNC void tcc_close(BufferedFile *bf); +ST_FUNC int tcc_add_dll(TCCState *s, const char *filename, int flags); +PUB_FUNC int tcc_set_flag(TCCState *s, const char *flag_name, int value); +PUB_FUNC void tcc_print_stats(TCCState *s, int64_t total_time); +PUB_FUNC void set_num_callers(int n); + +ST_FUNC int ieee_finite(double d); + +/* ------------ tccpp.c ------------ */ + +ST_DATA struct BufferedFile *file; +ST_DATA int ch, tok; +ST_DATA CValue tokc; +ST_DATA int *macro_ptr; +ST_DATA int parse_flags; +ST_DATA int tok_flags; +ST_DATA CString tokcstr; /* current parsed string, if any */ + +/* display benchmark infos */ +ST_DATA int total_lines; +ST_DATA int total_bytes; +ST_DATA int tok_ident; +ST_DATA TokenSym **table_ident; + +#define TOK_FLAG_BOL 0x0001 /* beginning of line before */ +#define TOK_FLAG_BOF 0x0002 /* beginning of file before */ +#define TOK_FLAG_ENDIF 0x0004 /* a endif was found matching starting #ifdef */ +#define TOK_FLAG_EOF 0x0008 /* end of file */ + +#define PARSE_FLAG_PREPROCESS 0x0001 /* activate preprocessing */ +#define PARSE_FLAG_TOK_NUM 0x0002 /* return numbers instead of TOK_PPNUM */ +#define PARSE_FLAG_LINEFEED 0x0004 /* line feed is returned as a + token. line feed is also + returned at eof */ +#define PARSE_FLAG_ASM_COMMENTS 0x0008 /* '#' can be used for line comment */ +#define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */ + +ST_FUNC TokenSym *tok_alloc(const char *str, int len); +ST_FUNC char *get_tok_str(int v, CValue *cv); +ST_FUNC void save_parse_state(ParseState *s); +ST_FUNC void restore_parse_state(ParseState *s); +ST_INLN void tok_str_new(TokenString *s); +ST_FUNC void tok_str_free(int *str); +ST_FUNC void tok_str_add(TokenString *s, int t); +ST_FUNC void tok_str_add_tok(TokenString *s); +ST_INLN void define_push(int v, int macro_type, int *str, Sym *first_arg); +ST_FUNC void define_undef(Sym *s); +ST_INLN Sym *define_find(int v); +ST_FUNC void free_defines(Sym *b); +ST_FUNC Sym *label_find(int v); +ST_FUNC Sym *label_push(Sym **ptop, int v, int flags); +ST_FUNC void label_pop(Sym **ptop, Sym *slast); +ST_FUNC void parse_define(void); +ST_FUNC void preprocess(int is_bof); +ST_FUNC void next_nomacro(void); +ST_FUNC void next(void); +ST_INLN void unget_tok(int last_tok); +ST_FUNC void preprocess_init(TCCState *s1); +ST_FUNC void preprocess_new(); +ST_FUNC int tcc_preprocess(TCCState *s1); +ST_FUNC void skip(int c); + +/* ------------ tccgen.c ------------ */ + +ST_DATA Section *text_section, *data_section, *bss_section; /* predefined sections */ +ST_DATA Section *cur_text_section; /* current section where function code is generated */ +#ifdef CONFIG_TCC_ASM +ST_DATA Section *last_text_section; /* to handle .previous asm directive */ +#endif +#ifdef CONFIG_TCC_BCHECK +/* bound check related sections */ +ST_DATA Section *bounds_section; /* contains global data bound description */ +ST_DATA Section *lbounds_section; /* contains local data bound description */ +#endif +/* symbol sections */ +ST_DATA Section *symtab_section, *strtab_section; +/* debug sections */ +ST_DATA Section *stab_section, *stabstr_section; + +#define SYM_POOL_NB (8192 / sizeof(Sym)) +ST_DATA Sym *sym_free_first; +ST_DATA void **sym_pools; +ST_DATA int nb_sym_pools; + +ST_DATA Sym *global_stack; +ST_DATA Sym *local_stack; +ST_DATA Sym *local_label_stack; +ST_DATA Sym *global_label_stack; +ST_DATA Sym *define_stack; +ST_DATA CType char_pointer_type, func_old_type, int_type; +ST_DATA SValue vstack[VSTACK_SIZE], *vtop; +ST_DATA int rsym, anon_sym, ind, loc; + +ST_DATA int const_wanted; /* true if constant wanted */ +ST_DATA int nocode_wanted; /* true if no code generation wanted for an expression */ +ST_DATA int global_expr; /* true if compound literals must be allocated globally (used during initializers parsing */ +ST_DATA CType func_vt; /* current function return type (used by return instruction) */ +ST_DATA int func_vc; +ST_DATA int last_line_num, last_ind, func_ind; /* debug last line number and pc */ +ST_DATA char *funcname; + +ST_INLN int is_float(int t); +ST_FUNC void test_lvalue(void); +ST_FUNC void swap(int *p, int *q); +ST_FUNC void vpushi(int v); +ST_FUNC Sym *external_global_sym(int v, CType *type, int r); +ST_FUNC void vset(CType *type, int r, int v); +ST_FUNC void vswap(void); +ST_FUNC void save_reg(int r); +ST_FUNC int get_reg(int rc); +ST_FUNC void save_regs(int n); +ST_FUNC int gv(int rc); +ST_FUNC void gv2(int rc1, int rc2); +ST_FUNC void vpop(void); +ST_FUNC void gen_op(int op); +ST_FUNC int type_size(CType *type, int *a); +ST_FUNC void mk_pointer(CType *type); +ST_FUNC void vstore(void); +ST_FUNC void inc(int post, int c); +ST_FUNC int lvalue_type(int t); +ST_FUNC void indir(void); +ST_FUNC void unary(void); +ST_FUNC void expr_prod(void); +ST_FUNC void expr_sum(void); +ST_FUNC void gexpr(void); +ST_FUNC int expr_const(void); +ST_FUNC void gen_inline_functions(void); +ST_FUNC void decl(int l); +#ifdef CONFIG_TCC_BCHECK +ST_FUNC Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size); +#endif + +/* ------------ tccelf.c ------------ */ + +#define ARMAG "!\012" /* For COFF and a.out archives */ + +typedef struct { + unsigned int n_strx; /* index into string table of name */ + unsigned char n_type; /* type of symbol */ + unsigned char n_other; /* misc info (usually empty) */ + unsigned short n_desc; /* description field */ + unsigned int n_value; /* value of symbol */ +} Stab_Sym; + +ST_FUNC Section *new_symtab(TCCState *s1, const char *symtab_name, int sh_type, int sh_flags, const char *strtab_name, const char *hash_name, int hash_sh_flags); + +ST_FUNC int put_elf_str(Section *s, const char *sym); +ST_FUNC int put_elf_sym(Section *s, unsigned long value, unsigned long size, int info, int other, int shndx, const char *name); +ST_FUNC int add_elf_sym(Section *s, uplong value, unsigned long size, int info, int other, int sh_num, const char *name); +ST_FUNC int find_elf_sym(Section *s, const char *name); +ST_FUNC void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol); + +ST_FUNC void put_stabs(const char *str, int type, int other, int desc, unsigned long value); +ST_FUNC void put_stabs_r(const char *str, int type, int other, int desc, unsigned long value, Section *sec, int sym_index); +ST_FUNC void put_stabn(int type, int other, int desc, int value); +ST_FUNC void put_stabd(int type, int other, int desc); + +ST_FUNC void relocate_common_syms(void); +ST_FUNC void relocate_syms(TCCState *s1, int do_resolve); +ST_FUNC void relocate_section(TCCState *s1, Section *s); + +ST_FUNC void tcc_add_linker_symbols(TCCState *s1); +ST_FUNC int tcc_load_object_file(TCCState *s1, int fd, unsigned long file_offset); +ST_FUNC int tcc_load_archive(TCCState *s1, int fd); +ST_FUNC void *tcc_get_symbol_err(TCCState *s, const char *name); +ST_FUNC void tcc_add_bcheck(TCCState *s1); + +ST_FUNC void build_got_entries(TCCState *s1); +ST_FUNC void tcc_add_runtime(TCCState *s1); + +#ifndef TCC_TARGET_PE +ST_FUNC int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level); +ST_FUNC int tcc_load_ldscript(TCCState *s1); +ST_FUNC uint8_t *parse_comment(uint8_t *p); +ST_FUNC void minp(void); +ST_INLN void inp(void); +ST_FUNC int handle_eob(void); +#endif + +/* ------------ xxx-gen.c ------------ */ + +ST_FUNC void gsym_addr(int t, int a); +ST_FUNC void gsym(int t); +ST_FUNC void load(int r, SValue *sv); +ST_FUNC void store(int r, SValue *v); +ST_FUNC void gfunc_call(int nb_args); +ST_FUNC void gfunc_prolog(CType *func_type); +ST_FUNC void gfunc_epilog(void); +ST_FUNC int gjmp(int t); +ST_FUNC void gjmp_addr(int a); +ST_FUNC int gtst(int inv, int t); +ST_FUNC void gen_opi(int op); +ST_FUNC void gen_opf(int op); +ST_FUNC void gen_cvt_ftoi(int t); +ST_FUNC void gen_cvt_ftof(int t); +ST_FUNC void ggoto(void); +#ifndef TCC_TARGET_C67 +ST_FUNC void o(unsigned int c); +#endif +#ifndef TCC_TARGET_ARM +ST_FUNC void gen_cvt_itof(int t); +#endif + +/* ------------ i386-gen.c ------------ */ +#if defined TCC_TARGET_I386 || defined TCC_TARGET_X86_64 +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_le32(int c); +ST_FUNC void gen_addr32(int r, Sym *sym, int c); +ST_FUNC void gen_addrpc32(int r, Sym *sym, int c); +#endif + +#ifdef CONFIG_TCC_BCHECK +ST_FUNC void gen_bounded_ptr_add(void); +ST_FUNC void gen_bounded_ptr_deref(void); +#endif + +/* ------------ x86_64-gen.c ------------ */ +#ifdef TCC_TARGET_X86_64 +ST_FUNC void gen_addr64(int r, Sym *sym, int64_t c); +#endif + +/* ------------ arm-gen.c ------------ */ +#ifdef TCC_TARGET_ARM +ST_FUNC unsigned long encbranch(int pos,int addr,int fail); +ST_FUNC void gen_cvt_itof1(int t); +#endif + +/* ------------ c67-gen.c ------------ */ +#ifdef TCC_TARGET_C67 +#endif + +/* ------------ tcccoff.c ------------ */ + +#ifdef TCC_TARGET_COFF +ST_FUNC int tcc_output_coff(TCCState *s1, FILE *f); +#endif + +/* ------------ tccasm.c ------------ */ +ST_FUNC void asm_instr(void); +ST_FUNC void asm_global_instr(void); + +#ifdef CONFIG_TCC_ASM +ST_FUNC int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp); +ST_FUNC void asm_expr(TCCState *s1, ExprValue *pe); +ST_FUNC int asm_int_expr(TCCState *s1); +ST_FUNC int tcc_assemble(TCCState *s1, int do_preprocess); +/* ------------ i386-asm.c ------------ */ +ST_FUNC void gen_expr32(ExprValue *pe); +ST_FUNC void asm_opcode(TCCState *s1, int opcode); +ST_FUNC void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg); +ST_FUNC void subst_asm_operand(CString *add_str, SValue *sv, int modifier); +ST_FUNC void asm_gen_code(ASMOperand *operands, int nb_operands, int nb_outputs, int is_output, uint8_t *clobber_regs, int out_reg); +ST_FUNC void asm_clobber(uint8_t *clobber_regs, const char *str); +#endif +/* ------------ tccpe.c -------------- */ +#ifdef TCC_TARGET_PE +ST_FUNC int pe_load_file(struct TCCState *s1, const char *filename, int fd); +ST_FUNC int pe_add_dll(struct TCCState *s, const char *libraryname); +ST_FUNC int pe_output_file(TCCState * s1, const char *filename); +ST_FUNC int pe_dllimport(int r, SValue *sv, void (*fn)(int r, SValue *sv)); +/* tiny_impdef.c */ +ST_FUNC char *get_export_names(FILE *fp); +#endif + +/* ------------ tccrun.c ----------------- */ +#if !defined CONFIG_TCC_STATIC && !defined _WIN32 +ST_FUNC void *resolve_sym(TCCState *s1, const char *symbol); +#endif + +/********************************************************/ +/* include the target specific definitions */ + +#define TARGET_DEFS_ONLY +#ifdef TCC_TARGET_I386 +#include "i386-gen.c" +#endif +#ifdef TCC_TARGET_X86_64 +#include "x86_64-gen.c" +#endif +#ifdef TCC_TARGET_ARM +#include "arm-gen.c" +#endif +#ifdef TCC_TARGET_C67 +#include "c67-gen.c" +#endif +#undef TARGET_DEFS_ONLY + +ST_DATA const int reg_classes[NB_REGS]; + +/********************************************************/ +#undef ST_DATA +#ifndef NOTALLINONE +#define ST_DATA static +#else +#define ST_DATA +#endif +/********************************************************/ +#endif /* _TCC_H */ -- cgit v1.3.1