return pmu;
        }
+       return NULL;
+}
+
+const struct pmu_metrics_table *pmu_metrics_table__find(void)
+{
+       struct perf_pmu *pmu = pmu__find_core_pmu();
+
+       if (pmu)
+               return perf_pmu__find_metrics_table(pmu);
 
        return NULL;
 }
 
        return 0;
 }
 
-int pmu_events_table_for_each_metric(const struct pmu_events_table *etable, pmu_metric_iter_fn fn,
-                                    void *data)
+int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
+                                     void *data)
 {
-       struct pmu_metrics_table *table = (struct pmu_metrics_table *)etable;
-
        for (const struct pmu_metric *pm = &table->entries[0]; pm->metric_expr; pm++) {
-               int ret = fn(pm, etable, data);
+               int ret = fn(pm, table, data);
 
                if (ret)
                        return ret;
        return table;
 }
 
-const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
+const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
 {
-       const struct pmu_events_table *table = NULL;
+       const struct pmu_metrics_table *table = NULL;
        char *cpuid = perf_pmu__getcpuid(pmu);
        int i;
 
                        break;
 
                if (!strcmp_cpuid_str(map->cpuid, cpuid)) {
-                       table = (const struct pmu_events_table *)&map->metric_table;
+                       table = &map->metric_table;
                        break;
                }
        }
        return NULL;
 }
 
-const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid)
+const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid)
 {
        for (const struct pmu_events_map *tables = &pmu_events_map[0];
             tables->arch;
             tables++) {
                if (!strcmp(tables->arch, arch) && !strcmp_cpuid_str(tables->cpuid, cpuid))
-                       return (const struct pmu_events_table *)&tables->metric_table;
+                       return &tables->metric_table;
        }
        return NULL;
 }
        for (const struct pmu_events_map *tables = &pmu_events_map[0];
             tables->arch;
             tables++) {
-               int ret = pmu_events_table_for_each_metric(
-                       (const struct pmu_events_table *)&tables->metric_table, fn, data);
+               int ret = pmu_metrics_table_for_each_metric(&tables->metric_table, fn, data);
 
                if (ret)
                        return ret;
 
         return 0;
 }
 
-int pmu_events_table_for_each_metric(const struct pmu_events_table *table,
+int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *mtable,
                                      pmu_metric_iter_fn fn,
                                      void *data)
 {
+        const struct pmu_events_table *table = (const struct pmu_events_table *)mtable;
+
         for (size_t i = 0; i < table->length; i++) {
                 struct pmu_metric pm;
                 int ret;
                 decompress_metric(table->entries[i].offset, &pm);
                 if (!pm.metric_expr)
                         continue;
-                ret = fn(&pm, table, data);
+                ret = fn(&pm, mtable, data);
                 if (ret)
                         return ret;
         }
         return table;
 }
 
