public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
terminator instructions
tombagby (author)
Sun Oct 19 13:32:34 -0700 2008
commit  f26df3f0f9db776e33e04ee129d1a754b72e3bb1
tree    b672d413cec8498058334960fa8708242b2baa1e
parent  da0d2abff09f6f722bddc4dd9ba43045174e275c
...
83
84
85
86
 
87
88
89
...
83
84
85
 
86
87
88
89
0
@@ -83,7 +83,7 @@ VALUE
0
 llvm_builder_return(VALUE self, VALUE rv) {
0
   //CHECK_TYPE(rv, cLLVMValue);
0
   DATA_GET_BUILDER
0
-  return llvm_value_wrap(builder->CreateRet(LLVM_VAL(rv)));
0
+  return Data_Wrap_Struct(cLLVMReturnInst, NULL, NULL, builder->CreateRet(LLVM_VAL(rv)));
0
 }
0
 
0
 VALUE 
...
26
27
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
30
31
...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
0
@@ -26,6 +26,32 @@ llvm_instruction_get_opcode_name(VALUE self) {
0
   return rb_str_new2(name.c_str());
0
 }
0
 
0
+#define DATA_GET_TERMINATOR_INST TerminatorInst *ti; Data_Get_Struct(self, TerminatorInst, ti);
0
+
0
+VALUE
0
+llvm_terminator_inst_num_successors(VALUE self) {
0
+  DATA_GET_TERMINATOR_INST
0
+  return INT2FIX(ti->getNumSuccessors());
0
+}
0
+
0
+VALUE
0
+llvm_terminator_inst_get_successor(VALUE self, VALUE ridx) {
0
+  DATA_GET_TERMINATOR_INST
0
+  BasicBlock *bb = ti->getSuccessor(FIX2INT(ridx));
0
+  return llvm_basic_block_wrap(bb);
0
+}
0
+
0
+VALUE
0
+llvm_terminator_inst_set_successor(VALUE self, VALUE ridx, VALUE rbb) {
0
+  DATA_GET_TERMINATOR_INST
0
0
+  BasicBlock *bb;
0
+  Data_Get_Struct(rbb, BasicBlock, bb);
0
+
0
+  ti->setSuccessor(FIX2INT(ridx), bb);
0
+  return rbb;
0
+}
0
+
0
 #define DATA_GET_BRANCH_INST BranchInst *bi; Data_Get_Struct(self, BranchInst, bi);
0
 
0
 VALUE
...
13
14
15
 
 
16
17
18
...
54
55
56
 
 
 
 
57
58
59
...
123
124
125
126
127
 
 
 
 
128
129
130
...
170
171
172
 
 
 
 
173
174
175
...
13
14
15
16
17
18
19
20
...
56
57
58
59
60
61
62
63
64
65
...
129
130
131
 
 
132
133
134
135
136
137
138
...
178
179
180
181
182
183
184
185
186
187
0
@@ -13,6 +13,8 @@ VALUE cLLVMArrayType = Qnil;
0
 VALUE cLLVMVectorType = Qnil;
0
 VALUE cLLVMFunctionType = Qnil;
0
 VALUE cLLVMInstruction = Qnil;
0
+VALUE cLLVMTerminatorInst = Qnil;
0
+VALUE cLLVMReturnInst = Qnil;
0
 VALUE cLLVMBranchInst = Qnil;
0
 VALUE cLLVMSwitchInst = Qnil;
0
 VALUE cLLVMPhi = Qnil;
0
@@ -54,6 +56,10 @@ VALUE llvm_basic_block_get_instruction_list(VALUE);
0
 VALUE llvm_instruction_inspect(VALUE);
0
 VALUE llvm_instruction_get_opcode_name(VALUE);
0
 
0
+VALUE llvm_terminator_inst_num_successors(VALUE);
0
+VALUE llvm_terminator_inst_get_successor(VALUE, VALUE);
0
+VALUE llvm_terminator_inst_set_successor(VALUE, VALUE, VALUE);
0
+
0
 VALUE llvm_branch_inst_is_conditional(VALUE);
0
 VALUE llvm_branch_inst_is_unconditional(VALUE);
0
 VALUE llvm_branch_inst_get_condition(VALUE);
0
@@ -123,8 +129,10 @@ void Init_llvmruby() {
0
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, "Builder", rb_cObject);
0
 
0
   cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", rb_cObject);
