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