public
Rubygem
Description: LLVM bindings for Ruby
Homepage: http://llvmruby.org
Clone URL: git://github.com/tombagby/llvmruby.git
fix value name handling, more value methods
tombagby (author)
Sun Oct 19 16:20:12 -0700 2008
commit  d5243b0f46107e05471f884a95fe723ec6aaee23
tree    78be5acd5b09cc8659fb2f01a64032e50ee4015b
parent  e0eb33ec85b71d3761cb648e1fdc89a724b5bb9e
...
7
8
9
10
11
12
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
15
16
...
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
0
@@ -7,10 +7,52 @@ llvm_value_wrap(Value* v) {
0
 }
0
 
0
 VALUE
0
-llvm_value_get_name(VALUE self) {
0
-  Value *v = LLVM_VAL(self);
0
-  std::string name = v->getName();
0
-  return rb_str_new2(name.c_str());
0
+llvm_value_name(VALUE self) {
0
+  Value *v;
0
+  Data_Get_Struct(self, Value, v);
0
+
0
+  if(v->hasName()) {
0
+    const char *name = v->getNameStart();
0
+    int len = v->getNameLen();
0
+    return rb_str_new(name, len);
0
+  } else {
0
+    return Qnil;
0
+  }
0
+}
0
+
0
+VALUE
0
+llvm_value_set_name(VALUE self, VALUE rname) {
0
+  Value *v;
0
+  Data_Get_Struct(self, Value, v);
0
+  v->setName(RSTRING_PTR(rname), RSTRING_LEN(rname));
0
+  return rname; 
0
+}
0
+
0
+VALUE 
0
+llvm_value_num_uses(VALUE self) {
0
+  Value *v;
0
+  Data_Get_Struct(self, Value, v);
0
+  return INT2FIX(v->getNumUses());
0
+}
0
+
0
+VALUE 
0
+llvm_value_used_in_basic_block(VALUE self, VALUE rbb) {
0
+  Value *v;
0
+  Data_Get_Struct(self, Value, v);
0
+  
0
+  BasicBlock *bb;
0
+  Data_Get_Struct(rbb, BasicBlock, bb);
0
+
0
+  return v->isUsedInBasicBlock(bb) ? Qtrue : Qfalse;
0
+}
0
+
0
+VALUE 
0
+llvm_value_replace_all_uses_with(VALUE self, VALUE rv2) {
0
+  Value *v1, *v2;
0
+  Data_Get_Struct(self, Value, v1);
0
+  Data_Get_Struct(rv2, Value, v2);
0
+  v1->replaceAllUsesWith(v2);
0
+  return rv2;
0
 }
0
 
0
 VALUE 
...
106
107
108
109
110
 
 
 
 
 
111
112
113
...
158
159
160
161
 
 
 
 
 
162
163
164
...
106
107
108
 
 
109
110
111
112
113
114
115
116
...
161
162
163
 
164
165
166
167
168
169
170
171
0
@@ -106,8 +106,11 @@ VALUE llvm_value_get_float_constant(VALUE);
0
 VALUE llvm_value_get_double_constant(VALUE);
0
 VALUE llvm_value_get_immediate_constant(VALUE);
0
 VALUE llvm_value_get_struct_constant(int, VALUE*, VALUE);
0
-VALUE llvm_value_get_name(VALUE);
0
-
0
+VALUE llvm_value_name(VALUE);
0
+VALUE llvm_value_set_name(VALUE, VALUE);
0
+VALUE llvm_value_num_uses(VALUE);
0
+VALUE llvm_value_used_in_basic_block(VALUE, VALUE);
0
+VALUE llvm_value_replace_all_uses_with(VALUE, VALUE);
0
 
0
 VALUE llvm_phi_add_incoming(VALUE, VALUE, VALUE);
0
 
0
@@ -158,7 +161,11 @@ void Init_llvmruby() {
0
   rb_define_module_function(cLLVMValue, "get_double_constant", llvm_value_get_double_constant, 1);
0
   rb_define_module_function(cLLVMValue, "get_immediate_constant", llvm_value_get_immediate_constant, 1);
0
   rb_define_module_function(cLLVMValue, "get_struct_constant", llvm_value_get_struct_constant, -1);
0
-  rb_define_method(cLLVMValue, "get_name", llvm_value_get_name, 0);
0
+  rb_define_method(cLLVMValue, "name", llvm_value_name, 0);
0
+  rb_define_method(cLLVMValue, "name=", llvm_value_set_name, 1);
0
+  rb_define_method(cLLVMValue, "num_uses", llvm_value_num_uses, 0);
0
+  rb_define_method(cLLVMValue, "used_in_basic_block?", llvm_value_used_in_basic_block, 1);
0
+  rb_define_method(cLLVMValue, "replace_all_uses_with", llvm_value_replace_all_uses_with, 1);
0
 
0
   init_instructions();
0
 
...
57
58
59
60
 
61
62
63
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
...
57
58
59
 
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
0
@@ -57,9 +57,24 @@ class BasicBlockTests < Test::Unit::TestCase
0
     expected = { 'entry' => 2, 'bb5' => 6, 'bb11' => 2, 'bb15.split' => 2, 'bb19' => 4, 'bb26' => 2 }
0
     res = Hash.new
0
     bbs.each { |b|
0
-      res[b.get_name] = b.size
0
+      res[b.name] = b.size
0
     }
0
     assert_equal(expected,res)
0
   end
0
 
0
+  def test_manipulate_values
0
+    m = LLVM::Module.read_assembly(@assembly_gcd)
0
+    gcd = m.get_function("gcd")
0
+
0
+    bbs = gcd.get_basic_block_list
0
+    bb = bbs.first
0
+    assert_equal('entry', bb.name)
0
+    bb.name = 'first_block'
0
+    assert_equal('first_block', bb.name)
0
+    assert_equal(3, bb.num_uses)
0
+    bb2 = bbs.find {|x| x.name == 'bb19'}
0
+    assert(bb.used_in_basic_block?(bb2))
0
+    bb3 = bbs.find {|x| x.name = 'bb26'}
0
+    assert(!bb.used_in_basic_block?(bb3))
0
+  end
0
 end

Comments