public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
more specialized instruction classes
tombagby (author)
Sun Oct 19 17:17:04 -0700 2008
commit  86dc62620c7efb3e5cb10889af328c9675f449b2
tree    21d5a2bf9ff34159d7e78bbd8e9efc2e0e0396f2
parent  d5243b0f46107e05471f884a95fe723ec6aaee23
...
49
50
51
52
53
54
55
56
...
59
60
61
62
 
63
64
65
...
73
74
75
 
76
77
 
78
79
80
81
82
83
84
 
85
86
87
...
142
143
144
145
146
 
 
147
148
149
...
164
165
166
167
 
168
169
170
...
174
175
176
177
 
178
179
180
...
183
184
185
186
 
187
188
189
...
192
193
194
195
 
196
197
198
...
49
50
51
 
 
52
53
54
...
57
58
59
 
60
61
62
63
...
71
72
73
74
75
76
77
78
79
80
81
82
83
 
84
85
86
87
...
142
143
144
 
 
145
146
147
148
149
...
164
165
166
 
167
168
169
170
...
174
175
176
 
177
178
179
180
...
183
184
185
 
186
187
188
189
...
192
193
194
 
195
196
197
198
0
@@ -49,8 +49,6 @@ llvm_builder_set_insert_point(VALUE self, VALUE rbb) {
0
 VALUE 
0
 llvm_builder_bin_op(VALUE self, VALUE rbin_op, VALUE rv1, VALUE rv2) {
0
   Check_Type(rbin_op, T_FIXNUM);
0
-  //CHECK_TYPE(rv1, cLLVMValue);
0
-  //CHECK_TYPE(rv2, cLLVMValue);
0
   DATA_GET_BUILDER
0
 
0
   Instruction::BinaryOps bin_op = (Instruction::BinaryOps)FIX2INT(rbin_op);
0
@@ -59,7 +57,7 @@ llvm_builder_bin_op(VALUE self, VALUE rbin_op, VALUE rv1, VALUE rv2) {
0
   Data_Get_Struct(rv1, Value, v1);
0
   Data_Get_Struct(rv2, Value, v2);
0
   Value *res = builder->CreateBinOp(bin_op, v1, v2);
0
-  return llvm_value_wrap(res);
0
+  return Data_Wrap_Struct(cLLVMBinaryOperator, NULL, NULL, res);
0
 }
0
 
0
 VALUE
0
@@ -73,15 +71,17 @@ llvm_builder_phi(VALUE self, VALUE type) {
0
 VALUE
0
 llvm_phi_add_incoming(VALUE self, VALUE val, VALUE rbb) {
0
   CHECK_TYPE(val, cLLVMValue);
0
+
0
   DATA_GET_BLOCK
0
   PHINode *phi = LLVM_PHI(self);
0
+
0
   phi->addIncoming(LLVM_VAL(val), bb);
0
   return self;
0
 }
0
 
0
 VALUE 
0
 llvm_builder_return(VALUE self, VALUE rv) {
0
-  //CHECK_TYPE(rv, cLLVMValue);
0
+  CHECK_TYPE(rv, cLLVMValue);
0
   DATA_GET_BUILDER
0
   return Data_Wrap_Struct(cLLVMReturnInst, NULL, NULL, builder->CreateRet(LLVM_VAL(rv)));
0
 }
0
@@ -142,8 +142,8 @@ VALUE
0
 llvm_builder_free(VALUE self, VALUE rptr) {
0
    DATA_GET_BUILDER
0
    Value *v = LLVM_VAL(rptr);
0
-   builder->CreateFree(v);
0
-   return Qtrue;
0
+   Value *free_inst = builder->CreateFree(v);
0
+   return Data_Wrap_Struct(cLLVMFreeInst, NULL, NULL, free_inst);
0
 }
0
   
0
 VALUE 
0
@@ -164,7 +164,7 @@ llvm_builder_load(VALUE self, VALUE rptr) {
0
 
0
   Value *ptr;
0
   Data_Get_Struct(rptr, Value, ptr);
0
-  return llvm_value_wrap(builder->CreateLoad(ptr));
0
+  return Data_Wrap_Struct(cLLVMLoadInst, NULL, NULL, builder->CreateLoad(ptr));
0
 }
0
 
0
 VALUE
0
@@ -174,7 +174,7 @@ llvm_builder_store(VALUE self, VALUE rv, VALUE rptr) {
0
   Value *v, *ptr;
0
   Data_Get_Struct(rv, Value, v);
0
   Data_Get_Struct(rptr, Value, ptr);
0
-  return llvm_value_wrap(builder->CreateStore(v, ptr));
0
+  return Data_Wrap_Struct(cLLVMStoreInst, NULL, NULL, builder->CreateStore(v, ptr));
0
 }
0
 
0
 VALUE
0
@@ -183,7 +183,7 @@ llvm_builder_icmp(VALUE self, VALUE pred, VALUE lhs, VALUE rhs) {
0
 
0
   CmpInst::Predicate p = (CmpInst::Predicate)FIX2INT(pred);
0
   Value *v = builder->CreateICmp(p, LLVM_VAL(lhs), LLVM_VAL(rhs));
0
-  return llvm_value_wrap(v);
0
+  return Data_Wrap_Struct(cLLVMICmpInst, NULL, NULL, v);
0
 }
0
 
0
 VALUE
0
@@ -192,7 +192,7 @@ llvm_builder_fcmp(VALUE self, VALUE pred, VALUE lhs, VALUE rhs) {
0
 
0
   CmpInst::Predicate p = (CmpInst::Predicate)FIX2INT(pred);
0
   Value *v = builder->CreateFCmp(p, LLVM_VAL(lhs), LLVM_VAL(rhs));
0
-  return llvm_value_wrap(v);
0
+  return Data_Wrap_Struct(cLLVMFCmpInst, NULL, NULL, v);
0
 }
0
 
0
 VALUE
...
13
14
15
 
 
 
 
 
 
 
16
17
18
19
20
 
21
22
23
...
137
138
139
140
 
 
 
 
 
 
 
 
141
142
143
144
145
 
146
147
148
...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
...
145
146
147
 
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
0
@@ -13,11 +13,19 @@ VALUE cLLVMArrayType = Qnil;
0
 VALUE cLLVMVectorType = Qnil;
0
 VALUE cLLVMFunctionType = Qnil;
0
 VALUE cLLVMInstruction = Qnil;
0
+VALUE cLLVMUnaryOperator = Qnil;
0
+VALUE cLLVMBinaryOperator = Qnil;
0
+VALUE cLLVMLoadInst = Qnil;
0
+VALUE cLLVMStoreInst = Qnil;
0
+VALUE cLLVMCmpInst = Qnil;
0
+VALUE cLLVMICmpInst = Qnil;
0
+VALUE cLLVMFCmpInst = Qnil;
0
 VALUE cLLVMTerminatorInst = Qnil;
0
 VALUE cLLVMReturnInst = Qnil;
0
 VALUE cLLVMBranchInst = Qnil;
0
 VALUE cLLVMSwitchInst = Qnil;
0
 VALUE cLLVMAllocationInst = Qnil;
0
+VALUE cLLVMFreeInst = Qnil;
0
 VALUE cLLVMPhi = Qnil;
0
 VALUE cLLVMBinaryOps = Qnil;
0
 VALUE cLLVMPassManager = Qnil;
0
@@ -137,12 +145,20 @@ void Init_llvmruby() {
0
   cLLVMBasicBlock = rb_define_class_under(cLLVMRuby, "BasicBlock", cLLVMValue);   
0
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, "Builder", rb_cObject);
0
 
0
-  cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", rb_cObject);
0
+  cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", cLLVMValue);
0
+  cLLVMUnaryOperator = rb_define_class_under(cLLVMRuby, "UnaryOperator", cLLVMInstruction);
0
+  cLLVMBinaryOperator = rb_define_class_under(cLLVMRuby, "BinaryOperator", cLLVMInstruction);
0
+  cLLVMLoadInst = rb_define_class_under(cLLVMRuby, "LoadInst", cLLVMUnaryOperator);
0
+  cLLVMStoreInst = rb_define_class_under(cLLVMRuby, "BinaryOperator", cLLVMInstruction);
0
+  cLLVMCmpInst = rb_define_class_under(cLLVMRuby, "CmpInst", cLLVMInstruction);
0
+  cLLVMICmpInst = rb_define_class_under(cLLVMRuby, "ICmpInst", cLLVMCmpInst);
0
+  cLLVMFCmpInst = rb_define_class_under(cLLVMRuby, "FCmpInst", cLLVMCmpInst);
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
   cLLVMAllocationInst = rb_define_class_under(cLLVMRuby, "AllocationInst", cLLVMInstruction);
0
+  cLLVMFreeInst = rb_define_class_under(cLLVMRuby, "FreeInst", cLLVMInstruction);
0
   cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, "BinaryOps", rb_cObject);
0
   cLLVMPhi = rb_define_class_under(cLLVMRuby, "Phi", cLLVMValue);
0
 
...
32
33
34
 
 
 
 
 
 
 
35
36
37
38
39
 
40
41
42
...
51
52
53
54
 
55
56
57
...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
...
59
60
61
 
62
63
64
65
0
@@ -32,11 +32,19 @@ extern VALUE cLLVMArrayType;
0
 extern VALUE cLLVMVectorType;
0
 extern VALUE cLLVMFunctionType;
0
 extern VALUE cLLVMInstruction;
0
+extern VALUE cLLVMUnaryOperator;
0
+extern VALUE cLLVMBinaryOperator;
0
+extern VALUE cLLVMLoadInst;
0
+extern VALUE cLLVMStoreInst;
0
+extern VALUE cLLVMCmpInst;
0
+extern VALUE cLLVMICmpInst;
0
+extern VALUE cLLVMFCmpInst;
0
 extern VALUE cLLVMTerminatorInst;
0
 extern VALUE cLLVMReturnInst;
0
 extern VALUE cLLVMBranchInst;
0
 extern VALUE cLLVMSwitchInst;
0
 extern VALUE cLLVMAllocationInst;
0
+extern VALUE cLLVMFreeInst;
0
 extern VALUE cLLVMBinaryOps;
0
 extern VALUE cLLVMPhi;
0
 extern VALUE cLLVMPassManager;
0
@@ -51,7 +59,7 @@ extern VALUE cLLVMPassManager;
0
 #define LLVM_PHI(obj) ((PHINode*)DATA_PTR(obj))
0
 
0
 #define CHECK_TYPE(val, klass)\
0
-  if(CLASS_OF(val) != klass) {\
0
+  if(!rb_obj_is_kind_of(val, klass)) {\
0
     rb_raise(rb_eTypeError, "wrong argument type: %s given, expected %s", rb_obj_classname(val), rb_class2name(klass));\
0
   }
0
 
...
280
281
282
283
 
 
284
285
286
...
280
281
282
 
283
284
285
286
287
0
@@ -280,7 +280,8 @@ class BasicTests < Test::Unit::TestCase
0
 
0
       b.store(23.llvm(MACHINE_WORD), new_space)    
0
       v = b.load(new_space)
0
-      b.free(new_space)
0
+      free_inst = b.free(new_space)
0
+      assert_kind_of(FreeInst, free_inst)
0
       b.return(v)
0
     end
0
   end

Comments