public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
start leveraging info in Instructions.def, better mapping of instruction classes
tombagby (author)
Sun Oct 19 18:23:03 -0700 2008
commit  799f27a8b33a6a96760d808784b3e34ba624fe4c
tree    cf273fb74175fe4b333b308184168b176510ceee
parent  86dc62620c7efb3e5cb10889af328c9675f449b2
...
1
 
2
3
4
...
6
7
8
 
 
 
9
10
11
 
12
13
14
...
146
147
148
 
 
 
 
 
 
 
 
 
149
150
151
...
 
1
2
3
4
...
6
7
8
9
10
11
12
13
 
14
15
16
17
...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
0
@@ -1,4 +1,4 @@
0
-#include "llvmruby.h"
0
+#include "llvmruby.h" 
0
 #include <sstream>
0
 
0
 extern VALUE cLLVMInstruction;
0
@@ -6,9 +6,12 @@ extern VALUE cLLVMBinaryOps;
0
 
0
 extern "C" {
0
 
0
+#define LAST_INSTRUCTION_NUM 100
0
+VALUE gInstructionClasses[LAST_INSTRUCTION_NUM];
0
+
0
 VALUE
0
 llvm_instruction_wrap(Instruction* i) {
0
-   return Data_Wrap_Struct(cLLVMInstruction, NULL, NULL, i);
0
+   return Data_Wrap_Struct(gInstructionClasses[i->getOpcode()], NULL, NULL, i);
0
 }
0
 
0
 VALUE
0
@@ -146,6 +149,15 @@ llvm_allocation_inst_alignment(VALUE self) {
0
 #define DEFINE_CAST(name) rb_define_const(cLLVMInstruction, #name, INT2FIX(Instruction::name));
0
 
0
 void init_instructions() {
0
+  for(int i = 0; i < LAST_INSTRUCTION_NUM; ++i) {
0
+    gInstructionClasses[i] = cLLVMInstruction;
0
+  }
0
+
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
+  #include "llvm/Instruction.def"
0
+  
0
   // Standard binary operators
0
   DEFINE_BINARY_INST(Add)
0
   DEFINE_BINARY_INST(Sub)
...
13
14
15
 
16
17
18
...
20
21
22
23
24
25
26
27
28
29
...
31
32
33
 
 
 
34
35
36
...
13
14
15
16
17
18
19
...
21
22
23
 
 
 
 
24
25
26
...
28
29
30
31
32
33
34
35
36
0
@@ -13,6 +13,7 @@ VALUE cLLVMArrayType = Qnil;
0
 VALUE cLLVMVectorType = Qnil;
0
 VALUE cLLVMFunctionType = Qnil;
0
 VALUE cLLVMInstruction = Qnil;
0
+VALUE cLLVMTerminatorInst = Qnil;
0
 VALUE cLLVMUnaryOperator = Qnil;
0
 VALUE cLLVMBinaryOperator = Qnil;
0
 VALUE cLLVMLoadInst = Qnil;
0
@@ -20,10 +21,6 @@ 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
@@ -31,6 +28,9 @@ VALUE cLLVMBinaryOps = Qnil;
0
 VALUE cLLVMPassManager = Qnil;
0
 VALUE cLLVMExecutionEngine = Qnil;
0
 
0
+#define HANDLE_TERM_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
0
+#include "llvm/Instruction.def"
0
+
0
 void init_types();
0
 VALUE llvm_type_pointer(VALUE, VALUE);
0
 VALUE llvm_type_struct(VALUE, VALUE, VALUE);
...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
 
 
 
48
49
50
51
 
 
52
53
54
...
32
33
34
 
35
 
 
 
 
 
 
 
 
 
 
 
36
37
38
39
40
41
42
43
44
45
46
47
48
0
@@ -32,23 +32,17 @@ 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
+
0
+#define HANDLE_TERM_INST(Num, Opcode, Klass) extern VALUE cLLVM##Klass;
0
+#include "llvm/Instruction.def"
0
+
0
 extern VALUE cLLVMBinaryOps;
0
 extern VALUE cLLVMPhi;
0
 extern VALUE cLLVMPassManager;
0
 
0
+
0
+
0
 #define LLVM_VAL(obj) ((Value*)DATA_PTR(obj))
0
 #define LLVM_TYPE(obj) ((Type*)DATA_PTR(obj))
0
 #define LLVM_FUNC_TYPE(obj) ((FunctionType*)DATA_PTR(obj))
...
37
38
39
40
 
41
42
43
 
 
 
 
 
 
 
 
 
44
45
46
...
37
38
39
 
40
41
42
 
43
44
45
46
47
48
49
50
51
52
53
54
0
@@ -37,10 +37,18 @@ class InstructionTests < Test::Unit::TestCase
0
     b = bbs[0]
0
     assert_equal(8,b.size)
0
 
0
-    expected_opcodes_in_bswap = ["shl", "shl", "and", "lshr", "and", "lshr", "and", "or", "or", "ret"]
0
+    expected_opcodes_in_bswap = ["shl", "shl", "and", "lshr", "and", "or", "or", "ret"]
0
     ins = b.get_instruction_list
0
     actual_opcodes_in_bswap = ins.map { |i| i.get_opcode_name}
0
-    assert(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
0
+    assert_equal(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
0
+    
0
+    assert_kind_of(BinaryOperator, ins.first)
0
+    assert_kind_of(ReturnInst, ins.last)
0
+  end
0
+
0
+  def test_instruction_classes
0
+    #m = LLVM::Module.read_assembly(@assembly_byteswap)
0
+    #bswap = m.get_function('bswap')
0
   end
0
 
0
   def test_branch_instructions

Comments