/* * icode.h */ #ifndef __ICODE_H_ #define __ICODE_H_ #include "vm.h" #include "value.h" struct ast; struct builtin; struct iprogram { struct icode *head; struct icode *tail; }; union icode_operand { struct { int index; int upcount; } local; struct value value; struct icode *branch; struct builtin *builtin; }; #define ICOMEFROM_ICODE 0 #define ICOMEFROM_CLOSURE 1 struct icomefrom { struct icomefrom *next; int type; union { struct icode *icode; struct closure *closure; } referrer; }; struct icode { struct icode *next; struct icode *prev; struct icomefrom *referrers; /* links back to all icodes that branch here */ int number; /* for identification porpoises */ vm_label_t label; /* corresponding instr in vm */ unsigned char opcode; union icode_operand operand; }; struct iprogram *iprogram_new(void); void iprogram_free(struct iprogram *); void iprogram_dump(struct iprogram *, vm_label_t); struct icode *icode_new(struct iprogram *, int); struct icode *icode_new_local(struct iprogram *, int, int, int); struct icode *icode_new_value(struct iprogram *, int, struct value); struct icode *icode_new_builtin(struct iprogram *, struct builtin *); void icode_free(struct iprogram *, struct icode *); void icode_set_branch(struct icode *, struct icode *); struct iprogram *ast_gen_iprogram(struct ast *); void iprogram_eliminate_nops(struct iprogram *); void iprogram_eliminate_dead_code(struct iprogram *); void iprogram_optimize_tail_calls(struct iprogram *); void iprogram_optimize_push_small_ints(struct iprogram *); void iprogram_eliminate_useless_jumps(struct iprogram *); void referrer_unwire(struct icode *, struct icode *); void referrers_rewire(struct icode *, struct icode *); #endif