1*8b84de26SClement Courbet
2*8b84de26SClement Courbet #include "ValidationEvent.h"
3*8b84de26SClement Courbet #include "llvm/ADT/StringRef.h"
4*8b84de26SClement Courbet #include "llvm/Support/Errc.h"
5*8b84de26SClement Courbet #include "llvm/Support/Error.h"
6*8b84de26SClement Courbet
7*8b84de26SClement Courbet namespace llvm {
8*8b84de26SClement Courbet namespace exegesis {
9*8b84de26SClement Courbet
10*8b84de26SClement Courbet namespace {
11*8b84de26SClement Courbet
12*8b84de26SClement Courbet struct ValidationEventInfo {
13*8b84de26SClement Courbet const char *const Name;
14*8b84de26SClement Courbet const char *const Description;
15*8b84de26SClement Courbet };
16*8b84de26SClement Courbet
17*8b84de26SClement Courbet // Information about validation events, indexed by `ValidationEvent` enum
18*8b84de26SClement Courbet // value.
19*8b84de26SClement Courbet static constexpr ValidationEventInfo ValidationEventInfos[] = {
20*8b84de26SClement Courbet {"instructions-retired", "Count retired instructions"},
21*8b84de26SClement Courbet {"l1d-cache-load-misses", "Count L1D load cache misses"},
22*8b84de26SClement Courbet {"l1d-cache-store-misses", "Count L1D store cache misses"},
23*8b84de26SClement Courbet {"l1i-cache-load-misses", "Count L1I load cache misses"},
24*8b84de26SClement Courbet {"data-tlb-load-misses", "Count DTLB load misses"},
25*8b84de26SClement Courbet {"data-tlb-store-misses", "Count DTLB store misses"},
26*8b84de26SClement Courbet {"instruction-tlb-load-misses", "Count ITLB load misses"},
27*8b84de26SClement Courbet {"branch-prediction-misses", "Branch prediction misses"},
28*8b84de26SClement Courbet };
29*8b84de26SClement Courbet
30*8b84de26SClement Courbet static_assert(sizeof(ValidationEventInfos) ==
31*8b84de26SClement Courbet NumValidationEvents * sizeof(ValidationEventInfo),
32*8b84de26SClement Courbet "please update ValidationEventInfos");
33*8b84de26SClement Courbet
34*8b84de26SClement Courbet } // namespace
35*8b84de26SClement Courbet
getValidationEventName(ValidationEvent VE)36*8b84de26SClement Courbet const char *getValidationEventName(ValidationEvent VE) {
37*8b84de26SClement Courbet return ValidationEventInfos[VE].Name;
38*8b84de26SClement Courbet }
getValidationEventDescription(ValidationEvent VE)39*8b84de26SClement Courbet const char *getValidationEventDescription(ValidationEvent VE) {
40*8b84de26SClement Courbet return ValidationEventInfos[VE].Description;
41*8b84de26SClement Courbet }
42*8b84de26SClement Courbet
getValidationEventByName(StringRef Name)43*8b84de26SClement Courbet Expected<ValidationEvent> getValidationEventByName(StringRef Name) {
44*8b84de26SClement Courbet int VE = 0;
45*8b84de26SClement Courbet for (const ValidationEventInfo &Info : ValidationEventInfos) {
46*8b84de26SClement Courbet if (Name == Info.Name)
47*8b84de26SClement Courbet return static_cast<ValidationEvent>(VE);
48*8b84de26SClement Courbet ++VE;
49*8b84de26SClement Courbet }
50*8b84de26SClement Courbet
51*8b84de26SClement Courbet return make_error<StringError>("Invalid validation event string",
52*8b84de26SClement Courbet errc::invalid_argument);
53*8b84de26SClement Courbet }
54*8b84de26SClement Courbet
55*8b84de26SClement Courbet } // namespace exegesis
56*8b84de26SClement Courbet } // namespace llvm
57