xref: /aosp_15_r20/system/extras/simpleperf/event_table_generator.py (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*288bf522SAndroid Build Coastguard Worker#
3*288bf522SAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project
4*288bf522SAndroid Build Coastguard Worker#
5*288bf522SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*288bf522SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*288bf522SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*288bf522SAndroid Build Coastguard Worker#
9*288bf522SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*288bf522SAndroid Build Coastguard Worker#
11*288bf522SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*288bf522SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*288bf522SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*288bf522SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*288bf522SAndroid Build Coastguard Worker# limitations under the License.
16*288bf522SAndroid Build Coastguard Worker#
17*288bf522SAndroid Build Coastguard Worker
18*288bf522SAndroid Build Coastguard Workerimport dataclasses
19*288bf522SAndroid Build Coastguard Workerfrom dataclasses import dataclass
20*288bf522SAndroid Build Coastguard Workerimport json
21*288bf522SAndroid Build Coastguard Workerimport sys
22*288bf522SAndroid Build Coastguard Workerfrom typing import List
23*288bf522SAndroid Build Coastguard Worker
24*288bf522SAndroid Build Coastguard Worker
25*288bf522SAndroid Build Coastguard Workerdef gen_event_type_entry_str(event_type_name, event_type, event_config, description='',
26*288bf522SAndroid Build Coastguard Worker                             limited_arch=''):
27*288bf522SAndroid Build Coastguard Worker    return '{"%s", %s, %s, "%s", "%s"},\n' % (
28*288bf522SAndroid Build Coastguard Worker        event_type_name, event_type, event_config, description, limited_arch)
29*288bf522SAndroid Build Coastguard Worker
30*288bf522SAndroid Build Coastguard Worker
31*288bf522SAndroid Build Coastguard Workerdef gen_hardware_events():
32*288bf522SAndroid Build Coastguard Worker    hardware_configs = ["cpu-cycles",
33*288bf522SAndroid Build Coastguard Worker                        "instructions",
34*288bf522SAndroid Build Coastguard Worker                        "cache-references",
35*288bf522SAndroid Build Coastguard Worker                        "cache-misses",
36*288bf522SAndroid Build Coastguard Worker                        "branch-instructions",
37*288bf522SAndroid Build Coastguard Worker                        "branch-misses",
38*288bf522SAndroid Build Coastguard Worker                        "bus-cycles",
39*288bf522SAndroid Build Coastguard Worker                        "stalled-cycles-frontend",
40*288bf522SAndroid Build Coastguard Worker                        "stalled-cycles-backend",
41*288bf522SAndroid Build Coastguard Worker                        ]
42*288bf522SAndroid Build Coastguard Worker    generated_str = ""
43*288bf522SAndroid Build Coastguard Worker    for config in hardware_configs:
44*288bf522SAndroid Build Coastguard Worker        event_type_name = config
45*288bf522SAndroid Build Coastguard Worker        event_config = "PERF_COUNT_HW_" + config.replace('-', '_').upper()
46*288bf522SAndroid Build Coastguard Worker
47*288bf522SAndroid Build Coastguard Worker        generated_str += gen_event_type_entry_str(
48*288bf522SAndroid Build Coastguard Worker            event_type_name, "PERF_TYPE_HARDWARE", event_config)
49*288bf522SAndroid Build Coastguard Worker
50*288bf522SAndroid Build Coastguard Worker    return generated_str
51*288bf522SAndroid Build Coastguard Worker
52*288bf522SAndroid Build Coastguard Worker
53*288bf522SAndroid Build Coastguard Workerdef gen_software_events():
54*288bf522SAndroid Build Coastguard Worker    software_configs = ["cpu-clock",
55*288bf522SAndroid Build Coastguard Worker                        "task-clock",
56*288bf522SAndroid Build Coastguard Worker                        "page-faults",
57*288bf522SAndroid Build Coastguard Worker                        "context-switches",
58*288bf522SAndroid Build Coastguard Worker                        "cpu-migrations",
59*288bf522SAndroid Build Coastguard Worker                        ["minor-faults", "PERF_COUNT_SW_PAGE_FAULTS_MIN"],
60*288bf522SAndroid Build Coastguard Worker                        ["major-faults", "PERF_COUNT_SW_PAGE_FAULTS_MAJ"],
61*288bf522SAndroid Build Coastguard Worker                        "alignment-faults",
62*288bf522SAndroid Build Coastguard Worker                        "emulation-faults",
63*288bf522SAndroid Build Coastguard Worker                        ]
64*288bf522SAndroid Build Coastguard Worker    generated_str = ""
65*288bf522SAndroid Build Coastguard Worker    for config in software_configs:
66*288bf522SAndroid Build Coastguard Worker        if isinstance(config, list):
67*288bf522SAndroid Build Coastguard Worker            event_type_name = config[0]
68*288bf522SAndroid Build Coastguard Worker            event_config = config[1]
69*288bf522SAndroid Build Coastguard Worker        else:
70*288bf522SAndroid Build Coastguard Worker            event_type_name = config
71*288bf522SAndroid Build Coastguard Worker            event_config = "PERF_COUNT_SW_" + config.replace('-', '_').upper()
72*288bf522SAndroid Build Coastguard Worker
73*288bf522SAndroid Build Coastguard Worker        generated_str += gen_event_type_entry_str(
74*288bf522SAndroid Build Coastguard Worker            event_type_name, "PERF_TYPE_SOFTWARE", event_config)
75*288bf522SAndroid Build Coastguard Worker
76*288bf522SAndroid Build Coastguard Worker    return generated_str
77*288bf522SAndroid Build Coastguard Worker
78*288bf522SAndroid Build Coastguard Worker
79*288bf522SAndroid Build Coastguard Workerdef gen_hw_cache_events():
80*288bf522SAndroid Build Coastguard Worker    hw_cache_types = [["L1-dcache", "PERF_COUNT_HW_CACHE_L1D"],
81*288bf522SAndroid Build Coastguard Worker                      ["L1-icache", "PERF_COUNT_HW_CACHE_L1I"],
82*288bf522SAndroid Build Coastguard Worker                      ["LLC", "PERF_COUNT_HW_CACHE_LL"],
83*288bf522SAndroid Build Coastguard Worker                      ["dTLB", "PERF_COUNT_HW_CACHE_DTLB"],
84*288bf522SAndroid Build Coastguard Worker                      ["iTLB", "PERF_COUNT_HW_CACHE_ITLB"],
85*288bf522SAndroid Build Coastguard Worker                      ["branch", "PERF_COUNT_HW_CACHE_BPU"],
86*288bf522SAndroid Build Coastguard Worker                      ["node", "PERF_COUNT_HW_CACHE_NODE"],
87*288bf522SAndroid Build Coastguard Worker                      ]
88*288bf522SAndroid Build Coastguard Worker    hw_cache_ops = [["loads", "load", "PERF_COUNT_HW_CACHE_OP_READ"],
89*288bf522SAndroid Build Coastguard Worker                    ["stores", "store", "PERF_COUNT_HW_CACHE_OP_WRITE"],
90*288bf522SAndroid Build Coastguard Worker                    ["prefetches", "prefetch",
91*288bf522SAndroid Build Coastguard Worker                     "PERF_COUNT_HW_CACHE_OP_PREFETCH"],
92*288bf522SAndroid Build Coastguard Worker                    ]
93*288bf522SAndroid Build Coastguard Worker    hw_cache_op_results = [["accesses", "PERF_COUNT_HW_CACHE_RESULT_ACCESS"],
94*288bf522SAndroid Build Coastguard Worker                           ["misses", "PERF_COUNT_HW_CACHE_RESULT_MISS"],
95*288bf522SAndroid Build Coastguard Worker                           ]
96*288bf522SAndroid Build Coastguard Worker    generated_str = ""
97*288bf522SAndroid Build Coastguard Worker    for (type_name, type_config) in hw_cache_types:
98*288bf522SAndroid Build Coastguard Worker        for (op_name_access, op_name_miss, op_config) in hw_cache_ops:
99*288bf522SAndroid Build Coastguard Worker            for (result_name, result_config) in hw_cache_op_results:
100*288bf522SAndroid Build Coastguard Worker                if result_name == "accesses":
101*288bf522SAndroid Build Coastguard Worker                    event_type_name = type_name + '-' + op_name_access
102*288bf522SAndroid Build Coastguard Worker                else:
103*288bf522SAndroid Build Coastguard Worker                    event_type_name = type_name + '-' + \
104*288bf522SAndroid Build Coastguard Worker                        op_name_miss + '-' + result_name
105*288bf522SAndroid Build Coastguard Worker                event_config = "((%s) | (%s << 8) | (%s << 16))" % (
106*288bf522SAndroid Build Coastguard Worker                    type_config, op_config, result_config)
107*288bf522SAndroid Build Coastguard Worker                generated_str += gen_event_type_entry_str(
108*288bf522SAndroid Build Coastguard Worker                    event_type_name, "PERF_TYPE_HW_CACHE", event_config)
109*288bf522SAndroid Build Coastguard Worker
110*288bf522SAndroid Build Coastguard Worker    return generated_str
111*288bf522SAndroid Build Coastguard Worker
112*288bf522SAndroid Build Coastguard Worker
113*288bf522SAndroid Build Coastguard Worker@dataclass
114*288bf522SAndroid Build Coastguard Workerclass RawEvent:
115*288bf522SAndroid Build Coastguard Worker    number: int
116*288bf522SAndroid Build Coastguard Worker    name: str
117*288bf522SAndroid Build Coastguard Worker    desc: str
118*288bf522SAndroid Build Coastguard Worker    limited_arch: str
119*288bf522SAndroid Build Coastguard Worker
120*288bf522SAndroid Build Coastguard Worker
121*288bf522SAndroid Build Coastguard Worker@dataclass
122*288bf522SAndroid Build Coastguard Workerclass CpuModel:
123*288bf522SAndroid Build Coastguard Worker    name: str
124*288bf522SAndroid Build Coastguard Worker    implementer: int
125*288bf522SAndroid Build Coastguard Worker    partnum: int
126*288bf522SAndroid Build Coastguard Worker    mvendorid: int
127*288bf522SAndroid Build Coastguard Worker    marchid: str
128*288bf522SAndroid Build Coastguard Worker    mimpid: str
129*288bf522SAndroid Build Coastguard Worker    supported_raw_events: list[int] = dataclasses.field(default_factory=list)
130*288bf522SAndroid Build Coastguard Worker
131*288bf522SAndroid Build Coastguard Worker
132*288bf522SAndroid Build Coastguard Workerclass ArchData:
133*288bf522SAndroid Build Coastguard Worker    def __init__(self, arch: str):
134*288bf522SAndroid Build Coastguard Worker        self.arch = arch
135*288bf522SAndroid Build Coastguard Worker        self.events: List[RawEvent] = []
136*288bf522SAndroid Build Coastguard Worker        self.cpus: List[CpuModel] = []
137*288bf522SAndroid Build Coastguard Worker
138*288bf522SAndroid Build Coastguard Worker    def load_from_json_data(self, data) -> None:
139*288bf522SAndroid Build Coastguard Worker        # Load common events
140*288bf522SAndroid Build Coastguard Worker        for event in data['events']:
141*288bf522SAndroid Build Coastguard Worker            number = int(event[0], 16)
142*288bf522SAndroid Build Coastguard Worker            name = 'raw-' + event[1].lower().replace('_', '-')
143*288bf522SAndroid Build Coastguard Worker            desc = event[2]
144*288bf522SAndroid Build Coastguard Worker            self.events.append(RawEvent(number, name, desc, self.arch))
145*288bf522SAndroid Build Coastguard Worker        for cpu in data['cpus']:
146*288bf522SAndroid Build Coastguard Worker            cpu_name = cpu['name'].lower().replace('_', '-')
147*288bf522SAndroid Build Coastguard Worker            cpu_model = CpuModel(
148*288bf522SAndroid Build Coastguard Worker                cpu['name'],
149*288bf522SAndroid Build Coastguard Worker                int(cpu.get('implementer', '0'), 16),
150*288bf522SAndroid Build Coastguard Worker                int(cpu.get('partnum', '0'), 16),
151*288bf522SAndroid Build Coastguard Worker                int(cpu.get('mvendorid', '0'), 16),
152*288bf522SAndroid Build Coastguard Worker                cpu.get('marchid', '0'),
153*288bf522SAndroid Build Coastguard Worker                cpu.get('mimpid', '0'),
154*288bf522SAndroid Build Coastguard Worker                []
155*288bf522SAndroid Build Coastguard Worker            )
156*288bf522SAndroid Build Coastguard Worker            cpu_index = len(self.cpus)
157*288bf522SAndroid Build Coastguard Worker
158*288bf522SAndroid Build Coastguard Worker            self.cpus.append(cpu_model)
159*288bf522SAndroid Build Coastguard Worker            # Load common events supported in this cpu model.
160*288bf522SAndroid Build Coastguard Worker            for number in cpu['common_events']:
161*288bf522SAndroid Build Coastguard Worker                number = int(number, 16)
162*288bf522SAndroid Build Coastguard Worker                event = self.get_event(number)
163*288bf522SAndroid Build Coastguard Worker                cpu_model.supported_raw_events.append(number)
164*288bf522SAndroid Build Coastguard Worker
165*288bf522SAndroid Build Coastguard Worker            # Load cpu specific events supported in this cpu model.
166*288bf522SAndroid Build Coastguard Worker            if 'implementation_defined_events' in cpu:
167*288bf522SAndroid Build Coastguard Worker                for event in cpu['implementation_defined_events']:
168*288bf522SAndroid Build Coastguard Worker                    number = int(event[0], 16)
169*288bf522SAndroid Build Coastguard Worker                    name = ('raw-' + cpu_name + '-' + event[1]).lower().replace('_', '-')
170*288bf522SAndroid Build Coastguard Worker                    desc = event[2]
171*288bf522SAndroid Build Coastguard Worker                    limited_arch = self.arch + ':' + cpu['name']
172*288bf522SAndroid Build Coastguard Worker                    self.events.append(RawEvent(number, name, desc, limited_arch))
173*288bf522SAndroid Build Coastguard Worker                    cpu_model.supported_raw_events.append(number)
174*288bf522SAndroid Build Coastguard Worker
175*288bf522SAndroid Build Coastguard Worker    def get_event(self, event_number: int) -> RawEvent:
176*288bf522SAndroid Build Coastguard Worker        for event in self.events:
177*288bf522SAndroid Build Coastguard Worker            if event.number == event_number:
178*288bf522SAndroid Build Coastguard Worker                return event
179*288bf522SAndroid Build Coastguard Worker        raise Exception(f'no event for event number {event_number}')
180*288bf522SAndroid Build Coastguard Worker
181*288bf522SAndroid Build Coastguard Worker
182*288bf522SAndroid Build Coastguard Workerclass X86ArchData:
183*288bf522SAndroid Build Coastguard Worker    def __init__(self, arch: str):
184*288bf522SAndroid Build Coastguard Worker        self.arch = arch
185*288bf522SAndroid Build Coastguard Worker        self.events: List[RawEvent] = []
186*288bf522SAndroid Build Coastguard Worker
187*288bf522SAndroid Build Coastguard Worker    def load_from_json_data(self, data) -> None:
188*288bf522SAndroid Build Coastguard Worker        for event in data['events']:
189*288bf522SAndroid Build Coastguard Worker            number = int(event[0], 16)
190*288bf522SAndroid Build Coastguard Worker            name = event[1]
191*288bf522SAndroid Build Coastguard Worker            desc = event[2]
192*288bf522SAndroid Build Coastguard Worker            self.events.append(RawEvent(number, name, desc, self.arch))
193*288bf522SAndroid Build Coastguard Worker
194*288bf522SAndroid Build Coastguard Worker
195*288bf522SAndroid Build Coastguard Workerclass RawEventGenerator:
196*288bf522SAndroid Build Coastguard Worker    def __init__(self, event_table_file: str):
197*288bf522SAndroid Build Coastguard Worker        with open(event_table_file, 'r') as fh:
198*288bf522SAndroid Build Coastguard Worker            event_table = json.load(fh)
199*288bf522SAndroid Build Coastguard Worker            self.arm64_data = ArchData('arm64')
200*288bf522SAndroid Build Coastguard Worker            self.arm64_data.load_from_json_data(event_table['arm64'])
201*288bf522SAndroid Build Coastguard Worker            self.riscv64_data = ArchData('riscv64')
202*288bf522SAndroid Build Coastguard Worker            self.riscv64_data.load_from_json_data(event_table['riscv64'])
203*288bf522SAndroid Build Coastguard Worker            self.x86_intel_data = X86ArchData('x86-intel')
204*288bf522SAndroid Build Coastguard Worker            self.x86_intel_data.load_from_json_data(event_table['x86-intel'])
205*288bf522SAndroid Build Coastguard Worker            self.x86_amd_data = X86ArchData('x86-amd')
206*288bf522SAndroid Build Coastguard Worker            self.x86_amd_data.load_from_json_data(event_table['x86-amd'])
207*288bf522SAndroid Build Coastguard Worker
208*288bf522SAndroid Build Coastguard Worker    def generate_raw_events(self) -> str:
209*288bf522SAndroid Build Coastguard Worker        def generate_event_entries(events, guard) -> list:
210*288bf522SAndroid Build Coastguard Worker            lines = []
211*288bf522SAndroid Build Coastguard Worker            for event in events:
212*288bf522SAndroid Build Coastguard Worker                lines.append(gen_event_type_entry_str(event.name, 'PERF_TYPE_RAW', '0x%x' %
213*288bf522SAndroid Build Coastguard Worker                         event.number, event.desc, event.limited_arch))
214*288bf522SAndroid Build Coastguard Worker            return guard(''.join(lines))
215*288bf522SAndroid Build Coastguard Worker
216*288bf522SAndroid Build Coastguard Worker        lines_arm64 = generate_event_entries(self.arm64_data.events, self.add_arm_guard)
217*288bf522SAndroid Build Coastguard Worker        lines_riscv64 = generate_event_entries(self.riscv64_data.events, self.add_riscv_guard)
218*288bf522SAndroid Build Coastguard Worker        lines_x86_intel = generate_event_entries(self.x86_intel_data.events, self.add_x86_guard)
219*288bf522SAndroid Build Coastguard Worker        lines_x86_amd = generate_event_entries(self.x86_amd_data.events, self.add_x86_guard)
220*288bf522SAndroid Build Coastguard Worker
221*288bf522SAndroid Build Coastguard Worker        return lines_arm64 + lines_riscv64 + lines_x86_intel + lines_x86_amd
222*288bf522SAndroid Build Coastguard Worker
223*288bf522SAndroid Build Coastguard Worker    def generate_cpu_support_events(self) -> str:
224*288bf522SAndroid Build Coastguard Worker        def generate_cpu_events(data, guard) -> str:
225*288bf522SAndroid Build Coastguard Worker            lines = []
226*288bf522SAndroid Build Coastguard Worker            for cpu in data:
227*288bf522SAndroid Build Coastguard Worker                event_list = ', '.join('0x%x' % number for number in cpu.supported_raw_events)
228*288bf522SAndroid Build Coastguard Worker                lines.append('{"%s", {%s}},' % (cpu.name, event_list))
229*288bf522SAndroid Build Coastguard Worker            return guard('\n'.join(lines))
230*288bf522SAndroid Build Coastguard Worker
231*288bf522SAndroid Build Coastguard Worker        text = f"""
232*288bf522SAndroid Build Coastguard Worker        // Map from cpu model to raw events supported on that cpu.
233*288bf522SAndroid Build Coastguard Worker        std::unordered_map<std::string, std::unordered_set<int>> cpu_supported_raw_events = {{
234*288bf522SAndroid Build Coastguard Worker        {generate_cpu_events(self.arm64_data.cpus, self.add_arm_guard)}
235*288bf522SAndroid Build Coastguard Worker        {generate_cpu_events(self.riscv64_data.cpus, self.add_riscv_guard)}
236*288bf522SAndroid Build Coastguard Worker        }};\n
237*288bf522SAndroid Build Coastguard Worker        """
238*288bf522SAndroid Build Coastguard Worker
239*288bf522SAndroid Build Coastguard Worker        return text
240*288bf522SAndroid Build Coastguard Worker
241*288bf522SAndroid Build Coastguard Worker    def generate_cpu_models(self) -> str:
242*288bf522SAndroid Build Coastguard Worker        def generate_model(data, map_type, map_key_type, id_func) -> str:
243*288bf522SAndroid Build Coastguard Worker            lines = [f'std::{map_type}<{map_key_type}, std::string> cpuid_to_name = {{']
244*288bf522SAndroid Build Coastguard Worker            for cpu in data:
245*288bf522SAndroid Build Coastguard Worker                cpu_id = id_func(cpu)
246*288bf522SAndroid Build Coastguard Worker                lines.append(f'{{{cpu_id}, "{cpu.name}"}},')
247*288bf522SAndroid Build Coastguard Worker            lines.append('};')
248*288bf522SAndroid Build Coastguard Worker            return '\n'.join(lines)
249*288bf522SAndroid Build Coastguard Worker
250*288bf522SAndroid Build Coastguard Worker        arm64_model = generate_model(
251*288bf522SAndroid Build Coastguard Worker            self.arm64_data.cpus,
252*288bf522SAndroid Build Coastguard Worker            "unordered_map",
253*288bf522SAndroid Build Coastguard Worker            "uint64_t",
254*288bf522SAndroid Build Coastguard Worker            lambda cpu: f"0x{((cpu.implementer << 32) | cpu.partnum):x}ull"
255*288bf522SAndroid Build Coastguard Worker        )
256*288bf522SAndroid Build Coastguard Worker
257*288bf522SAndroid Build Coastguard Worker        riscv64_model = generate_model(
258*288bf522SAndroid Build Coastguard Worker            self.riscv64_data.cpus,
259*288bf522SAndroid Build Coastguard Worker            "map",
260*288bf522SAndroid Build Coastguard Worker            "std::tuple<uint64_t, std::string, std::string>",
261*288bf522SAndroid Build Coastguard Worker            lambda cpu: f'{{0x{cpu.mvendorid:x}ull, "{cpu.marchid}", "{cpu.mimpid}"}}'
262*288bf522SAndroid Build Coastguard Worker        )
263*288bf522SAndroid Build Coastguard Worker
264*288bf522SAndroid Build Coastguard Worker        return self.add_arm_guard(arm64_model) + "\n" + self.add_riscv_guard(riscv64_model)
265*288bf522SAndroid Build Coastguard Worker
266*288bf522SAndroid Build Coastguard Worker    def add_arm_guard(self, data: str) -> str:
267*288bf522SAndroid Build Coastguard Worker        return f'#if defined(__aarch64__) || defined(__arm__)\n{data}\n#endif\n'
268*288bf522SAndroid Build Coastguard Worker
269*288bf522SAndroid Build Coastguard Worker    def add_riscv_guard(self, data: str) -> str:
270*288bf522SAndroid Build Coastguard Worker        return f'#if defined(__riscv)\n{data}\n#endif\n'
271*288bf522SAndroid Build Coastguard Worker
272*288bf522SAndroid Build Coastguard Worker    def add_x86_guard(self, data: str) -> str:
273*288bf522SAndroid Build Coastguard Worker        return f'#if defined(__i386__) || defined(__x86_64__)\n{data}\n#endif\n'
274*288bf522SAndroid Build Coastguard Worker
275*288bf522SAndroid Build Coastguard Worker
276*288bf522SAndroid Build Coastguard Workerdef gen_events(event_table_file: str):
277*288bf522SAndroid Build Coastguard Worker    generated_str = """
278*288bf522SAndroid Build Coastguard Worker        #include <unordered_map>
279*288bf522SAndroid Build Coastguard Worker        #include <unordered_set>
280*288bf522SAndroid Build Coastguard Worker        #include <map>
281*288bf522SAndroid Build Coastguard Worker        #include <string_view>
282*288bf522SAndroid Build Coastguard Worker
283*288bf522SAndroid Build Coastguard Worker        #include "event_type.h"
284*288bf522SAndroid Build Coastguard Worker
285*288bf522SAndroid Build Coastguard Worker        namespace simpleperf {
286*288bf522SAndroid Build Coastguard Worker
287*288bf522SAndroid Build Coastguard Worker        // A constexpr-constructible version of EventType for the built-in table.
288*288bf522SAndroid Build Coastguard Worker        struct BuiltinEventType {
289*288bf522SAndroid Build Coastguard Worker          std::string_view name;
290*288bf522SAndroid Build Coastguard Worker          uint32_t type;
291*288bf522SAndroid Build Coastguard Worker          uint64_t config;
292*288bf522SAndroid Build Coastguard Worker          std::string_view description;
293*288bf522SAndroid Build Coastguard Worker          std::string_view limited_arch;
294*288bf522SAndroid Build Coastguard Worker
295*288bf522SAndroid Build Coastguard Worker          explicit operator EventType() const {
296*288bf522SAndroid Build Coastguard Worker            return {std::string(name), type, config, std::string(description), std::string(limited_arch)};
297*288bf522SAndroid Build Coastguard Worker          }
298*288bf522SAndroid Build Coastguard Worker        };
299*288bf522SAndroid Build Coastguard Worker
300*288bf522SAndroid Build Coastguard Worker        static constexpr BuiltinEventType kBuiltinEventTypes[] = {
301*288bf522SAndroid Build Coastguard Worker    """
302*288bf522SAndroid Build Coastguard Worker    generated_str += gen_hardware_events() + '\n'
303*288bf522SAndroid Build Coastguard Worker    generated_str += gen_software_events() + '\n'
304*288bf522SAndroid Build Coastguard Worker    generated_str += gen_hw_cache_events() + '\n'
305*288bf522SAndroid Build Coastguard Worker    raw_event_generator = RawEventGenerator(event_table_file)
306*288bf522SAndroid Build Coastguard Worker    generated_str += raw_event_generator.generate_raw_events() + '\n'
307*288bf522SAndroid Build Coastguard Worker    generated_str += """
308*288bf522SAndroid Build Coastguard Worker        };
309*288bf522SAndroid Build Coastguard Worker
310*288bf522SAndroid Build Coastguard Worker        void LoadBuiltinEventTypes(std::set<EventType>& set) {
311*288bf522SAndroid Build Coastguard Worker          for (const auto& event_type : kBuiltinEventTypes) {
312*288bf522SAndroid Build Coastguard Worker            set.insert(static_cast<EventType>(event_type));
313*288bf522SAndroid Build Coastguard Worker          }
314*288bf522SAndroid Build Coastguard Worker        }
315*288bf522SAndroid Build Coastguard Worker
316*288bf522SAndroid Build Coastguard Worker
317*288bf522SAndroid Build Coastguard Worker    """
318*288bf522SAndroid Build Coastguard Worker    generated_str += raw_event_generator.generate_cpu_support_events()
319*288bf522SAndroid Build Coastguard Worker    generated_str += raw_event_generator.generate_cpu_models()
320*288bf522SAndroid Build Coastguard Worker
321*288bf522SAndroid Build Coastguard Worker    generated_str += """
322*288bf522SAndroid Build Coastguard Worker        }  // namespace simpleperf
323*288bf522SAndroid Build Coastguard Worker    """
324*288bf522SAndroid Build Coastguard Worker    return generated_str
325*288bf522SAndroid Build Coastguard Worker
326*288bf522SAndroid Build Coastguard Worker
327*288bf522SAndroid Build Coastguard Workerdef main():
328*288bf522SAndroid Build Coastguard Worker    event_table_file = sys.argv[1]
329*288bf522SAndroid Build Coastguard Worker    output_file = sys.argv[2]
330*288bf522SAndroid Build Coastguard Worker    generated_str = gen_events(event_table_file)
331*288bf522SAndroid Build Coastguard Worker    with open(output_file, 'w') as fh:
332*288bf522SAndroid Build Coastguard Worker        fh.write(generated_str)
333*288bf522SAndroid Build Coastguard Worker
334*288bf522SAndroid Build Coastguard Worker
335*288bf522SAndroid Build Coastguard Workerif __name__ == '__main__':
336*288bf522SAndroid Build Coastguard Worker    main()
337