This will be necessary for bc2ir to work.
Signed-off-by: Arthur HUILLET <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel