plessl-llvmruby 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,71 @@
1
+ #include "llvmruby.h"
2
+
3
+ extern "C" {
4
+ VALUE
5
+ llvm_user_wrap(User *u) {
6
+ return Data_Wrap_Struct(cLLVMUser, NULL, NULL, u);
7
+ }
8
+
9
+ //llvm_user_get_operand_list
10
+ VALUE
11
+ llvm_user_get_operand_list(VALUE self) {
12
+ User *usr = LLVM_USER(self);
13
+ VALUE op_array = rb_ary_new();
14
+ User::op_iterator op = usr->op_begin();
15
+ while(op != usr->op_end()) {
16
+ Use *u = op++;
17
+ rb_ary_push(op_array, llvm_use_wrap(op));
18
+ }
19
+ return op_array;
20
+ }
21
+
22
+
23
+ //llvm_user_set_operand
24
+ VALUE
25
+ llvm_user_set_operand(VALUE self, VALUE i, VALUE val) {
26
+ User *u = LLVM_USER(self);
27
+ Value *v;
28
+ Data_Get_Struct(val, Value, v);
29
+ u->setOperand(FIX2UINT(i),v);
30
+ return Qtrue;
31
+ }
32
+
33
+
34
+ //llvm_user_get_operand
35
+ VALUE
36
+ llvm_user_get_operand(VALUE self, VALUE i) {
37
+ User *u = LLVM_USER(self);
38
+ return llvm_value_wrap(u->getOperand(FIX2UINT(i)));
39
+ }
40
+
41
+
42
+ //llvm_user_get_num_operands
43
+ VALUE
44
+ llvm_user_get_num_operands(VALUE self) {
45
+ User *u = LLVM_USER(self);
46
+ return INT2NUM(u->getNumOperands());
47
+ }
48
+
49
+
50
+ //llvm_user_drop_all_references
51
+ VALUE
52
+ llvm_user_drop_all_references(VALUE self) {
53
+ User *u = LLVM_USER(self);
54
+ u->dropAllReferences();
55
+ return Qtrue;
56
+ }
57
+
58
+
59
+ //llvm_user_replace_uses_of_with
60
+ VALUE
61
+ llvm_user_replace_uses_of_with(VALUE self, VALUE from, VALUE to) {
62
+ User *u = LLVM_USER(self);
63
+ Value *v_from, *v_to;
64
+ Data_Get_Struct(from, Value, v_from);
65
+ Data_Get_Struct(to, Value, v_to);
66
+ u->replaceUsesOfWith(v_from,v_to);
67
+ return Qtrue;
68
+ }
69
+
70
+
71
+ }
@@ -0,0 +1,254 @@
1
+ #include "llvmruby.h"
2
+
3
+ extern "C" {
4
+ VALUE
5
+ llvm_value_wrap(Value* v) {
6
+ return Data_Wrap_Struct(cLLVMValue, NULL, NULL, v);
7
+ }
8
+
9
+ VALUE
10
+ llvm_value_name(VALUE self) {
11
+ Value *v;
12
+ Data_Get_Struct(self, Value, v);
13
+
14
+ if(v->hasName()) {
15
+ const char *name = v->getNameStart();
16
+ int len = v->getNameLen();
17
+ return rb_str_new(name, len);
18
+ } else {
19
+ return Qnil;
20
+ }
21
+ }
22
+
23
+ VALUE
24
+ llvm_value_set_name(VALUE self, VALUE rname) {
25
+ Value *v;
26
+ Data_Get_Struct(self, Value, v);
27
+ v->setName(RSTRING_PTR(rname), RSTRING_LEN(rname));
28
+ return rname;
29
+ }
30
+
31
+ VALUE
32
+ llvm_value_type(VALUE self) {
33
+ Value *v;
34
+ Data_Get_Struct(self, Value, v);
35
+ const Type *t = v->getType();
36
+ return Data_Wrap_Struct(cLLVMType, NULL, NULL, (void*) t);;
37
+ }
38
+
39
+ VALUE
40
+ llvm_value_num_uses(VALUE self) {
41
+ Value *v;
42
+ Data_Get_Struct(self, Value, v);
43
+ return INT2FIX(v->getNumUses());
44
+ }
45
+
46
+ VALUE
47
+ llvm_value_used_in_basic_block(VALUE self, VALUE rbb) {
48
+ Value *v;
49
+ Data_Get_Struct(self, Value, v);
50
+
51
+ BasicBlock *bb;
52
+ Data_Get_Struct(rbb, BasicBlock, bb);
53
+
54
+ return v->isUsedInBasicBlock(bb) ? Qtrue : Qfalse;
55
+ }
56
+
57
+ VALUE
58
+ llvm_value_replace_all_uses_with(VALUE self, VALUE rv2) {
59
+ Value *v1, *v2;
60
+ Data_Get_Struct(self, Value, v1);
61
+ Data_Get_Struct(rv2, Value, v2);
62
+ v1->replaceAllUsesWith(v2);
63
+ return rv2;
64
+ }
65
+
66
+ VALUE
67
+ llvm_value_get_constant(VALUE self, VALUE type, VALUE v) {
68
+ return llvm_value_wrap(ConstantInt::get(LLVM_TYPE(type), FIX2INT(v)));
69
+ }
70
+
71
+ VALUE
72
+ llvm_value_get_float_constant(VALUE self, VALUE v) {
73
+ return llvm_value_wrap(ConstantFP::get(Type::FloatTy, RFLOAT(v)->value));
74
+ }
75
+
76
+ VALUE
77
+ llvm_value_get_double_constant(VALUE self, VALUE v) {
78
+ return llvm_value_wrap(ConstantFP::get(Type::DoubleTy, RFLOAT(v)->value));
79
+ }
80
+
81
+ VALUE
82
+ llvm_value_get_struct_constant(int argc, VALUE *argv, VALUE self) {
83
+ StructType *t = (StructType*)DATA_PTR(argv[0]);
84
+ std::vector<Constant*> vals;
85
+
86
+ for(int i = 1; i < argc; ++i) {
87
+ Constant *c = (Constant*)DATA_PTR(argv[i]);
88
+ vals.push_back(c);
89
+ }
90
+ return llvm_value_wrap(ConstantStruct::get(t, vals));
91
+ }
92
+
93
+ VALUE
94
+ llvm_value_get_immediate_constant(VALUE self, VALUE v) {
95
+ const IntegerType* type;
96
+ if(sizeof(VALUE) == 4) {
97
+ type = Type::Int32Ty;
98
+ } else {
99
+ type = Type::Int64Ty;
100
+ }
101
+ return llvm_value_wrap(ConstantInt::get(type, (long)v));
102
+ }
103
+
104
+ VALUE
105
+ llvm_value_is_constant(VALUE self) {
106
+ Value *v;
107
+ Data_Get_Struct(self, Value, v);
108
+ return isa<Constant>(v) ? Qtrue : Qfalse;
109
+ }
110
+
111
+ VALUE
112
+ llvm_value_is_int_constant(VALUE self) {
113
+ Value *v;
114
+ Data_Get_Struct(self, Value, v);
115
+ return isa<ConstantInt>(v) ? Qtrue : Qfalse;
116
+ }
117
+
118
+ VALUE
119
+ llvm_value_is_float_constant(VALUE self) {
120
+ Value *v;
121
+ Data_Get_Struct(self, Value, v);
122
+ return isa<ConstantFP>(v) ? Qtrue : Qfalse;
123
+ }
124
+
125
+ VALUE
126
+ llvm_value_get_int_constant_value(VALUE self) {
127
+ Value *v;
128
+ Data_Get_Struct(self, Value, v);
129
+ if (ConstantInt *C = dyn_cast<ConstantInt>(v)) {
130
+ APInt val = C->getValue();
131
+ return LL2NUM(val.getLimitedValue());
132
+ } else {
133
+ rb_raise(rb_eTypeError, "Argument not an integer constant");
134
+ }
135
+ }
136
+
137
+ VALUE
138
+ llvm_value_get_float_constant_value(VALUE self) {
139
+ Value *v;
140
+ Data_Get_Struct(self, Value, v);
141
+ if (ConstantFP *C = dyn_cast<ConstantFP>(v)) {
142
+ APFloat val = C->getValueAPF();
143
+ return rb_float_new(val.convertToFloat());
144
+ } else {
145
+ rb_raise(rb_eTypeError, "Argument not a float constant");
146
+ }
147
+ }
148
+
149
+
150
+ VALUE
151
+ llvm_value_is_null(VALUE self) {
152
+ Value *v;
153
+ Data_Get_Struct(self, Value, v);
154
+ if (Constant *C = dyn_cast<Constant>(v))
155
+ return C->isNullValue() ? Qtrue : Qfalse;
156
+ return Qfalse;
157
+ }
158
+
159
+ VALUE
160
+ llvm_value_is_undef(VALUE self) {
161
+ Value *v;
162
+ Data_Get_Struct(self, Value, v);
163
+ return isa<UndefValue>(v) ? Qtrue : Qfalse;
164
+ }
165
+
166
+ VALUE
167
+ llvm_type_pointer(VALUE self, VALUE rtype) {
168
+ Type *type;
169
+ Data_Get_Struct(rtype, Type, type);
170
+ Type* ptr_type = PointerType::getUnqual(type);
171
+ return Data_Wrap_Struct(cLLVMPointerType, NULL, NULL, ptr_type);
172
+ }
173
+
174
+ VALUE
175
+ llvm_type_struct(VALUE self, VALUE rtypes, VALUE rpacked) {
176
+ std::vector<const Type*> types;
177
+
178
+ for(int i = 0; i < RARRAY_LEN(rtypes); ++i) {
179
+ VALUE v = RARRAY_PTR(rtypes)[i];
180
+ const Type *t;
181
+ Data_Get_Struct(v, Type, t);
182
+ types.push_back(t);
183
+ }
184
+ StructType *s = StructType::get(types);
185
+ return Data_Wrap_Struct(cLLVMStructType, NULL, NULL, s);
186
+ }
187
+
188
+ VALUE
189
+ llvm_type_array(VALUE self, VALUE rtype, VALUE size) {
190
+ Type *type;
191
+ Data_Get_Struct(rtype, Type, type);
192
+ type = ArrayType::get(type, FIX2INT(size));
193
+ return Data_Wrap_Struct(cLLVMArrayType, NULL, NULL, type);
194
+ }
195
+
196
+ VALUE
197
+ llvm_type_vector(VALUE self, VALUE rtype, VALUE size) {
198
+ Type *type;
199
+ Data_Get_Struct(rtype, Type, type);
200
+ type = VectorType::get(type, FIX2INT(size));
201
+ return Data_Wrap_Struct(cLLVMVectorType, NULL, NULL, type);
202
+ }
203
+
204
+ VALUE
205
+ llvm_type_function(int argc, VALUE *argv, VALUE self) {
206
+ VALUE rret_type, rarg_types, var_args;
207
+
208
+ rb_scan_args(argc, argv, "21", &rret_type, &rarg_types, &var_args);
209
+
210
+ std::vector<const Type*> arg_types;
211
+ for(int i = 0; i < RARRAY_LEN(rarg_types); ++i) {
212
+ VALUE v = RARRAY_PTR(rarg_types)[i];
213
+ arg_types.push_back(LLVM_TYPE(v));
214
+ }
215
+ const Type *ret_type = LLVM_TYPE(rret_type);
216
+ FunctionType *ftype = FunctionType::get(ret_type, arg_types, RTEST(var_args));
217
+ return Data_Wrap_Struct(cLLVMFunctionType, NULL, NULL, ftype);
218
+ }
219
+
220
+ VALUE
221
+ llvm_type_to_s(VALUE self) {
222
+ Type *type;
223
+ Data_Get_Struct(self, Type, type);
224
+ return rb_str_new2(type->getDescription().c_str());
225
+ }
226
+
227
+ VALUE
228
+ llvm_type_type_id(VALUE self) {
229
+ Type *type;
230
+ Data_Get_Struct(self, Type, type);
231
+ return INT2FIX((int) type->getTypeID());
232
+ }
233
+
234
+ void init_types() {
235
+ rb_define_const(cLLVMType, "Int1Ty", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(Type::Int1Ty)));
236
+ rb_define_const(cLLVMType, "Int8Ty", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(Type::Int8Ty)));
237
+ rb_define_const(cLLVMType, "Int16Ty", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(Type::Int16Ty)));
238
+ rb_define_const(cLLVMType, "Int32Ty", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(Type::Int32Ty)));
239
+ rb_define_const(cLLVMType, "Int64Ty", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(Type::Int64Ty)));
240
+ rb_define_const(cLLVMType, "VoidTy", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<Type*>(Type::VoidTy)));
241
+ rb_define_const(cLLVMType, "LabelTy", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<Type*>(Type::LabelTy)));
242
+ rb_define_const(cLLVMType, "FloatTy", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<Type*>(Type::FloatTy)));
243
+ rb_define_const(cLLVMType, "DoubleTy", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<Type*>(Type::DoubleTy)));
244
+
245
+ // Figure out details of the target machine
246
+ const IntegerType *machine_word_type;
247
+ if(sizeof(void*) == 4) {
248
+ machine_word_type = Type::Int32Ty;
249
+ } else {
250
+ machine_word_type = Type::Int64Ty;
251
+ }
252
+ rb_define_const(cLLVMRuby, "MACHINE_WORD", Data_Wrap_Struct(cLLVMType, NULL, NULL, const_cast<IntegerType*>(machine_word_type)));
253
+ }
254
+ }
@@ -0,0 +1,328 @@
1
+ #include "ruby.h"
2
+
3
+ VALUE cLLVMRuby = Qnil;
4
+ VALUE cLLVMValue = Qnil;
5
+ VALUE cLLVMUser = Qnil;
6
+ VALUE cLLVMUse = Qnil;
7
+ VALUE cLLVMModule = Qnil;
8
+ VALUE cLLVMFunction = Qnil;
9
+ VALUE cLLVMBasicBlock = Qnil;
10
+ VALUE cLLVMBuilder = Qnil;
11
+ VALUE cLLVMType = Qnil;
12
+ VALUE cLLVMPointerType = Qnil;
13
+ VALUE cLLVMStructType = Qnil;
14
+ VALUE cLLVMArrayType = Qnil;
15
+ VALUE cLLVMVectorType = Qnil;
16
+ VALUE cLLVMFunctionType = Qnil;
17
+ VALUE cLLVMInstruction = Qnil;
18
+ VALUE cLLVMTerminatorInst = Qnil;
19
+ VALUE cLLVMUnaryInstruction = Qnil;
20
+ VALUE cLLVMBinaryOperator = Qnil;
21
+ VALUE cLLVMCmpInst = Qnil;
22
+ VALUE cLLVMICmpInst = Qnil;
23
+ VALUE cLLVMFCmpInst = Qnil;
24
+ VALUE cLLVMAllocationInst = Qnil;
25
+ VALUE cLLVMFreeInst = Qnil;
26
+ VALUE cLLVMPhi = Qnil;
27
+ VALUE cLLVMBinaryOps = Qnil;
28
+ VALUE cLLVMPassManager = Qnil;
29
+ VALUE cLLVMExecutionEngine = Qnil;
30
+
31
+ #define HANDLE_TERM_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
32
+ #define HANDLE_MEMORY_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
33
+ #include "llvm/Instruction.def"
34
+
35
+ void init_types();
36
+ VALUE llvm_type_pointer(VALUE, VALUE);
37
+ VALUE llvm_type_struct(VALUE, VALUE, VALUE);
38
+ VALUE llvm_type_array(VALUE, VALUE, VALUE);
39
+ VALUE llvm_type_vector(VALUE, VALUE, VALUE);
40
+ VALUE llvm_type_function2(VALUE, VALUE);
41
+ VALUE llvm_type_function(VALUE, VALUE, VALUE);
42
+ VALUE llvm_type_to_s(VALUE);
43
+ VALUE llvm_type_type_id(VALUE);
44
+
45
+ void init_instructions();
46
+
47
+ VALUE llvm_module_allocate(VALUE);
48
+ VALUE llvm_module_initialize(VALUE);
49
+ VALUE llvm_module_get_or_insert_function(VALUE, VALUE);
50
+ VALUE llvm_module_get_function(VALUE, VALUE);
51
+ VALUE llvm_module_global_variable(VALUE, VALUE, VALUE);
52
+ VALUE llvm_module_external_function(VALUE, VALUE, VALUE);
53
+ VALUE llvm_module_read_assembly(VALUE, VALUE);
54
+ VALUE llvm_module_read_bitcode(VALUE, VALUE);
55
+ VALUE llvm_module_write_bitcode(VALUE, VALUE);
56
+ VALUE llvm_module_inspect(VALUE);
57
+
58
+ VALUE llvm_function_allocate(VALUE);
59
+ VALUE llvm_function_create_block(VALUE);
60
+ VALUE llvm_function_arguments(VALUE);
61
+ VALUE llvm_function_inspect(VALUE);
62
+ VALUE llvm_function_get_basic_block_list(VALUE);
63
+
64
+ VALUE llvm_basic_block_builder(VALUE);
65
+ VALUE llvm_basic_block_size(VALUE);
66
+ VALUE llvm_basic_block_get_instruction_list(VALUE);
67
+
68
+ VALUE llvm_instruction_inspect(VALUE);
69
+ VALUE llvm_instruction_get_opcode_name(VALUE);
70
+ VALUE llvm_instruction_may_read_from_memory(VALUE);
71
+ VALUE llvm_instruction_may_write_to_memory(VALUE);
72
+ VALUE llvm_instruction_is_identical_to(VALUE, VALUE);
73
+ VALUE llvm_instruction_is_same_operation_as(VALUE, VALUE);
74
+ VALUE llvm_instruction_is_used_outside_of_block(VALUE, VALUE);
75
+
76
+ VALUE llvm_terminator_inst_num_successors(VALUE);
77
+ VALUE llvm_terminator_inst_get_successor(VALUE, VALUE);
78
+ VALUE llvm_terminator_inst_set_successor(VALUE, VALUE, VALUE);
79
+
80
+ VALUE llvm_branch_inst_is_conditional(VALUE);
81
+ VALUE llvm_branch_inst_is_unconditional(VALUE);
82
+ VALUE llvm_branch_inst_get_condition(VALUE);
83
+ VALUE llvm_branch_inst_set_condition(VALUE, VALUE);
84
+
85
+ VALUE llvm_switch_inst_get_default_dest(VALUE);
86
+ VALUE llvm_switch_inst_get_num_cases(VALUE);
87
+ VALUE llvm_switch_inst_add_case(VALUE, VALUE, VALUE);
88
+
89
+ VALUE llvm_allocation_inst_is_array_allocation(VALUE);
90
+ VALUE llvm_allocation_inst_array_size(VALUE);
91
+ VALUE llvm_allocation_inst_allocated_type(VALUE);
92
+ VALUE llvm_allocation_inst_alignment(VALUE);
93
+
94
+ VALUE llvm_builder_set_insert_point(VALUE, VALUE);
95
+ VALUE llvm_builder_bin_op(VALUE, VALUE, VALUE, VALUE);
96
+ VALUE llvm_builder_phi(VALUE, VALUE);
97
+ VALUE llvm_builder_return(VALUE, VALUE);
98
+ VALUE llvm_builder_br(VALUE, VALUE);
99
+ VALUE llvm_builder_cond_br(VALUE, VALUE, VALUE, VALUE);
100
+ VALUE llvm_builder_switch(VALUE, VALUE, VALUE);
101
+
102
+ VALUE llvm_builder_malloc(VALUE, VALUE, VALUE);
103
+ VALUE llvm_builder_free(VALUE, VALUE);
104
+ VALUE llvm_builder_alloca(VALUE, VALUE, VALUE);
105
+ VALUE llvm_builder_load(VALUE, VALUE);
106
+ VALUE llvm_builder_store(VALUE, VALUE, VALUE);
107
+ VALUE llvm_builder_icmp(VALUE, VALUE, VALUE, VALUE);
108
+ VALUE llvm_builder_fcmp(VALUE, VALUE, VALUE, VALUE);
109
+ VALUE llvm_builder_gep(VALUE, VALUE, VALUE);
110
+ VALUE llvm_builder_struct_gep(VALUE, VALUE, VALUE);
111
+ VALUE llvm_builder_cast(VALUE, VALUE, VALUE, VALUE);
112
+ VALUE llvm_builder_int_to_ptr(VALUE, VALUE, VALUE);
113
+ VALUE llvm_builder_int_cast(VALUE, VALUE, VALUE);
114
+ VALUE llvm_builder_call(int, VALUE*, VALUE);
115
+ VALUE llvm_builder_insert_element(VALUE, VALUE, VALUE, VALUE);
116
+ VALUE llvm_builder_extract_element(VALUE, VALUE, VALUE);
117
+ VALUE llvm_builder_get_global(VALUE);
118
+ VALUE llvm_builder_create_global_string_ptr(VALUE);
119
+
120
+ VALUE llvm_value_get_constant(VALUE);
121
+ VALUE llvm_value_get_float_constant(VALUE);
122
+ VALUE llvm_value_get_double_constant(VALUE);
123
+ VALUE llvm_value_get_immediate_constant(VALUE);
124
+ VALUE llvm_value_get_struct_constant(int, VALUE*, VALUE);
125
+ VALUE llvm_value_name(VALUE);
126
+ VALUE llvm_value_set_name(VALUE, VALUE);
127
+ VALUE llvm_value_type(VALUE);
128
+ VALUE llvm_value_num_uses(VALUE);
129
+ VALUE llvm_value_used_in_basic_block(VALUE, VALUE);
130
+ VALUE llvm_value_replace_all_uses_with(VALUE, VALUE);
131
+
132
+ VALUE llvm_value_is_constant(VALUE self);
133
+ VALUE llvm_value_is_int_constant(VALUE self);
134
+ VALUE llvm_value_is_float_constant(VALUE self);
135
+ VALUE llvm_value_get_int_constant_value(VALUE self);
136
+ VALUE llvm_value_get_float_constant_value(VALUE self);
137
+ VALUE llvm_value_is_null(VALUE self);
138
+ VALUE llvm_value_is_undef(VALUE self);
139
+
140
+ VALUE llvm_user_get_operand_list(VALUE);
141
+ VALUE llvm_user_get_num_operands(VALUE);
142
+ VALUE llvm_user_get_operand(VALUE, VALUE);
143
+ VALUE llvm_user_set_operand(VALUE, VALUE, VALUE);
144
+ VALUE llvm_user_drop_all_references(VALUE);
145
+ VALUE llvm_user_replace_uses_of_with(VALUE, VALUE, VALUE);
146
+
147
+ VALUE llvm_phi_add_incoming(VALUE, VALUE, VALUE);
148
+
149
+ VALUE llvm_pass_manager_allocate(VALUE);
150
+ VALUE llvm_pass_manager_initialize(VALUE);
151
+ VALUE llvm_pass_manager_run(VALUE, VALUE);
152
+ VALUE llvm_execution_engine_get(VALUE, VALUE);
153
+ VALUE llvm_execution_engine_run_function(int, VALUE*, VALUE);
154
+ VALUE llvm_execution_engine_run_autoconvert(VALUE, VALUE);
155
+
156
+ void Init_llvmruby() {
157
+ cLLVMRuby = rb_define_module("LLVM");
158
+
159
+ cLLVMType = rb_define_class_under(cLLVMRuby, "Type", rb_cObject);
160
+ cLLVMPointerType = rb_define_class_under(cLLVMRuby, "PointerType", cLLVMType);
161
+ cLLVMStructType = rb_define_class_under(cLLVMRuby, "StructType", cLLVMType);
162
+ cLLVMArrayType = rb_define_class_under(cLLVMRuby, "ArrayType", cLLVMType);
163
+ cLLVMVectorType = rb_define_class_under(cLLVMRuby, "VectorType", cLLVMType);
164
+ cLLVMFunctionType = rb_define_class_under(cLLVMRuby, "FunctionType", cLLVMType);
165
+
166
+ cLLVMValue = rb_define_class_under(cLLVMRuby, "Value", rb_cObject);
167
+ cLLVMUser = rb_define_class_under(cLLVMRuby, "User", cLLVMValue);
168
+ cLLVMUse = rb_define_class_under(cLLVMRuby, "Use", rb_cObject);
169
+ cLLVMModule = rb_define_class_under(cLLVMRuby, "Module", rb_cObject);
170
+ cLLVMFunction = rb_define_class_under(cLLVMRuby, "Function", rb_cObject);
171
+ cLLVMBasicBlock = rb_define_class_under(cLLVMRuby, "BasicBlock", cLLVMValue);
172
+ cLLVMBuilder = rb_define_class_under(cLLVMRuby, "Builder", rb_cObject);
173
+
174
+ cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", cLLVMUser);
175
+ cLLVMUnaryInstruction = rb_define_class_under(cLLVMRuby, "UnaryInstruction", cLLVMInstruction);
176
+ cLLVMBinaryOperator = rb_define_class_under(cLLVMRuby, "BinaryOperator", cLLVMInstruction);
177
+ cLLVMTerminatorInst = rb_define_class_under(cLLVMRuby, "TerminatorInst", cLLVMInstruction);
178
+ cLLVMAllocationInst = rb_define_class_under(cLLVMRuby, "AllocationInst", cLLVMInstruction);
179
+ cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, "BinaryOps", rb_cObject);
180
+
181
+ #define HANDLE_TERM_INST(Num, Opcode, Klass) cLLVM##Klass = rb_define_class_under(cLLVMRuby, #Klass, cLLVMTerminatorInst);
182
+ #include "llvm/Instruction.def"
183
+
184
+ cLLVMLoadInst = rb_define_class_under(cLLVMRuby, "LoadInst", cLLVMUnaryInstruction);
185
+ cLLVMStoreInst = rb_define_class_under(cLLVMRuby, "StoreInst", cLLVMInstruction);
186
+ cLLVMFreeInst = rb_define_class_under(cLLVMRuby, "FreeInst", cLLVMUnaryInstruction);
187
+ cLLVMGetElementPtrInst = rb_define_class_under(cLLVMRuby, "GetElementPtrInst", cLLVMInstruction);
188
+ cLLVMAllocaInst = rb_define_class_under(cLLVMRuby, "AllocaInst", cLLVMAllocationInst);
189
+ cLLVMMallocInst = rb_define_class_under(cLLVMRuby, "MallocInst", cLLVMAllocationInst);
190
+
191
+ cLLVMCmpInst = rb_define_class_under(cLLVMRuby, "CmpInst", cLLVMInstruction);
192
+ cLLVMICmpInst = rb_define_class_under(cLLVMRuby, "ICmpInst", cLLVMCmpInst);
193
+ cLLVMFCmpInst = rb_define_class_under(cLLVMRuby, "FCmpInst", cLLVMCmpInst);
194
+ cLLVMPhi = rb_define_class_under(cLLVMRuby, "Phi", cLLVMValue);
195
+
196
+ cLLVMPassManager = rb_define_class_under(cLLVMRuby, "PassManager", rb_cObject);
197
+ cLLVMExecutionEngine = rb_define_class_under(cLLVMRuby, "ExecutionEngine", rb_cObject);
198
+
199
+ init_types();
200
+ rb_define_module_function(cLLVMType, "pointer", llvm_type_pointer, 1);
201
+ rb_define_module_function(cLLVMType, "struct", llvm_type_struct, 1);
202
+ rb_define_module_function(cLLVMType, "array", llvm_type_array, 2);
203
+ rb_define_module_function(cLLVMType, "vector", llvm_type_vector, 2);
204
+ rb_define_module_function(cLLVMType, "function", llvm_type_function, -1);
205
+ rb_define_method(cLLVMType, "to_s", llvm_type_to_s, 0);
206
+ rb_define_method(cLLVMType, "type_id", llvm_type_type_id, 0);
207
+
208
+ rb_define_module_function(cLLVMValue, "get_constant", llvm_value_get_constant, 2);
209
+ rb_define_module_function(cLLVMValue, "get_float_constant", llvm_value_get_float_constant, 1);
210
+ rb_define_module_function(cLLVMValue, "get_double_constant", llvm_value_get_double_constant, 1);
211
+ rb_define_module_function(cLLVMValue, "get_immediate_constant", llvm_value_get_immediate_constant, 1);
212
+ rb_define_module_function(cLLVMValue, "get_struct_constant", llvm_value_get_struct_constant, -1);
213
+ rb_define_method(cLLVMValue, "name", llvm_value_name, 0);
214
+ rb_define_method(cLLVMValue, "name=", llvm_value_set_name, 1);
215
+ rb_define_method(cLLVMValue, "type", llvm_value_type, 0);
216
+ rb_define_method(cLLVMValue, "num_uses", llvm_value_num_uses, 0);
217
+ rb_define_method(cLLVMValue, "used_in_basic_block?", llvm_value_used_in_basic_block, 1);
218
+ rb_define_method(cLLVMValue, "replace_all_uses_with", llvm_value_replace_all_uses_with, 1);
219
+
220
+ rb_define_method(cLLVMValue, "is_constant", llvm_value_is_constant, 0);
221
+ rb_define_method(cLLVMValue, "is_int_constant", llvm_value_is_int_constant, 0);
222
+ rb_define_method(cLLVMValue, "is_float_constant", llvm_value_is_float_constant, 0);
223
+ rb_define_method(cLLVMValue, "get_int_constant_value", llvm_value_get_int_constant_value, 0);
224
+ rb_define_method(cLLVMValue, "get_float_constant_value", llvm_value_get_float_constant_value, 0);
225
+ rb_define_method(cLLVMValue, "is_null", llvm_value_is_null, 0);
226
+ rb_define_method(cLLVMValue, "is_undef", llvm_value_is_undef, 0);
227
+
228
+ rb_define_method(cLLVMUser, "get_operand_list", llvm_user_get_operand_list, 0);
229
+ rb_define_method(cLLVMUser, "get_num_operands", llvm_user_get_num_operands, 0);
230
+ rb_define_method(cLLVMUser, "get_operand", llvm_user_get_operand, 1);
231
+ rb_define_method(cLLVMUser, "set_operand", llvm_user_set_operand, 2);
232
+ rb_define_method(cLLVMUser, "drop_all_references", llvm_user_drop_all_references, 0);
233
+ rb_define_method(cLLVMUser, "replace_uses_of_with", llvm_user_replace_uses_of_with, 2);
234
+
235
+
236
+ init_instructions();
237
+
238
+ rb_define_alloc_func(cLLVMModule, llvm_module_allocate);
239
+ rb_define_module_function(cLLVMModule, "read_assembly", llvm_module_read_assembly, 1);
240
+ rb_define_module_function(cLLVMModule, "read_bitcode", llvm_module_read_bitcode, 1);
241
+ rb_define_method(cLLVMModule, "initialize", llvm_module_initialize, 1);
242
+ rb_define_method(cLLVMModule, "get_or_insert_function", llvm_module_get_or_insert_function, 2);
243
+ rb_define_method(cLLVMModule, "get_function", llvm_module_get_function, 1);
244
+ rb_define_method(cLLVMModule, "global_variable", llvm_module_global_variable, 2);
245
+ rb_define_method(cLLVMModule, "external_function", llvm_module_external_function, 2);
246
+ rb_define_method(cLLVMModule, "write_bitcode", llvm_module_write_bitcode, 1);
247
+ rb_define_method(cLLVMModule, "inspect", llvm_module_inspect, 0);
248
+
249
+ rb_define_method(cLLVMFunction, "create_block", llvm_function_create_block, 0);
250
+ rb_define_method(cLLVMFunction, "arguments", llvm_function_arguments, 0);
251
+ rb_define_method(cLLVMFunction, "inspect", llvm_function_inspect, 0);
252
+ rb_define_method(cLLVMFunction, "get_basic_block_list", llvm_function_get_basic_block_list, 0);
253
+
254
+ rb_define_method(cLLVMBasicBlock, "builder", llvm_basic_block_builder, 0);
255
+ rb_define_method(cLLVMBasicBlock, "size", llvm_basic_block_size, 0);
256
+ rb_define_method(cLLVMBasicBlock, "get_instruction_list", llvm_basic_block_get_instruction_list, 0);
257
+
258
+ rb_define_method(cLLVMInstruction, "inspect", llvm_instruction_inspect, 0);
259
+ rb_define_method(cLLVMInstruction, "get_opcode_name", llvm_instruction_get_opcode_name, 0);
260
+ rb_define_method(cLLVMInstruction, "may_read_from_memory?", llvm_instruction_may_read_from_memory, 0);
261
+ rb_define_method(cLLVMInstruction, "may_write_to_memory?", llvm_instruction_may_write_to_memory, 0);
262
+ rb_define_method(cLLVMInstruction, "identical_to?", llvm_instruction_is_identical_to, 1);
263
+ rb_define_method(cLLVMInstruction, "same_operation_as?", llvm_instruction_is_same_operation_as, 1);
264
+ rb_define_method(cLLVMInstruction, "used_outside_of_block?", llvm_instruction_is_used_outside_of_block, 1);
265
+
266
+ rb_define_method(cLLVMTerminatorInst, "num_successors", llvm_terminator_inst_num_successors, 0);
267
+ rb_define_method(cLLVMTerminatorInst, "get_successor", llvm_terminator_inst_get_successor, 1);
268
+ rb_define_method(cLLVMTerminatorInst, "set_successor", llvm_terminator_inst_set_successor, 2);
269
+
270
+ rb_define_method(cLLVMBranchInst, "conditional?", llvm_branch_inst_is_conditional, 0);
271
+ rb_define_method(cLLVMBranchInst, "unconditional?", llvm_branch_inst_is_unconditional, 0);
272
+ rb_define_method(cLLVMBranchInst, "condition", llvm_branch_inst_get_condition, 0);
273
+ rb_define_method(cLLVMBranchInst, "condition=", llvm_branch_inst_set_condition, 1);
274
+
275
+ rb_define_method(cLLVMSwitchInst, "get_default_dest", llvm_switch_inst_get_default_dest, 0);
276
+ rb_define_method(cLLVMSwitchInst, "get_num_cases", llvm_switch_inst_get_num_cases, 0);
277
+ rb_define_method(cLLVMSwitchInst, "add_case", llvm_switch_inst_add_case, 2);
278
+
279
+ rb_define_method(cLLVMAllocationInst, "array_allocation?", llvm_allocation_inst_is_array_allocation, 0);
280
+ rb_define_method(cLLVMAllocationInst, "array_size", llvm_allocation_inst_array_size, 0);
281
+ rb_define_method(cLLVMAllocationInst, "allocated_type", llvm_allocation_inst_allocated_type, 0);
282
+ rb_define_method(cLLVMAllocationInst, "alignment", llvm_allocation_inst_alignment, 0);
283
+
284
+ rb_define_method(cLLVMBuilder, "set_insert_point", llvm_builder_set_insert_point, 1);
285
+ rb_define_method(cLLVMBuilder, "bin_op", llvm_builder_bin_op, 3);
286
+ rb_define_method(cLLVMBuilder, "phi", llvm_builder_phi, 1);
287
+ rb_define_method(cLLVMBuilder, "return", llvm_builder_return, 1);
288
+ rb_define_method(cLLVMBuilder, "br", llvm_builder_br, 1);
289
+ rb_define_method(cLLVMBuilder, "cond_br", llvm_builder_cond_br, 3);
290
+ rb_define_method(cLLVMBuilder, "switch", llvm_builder_switch, 2);
291
+ rb_define_method(cLLVMBuilder, "malloc", llvm_builder_malloc, 2);
292
+ rb_define_method(cLLVMBuilder, "free", llvm_builder_free, 1);
293
+ rb_define_method(cLLVMBuilder, "alloca", llvm_builder_alloca, 2);
294
+ rb_define_method(cLLVMBuilder, "load", llvm_builder_load, 1);
295
+ rb_define_method(cLLVMBuilder, "store", llvm_builder_store, 2);
296
+ rb_define_method(cLLVMBuilder, "icmp", llvm_builder_icmp, 3);
297
+ rb_define_method(cLLVMBuilder, "fcmp", llvm_builder_fcmp, 3);
298
+
299
+ rb_define_method(cLLVMBuilder, "gep", llvm_builder_gep, 2);
300
+ rb_define_method(cLLVMBuilder, "struct_gep", llvm_builder_struct_gep, 2);
301
+ rb_define_method(cLLVMBuilder, "cast", llvm_builder_cast, 3);
302
+ rb_define_method(cLLVMBuilder, "int_to_ptr", llvm_builder_int_to_ptr, 2);
303
+ rb_define_method(cLLVMBuilder, "int_cast", llvm_builder_int_cast, 3);
304
+ rb_define_method(cLLVMBuilder, "call", llvm_builder_call, -1);
305
+ rb_define_method(cLLVMBuilder, "insert_element", llvm_builder_insert_element, 3);
306
+ rb_define_method(cLLVMBuilder, "extract_element", llvm_builder_extract_element, 2);
307
+ rb_define_method(cLLVMBuilder, "get_global", llvm_builder_get_global, 0);
308
+ rb_define_method(cLLVMBuilder, "create_global_string_ptr", llvm_builder_create_global_string_ptr, 1);
309
+
310
+ rb_define_method(cLLVMPhi, "add_incoming", llvm_phi_add_incoming, 2);
311
+
312
+ rb_define_alloc_func(cLLVMModule, llvm_pass_manager_allocate);
313
+ rb_define_method(cLLVMPassManager, "initialize", llvm_pass_manager_initialize, 0);
314
+ rb_define_method(cLLVMPassManager, "run", llvm_pass_manager_run, 1);
315
+
316
+ rb_define_module_function(cLLVMExecutionEngine, "get", llvm_execution_engine_get, 1);
317
+ rb_define_module_function(cLLVMExecutionEngine, "run_function", llvm_execution_engine_run_function, -1);
318
+ rb_define_module_function(cLLVMExecutionEngine, "run_autoconvert", llvm_execution_engine_run_autoconvert, 1);
319
+
320
+ /*
321
+ printf("sizeof long: %d\n", (int)sizeof(long));
322
+ printf("sizeof ptr: %d\n", (int)sizeof(long*));
323
+ printf("sizeof value: %d\n", (int)sizeof(VALUE));
324
+ printf("sizeof array: %d\n", (int)sizeof(struct RArray));
325
+ printf("sizeof int: %d\n", (int)sizeof(int));
326
+ printf("sizeof char: %d\n", (int)sizeof(char));
327
+ */
328
+ }