public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
more fixing and cleaning of instructions
tombagby (author)
Sun Oct 19 19:33:15 -0700 2008
commit  bd6fff4905d7ba608633000b6cd8e3a47a9f2534
tree    41e71da3d4873be2f6a013e0b6c697a2281b351b
parent  d30b2a76e2141244a4d0cf4915171b7a75d043dc
...
122
123
124
125
126
 
 
127
128
129
...
134
135
136
137
138
 
 
139
140
141
142
143
144
145
146
 
 
147
148
149
...
154
155
156
157
 
158
159
160
...
122
123
124
 
 
125
126
127
128
129
...
134
135
136
 
 
137
138
139
140
141
142
143
144
 
 
145
146
147
148
149
...
154
155
156
 
157
158
159
160
0
@@ -122,8 +122,8 @@ llvm_builder_switch(VALUE self, VALUE rv, VALUE rdefault) {
0
   Value *v;
0
   Data_Get_Struct(rv, Value, v);
0
 
0
-  Value* switch_instr = builder->CreateSwitch(v, deflt);
0
-  return Data_Wrap_Struct(cLLVMSwitchInst, NULL, NULL, switch_instr);
0
+  Instruction *switch_instr = builder->CreateSwitch(v, deflt);
0
+  return llvm_instruction_wrap(switch_instr);
0
 }
0
 
0
 VALUE
0
@@ -134,16 +134,16 @@ llvm_builder_malloc(VALUE self, VALUE rtype, VALUE rsize) {
0
   Data_Get_Struct(rtype, Type, type);
0
 
0
   Value *size = ConstantInt::get(Type::Int32Ty, FIX2INT(rsize));
0
-  Value *v = builder->CreateMalloc(type, size);
0
-  return Data_Wrap_Struct(cLLVMAllocationInst, NULL, NULL, v);
0
+  Instruction *v = builder->CreateMalloc(type, size);
0
+  return llvm_instruction_wrap(v);
0
 }
0
 
0
 VALUE
0
 llvm_builder_free(VALUE self, VALUE rptr) {
0
    DATA_GET_BUILDER
0
    Value *v = LLVM_VAL(rptr);
0
-   Value *free_inst = builder->CreateFree(v);
0
-   return Data_Wrap_Struct(cLLVMFreeInst, NULL, NULL, free_inst);
0
+   Instruction *free_inst = builder->CreateFree(v);
0
+   return llvm_instruction_wrap(free_inst);
0
 }
0
   
0
 VALUE 
0
@@ -154,7 +154,7 @@ llvm_builder_alloca(VALUE self, VALUE rtype, VALUE rsize) {
0
   Data_Get_Struct(rtype, Type, type);
0
 
0
   Value *size = ConstantInt::get(Type::Int32Ty, FIX2INT(rsize));
0
-  Value *v = builder->CreateAlloca(type, size);
0
+  Instruction *v = builder->CreateAlloca(type, size);
0
   return Data_Wrap_Struct(cLLVMAllocationInst, NULL, NULL, v);
0
 }
0
 
...
194
195
196
 
197
198
199
...
194
195
196
197
198
199
200
0
@@ -194,6 +194,7 @@ void init_instructions() {
0
   // Need to be able to quickly look up at runtime Ruby classes cooresponding to LLVM classes
0
   #define HANDLE_TERM_INST(Num, Opcode, Klass) gInstructionClasses[Num] = cLLVM##Klass;
0
   #define HANDLE_BINARY_INST(Num, Opcode, Klass) gInstructionClasses[Num] = cLLVM##Klass; 
0
+  #define HANDLE_MEMORY_INST(Num, Opcode, Klass) gInstructionClasses[Num] = cLLVM##Klass;
0
   #include "llvm/Instruction.def"
0
   
0
   // Standard binary operators
...
14
15
16
17
 
18
19
20
...
150
151
152
153
 
154
155
156
157
158
159
160
161
162
163
 
 
 
 
 
 
 
164
165
166
...
14
15
16
 
17
18
19
20
...
150
151
152
 
153
154
155
156
 
157
158
159
 
160
161
162
163
164
165
166
167
168
169
170
171
0
@@ -14,7 +14,7 @@ VALUE cLLVMVectorType = Qnil;
0
 VALUE cLLVMFunctionType = Qnil;
0
 VALUE cLLVMInstruction = Qnil;
0
 VALUE cLLVMTerminatorInst = Qnil;
0
-VALUE cLLVMUnaryOperator = Qnil;
0
+VALUE cLLVMUnaryInstruction = Qnil;
0
 VALUE cLLVMBinaryOperator = Qnil;
0
 VALUE cLLVMCmpInst = Qnil;
0
 VALUE cLLVMICmpInst = Qnil;
0
@@ -150,17 +150,22 @@ void Init_llvmruby() {
0
   cLLVMBuilder = rb_define_class_under(cLLVMRuby, "Builder", rb_cObject);
0
 
0
   cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", cLLVMValue);
0
-  cLLVMUnaryOperator = rb_define_class_under(cLLVMRuby, "UnaryOperator", cLLVMInstruction);
0
+  cLLVMUnaryInstruction = rb_define_class_under(cLLVMRuby, "UnaryInstruction", cLLVMInstruction);
0
   cLLVMBinaryOperator = rb_define_class_under(cLLVMRuby, "BinaryOperator", cLLVMInstruction);
0
   cLLVMTerminatorInst = rb_define_class_under(cLLVMRuby, "TerminatorInst", cLLVMInstruction);
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
 
0
   #define HANDLE_TERM_INST(Num, Opcode, Klass) cLLVM##Klass = rb_define_class_under(cLLVMRuby, #Klass, cLLVMTerminatorInst);
0
-  #define HANDLE_MEMORY_INST(Num, Opcode, Klass) cLLVM##Klass = rb_define_class_under(cLLVMRuby, #Klass, cLLVMInstruction);
0
   #include "llvm/Instruction.def"
0
 
0
+  cLLVMLoadInst = rb_define_class_under(cLLVMRuby, "LoadInst", cLLVMUnaryInstruction);
0
+  cLLVMStoreInst = rb_define_class_under(cLLVMRuby, "StoreInst", cLLVMInstruction);
0
+  cLLVMFreeInst = rb_define_class_under(cLLVMRuby, "FreeInst", cLLVMUnaryInstruction);
0
+  cLLVMGetElementPtrInst = rb_define_class_under(cLLVMRuby, "GetElementPtrInst", cLLVMInstruction);
0
+  cLLVMAllocaInst = rb_define_class_under(cLLVMRuby, "AllocaInst", cLLVMAllocationInst);
0
+  cLLVMMallocInst = rb_define_class_under(cLLVMRuby, "MallocInst", cLLVMAllocationInst);
0
+
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);
...
278
279
280
281
 
 
282
283
284
...
278
279
280
 
281
282
283
284
285
0
@@ -278,7 +278,8 @@ class BasicTests < Test::Unit::TestCase
0
       assert_kind_of(Type, new_space.allocated_type)
0
       assert_equal(0, new_space.alignment)
0
 
0
-      b.store(23.llvm(MACHINE_WORD), new_space)    
0
+      store_inst = b.store(23.llvm(MACHINE_WORD), new_space)    
0
+      assert(store_inst.may_write_to_memory?)
0
       v = b.load(new_space)
0
       free_inst = b.free(new_space)
0
       assert_kind_of(FreeInst, free_inst)

Comments