<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,4 @@
-#include &quot;llvmruby.h&quot;
+#include &quot;llvmruby.h&quot; 
 #include &lt;sstream&gt;
 
 extern VALUE cLLVMInstruction;
@@ -6,9 +6,12 @@ extern VALUE cLLVMBinaryOps;
 
 extern &quot;C&quot; {
 
+#define LAST_INSTRUCTION_NUM 100
+VALUE gInstructionClasses[LAST_INSTRUCTION_NUM];
+
 VALUE
 llvm_instruction_wrap(Instruction* i) {
-   return Data_Wrap_Struct(cLLVMInstruction, NULL, NULL, i);
+   return Data_Wrap_Struct(gInstructionClasses[i-&gt;getOpcode()], NULL, NULL, i);
 }
 
 VALUE
@@ -146,6 +149,15 @@ llvm_allocation_inst_alignment(VALUE self) {
 #define DEFINE_CAST(name) rb_define_const(cLLVMInstruction, #name, INT2FIX(Instruction::name));
 
 void init_instructions() {
+  for(int i = 0; i &lt; LAST_INSTRUCTION_NUM; ++i) {
+    gInstructionClasses[i] = cLLVMInstruction;
+  }
+
+  // Need to be able to quickly look up at runtime Ruby classes cooresponding to LLVM classes
+  #define HANDLE_TERM_INST(Num, Opcode, Klass) gInstructionClasses[Num] = cLLVM##Klass;
+  #define HANDLE_BINARY_INST(Num, Opcode, Klass) gInstructionClasses[Num] = cLLVM##Klass; 
+  #include &quot;llvm/Instruction.def&quot;
+  
   // Standard binary operators
   DEFINE_BINARY_INST(Add)
   DEFINE_BINARY_INST(Sub)</diff>
      <filename>ext/llvm_instruction.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,6 +13,7 @@ VALUE cLLVMArrayType = Qnil;
 VALUE cLLVMVectorType = Qnil;
 VALUE cLLVMFunctionType = Qnil;
 VALUE cLLVMInstruction = Qnil;
+VALUE cLLVMTerminatorInst = Qnil;
 VALUE cLLVMUnaryOperator = Qnil;
 VALUE cLLVMBinaryOperator = Qnil;
 VALUE cLLVMLoadInst = Qnil;
@@ -20,10 +21,6 @@ VALUE cLLVMStoreInst = Qnil;
 VALUE cLLVMCmpInst = Qnil;
 VALUE cLLVMICmpInst = Qnil;
 VALUE cLLVMFCmpInst = Qnil;
-VALUE cLLVMTerminatorInst = Qnil;
-VALUE cLLVMReturnInst = Qnil;
-VALUE cLLVMBranchInst = Qnil;
-VALUE cLLVMSwitchInst = Qnil;
 VALUE cLLVMAllocationInst = Qnil;
 VALUE cLLVMFreeInst = Qnil;
 VALUE cLLVMPhi = Qnil;
@@ -31,6 +28,9 @@ VALUE cLLVMBinaryOps = Qnil;
 VALUE cLLVMPassManager = Qnil;
 VALUE cLLVMExecutionEngine = Qnil;
 
+#define HANDLE_TERM_INST(Num, Opcode, Klass) VALUE cLLVM##Klass;
+#include &quot;llvm/Instruction.def&quot;
+
 void init_types();
 VALUE llvm_type_pointer(VALUE, VALUE);
 VALUE llvm_type_struct(VALUE, VALUE, VALUE);</diff>
      <filename>ext/llvmruby.c</filename>
    </modified>
    <modified>
      <diff>@@ -32,23 +32,17 @@ extern VALUE cLLVMArrayType;
 extern VALUE cLLVMVectorType;
 extern VALUE cLLVMFunctionType;
 extern VALUE cLLVMInstruction;
-extern VALUE cLLVMUnaryOperator;
 extern VALUE cLLVMBinaryOperator;
-extern VALUE cLLVMLoadInst;
-extern VALUE cLLVMStoreInst;
-extern VALUE cLLVMCmpInst;
-extern VALUE cLLVMICmpInst;
-extern VALUE cLLVMFCmpInst;
-extern VALUE cLLVMTerminatorInst;
-extern VALUE cLLVMReturnInst;
-extern VALUE cLLVMBranchInst;
-extern VALUE cLLVMSwitchInst;
-extern VALUE cLLVMAllocationInst;
-extern VALUE cLLVMFreeInst;
+
+#define HANDLE_TERM_INST(Num, Opcode, Klass) extern VALUE cLLVM##Klass;
+#include &quot;llvm/Instruction.def&quot;
+
 extern VALUE cLLVMBinaryOps;
 extern VALUE cLLVMPhi;
 extern VALUE cLLVMPassManager;
 
+
+
 #define LLVM_VAL(obj) ((Value*)DATA_PTR(obj))
 #define LLVM_TYPE(obj) ((Type*)DATA_PTR(obj))
 #define LLVM_FUNC_TYPE(obj) ((FunctionType*)DATA_PTR(obj))</diff>
      <filename>ext/llvmruby.h</filename>
    </modified>
    <modified>
      <diff>@@ -37,10 +37,18 @@ class InstructionTests &lt; Test::Unit::TestCase
     b = bbs[0]
     assert_equal(8,b.size)
 
-    expected_opcodes_in_bswap = [&quot;shl&quot;, &quot;shl&quot;, &quot;and&quot;, &quot;lshr&quot;, &quot;and&quot;, &quot;lshr&quot;, &quot;and&quot;, &quot;or&quot;, &quot;or&quot;, &quot;ret&quot;]
+    expected_opcodes_in_bswap = [&quot;shl&quot;, &quot;shl&quot;, &quot;and&quot;, &quot;lshr&quot;, &quot;and&quot;, &quot;or&quot;, &quot;or&quot;, &quot;ret&quot;]
     ins = b.get_instruction_list
     actual_opcodes_in_bswap = ins.map { |i| i.get_opcode_name}
-    assert(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
+    assert_equal(expected_opcodes_in_bswap, actual_opcodes_in_bswap)
+    
+    assert_kind_of(BinaryOperator, ins.first)
+    assert_kind_of(ReturnInst, ins.last)
+  end
+
+  def test_instruction_classes
+    #m = LLVM::Module.read_assembly(@assembly_byteswap)
+    #bswap = m.get_function('bswap')
   end
 
   def test_branch_instructions</diff>
      <filename>test/test_instructions.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>86dc62620c7efb3e5cb10889af328c9675f449b2</id>
    </parent>
  </parents>
  <author>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </author>
  <url>http://github.com/tombagby/llvmruby/commit/799f27a8b33a6a96760d808784b3e34ba624fe4c</url>
  <id>799f27a8b33a6a96760d808784b3e34ba624fe4c</id>
  <committed-date>2008-10-19T18:23:03-07:00</committed-date>
  <authored-date>2008-10-19T18:23:03-07:00</authored-date>
  <message>start leveraging info in Instructions.def, better mapping of instruction classes</message>
  <tree>cf273fb74175fe4b333b308184168b176510ceee</tree>
  <committer>
    <name>Tom Bagby</name>
    <email>tomatobagby@gmail.com</email>
  </committer>
</commit>
