forked from argonne-lcf/THAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommand.rb
124 lines (102 loc) · 2.77 KB
/
command.rb
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
class Command
attr_reader :tracepoint_parameters
attr_reader :meta_parameters
attr_reader :prologues
attr_reader :epilogues
attr_reader :function
def initialize(function)
@function = function
@tracepoint_parameters = []
@meta_parameters = AUTO_META_PARAMETERS.collect { |klass| klass.create_if_match(self) }.compact
@meta_parameters += META_PARAMETERS[@function.name].collect { |type, args|
type::new(self, *args)
}
@prologues = PROLOGUES[@function.name]
@epilogues = EPILOGUES[@function.name]
end
def name
@function.name
end
def decl_pointer(name = pointer_name)
YAMLCAst::Declaration::new(name: name, type: YAMLCAst::Pointer::new(type: @function.type), storage: "typedef").to_s
end
def decl
@function.to_s
end
def pointer_name
name + "_ptr"
end
def pointer_type_name
name + "_t"
end
def type
@function.type.type
end
def parameters
@function.type.params
end
def init?
name.match(INIT_FUNCTIONS)
end
def has_return_type?
type && !type.kind_of?(YAMLCAst::Void)
end
def [](name)
# special case when querying the return value
if name == :result
return YAMLCAst::Declaration.new(name: "#{RESULT_NAME}", type: type)
end
path = name.split(/->/)
if path.length == 1
res = parameters.find { |p| p.name == name }
return res if res
@tracepoint_parameters.find { |p| p.name == name }
else
param_name = path.shift
res = parameters.find { |p| p.name == param_name }
return nil unless res
path.each { |n|
res = STRUCT_MAP[res.type.type.name].find { |m| m.name == n }
return nil unless res
}
return res
end
end
end
class Member
def initialize(command, member, prefix, dir = :start)
@member = member
@dir = dir
@prefix = prefix
name = "#{prefix}#{MEMBER_SEPARATOR}#{member.name}"
expr = "#{prefix} ? #{prefix}->#{member.name} : 0"
@lttng_type = member.type.lttng_type
@lttng_type.name = name
@lttng_type.expr = expr
end
def lttng_in_type
@dir == :start ? @lttng_type : nil
end
def lttng_out_type
@dir == :start ? nil : @lttng_type
end
end
def register_meta_parameter(method, type, *args)
META_PARAMETERS[method].push [type, args]
end
def register_meta_struct(method, name, type)
raise "Unknown struct: #{type}!" unless STRUCT_TYPES.include?(type)
STRUCT_MAP[type].each { |m|
META_PARAMETERS[method].push [Member, [m, name]]
}
end
def register_prologue(method, code)
PROLOGUES[method].push(code)
end
def register_epilogue(method, code)
EPILOGUES[method].push(code)
end
AUTO_META_PARAMETERS = []
META_PARAMETERS = Hash::new { |h, k| h[k] = [] }
PROLOGUES = Hash::new { |h, k| h[k] = [] }
EPILOGUES = Hash::new { |h, k| h[k] = [] }