//===- TargetPfmCounters.td - Target Pfm Counters -*- tablegen ----------*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the target-independent interfaces for performance counters. // //===----------------------------------------------------------------------===// // Definition of a hardware counters from libpfm identifiers. class PfmCounter { // The name of the counter that measures events. // The name can be "some_counter + some_other_counter", in which case the // measured value is the sum of events on these counters. string Counter = counter; } // Issue counters can be tied to a ProcResource class PfmIssueCounter : PfmCounter { // The name of the ProcResource on which uops are issued. This is used by // llvm-exegesis to compare measurements with values in the SchedModels. // If the CPU has a sched model, this should correspond to the name of a // ProcResource. string ResourceName = resource_name; } // Definition of a validation event. A validation event represents a specific // event that can be measured using performance counters that is interesting // in regard to the snippet state. class ValidationEvent { int EventNumber = event_number; } // TableGen names for events defined in `llvm::exegesis::ValidationEvent`. def InstructionRetired : ValidationEvent<0>; def L1DCacheLoadMiss : ValidationEvent<1>; def L1DCacheStoreMiss : ValidationEvent<2>; def L1ICacheLoadMiss : ValidationEvent<3>; def DataTLBLoadMiss : ValidationEvent<4>; def DataTLBStoreMiss : ValidationEvent<5>; def InstructionTLBLoadMiss : ValidationEvent<6>; def BranchPredictionMiss : ValidationEvent<7>; // PfmValidationCounter provides a mapping between the events that are // are interesting in regards to the snippet execution environment and // a concrete performance counter name that can be looked up in libpfm. class PfmValidationCounter : PfmCounter { // The name of the event that the validation counter detects. ValidationEvent EventType = event_type; } def NoPfmCounter : PfmCounter <""> {} // Set of PfmCounters for measuring sched model characteristics. class ProcPfmCounters { // Processors can define how to measure cycles by defining a CycleCounter. PfmCounter CycleCounter = NoPfmCounter; // Processors can define how to measure uops by defining a UopsCounter. PfmCounter UopsCounter = NoPfmCounter; // Processors can define how to measure issued uops by defining IssueCounters. list IssueCounters = []; // Processor can list mappings between validation events and real counters // to measure the specified events. list ValidationCounters = []; } // A binding of a set of counters to a CPU. class PfmCountersBinding { string CpuName = cpu_name; ProcPfmCounters Counters = counters; } // Declares the default binding for unbound CPUs for the target. class PfmCountersDefaultBinding : PfmCountersBinding<"", counters> {}