public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
more methods on Instruction
tombagby (author)
Sun Oct 19 19:06:48 -0700 2008
commit  d30b2a76e2141244a4d0cf4915171b7a75d043dc
tree    6b61a9299c94ee4af2070a83cfbadaaa5e733ffa
parent  6746bcc66b86538abce38da8a60e1448e26cf6fb
...
9
10
11
 
 
12
13
14
...
29
30
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
33
34
...
9
10
11
12
13
14
15
16
...
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
0
@@ -9,6 +9,8 @@ extern "C" {
0
 #define LAST_INSTRUCTION_NUM 100
0
 VALUE gInstructionClasses[LAST_INSTRUCTION_NUM];
0
 
0
+#define DATA_GET_INSTRUCTION Instruction *i; Data_Get_Struct(self, Instruction, i);
0
+
0
 VALUE
0
 llvm_instruction_wrap(Instruction* i) {
0
    return Data_Wrap_Struct(gInstructionClasses[i->getOpcode()], NULL, NULL, i);
0
@@ -29,6 +31,42 @@ llvm_instruction_get_opcode_name(VALUE self) {
0
   return rb_str_new2(name.c_str());
0
 }
0
 
0
+VALUE 
0
+llvm_instruction_may_read_from_memory(VALUE self) {
0
+  DATA_GET_INSTRUCTION
0
+  return i->mayReadFromMemory() ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE 
0
+llvm_instruction_may_write_to_memory(VALUE self) {
0
+  DATA_GET_INSTRUCTION
0
+  return i->mayWriteToMemory() ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE
0
+llvm_instruction_is_identical_to(VALUE self, VALUE ri2) {
0
+  DATA_GET_INSTRUCTION
0
+  CHECK_TYPE(ri2, cLLVMInstruction);
0
+  Instruction *i2 = LLVM_INSTRUCTION(ri2);
0
+  return i->isIdenticalTo(i2) ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE 
0
+llvm_instruction_is_same_operation_as(VALUE self, VALUE ri2) {
0
+  DATA_GET_INSTRUCTION
0
+  CHECK_TYPE(ri2, cLLVMInstruction);
0
+  Instruction *i2 = LLVM_INSTRUCTION(ri2);
0
+  return i->isSameOperationAs(i2) ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE
0
+llvm_instruction_is_used_outside_of_block(VALUE self, VALUE rbb) {
0
+  DATA_GET_INSTRUCTION
0
+  CHECK_TYPE(rbb, cLLVMBasicBlock);
0
+  BasicBlock *bb = LLVM_BASIC_BLOCK(rbb);
0
+  return i->isUsedOutsideOfBlock(bb) ? Qtrue: Qfalse;
0
+}
0
+
0
 #define DATA_GET_TERMINATOR_INST TerminatorInst *ti; Data_Get_Struct(self, TerminatorInst, ti);
0
 
0
 VALUE
...
63
64
65
 
 
 
 
 
66
67
68
...
206
207
208
209
 
 
 
 
 
 
210
211
212
...
63
64
65
66
67
68
69
70
71
72
73
...
211
212
213
 
214
215
216
217
218
219
220
221
222
0
@@ -63,6 +63,11 @@ VALUE llvm_basic_block_get_instruction_list(VALUE);
0
 
0
 VALUE llvm_instruction_inspect(VALUE);
0
 VALUE llvm_instruction_get_opcode_name(VALUE);
0
+VALUE llvm_instruction_may_read_from_memory(VALUE);
0
+VALUE llvm_instruction_may_write_to_memory(VALUE);
0
+VALUE llvm_instruction_is_identical_to(VALUE, VALUE);
0
+VALUE llvm_instruction_is_same_operation_as(VALUE, VALUE);
0
+VALUE llvm_instruction_is_used_outside_of_block(VALUE, VALUE);
0
 
0
 VALUE llvm_terminator_inst_num_successors(VALUE);
0
 VALUE llvm_terminator_inst_get_successor(VALUE, VALUE);
0
@@ -206,7 +211,12 @@ void Init_llvmruby() {
0
 
0
   rb_define_method(cLLVMInstruction, "inspect", llvm_instruction_inspect, 0);
0
   rb_define_method(cLLVMInstruction, "get_opcode_name", llvm_instruction_get_opcode_name, 0);
0
-
0
+  rb_define_method(cLLVMInstruction, "may_read_from_memory?", llvm_instruction_may_read_from_memory, 0);
0
+  rb_define_method(cLLVMInstruction, "may_write_to_memory?", llvm_instruction_may_write_to_memory, 0);
0
+  rb_define_method(cLLVMInstruction, "identical_to?", llvm_instruction_is_identical_to, 1);
0
+  rb_define_method(cLLVMInstruction, "same_operation_as?", llvm_instruction_is_same_operation_as, 1);
0
+  rb_define_method(cLLVMInstruction, "used_outside_of_block?", llvm_instruction_is_used_outside_of_block, 1);
0
+  
0
   rb_define_method(cLLVMTerminatorInst, "num_successors", llvm_terminator_inst_num_successors, 0);
0
   rb_define_method(cLLVMTerminatorInst, "get_successor", llvm_terminator_inst_get_successor, 1);
0
   rb_define_method(cLLVMTerminatorInst, "set_successor", llvm_terminator_inst_set_successor, 2);
...
44
45
46
 
 
 
 
 
 
 
 
 
47
48
49
...
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
0
@@ -44,6 +44,15 @@ class InstructionTests < Test::Unit::TestCase
0
     
0
     assert_kind_of(BinaryOperator, ins.first)
0
     assert_kind_of(ReturnInst, ins.last)
0
0
+    f1, f2 = ins[0], ins[1]
0
+    assert(!f1.may_read_from_memory?)
0
+    assert(!f1.may_write_to_memory?)
0
+    assert(!f1.identical_to?(f2))
0
+    assert(f1.identical_to?(f1))
0
+    assert(f1.same_operation_as?(f2))
0
+    assert(f1.same_operation_as?(f1))
0
+    assert(!f1.used_outside_of_block?(b))
0
   end
0
 
0
   def test_instruction_classes

Comments