0
-  cLLVMBranchInst = rb_define_class_under(cLLVMRuby, "BranchInst", cLLVMInstruction);
0
-  cLLVMSwitchInst = rb_define_class_under(cLLVMRuby, "SwitchInst", cLLVMInstruction);
0
+  cLLVMTerminatorInst = rb_define_class_under(cLLVMRuby, "TerminatorInst", cLLVMInstruction);
0
+  cLLVMReturnInst = rb_define_class_under(cLLVMRuby, "ReturnInst", cLLVMTerminatorInst);
0
+  cLLVMBranchInst = rb_define_class_under(cLLVMRuby, "BranchInst", cLLVMTerminatorInst);
0
+  cLLVMSwitchInst = rb_define_class_under(cLLVMRuby, "SwitchInst", cLLVMTerminatorInst);
0
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, "BinaryOps", rb_cObject);
0
   cLLVMPhi = rb_define_class_under(cLLVMRuby, "Phi", cLLVMValue);
0
 
0
@@ -170,6 +178,10 @@ void Init_llvmruby() {
0
   rb_define_method(cLLVMInstruction, "inspect", llvm_instruction_inspect, 0);
0
   rb_define_method(cLLVMInstruction, "get_opcode_name", llvm_instruction_get_opcode_name, 0);
0
 
0
+  rb_define_method(cLLVMTerminatorInst, "num_successors", llvm_terminator_inst_num_successors, 0);
0
+  rb_define_method(cLLVMTerminatorInst, "get_successor", llvm_terminator_inst_get_successor, 1);
0
+  rb_define_method(cLLVMTerminatorInst, "set_successor", llvm_terminator_inst_set_successor, 2);
0
+
0
   rb_define_method(cLLVMBranchInst, "conditional?", llvm_branch_inst_is_conditional, 0);
0
   rb_define_method(cLLVMBranchInst, "unconditional?", llvm_branch_inst_is_unconditional, 0);
0
   rb_define_method(cLLVMBranchInst, "condition", llvm_branch_inst_get_condition, 0);
...
32
33
34
 
 
35
36
37
...
32
33
34
35
36
37
38
39
0
@@ -32,6 +32,8 @@ extern VALUE cLLVMArrayType;
0
 extern VALUE cLLVMVectorType;
0
 extern VALUE cLLVMFunctionType;
0
 extern VALUE cLLVMInstruction;
0
+extern VALUE cLLVMTerminatorInst;
0
+extern VALUE cLLVMReturnInst;
0
 extern VALUE cLLVMBranchInst;
0
 extern VALUE cLLVMSwitchInst;
0
 extern VALUE cLLVMBinaryOps;
...
53
54
55
 
56
57
58
...
68
69
70
 
 
 
71
72
73
 
 
74
75
76
77
78
79
 
 
80
81
 
 
 
 
 
 
82
83
...
53
54
55
56
57
58
59
...
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
85
86
87
 
88
89
90
91
92
93
94
95
0
@@ -53,6 +53,7 @@ class InstructionTests < Test::Unit::TestCase
0
     b2 = f.create_block
0
     b3 = f.create_block
0
     b4 = f.create_block
0
+    b5 = f.create_block
0
 
0
     b = b1.builder
0
     br_inst = b.br(b2)
0
@@ -68,16 +69,27 @@ class InstructionTests < Test::Unit::TestCase
0
     b = b4.builder
0
     b.return(5.llvm)
0
 
0
+    b = b5.builder
0
+    ret_inst = b.return(1999.llvm)
0
+
0
     assert_kind_of(BranchInst, br_inst)
0
     assert(br_inst.unconditional?)
0
     assert(!br_inst.conditional?)
0
+    assert_equal(1, br_inst.num_successors)
0
+    assert_kind_of(BasicBlock, br_inst.get_successor(0))
0
 
0
     assert_kind_of(BranchInst, cond_br_inst)
0
     assert(cond_br_inst.conditional?)
0
     assert(!cond_br_inst.unconditional?)
0
     assert_kind_of(Value, cond_br_inst.condition)
0
-    cond_br_inst.condition = cmp2
0
+    assert_equal(2, cond_br_inst.num_successors)
0
+    assert_kind_of(BasicBlock, cond_br_inst.get_successor(1))
0
 
0
-    assert_equal(23, ExecutionEngine.run_autoconvert(f))
0
+    assert_kind_of(ReturnInst, ret_inst)
0
+    assert_equal(0, ret_inst.num_successors)
0
+
0
+    cond_br_inst.condition = cmp2
0
+    cond_br_inst.set_successor(0, b5)
0
+    assert_equal(1999, ExecutionEngine.run_autoconvert(f))
0
   end
0
 end

Comments