The list of predecessors is not set yet, this is just the
infrastructure.

Signed-off-by: Arthur HUILLET <arthur.huil...@free.fr>
---
 include/jit/basic-block.h     |    2 ++
 jit/basic-block.c             |   32 +++++++++++++++++++++++---------
 jit/trace-jit.c               |   23 +++++++++++++++++++----
 test/jit/basic-block-assert.h |   22 +++++++++++++++++-----
 4 files changed, 61 insertions(+), 18 deletions(-)

diff --git a/include/jit/basic-block.h b/include/jit/basic-block.h
index b555d9e..4919c95 100644
--- a/include/jit/basic-block.h
+++ b/include/jit/basic-block.h
@@ -24,6 +24,8 @@ struct basic_block {
        unsigned long br_target_off;    /* Branch target offset in bytecode 
insns. */
        unsigned long nr_successors;
        struct basic_block **successors;
+       unsigned long nr_predecessors;
+       struct basic_block **predecessors;
        unsigned long mach_offset;
 
        /* The mimic stack is used to simulate JVM operand stack at
diff --git a/jit/basic-block.c b/jit/basic-block.c
index 22b102a..df984eb 100644
--- a/jit/basic-block.c
+++ b/jit/basic-block.c
@@ -76,6 +76,7 @@ void free_basic_block(struct basic_block *bb)
        free_stmt_list(&bb->stmt_list);
        free_insn_list(&bb->insn_list);
        free(bb->successors);
+       free(bb->predecessors);
        free(bb->use_set);
        free(bb->def_set);
        free(bb->live_in_set);
@@ -112,6 +113,9 @@ struct basic_block *bb_split(struct basic_block *orig_bb, 
unsigned long offset)
        new_bb->nr_successors = orig_bb->nr_successors;
        orig_bb->nr_successors = 0;
 
+       new_bb->predecessors = NULL;
+       new_bb->nr_predecessors = 0;
+
        if (orig_bb->has_branch) {
                orig_bb->has_branch = false;
                new_bb->has_branch = true;
@@ -142,25 +146,35 @@ void bb_add_insn(struct basic_block *bb, struct insn 
*insn)
        list_add_tail(&insn->insn_list_node, &bb->insn_list);
 }
 
-int bb_add_successor(struct basic_block *bb, struct basic_block *successor)
+int __bb_add_neighbor(struct basic_block *new, struct basic_block ***array, 
unsigned long *nb)
 {
-       int new_size;
-       struct basic_block **new_successors;
+       unsigned long new_size;
+       struct basic_block **new_neighbors;
 
-       new_size = sizeof(struct basic_block *) * (bb->nr_successors + 1);
+       new_size = sizeof(struct basic_block *) * (*nb + 1);
 
-       new_successors = realloc(bb->successors, new_size);
-       if (new_successors == NULL)
+       new_neighbors = realloc(*array, new_size);
+       if (new_neighbors == NULL)
                return -ENOMEM;
 
-       bb->successors = new_successors;
+       *array = new_neighbors;
 
-       bb->successors[bb->nr_successors] = successor;
-       bb->nr_successors++;
+       (*array)[*nb] = new;
+       (*nb)++;
 
        return 0;
 }
 
+int bb_add_successor(struct basic_block *bb, struct basic_block *successor)
+{
+       return __bb_add_neighbor(successor, &bb->successors, 
&bb->nr_successors);
+}
+
+int bb_add_predecessor(struct basic_block *bb, struct basic_block *predecessor)
+{
+       return __bb_add_neighbor(predecessor, &bb->predecessors, 
&bb->nr_predecessors);
+}
+
 unsigned char *bb_native_ptr(struct basic_block *bb)
 {
        return buffer_ptr(bb->b_parent->objcode) + bb->mach_offset;
diff --git a/jit/trace-jit.c b/jit/trace-jit.c
index c11a896..feb23d8 100644
--- a/jit/trace-jit.c
+++ b/jit/trace-jit.c
@@ -54,7 +54,7 @@ void trace_cfg(struct compilation_unit *cu)
        struct basic_block *bb;
 
        printf("Control Flow Graph:\n\n");
-       printf("  #:\t\tRange\t\tSuccessors\n");
+       printf("  #:\t\tRange\t\tSuccessors\t\tPredecessors\n");
 
        for_each_basic_block(bb, &cu->bb_list) {
                unsigned long i;
@@ -63,15 +63,30 @@ void trace_cfg(struct compilation_unit *cu)
                if (bb->is_eh)
                        printf(" (eh)");
 
+               printf("\t");
+
                for (i = 0; i < bb->nr_successors; i++) {
-                       if (i == 0)
-                               printf("\t");
-                       else
+                       if (i != 0)
                                printf(", ");
 
                        printf("%p", bb->successors[i]);
                }
 
+               if (i == 0)
+                       printf("none    ");
+
+               printf("\t");
+
+               for (i = 0; i < bb->nr_predecessors; i++) {
+                       if (i != 0)
+                               printf(", ");
+
+                       printf("%p", bb->predecessors[i]);
+               }
+
+               if (i == 0)
+                       printf("none    ");
+
                printf("\n");
        }
 
diff --git a/test/jit/basic-block-assert.h b/test/jit/basic-block-assert.h
index 8f00672..abec84c 100644
--- a/test/jit/basic-block-assert.h
+++ b/test/jit/basic-block-assert.h
@@ -12,16 +12,28 @@ static void inline assert_basic_block(struct 
compilation_unit *parent,
        assert_int_equals(end, bb->end);
 }
 
+static void inline __assert_bb_neighbors(struct basic_block **neigh, int 
nneigh, struct basic_block **array, unsigned long sz)
+{
+       int i;
+
+       assert_int_equals(sz, nneigh);
+
+       for (i = 0; i < nneigh; i++)
+               assert_ptr_equals(neigh[i], array[i]);
+}
+
 static void inline assert_basic_block_successors(struct basic_block **succ,
                                                 int nsucc,
                                                 struct basic_block *bb)
 {
-       int i;
-
-       assert_int_equals(bb->nr_successors, nsucc);
+       __assert_bb_neighbors(succ, nsucc, bb->successors, bb->nr_successors);
+}
 
-       for (i = 0; i < nsucc; i++)
-               assert_ptr_equals(succ[i], bb->successors[i]);
+static void inline assert_basic_block_predecessors(struct basic_block **pred,
+                                                int npred,
+                                                struct basic_block *bb)
+{
+       __assert_bb_neighbors(pred, npred, bb->predecessors, 
bb->nr_predecessors);
 }
 
 #endif
-- 
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