public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
more of the branch instruction class
tombagby (author)
Sun Oct 19 12:56:04 -0700 2008
commit  da0d2abff09f6f722bddc4dd9ba43045174e275c
tree    eec0b5e15175adc34c7434faeb16a53781bcbaf4
parent  05ce65372eee190044e77150770984a992f46da3
...
92
93
94
95
 
 
 
96
97
98
...
106
107
108
109
 
 
110
111
112
...
92
93
94
 
95
96
97
98
99
100
...
108
109
110
 
111
112
113
114
115
0
@@ -92,7 +92,9 @@ llvm_builder_br(VALUE self, VALUE rblock) {
0
 
0
   BasicBlock *bb;
0
   Data_Get_Struct(rblock, BasicBlock, bb);
0
-  return llvm_value_wrap(builder->CreateBr(bb)); 
0
+
0
+  Value *branch_instr = builder->CreateBr(bb);
0
+  return Data_Wrap_Struct(cLLVMBranchInst, NULL, NULL, branch_instr); 
0
 }  
0
 
0
 VALUE 
0
@@ -106,7 +108,8 @@ llvm_builder_cond_br(VALUE self, VALUE rcond, VALUE rtrue_block, VALUE rfalse_bl
0
   Data_Get_Struct(rtrue_block, BasicBlock, true_block);
0
   Data_Get_Struct(rfalse_block, BasicBlock, false_block);
0
 
0
-  return llvm_value_wrap(builder->CreateCondBr(cond, true_block, false_block));
0
+  Value *branch_instr = builder->CreateCondBr(cond, true_block, false_block);
0
+  return Data_Wrap_Struct(cLLVMBranchInst, NULL, NULL, branch_instr);
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
58
59
60
61
62
0
@@ -26,6 +26,37 @@ llvm_instruction_get_opcode_name(VALUE self) {
0
   return rb_str_new2(name.c_str());
0
 }
0
 
0
+#define DATA_GET_BRANCH_INST BranchInst *bi; Data_Get_Struct(self, BranchInst, bi);
0
+
0
+VALUE
0
+llvm_branch_inst_is_unconditional(VALUE self) {
0
+  DATA_GET_BRANCH_INST
0
+  return bi->isUnconditional() ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE
0
+llvm_branch_inst_is_conditional(VALUE self) {
0
+  DATA_GET_BRANCH_INST
0
+  return bi->isConditional() ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE
0
+llvm_branch_inst_get_condition(VALUE self) {
0
+  DATA_GET_BRANCH_INST
0
+  return llvm_value_wrap(bi->getCondition()); 
0
+}
0
+
0
+VALUE
0
+llvm_branch_inst_set_condition(VALUE self, VALUE rv) {
0
+  DATA_GET_BRANCH_INST
0
+  
0
+  Value *v;
0
+  Data_Get_Struct(rv, Value, v);
0
+
0
+  bi->setCondition(v);
0
+  return rv;
0
+}
0
+
0
 #define DATA_GET_SWITCH_INST SwitchInst *si; Data_Get_Struct(self, SwitchInst, si);
0
 
0
 VALUE
...
13
14
15
 
16
17
18
...
53
54
55
 
 
 
 
 
56
57
58
...
117
118
119
 
120
121
122
...
163
164
165
 
 
 
 
 
166
167
168
...
13
14
15
16
17
18
19
...
54
55
56
57
58
59
60
61
62
63
64
...
123
124
125
126
127
128
129
...
170
171
172
173
174
175
176
177
178
179
180
0
@@ -13,6 +13,7 @@ VALUE cLLVMArrayType = Qnil;
0
 VALUE cLLVMVectorType = Qnil;
0
 VALUE cLLVMFunctionType = Qnil;
0
 VALUE cLLVMInstruction = Qnil;
0
+VALUE cLLVMBranchInst = Qnil;
0
 VALUE cLLVMSwitchInst = Qnil;
0
 VALUE cLLVMPhi = Qnil;
0
 VALUE cLLVMBinaryOps = Qnil;
0
@@ -53,6 +54,11 @@ 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_branch_inst_is_conditional(VALUE);
0
+VALUE llvm_branch_inst_is_unconditional(VALUE);
0
+VALUE llvm_branch_inst_get_condition(VALUE);
0
+VALUE llvm_branch_inst_set_condition(VALUE, VALUE);
0
+
0
 VALUE llvm_switch_inst_get_default_dest(VALUE);
0
 VALUE llvm_switch_inst_get_num_cases(VALUE);
0
 VALUE llvm_switch_inst_add_case(VALUE, VALUE, VALUE);
0
@@ -117,6 +123,7 @@ 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
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, "BinaryOps", rb_cObject);
0
   cLLVMPhi = rb_define_class_under(cLLVMRuby, "Phi", cLLVMValue);
0
@@ -163,6 +170,11 @@ 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(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);
0
+  rb_define_method(cLLVMBranchInst, "condition=", llvm_branch_inst_set_condition, 1);
0
+
0
   rb_define_method(cLLVMSwitchInst, "get_default_dest", llvm_switch_inst_get_default_dest, 0);
0
   rb_define_method(cLLVMSwitchInst, "get_num_cases", llvm_switch_inst_get_num_cases, 0);
0
   rb_define_method(cLLVMSwitchInst, "add_case", llvm_switch_inst_add_case, 2);
...
32
33
34
 
35
36
37
...
32
33
34
35
36
37
38
0
@@ -32,6 +32,7 @@ extern VALUE cLLVMArrayType;
0
 extern VALUE cLLVMVectorType;
0
 extern VALUE cLLVMFunctionType;
0
 extern VALUE cLLVMInstruction;
0
+extern VALUE cLLVMBranchInst;
0
 extern VALUE cLLVMSwitchInst;
0
 extern VALUE cLLVMBinaryOps;
0
 extern VALUE cLLVMPhi;
...
43
44
45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
46
...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
0
@@ -43,4 +43,41 @@ class InstructionTests < Test::Unit::TestCase
0
     assert(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
0
   end
0
 
0
+  def test_branch_instructions
0
+    m = LLVM::Module.new('branch_instructions')
0
+    ExecutionEngine.get(m)
0
+    type = Type::function(MACHINE_WORD, [])
0
+
0
+    f = m.get_or_insert_function("test_br", type)
0
+    b1 = f.create_block
0
+    b2 = f.create_block
0
+    b3 = f.create_block
0
+    b4 = f.create_block
0
+
0
+    b = b1.builder
0
+    br_inst = b.br(b2)
0
+
0
+    b = b2.builder
0
+    cmp1 = b.icmp_sgt(-1.llvm, 1.llvm)
0
+    cmp2 = b.icmp_slt(-1.llvm, 1.llvm)
0
+    cond_br_inst = b.cond_br(cmp1, b3, b4)
0
+
0
+    b = b3.builder
0
+    b.return(23.llvm)
0
+
0
+    b = b4.builder
0
+    b.return(5.llvm)
0
+
0
+    assert_kind_of(BranchInst, br_inst)
0
+    assert(br_inst.unconditional?)
0
+    assert(!br_inst.conditional?)
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
+
0
+    assert_equal(23, ExecutionEngine.run_autoconvert(f))
0
+  end
0
 end

Comments