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

Reply via email to