summaryrefslogtreecommitdiff
path: root/tool/gen_ruby_tapset.rb
blob: ec8650204f7c04546d561d19d4046e2cbb4e9d3d (plain)
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
#!/usr/bin/ruby
# -*- coding: us-ascii -*-
# Create a tapset for systemtap and DTrace
# usage: ./ruby gen_ruby_tapset.rb --ruby-path=/path/to/ruby probes.d > output

require "optparse"

def set_argument(argname, nth)
  # remove C style type info
  argname.gsub!(/.+ (.+)/, '\1') # e.g. char *hoge -> *hoge
  argname.gsub!(/^\*/, '')       # e.g. *filename -> filename

  "#{argname} = $arg#{nth}"
end

ruby_path = "/usr/local/ruby"

opts = OptionParser.new
opts.on("--ruby-path=PATH"){|v| ruby_path = v}
opts.parse!(ARGV)

text = ARGF.read

# remove preprocessor directives
text.gsub!(/^#.*$/, '')

# remove provider name
text.gsub!(/^provider ruby \{/, "")
text.gsub!(/^\};/, "")

# probename()
text.gsub!(/probe (.+)\( *\);/) {
  probe_name = $1
  probe = <<-End
    probe #{probe_name} = process("ruby").provider("ruby").mark("#{probe_name}")
    {
    }
  End
}

# probename(arg1)
text.gsub!(/ *probe (.+)\(([^,)]+)\);/) {
  probe_name = $1
  arg1 = $2

  probe = <<-End
    probe #{probe_name} = process("ruby").provider("ruby").mark("#{probe_name}")
    {
      #{set_argument(arg1, 1)}
    }
  End
}

# probename(arg1, arg2)
text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+)\);/) {
  probe_name = $1
  arg1 = $2
  arg2 = $3

  probe = <<-End
    probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
    {
      #{set_argument(arg1, 1)}
      #{set_argument(arg2, 2)}
    }
  End
}

# probename(arg1, arg2, arg3)
text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+),([^,)]+)\);/) {
  probe_name = $1
  arg1 = $2
  arg2 = $3
  arg3 = $4

  probe = <<-End
    probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
    {
      #{set_argument(arg1, 1)}
      #{set_argument(arg2, 2)}
      #{set_argument(arg3, 3)}
    }
  End
}

# probename(arg1, arg2, arg3, arg4)
text.gsub!(/ *probe (.+)\(([^,)]+),([^,)]+),([^,)]+),([^,)]+)\);/) {
  probe_name = $1
  arg1 = $2
  arg2 = $3
  arg3 = $4
  arg4 = $5

  probe = <<-End
    probe #{probe_name} = process("#{ruby_path}").provider("ruby").mark("#{probe_name}")
    {
      #{set_argument(arg1, 1)}
      #{set_argument(arg2, 2)}
      #{set_argument(arg3, 3)}
      #{set_argument(arg4, 4)}
    }
  End
}

print text