+const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu)
+{
+        return (struct pmu_metrics_table *)perf_pmu__find_events_table(pmu);
+}
+
 const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid)
 {
         for (const struct pmu_events_map *tables = &pmu_events_map[0];
         return NULL;
 }
 
-const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid)
+const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid)
 {
-        return (struct pmu_events_table *)find_core_events_table(arch, cpuid);
+       return (struct pmu_metrics_table *)find_core_events_table(arch, cpuid);
 }
 
 int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data)
         for (const struct pmu_events_map *tables = &pmu_events_map[0];
              tables->arch;
              tables++) {
-                int ret = pmu_events_table_for_each_metric(&tables->table, fn, data);
+                int ret = pmu_metrics_table_for_each_metric(
+                                (struct pmu_metrics_table *)&tables->table, fn, data);
 
                 if (ret)
                         return ret;
         for (const struct pmu_sys_events *tables = &pmu_sys_event_tables[0];
              tables->name;
              tables++) {
-                int ret = pmu_events_table_for_each_metric(&tables->table, fn, data);
+                int ret = pmu_metrics_table_for_each_metric(
+                                (struct pmu_metrics_table *)&tables->table, fn, data);
 
                 if (ret)
                         return ret;
 
 };
 
 struct pmu_events_table;
+struct pmu_metrics_table;
 
 typedef int (*pmu_event_iter_fn)(const struct pmu_event *pe,
                                 const struct pmu_events_table *table,
                                 void *data);
 
 typedef int (*pmu_metric_iter_fn)(const struct pmu_metric *pm,
-                                 const struct pmu_events_table *table,
+                                 const struct pmu_metrics_table *table,
                                  void *data);
 
 int pmu_events_table_for_each_event(const struct pmu_events_table *table, pmu_event_iter_fn fn,
                                    void *data);
-int pmu_events_table_for_each_metric(const struct pmu_events_table *table, pmu_metric_iter_fn fn,
+int pmu_metrics_table_for_each_metric(const struct pmu_metrics_table *table, pmu_metric_iter_fn fn,
                                     void *data);
 
 const struct pmu_events_table *perf_pmu__find_events_table(struct perf_pmu *pmu);
-const struct pmu_events_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
+const struct pmu_metrics_table *perf_pmu__find_metrics_table(struct perf_pmu *pmu);
 const struct pmu_events_table *find_core_events_table(const char *arch, const char *cpuid);
-const struct pmu_events_table *find_core_metrics_table(const char *arch, const char *cpuid);
+const struct pmu_metrics_table *find_core_metrics_table(const char *arch, const char *cpuid);
 int pmu_for_each_core_event(pmu_event_iter_fn fn, void *data);
 int pmu_for_each_core_metric(pmu_metric_iter_fn fn, void *data);
 
 const struct pmu_events_table *find_sys_events_table(const char *name);
+const struct pmu_metrics_table *find_sys_metrics_table(const char *name);
 int pmu_for_each_sys_event(pmu_event_iter_fn fn, void *data);
 int pmu_for_each_sys_metric(pmu_metric_iter_fn fn, void *data);
 
 
        struct evlist *evlist;
        struct rblist metric_events;
        const char metric_str[] = "CPI";
-       const struct pmu_events_table *pme_test;
+       const struct pmu_metrics_table *pme_test;
 
        evlist = evlist__new();
        TEST_ASSERT_VAL("failed to get evlist", evlist);
 
        struct rblist metric_events = {
                .nr_entries = 0,
        };
-       const struct pmu_events_table *pme_test;
+       const struct pmu_metrics_table *pme_test;
        struct perf_cpu_map *cpus;
        struct runtime_stat st;
        struct evlist *evlist;
 
        struct metric_ref metric_ref;
 };
 
-static int test__parsing_callback(const struct pmu_metric *pm, const struct pmu_events_table *table,
+static int test__parsing_callback(const struct pmu_metric *pm,
+                                 const struct pmu_metrics_table *table,
                                  void *data)
 {
        int *failures = data;
 }
 
 static int test__parsing_fake_callback(const struct pmu_metric *pm,
-                                      const struct pmu_events_table *table __maybe_unused,
+                                      const struct pmu_metrics_table *table __maybe_unused,
                                       void *data __maybe_unused)
 {
        return metric_parse_fake(pm->metric_name, pm->metric_expr);
 
 };
 
 static int metricgroup__sys_event_iter(const struct pmu_metric *pm,
-                                      const struct pmu_events_table *table,
+                                      const struct pmu_metrics_table *table,
                                       void *data)
 {
        struct metricgroup_iter_data *d = data;
 }
 
 static int metricgroup__add_to_mep_groups_callback(const struct pmu_metric *pm,
-                                               const struct pmu_events_table *table __maybe_unused,
-                                               void *vdata)
+                                       const struct pmu_metrics_table *table __maybe_unused,
+                                       void *vdata)
 {
        struct rblist *groups = vdata;
 
 void metricgroup__print(const struct print_callbacks *print_cb, void *print_state)
 {
        struct rblist groups;
-       const struct pmu_events_table *table;
+       const struct pmu_metrics_table *table;
        struct rb_node *node, *next;
 
        rblist__init(&groups);
        groups.node_new = mep_new;
        groups.node_cmp = mep_cmp;
        groups.node_delete = mep_delete;
-       table = pmu_events_table__find();
+       table = pmu_metrics_table__find();
        if (table) {
-               pmu_events_table_for_each_metric(table,
+               pmu_metrics_table_for_each_metric(table,
                                                 metricgroup__add_to_mep_groups_callback,
                                                 &groups);
        }
        bool system_wide;
        struct metric *root_metric;
        const struct visited_metric *visited;
-       const struct pmu_events_table *table;
+       const struct pmu_metrics_table *table;
 };
 
 static bool metricgroup__find_metric(const char *metric,
-                                    const struct pmu_events_table *table,
+                                    const struct pmu_metrics_table *table,
                                     struct pmu_metric *pm);
 
 static int add_metric(struct list_head *metric_list,
                      bool system_wide,
                      struct metric *root_metric,
                      const struct visited_metric *visited,
-                     const struct pmu_events_table *table);
+                     const struct pmu_metrics_table *table);
 
 /**
  * resolve_metric - Locate metrics within the root metric and recursively add
                          bool system_wide,
                          struct metric *root_metric,
                          const struct visited_metric *visited,
-                         const struct pmu_events_table *table)
+                         const struct pmu_metrics_table *table)
 {
        struct hashmap_entry *cur;
        size_t bkt;
                        bool system_wide,
                        struct metric *root_metric,
                        const struct visited_metric *visited,
-                       const struct pmu_events_table *table)
+                       const struct pmu_metrics_table *table)
 {
        const struct visited_metric *vm;
        int ret;
 };
 
 static int metricgroup__find_metric_callback(const struct pmu_metric *pm,
-                                            const struct pmu_events_table *table  __maybe_unused,
+                                            const struct pmu_metrics_table *table  __maybe_unused,
                                             void *vdata)
 {
        struct metricgroup__find_metric_data *data = vdata;
 }
 
 static bool metricgroup__find_metric(const char *metric,
-                                    const struct pmu_events_table *table,
+                                    const struct pmu_metrics_table *table,
                                     struct pmu_metric *pm)
 {
        struct metricgroup__find_metric_data data = {
                .pm = pm,
        };
 
-       return pmu_events_table_for_each_metric(table, metricgroup__find_metric_callback, &data)
+       return pmu_metrics_table_for_each_metric(table, metricgroup__find_metric_callback, &data)
                ? true : false;
 }
 
                      bool system_wide,
                      struct metric *root_metric,
                      const struct visited_metric *visited,
-                     const struct pmu_events_table *table)
+                     const struct pmu_metrics_table *table)
 {
        int ret = 0;
 
 }
 
 static int metricgroup__add_metric_sys_event_iter(const struct pmu_metric *pm,
-                                               const struct pmu_events_table *table __maybe_unused,
-                                               void *data)
+                                       const struct pmu_metrics_table *table __maybe_unused,
+                                       void *data)
 {
        struct metricgroup_add_iter_data *d = data;
        int ret;
 };
 
 static int metricgroup__add_metric_callback(const struct pmu_metric *pm,
-                                           const struct pmu_events_table *table,
+                                           const struct pmu_metrics_table *table,
                                            void *vdata)
 {
        struct metricgroup__add_metric_data *data = vdata;
                                   const char *user_requested_cpu_list,
                                   bool system_wide,
                                   struct list_head *metric_list,
-                                  const struct pmu_events_table *table)
+                                  const struct pmu_metrics_table *table)
 {
        LIST_HEAD(list);
        int ret;
                 * Iterate over all metrics seeing if metric matches either the
                 * name or group. When it does add the metric to the list.
                 */
-               ret = pmu_events_table_for_each_metric(table, metricgroup__add_metric_callback,
+               ret = pmu_metrics_table_for_each_metric(table, metricgroup__add_metric_callback,
                                                       &data);
                if (ret)
                        goto out;
 static int metricgroup__add_metric_list(const char *list, bool metric_no_group,
                                        const char *user_requested_cpu_list,
                                        bool system_wide, struct list_head *metric_list,
-                                       const struct pmu_events_table *table)
+                                       const struct pmu_metrics_table *table)
 {
        char *list_itr, *list_copy, *metric_name, *modifier;
        int ret, count = 0;
                        bool system_wide,
                        struct perf_pmu *fake_pmu,
                        struct rblist *metric_events_list,
-                       const struct pmu_events_table *table)
+                       const struct pmu_metrics_table *table)
 {
        struct evlist *combined_evlist = NULL;
        LIST_HEAD(metric_list);
                              bool system_wide,
                              struct rblist *metric_events)
 {
-       const struct pmu_events_table *table = pmu_events_table__find();
+       const struct pmu_metrics_table *table = pmu_metrics_table__find();
 
        if (!table)
                return -EINVAL;
 }
 
 int metricgroup__parse_groups_test(struct evlist *evlist,
-                                  const struct pmu_events_table *table,
+                                  const struct pmu_metrics_table *table,
                                   const char *str,
                                   bool metric_no_group,
                                   bool metric_no_merge,
 }
 
 static int metricgroup__has_metric_callback(const struct pmu_metric *pm,
-                                           const struct pmu_events_table *table __maybe_unused,
+                                           const struct pmu_metrics_table *table __maybe_unused,
                                            void *vdata)
 {
        const char *metric = vdata;
 
 bool metricgroup__has_metric(const char *metric)
 {
-       const struct pmu_events_table *table = pmu_events_table__find();
+       const struct pmu_metrics_table *table = pmu_metrics_table__find();
 
        if (!table)
                return false;
 
-       return pmu_events_table_for_each_metric(table, metricgroup__has_metric_callback,
+       return pmu_metrics_table_for_each_metric(table, metricgroup__has_metric_callback,
                                                (void *)metric) ? true : false;
 }
 
 
                              bool system_wide,
                              struct rblist *metric_events);
 int metricgroup__parse_groups_test(struct evlist *evlist,
-                                  const struct pmu_events_table *table,
+                                  const struct pmu_metrics_table *table,
                                   const char *str,
                                   bool metric_no_group,
                                   bool metric_no_merge,
 
        return perf_pmu__find_events_table(NULL);
 }
 
+__weak const struct pmu_metrics_table *pmu_metrics_table__find(void)
+{
+       return perf_pmu__find_metrics_table(NULL);
+}
+
 /*
  * Suffix must be in form tok_{digits}, or tok{digits}, or same as pmu_name
  * to be valid.
 
 
 char *perf_pmu__getcpuid(struct perf_pmu *pmu);
 const struct pmu_events_table *pmu_events_table__find(void);
+const struct pmu_metrics_table *pmu_metrics_table__find(void);
 bool pmu_uncore_alias_match(const char *pmu_name, const char *name);
 void perf_pmu_free_alias(struct perf_pmu_alias *alias);