tcc-stupidos/libtcc/cc/cc.h

276 lines
No EOL
8.8 KiB
C

#ifndef TCC_CC_H
# define TCC_CC_H
#include "tcc/state.h"
# include <tcc.h>
/* ------------ tccpp.c ------------ */
extern struct BufferedFile *file;
extern int tok;
extern CValue tokc;
extern const int *macro_ptr;
extern int parse_flags;
extern int tok_flags;
extern CString tokcstr; /* current parsed string, if any */
/* display benchmark infos */
extern int tok_ident;
extern TokenSym **table_ident;
extern int pp_expr;
#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 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_FILE 0x0008 /* we processing an asm file: '#' can be used for line comment, etc. */
#define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */
#define PARSE_FLAG_ACCEPT_STRAYS 0x0020 /* next() returns '\\' token */
#define PARSE_FLAG_TOK_STR 0x0040 /* return parsed strings instead of TOK_PPSTR */
/* isidnum_table flags: */
#define IS_SPC 1
#define IS_ID 2
#define IS_NUM 4
enum line_macro_output_format {
LINE_MACRO_OUTPUT_FORMAT_GCC,
LINE_MACRO_OUTPUT_FORMAT_NONE,
LINE_MACRO_OUTPUT_FORMAT_STD,
LINE_MACRO_OUTPUT_FORMAT_P10 = 11
};
TokenSym *tok_alloc(const char *str, int len);
int tok_alloc_const(const char *str);
const char *get_tok_str(int v, CValue *cv);
void begin_macro(TokenString *str, int alloc);
void end_macro(void);
int set_idnum(int c, int val);
void tok_str_new(TokenString *s);
TokenString *tok_str_alloc(void);
void tok_str_free(TokenString *s);
void tok_str_free_str(int *str);
void tok_str_add(TokenString *s, int t);
void tok_str_add_tok(TokenString *s);
void define_push(int v, int macro_type, int *str, Sym *first_arg);
void define_undef(Sym *s);
Sym *define_find(int v);
void free_defines(Sym *b);
void parse_define(void);
void skip_to_eol(int warn);
void preprocess(int is_bof);
void next(void);
void unget_tok(int last_tok);
void preprocess_start(TCCState *s1, int filetype);
void preprocess_end(TCCState *s1);
void tccpp_new(TCCState *s);
void tccpp_delete(TCCState *s);
void tccpp_putfile(const char *filename);
int tcc_preprocess(TCCState *s1);
void skip(int c);
__attribute__((noreturn)) void expect(const char *msg);
void pp_error(CString *cs);
/* space excluding newline */
static inline int is_space(int ch) {
return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r';
}
static inline int isid(int c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_';
}
static inline int isnum(int c) {
return c >= '0' && c <= '9';
}
static inline int isoct(int c) {
return c >= '0' && c <= '7';
}
/* ------------ tccgen.c ------------ */
#define SYM_POOL_NB (8192 / sizeof(Sym))
extern Sym *global_stack;
extern Sym *local_stack;
extern Sym *local_label_stack;
extern Sym *global_label_stack;
extern Sym *define_stack;
extern CType int_type, func_old_type, char_pointer_type;
extern SValue *vtop;
extern int rsym, anon_sym, ind, loc;
extern char debug_modes;
extern int nocode_wanted; /* true if no code generation wanted for an expression */
extern int global_expr; /* true if compound literals must be allocated globally (used during initializers parsing */
extern CType func_vt; /* current function return type (used by return instruction) */
extern int func_var; /* true if current function is variadic */
extern int func_vc;
extern int func_ind;
extern const char *funcname;
void tccgen_init(TCCState *s1);
int tccgen_compile(TCCState *s1);
void tccgen_finish(TCCState *s1);
void check_vstack(void);
int is_float(int t);
int ieee_finite(double d);
int exact_log2p1(int i);
void test_lvalue(void);
COFFSym *coffsym(Sym *);
void update_storage(Sym *sym);
void put_extern_sym2(Sym *sym, int sh_num, addr_t value, unsigned long size, int can_add_underscore);
void put_extern_sym(Sym *sym, TCCSection *section, addr_t value, unsigned long size);
void greloc(TCCSection *s, Sym *sym, unsigned long offset, int type);
void greloca(TCCSection *s, Sym *sym, unsigned long offset, int type, addr_t addend);
void sym_free(Sym *sym);
Sym *sym_push(int v, CType *type, int r, int c);
void sym_pop(Sym **ptop, Sym *b, int keep);
Sym *sym_push2(Sym **ps, int v, int t, int c);
Sym *sym_find2(Sym *s, int v);
Sym *sym_find(int v);
Sym *label_find(int v);
Sym *label_push(Sym **ptop, int v, int flags);
void label_pop(Sym **ptop, Sym *slast, int keep);
Sym *struct_find(int v);
Sym *global_identifier_push(int v, int t, int c);
Sym *external_global_sym(int v, CType *type);
Sym *external_helper_sym(int v);
void vpush_helper_func(int v);
void vset(CType *type, int r, int v);
void vset_VT_CMP(int op);
void vpushi(int v);
void vpushv(SValue *v);
void vpushsym(CType *type, Sym *sym);
void vswap(void);
void vrott(int n);
void vrotb(int n);
void vrev(int n);
void vpop(void);
void lexpand(void);
void save_reg(int r);
void save_reg_upstack(int r, int n);
int get_reg(int rc);
void save_regs(int n);
void gaddrof(void);
int gv(int rc);
void gv2(int rc1, int rc2);
void gen_op(int op);
int type_size(CType *type, int *a);
void mk_pointer(CType *type);
void vstore(void);
void inc(int post, int c);
CString* parse_mult_str(const char *msg);
CString* parse_asm_str(void);
void indir(void);
void unary(void);
void gexpr(void);
int expr_const(void);
/* ------------ xxx-link.c ------------ */
#if !defined ELF_OBJ_ONLY
#define NEED_RELOC_TYPE
#endif
/*void relocate(TCCState *s1, ElfW_Rel *rel, int type, unsigned char *ptr, addr_t addr, addr_t val);
*/
/* ------------ xxx-gen.c ------------ */
extern const char * const target_machine_defs;
extern const int reg_classes[NB_REGS];
void gsym_addr(int t, int a);
void gsym(int t);
void load(int r, SValue *sv);
void store(int r, SValue *v);
int gfunc_sret(CType *vt, int variadic, CType *ret, int *align, int *regsize);
void gfunc_call(int nb_args);
void gfunc_prolog(Sym *func_sym);
void gfunc_epilog(void);
void gen_fill_nops(int);
int gjmp(int t);
void gjmp_addr(int a);
int gjmp_cond(int op, int t);
int gjmp_append(int n, int t);
void gen_opi(int op);
void gen_opf(int op);
void gen_cvt_ftoi(int t);
void gen_cvt_itof(void);
void gen_cvt_ftof(void);
void ggoto(void);
void o(unsigned int c);
void gen_vla_sp_save(int addr);
void gen_vla_sp_restore(int addr);
void gen_vla_alloc(CType *type, int align);
static inline uint16_t read16le(unsigned char *p) {
return p[0] | (uint16_t)p[1] << 8;
}
static inline void write16le(unsigned char *p, uint16_t x) {
p[0] = x & 255; p[1] = x >> 8 & 255;
}
static inline uint32_t read32le(unsigned char *p) {
return read16le(p) | (uint32_t)read16le(p + 2) << 16;
}
static inline void write32le(unsigned char *p, uint32_t x) {
write16le(p, x); write16le(p + 2, x >> 16);
}
static inline void add32le(unsigned char *p, int32_t x) {
write32le(p, read32le(p) + x);
}
static inline uint64_t read64le(unsigned char *p) {
return read32le(p) | (uint64_t)read32le(p + 4) << 32;
}
static inline void write64le(unsigned char *p, uint64_t x) {
write32le(p, x); write32le(p + 4, x >> 32);
}
static inline void add64le(unsigned char *p, int64_t x) {
write64le(p, read64le(p) + x);
}
/* ------------ i386-gen.c ------------ */
void g(int c);
void gen_le16(int c);
void gen_le32(int c);
void gen_addr32(int r, Sym *sym, int c);
void gen_addrpc32(int r, Sym *sym, int c);
void gen_cvt_csti(int t);
/* ------------ tccasm.c ------------ */
void asm_instr(TCCState *s1);
void asm_global_instr(TCCState *s1);
int tcc_assemble(TCCState *s1, int do_preprocess);
int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp);
Sym* get_asm_sym(TCCState *s1, int name, Sym *csym);
void asm_expr(TCCState *s1, ExprValue *pe);
int asm_int_expr(TCCState *s1);
/* ------------ i386-asm.c ------------ */
void gen_expr32(ExprValue *pe);
void asm_opcode(TCCState *s1, int opcode);
int asm_parse_regvar(int t);
void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg);
void subst_asm_operand(CString *add_str, SValue *sv, int modifier);
void asm_gen_code(ASMOperand *operands, int nb_operands, int nb_outputs, int is_output, uint8_t *clobber_regs, int out_reg);
void asm_clobber(uint8_t *clobber_regs, const char *str);
/** XXX: fixme */
/* Symbol visibility specification encoded in the st_other field. */
#define STV_DEFAULT 0 /* Default symbol visibility rules */
#define STV_INTERNAL 1 /* Processor specific hidden class */
#define STV_HIDDEN 2 /* Sym unavailable in other modules */
#define STV_PROTECTED 3 /* Not preemptible, not exported */
#endif /* !TCC_CC_H */