forked from macournoyer/llvmruby
-
Notifications
You must be signed in to change notification settings - Fork 1
/
llvmruby.c
328 lines (281 loc) · 16.7 KB
/
llvmruby.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
63
64
65
66
67
68
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
#include "ruby.h"
VALUE cLLVMRuby = Qnil;
VALUE cLLVMValue = Qnil;
VALUE cLLVMUser = Qnil;
VALUE cLLVMUse = Qnil;
VALUE cLLVMModule = Qnil;
VALUE cLLVMFunction = Qnil;
VALUE cLLVMBasicBlock = Qnil;
VALUE cLLVMBuilder = Qnil;
VALUE cLLVMType = Qnil;
VALUE cLLVMPointerType = Qnil;
VALUE cLLVMStructType = Qnil;
VALUE cLLVMArrayType = Qnil;
VALUE cLLVMVectorType = Qnil;
VALUE cLLVMFunctionType = Qnil;
VALUE cLLVMInstruction = Qnil;
VALUE cLLVMTerminatorInst = Qnil;
VALUE cLLVMUnaryInstruction = Qnil;
VALUE cLLVMBinaryOperator = Qnil;
VALUE cLLVMCmpInst = Qnil;
VALUE cLLVMICmpInst = Qnil;
VALUE cLLVMFCmpInst = Qnil;
VALUE cLLVMAllocationInst = Qnil;
VALUE cLLVMFreeInst = Qnil;
VALUE cLLVMPhi = Qnil;
VALUE cLLVMBinaryOps = Qnil;
VALUE cLLVMPassManager = Qnil;
VALUE cLLVMExecutionEngine = Qnil;
#define HANDLE_TERM_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
#define HANDLE_MEMORY_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
#include "llvm/Instruction.def"
void init_types();
VALUE llvm_type_pointer(VALUE, VALUE);
VALUE llvm_type_struct(VALUE, VALUE, VALUE);
VALUE llvm_type_array(VALUE, VALUE, VALUE);
VALUE llvm_type_vector(VALUE, VALUE, VALUE);
VALUE llvm_type_function2(VALUE, VALUE);
VALUE llvm_type_function(VALUE, VALUE, VALUE);
VALUE llvm_type_to_s(VALUE);
VALUE llvm_type_type_id(VALUE);
void init_instructions();
VALUE llvm_module_allocate(VALUE);
VALUE llvm_module_initialize(VALUE);
VALUE llvm_module_get_or_insert_function(VALUE, VALUE);
VALUE llvm_module_get_function(VALUE, VALUE);
VALUE llvm_module_global_variable(VALUE, VALUE, VALUE);
VALUE llvm_module_external_function(VALUE, VALUE, VALUE);
VALUE llvm_module_read_assembly(VALUE, VALUE);
VALUE llvm_module_read_bitcode(VALUE, VALUE);
VALUE llvm_module_write_bitcode(VALUE, VALUE);
VALUE llvm_module_inspect(VALUE);
VALUE llvm_function_allocate(VALUE);
VALUE llvm_function_create_block(VALUE);
VALUE llvm_function_arguments(VALUE);
VALUE llvm_function_inspect(VALUE);
VALUE llvm_function_get_basic_block_list(VALUE);
VALUE llvm_basic_block_builder(VALUE);
VALUE llvm_basic_block_size(VALUE);
VALUE llvm_basic_block_get_instruction_list(VALUE);
VALUE llvm_instruction_inspect(VALUE);
VALUE llvm_instruction_get_opcode_name(VALUE);
VALUE llvm_instruction_may_read_from_memory(VALUE);
VALUE llvm_instruction_may_write_to_memory(VALUE);
VALUE llvm_instruction_is_identical_to(VALUE, VALUE);
VALUE llvm_instruction_is_same_operation_as(VALUE, VALUE);
VALUE llvm_instruction_is_used_outside_of_block(VALUE, VALUE);
VALUE llvm_terminator_inst_num_successors(VALUE);
VALUE llvm_terminator_inst_get_successor(VALUE, VALUE);
VALUE llvm_terminator_inst_set_successor(VALUE, VALUE, VALUE);
VALUE llvm_branch_inst_is_conditional(VALUE);
VALUE llvm_branch_inst_is_unconditional(VALUE);
VALUE llvm_branch_inst_get_condition(VALUE);
VALUE llvm_branch_inst_set_condition(VALUE, VALUE);
VALUE llvm_switch_inst_get_default_dest(VALUE);
VALUE llvm_switch_inst_get_num_cases(VALUE);
VALUE llvm_switch_inst_add_case(VALUE, VALUE, VALUE);
VALUE llvm_allocation_inst_is_array_allocation(VALUE);
VALUE llvm_allocation_inst_array_size(VALUE);
VALUE llvm_allocation_inst_allocated_type(VALUE);
VALUE llvm_allocation_inst_alignment(VALUE);
VALUE llvm_builder_set_insert_point(VALUE, VALUE);
VALUE llvm_builder_bin_op(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_phi(VALUE, VALUE);
VALUE llvm_builder_return(VALUE, VALUE);
VALUE llvm_builder_br(VALUE, VALUE);
VALUE llvm_builder_cond_br(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_switch(VALUE, VALUE, VALUE);
VALUE llvm_builder_malloc(VALUE, VALUE, VALUE);
VALUE llvm_builder_free(VALUE, VALUE);
VALUE llvm_builder_alloca(VALUE, VALUE, VALUE);
VALUE llvm_builder_load(VALUE, VALUE);
VALUE llvm_builder_store(VALUE, VALUE, VALUE);
VALUE llvm_builder_icmp(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_fcmp(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_gep(VALUE, VALUE, VALUE);
VALUE llvm_builder_struct_gep(VALUE, VALUE, VALUE);
VALUE llvm_builder_cast(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_int_to_ptr(VALUE, VALUE, VALUE);
VALUE llvm_builder_int_cast(VALUE, VALUE, VALUE);
VALUE llvm_builder_call(int, VALUE*, VALUE);
VALUE llvm_builder_insert_element(VALUE, VALUE, VALUE, VALUE);
VALUE llvm_builder_extract_element(VALUE, VALUE, VALUE);
VALUE llvm_builder_get_global(VALUE);
VALUE llvm_builder_create_global_string_ptr(VALUE);
VALUE llvm_value_get_constant(VALUE);
VALUE llvm_value_get_float_constant(VALUE);
VALUE llvm_value_get_double_constant(VALUE);
VALUE llvm_value_get_immediate_constant(VALUE);
VALUE llvm_value_get_struct_constant(int, VALUE*, VALUE);
VALUE llvm_value_name(VALUE);
VALUE llvm_value_set_name(VALUE, VALUE);
VALUE llvm_value_type(VALUE);
VALUE llvm_value_num_uses(VALUE);
VALUE llvm_value_used_in_basic_block(VALUE, VALUE);
VALUE llvm_value_replace_all_uses_with(VALUE, VALUE);
VALUE llvm_value_is_constant(VALUE self);
VALUE llvm_value_is_int_constant(VALUE self);
VALUE llvm_value_is_float_constant(VALUE self);
VALUE llvm_value_get_int_constant_value(VALUE self);
VALUE llvm_value_get_float_constant_value(VALUE self);
VALUE llvm_value_is_null(VALUE self);
VALUE llvm_value_is_undef(VALUE self);
VALUE llvm_user_get_operand_list(VALUE);
VALUE llvm_user_get_num_operands(VALUE);
VALUE llvm_user_get_operand(VALUE, VALUE);
VALUE llvm_user_set_operand(VALUE, VALUE, VALUE);
VALUE llvm_user_drop_all_references(VALUE);
VALUE llvm_user_replace_uses_of_with(VALUE, VALUE, VALUE);
VALUE llvm_phi_add_incoming(VALUE, VALUE, VALUE);
VALUE llvm_pass_manager_allocate(VALUE);
VALUE llvm_pass_manager_initialize(VALUE);
VALUE llvm_pass_manager_run(VALUE, VALUE);
VALUE llvm_execution_engine_get(VALUE, VALUE);
VALUE llvm_execution_engine_run_function(int, VALUE*, VALUE);
VALUE llvm_execution_engine_run_autoconvert(VALUE, VALUE);
void Init_llvmruby() {
cLLVMRuby = rb_define_module("LLVM");
cLLVMType = rb_define_class_under(cLLVMRuby, "Type", rb_cObject);
cLLVMPointerType = rb_define_class_under(cLLVMRuby, "PointerType", cLLVMType);
cLLVMStructType = rb_define_class_under(cLLVMRuby, "StructType", cLLVMType);
cLLVMArrayType = rb_define_class_under(cLLVMRuby, "ArrayType", cLLVMType);
cLLVMVectorType = rb_define_class_under(cLLVMRuby, "VectorType", cLLVMType);
cLLVMFunctionType = rb_define_class_under(cLLVMRuby, "FunctionType", cLLVMType);
cLLVMValue = rb_define_class_under(cLLVMRuby, "Value", rb_cObject);
cLLVMUser = rb_define_class_under(cLLVMRuby, "User", cLLVMValue);
cLLVMUse = rb_define_class_under(cLLVMRuby, "Use", rb_cObject);
cLLVMModule = rb_define_class_under(cLLVMRuby, "Module", rb_cObject);
cLLVMFunction = rb_define_class_under(cLLVMRuby, "Function", rb_cObject);
cLLVMBasicBlock = rb_define_class_under(cLLVMRuby, "BasicBlock", cLLVMValue);
cLLVMBuilder = rb_define_class_under(cLLVMRuby, "Builder", rb_cObject);
cLLVMInstruction = rb_define_class_under(cLLVMRuby, "Instruction", cLLVMUser);
cLLVMUnaryInstruction = rb_define_class_under(cLLVMRuby, "UnaryInstruction", cLLVMInstruction);
cLLVMBinaryOperator = rb_define_class_under(cLLVMRuby, "BinaryOperator", cLLVMInstruction);
cLLVMTerminatorInst = rb_define_class_under(cLLVMRuby, "TerminatorInst", cLLVMInstruction);
cLLVMAllocationInst = rb_define_class_under(cLLVMRuby, "AllocationInst", cLLVMInstruction);
cLLVMBinaryOps = rb_define_class_under(cLLVMInstruction, "BinaryOps", rb_cObject);
#define HANDLE_TERM_INST(Num, Opcode, Klass) cLLVM##Klass = rb_define_class_under(cLLVMRuby, #Klass, cLLVMTerminatorInst);
#include "llvm/Instruction.def"
cLLVMLoadInst = rb_define_class_under(cLLVMRuby, "LoadInst", cLLVMUnaryInstruction);
cLLVMStoreInst = rb_define_class_under(cLLVMRuby, "StoreInst", cLLVMInstruction);
cLLVMFreeInst = rb_define_class_under(cLLVMRuby, "FreeInst", cLLVMUnaryInstruction);
cLLVMGetElementPtrInst = rb_define_class_under(cLLVMRuby, "GetElementPtrInst", cLLVMInstruction);
cLLVMAllocaInst = rb_define_class_under(cLLVMRuby, "AllocaInst", cLLVMAllocationInst);
cLLVMMallocInst = rb_define_class_under(cLLVMRuby, "MallocInst", cLLVMAllocationInst);
cLLVMCmpInst = rb_define_class_under(cLLVMRuby, "CmpInst", cLLVMInstruction);
cLLVMICmpInst = rb_define_class_under(cLLVMRuby, "ICmpInst", cLLVMCmpInst);
cLLVMFCmpInst = rb_define_class_under(cLLVMRuby, "FCmpInst", cLLVMCmpInst);
cLLVMPhi = rb_define_class_under(cLLVMRuby, "Phi", cLLVMValue);
cLLVMPassManager = rb_define_class_under(cLLVMRuby, "PassManager", rb_cObject);
cLLVMExecutionEngine = rb_define_class_under(cLLVMRuby, "ExecutionEngine", rb_cObject);
init_types();
rb_define_module_function(cLLVMType, "pointer", llvm_type_pointer, 1);
rb_define_module_function(cLLVMType, "struct", llvm_type_struct, 1);
rb_define_module_function(cLLVMType, "array", llvm_type_array, 2);
rb_define_module_function(cLLVMType, "vector", llvm_type_vector, 2);
rb_define_module_function(cLLVMType, "function", llvm_type_function, -1);
rb_define_method(cLLVMType, "to_s", llvm_type_to_s, 0);
rb_define_method(cLLVMType, "type_id", llvm_type_type_id, 0);
rb_define_module_function(cLLVMValue, "get_constant", llvm_value_get_constant, 2);
rb_define_module_function(cLLVMValue, "get_float_constant", llvm_value_get_float_constant, 1);
rb_define_module_function(cLLVMValue, "get_double_constant", llvm_value_get_double_constant, 1);
rb_define_module_function(cLLVMValue, "get_immediate_constant", llvm_value_get_immediate_constant, 1);
rb_define_module_function(cLLVMValue, "get_struct_constant", llvm_value_get_struct_constant, -1);
rb_define_method(cLLVMValue, "name", llvm_value_name, 0);
rb_define_method(cLLVMValue, "name=", llvm_value_set_name, 1);
rb_define_method(cLLVMValue, "type", llvm_value_type, 0);
rb_define_method(cLLVMValue, "num_uses", llvm_value_num_uses, 0);
rb_define_method(cLLVMValue, "used_in_basic_block?", llvm_value_used_in_basic_block, 1);
rb_define_method(cLLVMValue, "replace_all_uses_with", llvm_value_replace_all_uses_with, 1);
rb_define_method(cLLVMValue, "is_constant", llvm_value_is_constant, 0);
rb_define_method(cLLVMValue, "is_int_constant", llvm_value_is_int_constant, 0);
rb_define_method(cLLVMValue, "is_float_constant", llvm_value_is_float_constant, 0);
rb_define_method(cLLVMValue, "get_int_constant_value", llvm_value_get_int_constant_value, 0);
rb_define_method(cLLVMValue, "get_float_constant_value", llvm_value_get_float_constant_value, 0);
rb_define_method(cLLVMValue, "is_null", llvm_value_is_null, 0);
rb_define_method(cLLVMValue, "is_undef", llvm_value_is_undef, 0);
rb_define_method(cLLVMUser, "get_operand_list", llvm_user_get_operand_list, 0);
rb_define_method(cLLVMUser, "get_num_operands", llvm_user_get_num_operands, 0);
rb_define_method(cLLVMUser, "get_operand", llvm_user_get_operand, 1);
rb_define_method(cLLVMUser, "set_operand", llvm_user_set_operand, 2);
rb_define_method(cLLVMUser, "drop_all_references", llvm_user_drop_all_references, 0);
rb_define_method(cLLVMUser, "replace_uses_of_with", llvm_user_replace_uses_of_with, 2);
init_instructions();
rb_define_alloc_func(cLLVMModule, llvm_module_allocate);
rb_define_module_function(cLLVMModule, "read_assembly", llvm_module_read_assembly, 1);
rb_define_module_function(cLLVMModule, "read_bitcode", llvm_module_read_bitcode, 1);
rb_define_method(cLLVMModule, "initialize", llvm_module_initialize, 1);
rb_define_method(cLLVMModule, "get_or_insert_function", llvm_module_get_or_insert_function, 2);
rb_define_method(cLLVMModule, "get_function", llvm_module_get_function, 1);
rb_define_method(cLLVMModule, "global_variable", llvm_module_global_variable, 2);
rb_define_method(cLLVMModule, "external_function", llvm_module_external_function, 2);
rb_define_method(cLLVMModule, "write_bitcode", llvm_module_write_bitcode, 1);
rb_define_method(cLLVMModule, "inspect", llvm_module_inspect, 0);
rb_define_method(cLLVMFunction, "create_block", llvm_function_create_block, 0);
rb_define_method(cLLVMFunction, "arguments", llvm_function_arguments, 0);
rb_define_method(cLLVMFunction, "inspect", llvm_function_inspect, 0);
rb_define_method(cLLVMFunction, "get_basic_block_list", llvm_function_get_basic_block_list, 0);
rb_define_method(cLLVMBasicBlock, "builder", llvm_basic_block_builder, 0);
rb_define_method(cLLVMBasicBlock, "size", llvm_basic_block_size, 0);
rb_define_method(cLLVMBasicBlock, "get_instruction_list", llvm_basic_block_get_instruction_list, 0);
rb_define_method(cLLVMInstruction, "inspect", llvm_instruction_inspect, 0);
rb_define_method(cLLVMInstruction, "get_opcode_name", llvm_instruction_get_opcode_name, 0);
rb_define_method(cLLVMInstruction, "may_read_from_memory?", llvm_instruction_may_read_from_memory, 0);
rb_define_method(cLLVMInstruction, "may_write_to_memory?", llvm_instruction_may_write_to_memory, 0);
rb_define_method(cLLVMInstruction, "identical_to?", llvm_instruction_is_identical_to, 1);
rb_define_method(cLLVMInstruction, "same_operation_as?", llvm_instruction_is_same_operation_as, 1);
rb_define_method(cLLVMInstruction, "used_outside_of_block?", llvm_instruction_is_used_outside_of_block, 1);
rb_define_method(cLLVMTerminatorInst, "num_successors", llvm_terminator_inst_num_successors, 0);
rb_define_method(cLLVMTerminatorInst, "get_successor", llvm_terminator_inst_get_successor, 1);
rb_define_method(cLLVMTerminatorInst, "set_successor", llvm_terminator_inst_set_successor, 2);
rb_define_method(cLLVMBranchInst, "conditional?", llvm_branch_inst_is_conditional, 0);
rb_define_method(cLLVMBranchInst, "unconditional?", llvm_branch_inst_is_unconditional, 0);
rb_define_method(cLLVMBranchInst, "condition", llvm_branch_inst_get_condition, 0);
rb_define_method(cLLVMBranchInst, "condition=", llvm_branch_inst_set_condition, 1);
rb_define_method(cLLVMSwitchInst, "get_default_dest", llvm_switch_inst_get_default_dest, 0);
rb_define_method(cLLVMSwitchInst, "get_num_cases", llvm_switch_inst_get_num_cases, 0);
rb_define_method(cLLVMSwitchInst, "add_case", llvm_switch_inst_add_case, 2);
rb_define_method(cLLVMAllocationInst, "array_allocation?", llvm_allocation_inst_is_array_allocation, 0);
rb_define_method(cLLVMAllocationInst, "array_size", llvm_allocation_inst_array_size, 0);
rb_define_method(cLLVMAllocationInst, "allocated_type", llvm_allocation_inst_allocated_type, 0);
rb_define_method(cLLVMAllocationInst, "alignment", llvm_allocation_inst_alignment, 0);
rb_define_method(cLLVMBuilder, "set_insert_point", llvm_builder_set_insert_point, 1);
rb_define_method(cLLVMBuilder, "bin_op", llvm_builder_bin_op, 3);
rb_define_method(cLLVMBuilder, "phi", llvm_builder_phi, 1);
rb_define_method(cLLVMBuilder, "return", llvm_builder_return, 1);
rb_define_method(cLLVMBuilder, "br", llvm_builder_br, 1);
rb_define_method(cLLVMBuilder, "cond_br", llvm_builder_cond_br, 3);
rb_define_method(cLLVMBuilder, "switch", llvm_builder_switch, 2);
rb_define_method(cLLVMBuilder, "malloc", llvm_builder_malloc, 2);
rb_define_method(cLLVMBuilder, "free", llvm_builder_free, 1);
rb_define_method(cLLVMBuilder, "alloca", llvm_builder_alloca, 2);
rb_define_method(cLLVMBuilder, "load", llvm_builder_load, 1);
rb_define_method(cLLVMBuilder, "store", llvm_builder_store, 2);
rb_define_method(cLLVMBuilder, "icmp", llvm_builder_icmp, 3);
rb_define_method(cLLVMBuilder, "fcmp", llvm_builder_fcmp, 3);
rb_define_method(cLLVMBuilder, "gep", llvm_builder_gep, 2);
rb_define_method(cLLVMBuilder, "struct_gep", llvm_builder_struct_gep, 2);
rb_define_method(cLLVMBuilder, "cast", llvm_builder_cast, 3);
rb_define_method(cLLVMBuilder, "int_to_ptr", llvm_builder_int_to_ptr, 2);
rb_define_method(cLLVMBuilder, "int_cast", llvm_builder_int_cast, 3);
rb_define_method(cLLVMBuilder, "call", llvm_builder_call, -1);
rb_define_method(cLLVMBuilder, "insert_element", llvm_builder_insert_element, 3);
rb_define_method(cLLVMBuilder, "extract_element", llvm_builder_extract_element, 2);
rb_define_method(cLLVMBuilder, "get_global", llvm_builder_get_global, 0);
rb_define_method(cLLVMBuilder, "create_global_string_ptr", llvm_builder_create_global_string_ptr, 1);
rb_define_method(cLLVMPhi, "add_incoming", llvm_phi_add_incoming, 2);
rb_define_alloc_func(cLLVMModule, llvm_pass_manager_allocate);
rb_define_method(cLLVMPassManager, "initialize", llvm_pass_manager_initialize, 0);
rb_define_method(cLLVMPassManager, "run", llvm_pass_manager_run, 1);
rb_define_module_function(cLLVMExecutionEngine, "get", llvm_execution_engine_get, 1);
rb_define_module_function(cLLVMExecutionEngine, "run_function", llvm_execution_engine_run_function, -1);
rb_define_module_function(cLLVMExecutionEngine, "run_autoconvert", llvm_execution_engine_run_autoconvert, 1);
/*
printf("sizeof long: %d\n", (int)sizeof(long));
printf("sizeof ptr: %d\n", (int)sizeof(long*));
printf("sizeof value: %d\n", (int)sizeof(VALUE));
printf("sizeof array: %d\n", (int)sizeof(struct RArray));
printf("sizeof int: %d\n", (int)sizeof(int));
printf("sizeof char: %d\n", (int)sizeof(char));
*/
}