This will be necessary for bc2ir to work. Signed-off-by: Arthur HUILLET <arthur.huil...@free.fr> --- include/jit/expression.h | 16 ++++++++++++++++ jit/expression.c | 12 ++++++++++++ jit/tree-printer.c | 11 +++++++++-- 3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/include/jit/expression.h b/include/jit/expression.h index 43b41c0..d771778 100644 --- a/include/jit/expression.h +++ b/include/jit/expression.h @@ -35,6 +35,7 @@ enum expression_type { EXPR_NULL_CHECK, EXPR_ARRAY_SIZE_CHECK, EXPR_MULTIARRAY_SIZE_CHECK, + EXPR_MIMIC_STACK_SLOT, EXPR_LAST, /* Not a real type. Keep this last. */ }; @@ -235,6 +236,13 @@ struct expression { /* EXPR_ARRAY_SIZE_CHECK and EXPR_MULTIARRAY_SIZE_CHECK */ struct tree_node *size_expr; + + /* EXPR_MIMIC_STACK_SLOT */ + struct { + char entry; + int slotnb; + }; + }; }; @@ -248,6 +256,13 @@ static inline enum expression_type expr_type(struct expression *expr) return (expr->node.op & EXPR_TYPE_MASK) >> EXPR_TYPE_SHIFT; } +static inline void expr_set_type(struct expression *expr, int type) +{ + unsigned long op = expr->node.op & ~EXPR_TYPE_MASK; + type <<= EXPR_TYPE_SHIFT; + expr->node.op = op | type; +} + static inline enum binary_operator expr_bin_op(struct expression *expr) { return (expr->node.op & OP_MASK) >> OP_SHIFT; @@ -268,6 +283,7 @@ struct expression *value_expr(enum vm_type, unsigned long long); struct expression *fvalue_expr(enum vm_type, double); struct expression *local_expr(enum vm_type, unsigned long); struct expression *temporary_expr(enum vm_type, struct var_info *, struct var_info *); +struct expression *mimic_stack_expr(enum vm_type, int, int); struct expression *array_deref_expr(enum vm_type, struct expression *, struct expression *); struct expression *binop_expr(enum vm_type, enum binary_operator, struct expression *, struct expression *); struct expression *unary_op_expr(enum vm_type, enum unary_operator, struct expression *); diff --git a/jit/expression.c b/jit/expression.c index 8e4d736..a73217c 100644 --- a/jit/expression.c +++ b/jit/expression.c @@ -44,6 +44,7 @@ int expr_nr_kids(struct expression *expr) case EXPR_NO_ARGS: case EXPR_NEW: case EXPR_EXCEPTION_REF: + case EXPR_MIMIC_STACK_SLOT: return 0; default: assert(!"Invalid expression type"); @@ -134,6 +135,17 @@ struct expression *temporary_expr(enum vm_type vm_type, struct var_info *tmp_hig return expr; } +struct expression *mimic_stack_expr(enum vm_type vm_type, int entry, int slotnb) +{ + struct expression *expr = alloc_expression(EXPR_MIMIC_STACK_SLOT, vm_type); + if (expr) { + expr->entry = entry; + expr->slotnb = slotnb; + } + + return expr; +} + struct expression *array_deref_expr(enum vm_type vm_type, struct expression *arrayref, struct expression *array_index) diff --git a/jit/tree-printer.c b/jit/tree-printer.c index c96c87b..7a8c32a 100644 --- a/jit/tree-printer.c +++ b/jit/tree-printer.c @@ -84,7 +84,7 @@ static int simple_expr(struct expression *expr) return type == EXPR_VALUE || type == EXPR_FVALUE || type == EXPR_LOCAL || type == EXPR_TEMPORARY || type == EXPR_CLASS_FIELD - || type == EXPR_NO_ARGS || type == EXPR_EXCEPTION_REF; + || type == EXPR_NO_ARGS || type == EXPR_EXCEPTION_REF || type == EXPR_MIMIC_STACK_SLOT; } static int __tree_print(int, struct tree_node *, struct string *); @@ -355,6 +355,12 @@ static int print_temporary_expr(int lvl, struct string *str, expr->tmp_high, expr->tmp_low); } +static int print_mimic_stack_slot_expr(int lvl, struct string *str, + struct expression *expr) +{ + return str_append(str, "[mimic stack slot %d at %s]", expr->slotnb, expr->entry ? "entry" : "exit"); +} + static int print_array_deref_expr(int lvl, struct string *str, struct expression *expr) { @@ -807,7 +813,8 @@ static print_expr_fn expr_printers[] = { [EXPR_EXCEPTION_REF] = print_exception_ref_expr, [EXPR_NULL_CHECK] = print_null_check_expr, [EXPR_ARRAY_SIZE_CHECK] = print_array_size_check_expr, - [EXPR_MULTIARRAY_SIZE_CHECK] = print_multiarray_size_check_expr + [EXPR_MULTIARRAY_SIZE_CHECK] = print_multiarray_size_check_expr, + [EXPR_MIMIC_STACK_SLOT] = print_mimic_stack_slot_expr, }; -- 1.6.2.2 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel