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
|
#!/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
<<-End
probe #{probe_name} = process("ruby").provider("ruby").mark("#{probe_name}")
{
}
End
}
# probename(arg1)
text.gsub!(/ *probe (.+)\(([^,)]+)\);/) {
probe_name = $1
arg1 = $2
<<-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
<<-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
<<-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
<<-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
|