/* * Copyright (c) 2005 - 2007, Nils R. Weller * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef BACKEND_H #define BACKEND_H struct scope; struct expr; struct type; struct decl; struct reg; struct vreg; struct token; struct function; struct icode_instr; struct icode_list; struct scope; struct stack_block; struct initializer; struct sym_entry; struct fcall_data; struct init_with_name; struct inline_asm_io; struct ty_string; struct gas_token; struct copystruct; struct allocadata; struct vlasizedata; #include #include extern int optimizing; extern char *tunit_name; extern size_t tunit_size; struct vreg *get_parent_struct(struct vreg *); size_t calc_align_bytes( size_t offset, struct type *cur, struct type *next); int is_immediate_vla_type(struct type *ty); int xlate_icode(struct function *f, struct icode_list *ilp, struct icode_instr **lastret); struct vreg * vreg_static_alloc(struct type *ty, struct initializer *init); struct vreg * vreg_stack_alloc(struct type *ty, struct icode_list *il, int on_frame, struct initializer *init); struct initializer * make_null_block(struct sym_entry *se, struct type *ty, struct type * struct_ty, int remaining); struct init_with_name * make_init_name(struct initializer *init); size_t get_sizeof_const(struct token *constant); size_t get_sizeof_elem_type(struct type *ty); size_t get_sizeof_decl(struct decl *, struct token *); size_t get_align_type(struct type *ty); unsigned long calc_offsets(struct vreg *); int generic_same_representation(struct type *dest, struct type *src); /* as/gas-specific emitter functions. Work at least with x86 gas and SGI as */ void as_align_for_type(FILE *o, struct type *); void as_print_string_init(FILE *o, size_t howmany, struct ty_string *str); typedef int (*init_func_t)(FILE *fd, struct scope *s); typedef int (*is_multi_reg_obj_func_t)(struct type *t); typedef int (*gen_code_func_t)(void); typedef int (*gen_var_func_t)(struct decl *d, int is_glob, int inited); typedef int (*get_ptr_size_func_t)(void); typedef struct type *(*get_size_t_func_t)(void); typedef struct type *(*get_uintptr_t_func_t)(void); typedef size_t (*get_sizeof_basic_func_t)(int code); typedef size_t (*get_sizeof_type_func_t)(struct type *ty, struct token *tok); typedef size_t (*get_sizeof_elem_type_func_t)(struct type *ty); typedef size_t (*get_sizeof_decl_func_t)(struct decl *d, struct token *tok); typedef size_t (*get_sizeof_const_func_t)(struct token *t); typedef struct vreg *(*get_sizeof_vla_type_func_t)(struct type *, struct icode_list *); typedef size_t (*get_align_type_func_t)(struct type *ty); typedef struct reg (*reg_alloc_func_t)(void); typedef int (*reg_free_func_t)(void); typedef void (*invalidate_gprs_func_t)(struct icode_list *il, int saveregs); typedef void (*invalidate_except_func_t)(struct icode_list *il, int save, ...); typedef struct reg *(*alloc_gpr_func_t)( struct function *f, int size, struct icode_list *, struct reg *dontwipe, int line); typedef struct reg *(*alloc_16_or_32bit_noesiedi_func_t)( struct function *f, size_t size, struct icode_list *, struct reg *dontwipe); typedef struct reg *(*alloc_fpr_func_t)( struct function *f, int size, struct icode_list *, struct reg *dontwipe); typedef void (*free_preg_func_t)(struct reg *, struct icode_list *); typedef void (*flush_func_t)(void); typedef void (*wbreg_func_t)(struct vreg *vr, struct reg *pr); typedef void (*icode_prepare_op_func_t)( struct vreg **dest, struct vreg **src, int op, struct icode_list *il); typedef struct vreg *(*icode_make_cast_func_t) (struct vreg *src, struct type *to, struct icode_list *il); typedef void (*icode_make_structreloc_func_t)(struct copystruct *cs, struct icode_list *il); typedef struct initializer * (*make_null_block_func_t)( struct sym_entry *se, struct type *t, struct type *struct_ty, int remaining); typedef struct init_with_name * (*make_init_name_func_t)(struct initializer *); typedef void (*debug_print_gprs_func_t)(void); typedef struct reg *(*name_to_reg_func_t)(const char *name); typedef struct reg * (*asmvreg_to_reg_func_t)(struct vreg **, int, struct inline_asm_io*, struct icode_list*, int faultin); typedef char *(*get_inlineasm_label_func_t)(const char *); typedef void (*do_ret_func_t)(struct function *, struct icode_instr *); typedef struct reg *(*get_abi_reg_func_t)(int index, struct type *ty); typedef struct reg *(*get_abi_ret_reg_func_t)(struct type *p); typedef int (*same_representation_func_t)(struct type *dest, struct type *src); struct emitter; struct reg; struct copystruct; struct copyreg; #include "archdefs.h" struct backend { int arch; int abi; int multi_gpr_object; int struct_align; init_func_t init; is_multi_reg_obj_func_t is_multi_reg_obj; get_ptr_size_func_t get_ptr_size; get_size_t_func_t get_size_t; get_uintptr_t_func_t get_uintptr_t; get_sizeof_basic_func_t get_sizeof_basic; get_sizeof_type_func_t get_sizeof_type; get_sizeof_elem_type_func_t get_sizeof_elem_type; get_sizeof_decl_func_t get_sizeof_decl; get_sizeof_const_func_t get_sizeof_const; get_sizeof_vla_type_func_t get_sizeof_vla_type; get_align_type_func_t get_align_type; gen_code_func_t generate_program; struct emitter *emit; struct reg *esp; invalidate_gprs_func_t invalidate_gprs; invalidate_except_func_t invalidate_except; alloc_gpr_func_t alloc_gpr; alloc_16_or_32bit_noesiedi_func_t alloc_16_or_32bit_noesiedi; alloc_fpr_func_t alloc_fpr; free_preg_func_t free_preg; struct vreg *(*icode_make_fcall)( struct fcall_data *, struct vreg **vrs, int nvrs, struct icode_list * ); int (*icode_make_return)( struct vreg *vr, struct icode_list *il ); flush_func_t flushregs; icode_prepare_op_func_t icode_prepare_op; icode_make_cast_func_t icode_make_cast; icode_make_structreloc_func_t icode_make_structreloc; make_null_block_func_t make_null_block; make_init_name_func_t make_init_name; debug_print_gprs_func_t debug_print_gprs; name_to_reg_func_t name_to_reg; asmvreg_to_reg_func_t asmvreg_to_reg; get_inlineasm_label_func_t get_inlineasm_label; do_ret_func_t do_ret; get_abi_reg_func_t get_abi_reg; get_abi_ret_reg_func_t get_abi_ret_reg; same_representation_func_t same_representation; }; struct scope; struct vreg; struct inline_asm_stmt; struct gas_token; struct decl; struct copystruct; struct int_memcpy_data; struct builtinframeaddressdata; int init_backend(FILE *fd, struct scope *s); int do_xlate(struct function *, struct icode_instr **); struct reg *generic_alloc_gpr(struct function *f, int size, struct icode_list *il, struct reg *dontwipe, struct reg *regset, int nregs, int *csave_map, int line); size_t get_sizeof_type(struct type *, struct token *); struct vreg *get_sizeof_vla_type(struct type *, struct icode_list *); size_t generic_print_init_var(FILE *out, struct decl *d, size_t segoff, void (*print_init_expr)(struct type *, struct expr *), int skip_is_space); void generic_print_init_list(FILE *out, struct decl *, struct initializer *, void (*print_init_expr)(struct type *, struct expr *)); void new_generic_print_init_list(FILE *out, struct decl *, struct initializer *, void (*print_init_expr)(struct type *, struct expr *)); void relocate_struct_regs(struct copystruct *cs, struct reg *r0, struct reg *r1, struct reg *r2, struct icode_list *il); void copy_struct_regstack(struct decl *dec); void store_reg_to_stack_block(struct reg *, struct stack_block *); unsigned long align_for_cur_auto_var(struct type *ty, unsigned long off); #include typedef void (*extern_decls_func_t)(void); typedef void (*static_decls_func_t)(void); typedef void (*struct_defs_func_t)(void); typedef void (*strings_func_t)(void); typedef void (*comment_func_t)(const char *fmt, ...); typedef void (*dwarf2_line_func_t)(struct token *); typedef void (*dwarf2_files_func_t)(void); typedef void (*inlineasm_func_t)(struct inline_asm_stmt *); typedef void (*genunimpl_func_t)(void); typedef void (*empty_func_t)(void); typedef void (*label_func_t)(const char *label, int is_func); typedef void (*call_func_t)(const char *name); typedef void (*call_indir_func_t)(struct reg *r); typedef void (*func_intro_t)(struct function *f); typedef void (*func_outro_t)(void); typedef void (*define_func_t)(const char *name, const char *fmt, ...); typedef void (*push_func_t)(struct function *f, struct icode_instr *); typedef void (*allocstack_func_t)(struct function *f, size_t bytes); typedef void (*freestack_func_t)(struct function *f, size_t *bytes); typedef void (*adj_allocated_func_t)(struct function *f, int *bytes); typedef void (*inc_func_t)(struct icode_instr *); typedef void (*dec_func_t)(struct icode_instr *); typedef void (*load_func_t)(struct reg *r, struct vreg *vr); typedef void (*store_func_t)(struct vreg *dest, struct vreg *src); typedef void (*neg_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*sub_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*add_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*div_func_t)(struct reg **dest, struct icode_instr *src, int); typedef void (*mod_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*mul_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*shl_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*shr_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*or_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*preg_or_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*and_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*xor_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*not_func_t)(struct reg **dest, struct icode_instr *src); typedef void (*cmp_func_t)(struct reg **dest, struct icode_instr *ii); typedef void (*extend_sign_func_t)(struct icode_instr *ii); typedef void (*conv_fp_func_t)(struct icode_instr *ii); typedef void (*branch_func_t)(struct icode_instr *ii); #define SECTION_STACK 1 /* never used? */ #define SECTION_UNINIT 2 #define SECTION_INIT 3 #define SECTION_TEXT 4 #define SECTION_RODATA 5 typedef void (*setsection_func_t)(int value); typedef void (*alloc_func_t)(size_t nbytes); typedef void (*ret_func_t)(struct icode_instr *ii); typedef void (*mov_func_t)(struct copyreg *cr); typedef void (*setreg_func_t)(struct reg *dest, int *value); typedef void (*xchg_func_t)(struct reg *r1, struct reg *r2); typedef void (*addrof_func_t)(struct reg *dest, struct vreg *src, struct vreg *structtop); typedef void (*copyinit_func_t)(struct decl *dec); typedef void (*copystruct_func_t)(struct copystruct *cs); typedef void (*intrinsic_memcpy_func_t)(struct int_memcpy_data *cs); typedef void (*zerostack_func_t)(struct stack_block *addr, size_t nbytes); typedef void (*alloca_func_t)(struct allocadata *ad); typedef void (*dealloca_func_t)(struct stack_block *sb, struct reg *r); typedef void (*alloc_vla_func_t)(struct stack_block *ad); typedef void (*dealloc_vla_func_t)(struct stack_block *sb, struct reg *r); typedef void (*put_vla_size_func_t)(struct vlasizedata *data); typedef void (*retr_vla_size_func_t)(struct vlasizedata *data); typedef void (*load_vla_func_t)(struct reg *r, struct stack_block *sb); typedef void (*builtin_frame_address_func_t)(struct builtinframeaddressdata *); typedef void (*struct_inits_func_t)(void); typedef void (*save_ret_addr_func_t)(struct function *, struct stack_block *); typedef void (*check_ret_addr_func_t)(struct function *, struct stack_block *); typedef void (*print_mem_operand_func_t)(struct vreg *, struct token *); struct emitter { init_func_t init; strings_func_t strings; extern_decls_func_t extern_decls; static_decls_func_t static_decls; struct_defs_func_t struct_defs; comment_func_t comment; dwarf2_line_func_t dwarf2_line; dwarf2_files_func_t dwarf2_files; inlineasm_func_t inlineasm; genunimpl_func_t genunimpl; empty_func_t empty; label_func_t label; call_func_t call; call_indir_func_t callindir; func_intro_t intro; func_outro_t outro; define_func_t define; push_func_t push; allocstack_func_t allocstack; freestack_func_t freestack; adj_allocated_func_t adj_allocated; inc_func_t inc; dec_func_t dec; load_func_t load; store_func_t store; setsection_func_t setsection; alloc_func_t alloc; neg_func_t neg; sub_func_t sub; add_func_t add; div_func_t div; mod_func_t mod; mul_func_t mul; shl_func_t shl; shr_func_t shr; or_func_t or; preg_or_func_t preg_or; and_func_t and; xor_func_t xor; not_func_t not; ret_func_t ret; cmp_func_t cmp; extend_sign_func_t extend_sign; conv_fp_func_t conv_fp; branch_func_t branch; mov_func_t mov; setreg_func_t setreg; xchg_func_t xchg; addrof_func_t addrof; copyinit_func_t copyinit; copystruct_func_t copystruct; intrinsic_memcpy_func_t intrinsic_memcpy; zerostack_func_t zerostack; alloca_func_t alloca_; dealloca_func_t dealloca; alloc_vla_func_t alloc_vla; dealloc_vla_func_t dealloc_vla; put_vla_size_func_t put_vla_size; retr_vla_size_func_t retr_vla_size; load_vla_func_t load_vla; builtin_frame_address_func_t frame_address; struct_inits_func_t struct_inits; save_ret_addr_func_t save_ret_addr; check_ret_addr_func_t check_ret_addr; print_mem_operand_func_t print_mem_operand; }; extern struct backend *backend; extern struct emitter *emit; extern struct reg *tmpgpr; extern struct reg *tmpgpr2; extern struct reg *tmpfpr; extern int host_endianness; extern struct init_with_name *init_list_head; extern struct init_with_name *init_list_tail; extern int backend_warn_inv; struct allocation { int unused; }; #define ALLOC_GPR(func, size, il, dontwipe) \ backend->alloc_gpr((func), (size), (il), (dontwipe), __LINE__) #include "x86_gen.h" #include "mips_gen.h" #include "amd64_gen.h" #include "power_gen.h" #include "sparc_gen.h" #include "reg.h" #include "stack.h" #endif