diff options
Diffstat (limited to 'gprofng')
-rw-r--r-- | gprofng/common/hwcdrv.c | 83 | ||||
-rw-r--r-- | gprofng/common/hwcdrv.h | 32 | ||||
-rw-r--r-- | gprofng/common/hwcentry.h | 3 | ||||
-rw-r--r-- | gprofng/common/hwcfuncs.c | 39 | ||||
-rw-r--r-- | gprofng/common/hwcfuncs.h | 25 | ||||
-rw-r--r-- | gprofng/common/hwctable.c | 501 | ||||
-rw-r--r-- | gprofng/src/Dbe.cc | 5 | ||||
-rw-r--r-- | gprofng/src/collctrl.cc | 14 |
8 files changed, 50 insertions, 652 deletions
diff --git a/gprofng/common/hwcdrv.c b/gprofng/common/hwcdrv.c index 2d549b0..0ada09d 100644 --- a/gprofng/common/hwcdrv.c +++ b/gprofng/common/hwcdrv.c @@ -44,83 +44,11 @@ static hdrv_pcbe_api_t *hdrv_pcbe_drivers[] = { #include "opteron_pcbe.c" /* CPU-specific code */ #include "core_pcbe.c" /* CPU-specific code */ -extern hwcdrv_api_t hwcdrv_pcl_api; -IS_GLOBAL hwcdrv_api_t *hwcdrv_drivers[] = { - &hwcdrv_pcl_api, - NULL -}; - /*---------------------------------------------------------------------------*/ - -/* utils for drivers */ -IS_GLOBAL int -hwcdrv_assign_all_regnos (Hwcentry* entries[], unsigned numctrs) -{ - unsigned int pmc_assigned[MAX_PICS]; - unsigned idx; - for (int ii = 0; ii < MAX_PICS; ii++) - pmc_assigned[ii] = 0; - - /* assign the HWCs that we already know about */ - for (idx = 0; idx < numctrs; idx++) - { - regno_t regno = entries[idx]->reg_num; - if (regno == REGNO_ANY) - { - /* check to see if list of possible registers only contains one entry */ - regno = REG_LIST_SINGLE_VALID_ENTRY (entries[idx]->reg_list); - } - if (regno != REGNO_ANY) - { - if (regno < 0 || regno >= MAX_PICS || !regno_is_valid (entries[idx], regno)) - { - logerr (GTXT ("For counter #%d, register %d is out of range\n"), idx + 1, regno); /*!*/ - return HWCFUNCS_ERROR_HWCARGS; - } - TprintfT (DBG_LT2, "hwcfuncs_assign_regnos(): preselected: idx=%d, regno=%d\n", idx, regno); - entries[idx]->reg_num = regno; /* assigning back to entries */ - pmc_assigned[regno] = 1; - } - } - - /* assign HWCs that are currently REGNO_ANY */ - for (idx = 0; idx < numctrs; idx++) - { - if (entries[idx]->reg_num == REGNO_ANY) - { - int assigned = 0; - regno_t *reg_list = entries[idx]->reg_list; - for (; reg_list && *reg_list != REGNO_ANY; reg_list++) - { - regno_t regno = *reg_list; - if (regno < 0 || regno >= MAX_PICS) - { - logerr (GTXT ("For counter #%d, register %d is out of range\n"), idx + 1, regno); /*!*/ - return HWCFUNCS_ERROR_HWCARGS; - } - if (pmc_assigned[regno] == 0) - { - TprintfT (DBG_LT2, "hwcfuncs_assign_regnos(): assigned: idx=%d, regno=%d\n", idx, regno); - entries[idx]->reg_num = regno; /* assigning back to entries */ - pmc_assigned[regno] = 1; - assigned = 1; - break; - } - } - if (!assigned) - { - logerr (GTXT ("Counter '%s' could not be bound to a register\n"), - entries[idx]->name ? entries[idx]->name : "<NULL>"); - return HWCFUNCS_ERROR_HWCARGS; - } - } - } - return 0; -} - -IS_GLOBAL int +static int hwcdrv_lookup_cpuver (const char * cpcN_cciname) { + /* returns hwc_cpus.h ID for a given string. */ libcpc2_cpu_lookup_t *plookup; static libcpc2_cpu_lookup_t cpu_table[] = { LIBCPC2_CPU_LOOKUP_LIST @@ -307,11 +235,6 @@ hwcfuncs_get_x86_eventsel (unsigned int regno, const char *int_name, return -1; } hwcfuncs_parse_ctr (int_name, NULL, &nameOnly, NULL, NULL, NULL); - if (regno == REGNO_ANY) - { - logerr (GTXT ("reg# could not be determined for `%s'\n"), nameOnly); - goto attr_wrapup; - } /* look up evntsel */ if (myperfctr_get_x86_eventnum (nameOnly, regno, @@ -987,7 +910,7 @@ hwcdrv_get_descriptions (hwcf_hwc_cb_t *hwc_cb, hwcf_attr_cb_t *attr_cb) HWCDRV_API int hwcdrv_assign_regnos (Hwcentry* entries[], unsigned numctrs) { - return hwcdrv_assign_all_regnos (entries, numctrs); + return 0; } static int diff --git a/gprofng/common/hwcdrv.h b/gprofng/common/hwcdrv.h index 1829ec8..0a5eb33 100644 --- a/gprofng/common/hwcdrv.h +++ b/gprofng/common/hwcdrv.h @@ -41,29 +41,6 @@ #include "libcol_util.h" #define get_hwcdrv __collector_get_hwcdrv -#define hwcdrv_drivers __collector_hwcdrv_drivers -#define hwcdrv_cpc1_api __collector_hwcdrv_cpc1_api -#define hwcdrv_cpc2_api __collector_hwcdrv_cpc2_api -#define hwcdrv_default __collector_hwcdrv_default -#define hwcdrv_driver __collector_hwcdrv_driver -#define hwcdrv_init __collector_hwcdrv_init -#define hwcdrv_get_info __collector_hwcdrv_get_info -#define hwcdrv_enable_mt __collector_hwcdrv_enable_mt -#define hwcdrv_get_descriptions __collector_hwcdrv_get_descriptions -#define hwcdrv_assign_regnos __collector_hwcdrv_assign_regnos -#define hwcdrv_create_counters __collector_hwcdrv_create_counters -#define hwcdrv_start __collector_hwcdrv_start -#define hwcdrv_overflow __collector_hwcdrv_overflow -#define hwcdrv_read_events __collector_hwcdrv_read_events -#define hwcdrv_sighlr_restart __collector_hwcdrv_sighlr_restart -#define hwcdrv_lwp_suspend __collector_hwcdrv_lwp_suspend -#define hwcdrv_lwp_resume __collector_hwcdrv_lwp_resume -#define hwcdrv_free_counters __collector_hwcdrv_free_counters -#define hwcdrv_lwp_init __collector_hwcdrv_lwp_init -#define hwcdrv_lwp_fini __collector_hwcdrv_lwp_fini -#define hwcdrv_assign_all_regnos __collector_hwcdrv_assign_all_regnos -#define hwcdrv_lookup_cpuver __collector_hwcdrv_lookup_cpuver -#define hwcfuncs_int_capture_errmsg __collector_hwcfuncs_int_capture_errmsg #define GTXT(x) x @@ -263,7 +240,6 @@ extern "C" extern hwcdrv_api_t *__collector_get_hwcdrv (); extern int __collector_hwcfuncs_bind_descriptor (const char *defstring); extern Hwcentry **__collector_hwcfuncs_get_ctrs (unsigned *defcnt); - extern hwcdrv_api_t *hwcdrv_drivers[]; // array of available drivers /* prototypes for internal use by hwcdrv drivers */ typedef struct @@ -274,14 +250,6 @@ extern "C" const char *cpcN_cciname; } hwcdrv_about_t; - extern int hwcdrv_assign_all_regnos (Hwcentry* entries[], unsigned numctrs); - /* assign user's counters to specific CPU registers */ - - extern int hwcdrv_lookup_cpuver (const char * cpcN_cciname); - /* returns hwc_cpus.h ID for a given string. */ - - extern void hwcfuncs_int_capture_errmsg (const char *fn, int subcode, - const char *fmt, va_list ap); #define logerr hwcfuncs_int_logerr /*---------------------------------------------------------------------------*/ diff --git a/gprofng/common/hwcentry.h b/gprofng/common/hwcentry.h index a35a363..946356e 100644 --- a/gprofng/common/hwcentry.h +++ b/gprofng/common/hwcentry.h @@ -119,9 +119,6 @@ extern "C" unsigned int type : 16; /* Type of perf_event_attr */ long long config; /* perf_event_type -specific configuration */ int sort_order; /* "tag" to associate experiment record with HWC def */ - regno_t *reg_list; /* if not NULL, legal values for <reg_num> field above */ - /* Note: reg_list will be terminated by REGNO_ANY */ - /* Max size of array is MAX_PICS */ hrtime_t min_time; /* target minimum time between overflow events. 0 is off. See HWCTIME_* macros */ hrtime_t min_time_default; /* if min_time==HWCTIME_AUTO, use this value instead. 0 is off. */ int ref_val; /* if min_time==HWCTIME_AUTO, use this time. 0 is off. */ diff --git a/gprofng/common/hwcfuncs.c b/gprofng/common/hwcfuncs.c index 86d6935..fce711d 100644 --- a/gprofng/common/hwcfuncs.c +++ b/gprofng/common/hwcfuncs.c @@ -162,10 +162,10 @@ ctrdefprint (int dbg_lvl, const char * hdr, Hwcentry*phwcdef) { TprintfT (dbg_lvl, "%s: name='%s', int_name='%s'," " reg_num=%d, timecvt=%d, memop=%d, " - "interval=%d, tag=%u, reg_list=%p\n", + "interval=%d, tag=%u\n", hdr, phwcdef->name, phwcdef->int_name, phwcdef->reg_num, phwcdef->timecvt, phwcdef->memop, phwcdef->val, - phwcdef->sort_order, phwcdef->reg_list); + phwcdef->sort_order); } /*---------------------------------------------------------------------------*/ @@ -198,7 +198,7 @@ hwcfuncs_errmsg_get (char *buf, size_t bufsize, int enable) } /* used by cpc to log an error */ -IS_GLOBAL void +static void hwcfuncs_int_capture_errmsg (const char *fn, int subcode, const char *fmt, va_list ap) { @@ -639,39 +639,6 @@ hwcfuncs_get_ctrs (unsigned *defcnt) return hwctable; } -/* return 1 if <regno> is in Hwcentry's list */ -IS_GLOBAL int -regno_is_valid (const Hwcentry * pctr, regno_t regno) -{ - regno_t *reg_list = pctr->reg_list; - if (REG_LIST_IS_EMPTY (reg_list)) - return 0; - if (regno == REGNO_ANY) /* wildcard */ - return 1; - for (int ii = 0; ii < MAX_PICS; ii++) - { - regno_t tmp = reg_list[ii]; - if (REG_LIST_EOL (tmp)) /* end of list */ - break; - if (tmp == regno) /* is in list */ - return 1; - } - return 0; -} - -/* supplied by hwcdrv_api drivers */ -IS_GLOBAL int -hwcfuncs_assign_regnos (Hwcentry* entries[], - unsigned numctrs) -{ - if (numctrs > cpcN_npics) - { - logerr (GTXT ("More than %d counters were specified\n"), cpcN_npics); /*!*/ - return HWCFUNCS_ERROR_HWCARGS; - } - return hwcdrv_driver->hwcdrv_assign_regnos (entries, numctrs); -} - extern hwcdrv_api_t hwcdrv_pcl_api; static int hwcdrv_driver_inited = 0; diff --git a/gprofng/common/hwcfuncs.h b/gprofng/common/hwcfuncs.h index 7db0f72..f44b9a7 100644 --- a/gprofng/common/hwcfuncs.h +++ b/gprofng/common/hwcfuncs.h @@ -29,8 +29,6 @@ #define hwcfuncs_parse_attrs __collector_hwcfuncs_parse_attrs #define hwcfuncs_bind_descriptor __collector_hwcfuncs_bind_descriptor #define hwcfuncs_bind_hwcentry __collector_hwcfuncs_bind_hwcentry -#define hwcfuncs_assign_regnos __collector_hwcfuncs_assign_regnos -#define regno_is_valid __collector_regno_is_valid #define hwcfuncs_get_ctrs __collector_hwcfuncs_get_ctrs #define hwcfuncs_errmsg_get __collector_hwcfuncs_errmsg_get #endif /* --- LIBCOLLECTOR_SRC --- */ @@ -117,7 +115,6 @@ typedef struct { /* supplementary data fields */ #define HWCFUNCS_ERROR_HWCARGS (-5) #define HWCFUNCS_ERROR_MEMORY (-6) #define HWCFUNCS_ERROR_UNAVAIL (-7) -#define HWCFUNCS_ERROR_ERRNO_ZERO (-8) #define HWCFUNCS_ERROR_UNEXPECTED (-99) /*---------------------------------------------------------------------------*/ @@ -137,6 +134,7 @@ extern void hwcfuncs_int_logerr(const char *format,...); #define HWCFUNCS_SUPPORT_OVERFLOW_PROFILING 0x01llu #define HWCFUNCS_SUPPORT_PEBS_SAMPLING 0x02llu #define HWCFUNCS_SUPPORT_OVERFLOW_CTR_ID 0x04llu // OS identifies which counter overflowed +#define SUPPORT_MEMORYSPACE_PROFILING 0x08 /* get info about session Input: <cpuver>: if not NULL, returns value of CPC cpu version @@ -218,27 +216,6 @@ extern void hwcfuncs_int_logerr(const char *format,...); HWCFUNCS_ERROR_HWCARGS if counters were not specified correctly */ - extern int hwcfuncs_assign_regnos (Hwcentry *entries[], unsigned numctrs); - /* Assign entries[]->reg_num values as needed by platform - Note: modifies <entries> by supplying a regno to each counter - Input: - <entries>: array of counters - <numctrs>: number of items in <entries> - Output: - <entries>: array of counters is modified - Return: 0 if successful - HWCFUNCS_ERROR_HWCINIT if resources unavailable - HWCFUNCS_ERROR_HWCARGS if counters were not specified correctly - */ - - extern int regno_is_valid (const Hwcentry *pctr, regno_t regno); - /* return 1 if <regno> is in Hwcentry's list - Input: - <pctr>: counter definition, reg_list[] should be initialized - <regno>: register to check - Return: 1 if <regno> is in Hwcentry's list, 0 otherwise - */ - extern Hwcentry **hwcfuncs_get_ctrs (unsigned *defcnt); /* Get descriptions of the currently bound counters. Input: diff --git a/gprofng/common/hwctable.c b/gprofng/common/hwctable.c index 567f49f..40b4cd8 100644 --- a/gprofng/common/hwctable.c +++ b/gprofng/common/hwctable.c @@ -2659,145 +2659,6 @@ is_hidden_alias (Hwcentry* pctr) return 0; } -static int -is_numeric_alias (Hwcentry* pctr) -{ - int is_numeric_alias = 0; - regno_t regno; - char *nameOnly = NULL; - hwcfuncs_parse_ctr (pctr->int_name, NULL, &nameOnly, NULL, NULL, ®no); - if (is_numeric (nameOnly, NULL)) - is_numeric_alias = 1; - free (nameOnly); - return is_numeric_alias; -} - -/* print list of register to a buffer */ -/* - * style e x a m p l e s - * 0 NONE 2 {0|1|2|3} - * 1 NONE 2 : 0, 1, 2, or 3 - * 2 0 1 2 3 6 - */ -static char * -get_regnolist (char *buf, size_t sz, const regno_t *reg_list, int style) -{ - if (!buf || !sz) - return "INTERNAL ERROR"; - buf[0] = 0; - if (style == 2) - { - int ii; - // width should be consistent with that in format_columns() - // the format will accommodate cpcx_npics regs - if (cpcx_npics < 1) - return "INTERNAL ERROR"; - // clear out the buffer - for (ii = 0; ii < sz; ii++) - buf[ii] = '_'; - if (cpcx_npics <= 9) - { - // one char per reg, plus terminating null char - if (cpcx_npics + 1 > sz) - return "INTERNAL ERROR"; - buf[cpcx_npics] = '\0'; - - // fill buf with regnos - for (ii = 0; ii < MAX_PICS; ii++) - { - regno_t regno = reg_list[ii]; - if (REG_LIST_EOL (regno)) - break; - if (regno < 0 || regno >= cpcx_npics) - return "INTERNAL ERROR"; - buf[regno] = '0' + regno; - } - } - else - { - /* space between regs, which may be 1 or 2 digits each - * 1 char for reg 0 - * 2 chars for regs 1-9 each - * 3 chars for regs 10- each - * 1 char for terminating null char - */ - int nchars = 17 + 3 * (cpcx_npics - 9); - if (nchars > sz) - return "INTERNAL ERROR"; - buf[nchars - 1] = '\0'; - - // fill buf with regnos - for (ii = 0; ii < MAX_PICS; ii++) - { - regno_t regno = reg_list[ii]; - if (REG_LIST_EOL (regno)) - break; - if (regno <= 9) - buf[2 * regno ] = '0' + regno; - else - { - buf[3 * (regno - 9) + 17] = '0' + (regno / 10); - buf[3 * (regno - 9) + 18] = '0' + (regno % 10); - } - } - } - return buf; - } - if (REG_LIST_IS_EMPTY (reg_list)) - { - snprintf (buf, sz, GTXT ("NONE")); - return buf; - } - else if (REG_LIST_EOL (reg_list[1])) - { - /* 1 item in list */ - snprintf (buf, sz, "%d", reg_list[0]); - return buf; - } - else - { - /* 2 more items in list */ - int ii, num_regs; - for (ii = 0; ii < MAX_PICS; ii++) - { - regno_t regno = reg_list[ii]; - if (REG_LIST_EOL (regno)) - break; - } - num_regs = ii; - buf[0] = 0; - for (ii = 0; ii < num_regs; ii++) - { - regno_t regno = reg_list[ii]; - if (style == 0) - snprintf (buf + strlen (buf), sz - strlen (buf), - "%c%d", ii ? '|' : '{', regno); - else - { - if (num_regs == 2) - snprintf (buf + strlen (buf), sz - strlen (buf), - "%d%s", regno, !ii ? " or " : ""); - else - { - /* 3 or more items in list */ - if (ii < num_regs - 2) - snprintf (buf + strlen (buf), sz - strlen (buf), - "%d, ", regno); - else if (ii == num_regs - 2) - snprintf (buf + strlen (buf), sz - strlen (buf), - "%d, or ", regno); - else - snprintf (buf + strlen (buf), sz - strlen (buf), - "%d", regno); - } - } - } - if (style == 0) - snprintf (buf + strlen (buf), sz - strlen (buf), "}"); - } - return buf; -} - #if !HWC_DEBUG #define hwcentry_print(lvl,x1,x2) #else @@ -2806,8 +2667,7 @@ get_regnolist (char *buf, size_t sz, const regno_t *reg_list, int style) static void hwcentry_print (int lvl, const char * header, const Hwcentry *pentry) { - char buf[1024]; - Tprintf (lvl, "%s '%s', '%s', %d, '%s', %d, %d, %d, %d, %d, %d, /", + Tprintf (lvl, "%s '%s', '%s', %d, '%s', %d, %d, %d, %d, %d, %d, /\n", header, pentry->name ? pentry->name : "NULL", pentry->int_name ? pentry->int_name : "NULL", @@ -2819,67 +2679,9 @@ hwcentry_print (int lvl, const char * header, const Hwcentry *pentry) pentry->timecvt, pentry->memop, /* type of instruction that can trigger */ pentry->sort_order); - get_regnolist (buf, sizeof (buf), pentry->reg_list, 0); - Tprintf (lvl, "%s\n", buf); } #endif -/* add <regno> to a Hwcentry's list */ -static void -regno_add (Hwcentry * pctr, regno_t regno) -{ - int jj; - regno_t *reg_list; - if (!pctr) - { - Tprintf (0, "hwctable: regno_add(): ERROR: pctr==NULL\n"); - return; - } - reg_list = pctr->reg_list; - if (!reg_list) - { - /* create list */ - reg_list = (regno_t*) malloc (sizeof (regno_t*) * MAX_PICS); - if (!reg_list) - { - hwcentry_print (DBG_LT0, "hwctable: regno_add: ERROR:" - " Out of memory: ", pctr); - return; - } - /* initialize list */ - for (jj = 0; jj < MAX_PICS; jj++) - reg_list[jj] = REGNO_ANY; - pctr->reg_list = reg_list; - } - if (regno == REGNO_ANY) - { - /* add all counters up to cpcx_npics */ - for (jj = 0; jj < MAX_PICS && jj < cpcx_npics; jj++) - reg_list[jj] = jj; - } - else - { - /* add <regno> to list of registers */ - for (jj = 0; jj < MAX_PICS; jj++) - { - if (reg_list[jj] == regno) - { - hwcentry_print (DBG_LT0, "hwctable: regno_add: WARNING: " - "Duplicate regno: ", pctr); - break; - } - if (reg_list[jj] == REGNO_ANY) - { - reg_list[jj] = regno; - break; - } - } - } - if (jj == MAX_PICS) - hwcentry_print (DBG_LT0, "hwctable: regno_add: WARNING:" - " regno list is full:", pctr); -} - /*---------------------------------------------------------------------------*/ /* utilities for rawlist (list of raw counters with reglist[] filled in) */ @@ -2931,8 +2733,6 @@ list_add (ptr_list *list, uint_t regno, const char *name) tmpctr.name = (char *) name; praw = list_append_shallow_copy (list, &tmpctr); } - if (praw) - regno_add (praw, regno); return praw; } @@ -2989,28 +2789,7 @@ ptrarray_find (const Hwcentry **array, const char *name, const char *int_name, if (NULL == strstr (int_name, pctr->int_name)) continue; } - if (!check_regno) - return pctr; - else - { - /* duplicates aliases are allowed in table because of 6759307 */ - if (REG_LIST_IS_EMPTY (pctr->reg_list)) - { - /* skip aliases that don't have a valid list of registers */ - hwcentry_print (1, "hwctable: stdlist_find_by_name:" - " WARNING: alias found, but event not supported by HW:", - pctr); - continue; - } - if (!regno_is_valid (pctr, regno)) - { - hwcentry_print (1, "hwctable: stdlist_find_by_name():" - " WARNING: alias found, but regno doesn't match:", - pctr); - continue; - } - return pctr; - } + return pctr; } return NULL; } @@ -3046,49 +2825,15 @@ static_table_find (const Hwcentry *table, const char *name, const char *int_name static void stdlist_print (int dbg_lvl, const Hwcentry* table) { - const Hwcentry *pctr; if (!table) { Tprintf (0, "hwctable: stdlist_print: ERROR: " "table is invalid.\n"); return; } - for (pctr = table; pctr->name; pctr++) + for (const Hwcentry *pctr = table; pctr->name; pctr++) { - int ii; hwcentry_print (dbg_lvl, "hwctable: stdlist: ", pctr); - if (REG_LIST_IS_EMPTY (pctr->reg_list)) - { - if (pctr->int_name || !pctr->metric) - hwcentry_print (DBG_LT1, "hwctable: stdlist_print: WARNING: " - "no hardware event found for table entry", pctr); - continue; - } - /* check if incorrect reg_num used in table */ - if (!regno_is_valid (pctr, pctr->reg_num)) - { - hwcentry_print (DBG_LT0, "hwctable: stdlist_print: ERROR: " - "reg_num is not in table. ", pctr); - continue; - } - for (ii = 0; ii < MAX_PICS; ii++) - { - regno_t regno = pctr->reg_list[ii]; - if (REG_LIST_EOL (regno)) - break; - } - if (ii > 1 && pctr->reg_num != REGNO_ANY) - { - /* several regnos were valid, but only one can be specified */ - if (pctr->metric || !pctr->int_name) - { - /* pctr is standard or a raw definition */ - /* (pctr is not an alias like cycles0) */ - hwcentry_print (DBG_LT0, "hwctable: stdlist_print: ERROR: " - "regno in table should have been REGNO_ANY. ", - pctr); - } - } } } #endif @@ -3173,41 +2918,17 @@ check_tables () if (pentry->metric) Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" " internal && metric @%d, %s\n", cputag, pentry->name); - if (pentry->reg_num != REGNO_ANY) - Tprintf (DBG_LT1, "hwctable: check_tables: WARNING:" - " internal && reg_num!=REGNO_ANY @%d, %s\n", - cputag, pentry->name); if (pentry->val != PRELOAD_DEF && pentry->memop != ABST_EXACT_PEBS_PLUS1) Tprintf (DBG_LT2, "hwctable: check_tables: INFO:" " internal && custom val=%d @%d, %s\n", pentry->val, cputag, pentry->name); -#if 0 - if (!pentry->timecvt && pentry->memop == ABST_NONE) - Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" - " internal && not special! @%d, %s\n", - cputag, pentry->name); -#endif } if (pentry->metric) { /* aliased */ if (!pentry->int_name) Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" " aliased && !int_name @%d, %s\n", cputag, pentry->name); -#if 0 - else if (!strcmp (pentry->name, pentry->int_name)) - Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" - " name==int_name @%d, %s\n", - cputag, pentry->name); -#endif - if (pentry->reg_num != REGNO_ANY && pentry->reg_num != REGNO_INVALID) - Tprintf (DBG_LT1, "hwctable: check_tables: INFO:" - " aliased && custom reg_num==%d @%d, %s\n", - pentry->reg_num, cputag, pentry->name); - if (pentry->reg_num == REGNO_INVALID) - Tprintf (DBG_LT2, "hwctable: check_tables: INFO:" - " aliased && reg_num==REGNO_INVALID @%d, %s\n", - cputag, pentry->name); } if (pentry->int_name && !pentry->metric) { /* convenience */ @@ -3215,10 +2936,6 @@ check_tables () Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" " convenience && name==int_name @%d, %s\n", cputag, pentry->name); - if (pentry->reg_num == REGNO_ANY) - Tprintf (DBG_LT0, "hwctable: check_tables: ERROR:" - " convenience && reg_num==REGNO_ANY @%d, %s\n", - cputag, pentry->name); } } } @@ -3417,17 +3134,13 @@ try_a_counter (int forKernel) return 0; /* consider this an automatic PASS */ } /* look for a valid table entry, only try valid_cpu_tables[0] */ - { - testevent = cpcx_std[forKernel][0]; - if (!testevent || !testevent->name) - { - Tprintf (0, "hwctable: WARNING: no test metric" - " available to verify counters\n"); - return 0; /* consider this an automatic PASS */ - } - if (REG_LIST_IS_EMPTY (testevent->reg_list)) - return 0; // weird - } + testevent = cpcx_std[forKernel][0]; + if (!testevent || !testevent->name) + { + Tprintf (0, "hwctable: WARNING: no test metric" + " available to verify counters\n"); + return 0; /* consider this an automatic PASS */ + } Hwcentry tmp_testevent; tmp_testevent = *testevent; /* shallow copy */ if (tmp_testevent.int_name == NULL) @@ -3436,9 +3149,6 @@ try_a_counter (int forKernel) tmp_testevent.int_name = strdup (tmp_testevent.name); } Hwcentry * test_array[1] = {&tmp_testevent}; - rc = hwcfuncs_assign_regnos (test_array, 1); /* may modify test_array */ - if (rc) - return rc; rc = test_hwcs ((const Hwcentry**) test_array, 1); if (rc == HWCFUNCS_ERROR_UNAVAIL) { @@ -3677,7 +3387,6 @@ process_ctr_def (int forKernel, hrtime_t global_min_time_nsec, if (tmp) { tmp->name = strdup (nameOnly); - regno_add (tmp, REGNO_ANY); pfound = tmp; } } @@ -3780,27 +3489,6 @@ process_ctr_def (int forKernel, hrtime_t global_min_time_nsec, GTXT ("Warning: HW counter `%s' is not program-related -- callstacks will be not be recorded for this counter\n"), uname); - /* update reg_num */ - if (!regno_is_valid (pfound, regno)) - { - char buf[1024]; - snprintf (UEbuf + strlen (UEbuf), UEsz - strlen (UEbuf), - GTXT ("For counter `%s', %s is not a valid register; valid registers: %s\n"), - nameOnly, regstr ? regstr + 1 : "?", - get_regnolist (buf, sizeof (buf), pfound->reg_list, 1)); - goto process_ctr_def_wrapup; - } - if (pret_ctr->reg_num == REGNO_ANY) - { /* table's regno is a wildcard */ - if (REG_LIST_EOL (pfound->reg_list[1])) - { - /* valid list only contains one regno, so use it */ - pret_ctr->reg_num = pfound->reg_list[0]; - } - else - pret_ctr->reg_num = regno; /* use user's selection */ - } - /* update name and int_name */ { // validate attributes @@ -4073,43 +3761,9 @@ hwc_validate_ctrs (int forKernel, Hwcentry *entries[], unsigned numctrs) char UEbuf[1024 * 5]; UEbuf[0] = 0; - /* search for obvious duplicates*/ - unsigned ii; - for (ii = 0; ii < numctrs; ii++) - { - regno_t reg_a = entries[ii]->reg_num; - if (reg_a != REGNO_ANY) - { - unsigned jj; - for (jj = ii + 1; jj < numctrs; jj++) - { - int reg_b = entries[jj]->reg_num; - if (reg_a == reg_b) - { - snprintf (UEbuf + strlen (UEbuf), sizeof (UEbuf) - strlen (UEbuf), - GTXT ("Only one HW counter is allowed per register. The following counters use register %d: \n"), - reg_a); - for (jj = 0; jj < numctrs; jj++) - { - char buf[256]; - int reg_b = entries[jj]->reg_num; - if (reg_a == reg_b) - snprintf (UEbuf + strlen (UEbuf), sizeof (UEbuf) - strlen (UEbuf), - GTXT (" %d. %s\n"), jj + 1, - hwc_hwcentry_specd_string (buf, sizeof (buf), - entries[jj])); - } - return strdup (UEbuf); - } - } - } - } - /* test counters */ hwcfuncs_errmsg_get (NULL, 0, 1); /* enable errmsg capture */ - int hwc_rc = hwcfuncs_assign_regnos (entries, numctrs); - if (!hwc_rc) - hwc_rc = test_hwcs ((const Hwcentry**) entries, numctrs); + int hwc_rc = test_hwcs ((const Hwcentry**) entries, numctrs); if (hwc_rc) { if (cpcx_cpuver == CPC_PENTIUM_4_HT || cpcx_cpuver == CPC_PENTIUM_4) @@ -4172,15 +3826,12 @@ hwc_post_lookup (Hwcentry * pret_ctr, char *counter, char * int_name, int cpuver } else pret_ctr->int_name = strdup (counter); - if (pret_ctr->reg_num == REGNO_ANY) - pret_ctr->reg_num = regno; /* table's regno is a wildcard */ } else { /* not a standard counter */ *pret_ctr = empty_ctr; pret_ctr->int_name = strdup (counter); - pret_ctr->reg_num = regno; } /* update the name */ @@ -4456,7 +4107,7 @@ int show_regs = 0; // The register setting is available on Solaris only */ static void format_columns (char *buf, int bufsiz, char *s1, char *s2, const char *s3, - const char *s4, char *s5, const char *s6) + const char *s4, const char *s6) { // NULL strings are blanks char *blank = NTXT (""); @@ -4470,7 +4121,7 @@ format_columns (char *buf, int bufsiz, char *s1, char *s2, const char *s3, // get the lengths and target widths // (s6 can be as wide as it likes) int l1 = strlen (s1), n1 = 10, l2 = strlen (s2), n2 = 13; - int l3 = strlen (s3), n3 = 20, l4 = strlen (s4), n4 = 10, n5; + int l3 = strlen (s3), n3 = 20, l4 = strlen (s4), n4 = 10; char divide = ' '; // adjust widths, stealing from one column to help a neighbor @@ -4518,26 +4169,8 @@ format_columns (char *buf, int bufsiz, char *s1, char *s2, const char *s3, n2 = 0; } - if (show_regs) - { - // fifth column should be wide enough for regnolist - // see function get_regnolist() - if (cpcx_npics < 10) - n5 = cpcx_npics; // one char per regno - else - n5 = 16 + 3 * (cpcx_npics - 9); // spaces between regnos and some regnos are 2-char wide - // ... and be wide enough for header "regs" - if (n5 < 4) - n5 = 4; - - // print to buffer - // (don't need a space before s4 since historical precedent to have a trailing space in s3) - snprintf (buf, bufsiz, "%-*s %-*s%c%*s%*s %-*s %s", - n1, s1, n2, s2, divide, n3, s3, n4, s4, n5, s5, s6); - } - else - snprintf (buf, bufsiz, "%-*s %-*s%c%*s%*s %s", - n1, s1, n2, s2, divide, n3, s3, n4, s4, s6); + snprintf (buf, bufsiz, "%-*s %-*s%c%*s%*s %s", + n1, s1, n2, s2, divide, n3, s3, n4, s4, s6); for (int i = strlen (buf); i > 0; i--) if (buf[i] == ' ' || buf[i] == '\t') buf[i] = 0; @@ -4550,7 +4183,6 @@ static char * hwc_hwcentry_string_internal (char *buf, size_t buflen, const Hwcentry *ctr, int show_short_desc) { - char regnolist[256]; if (!buf || !buflen) return buf; if (ctr == NULL) @@ -4565,7 +4197,6 @@ hwc_hwcentry_string_internal (char *buf, size_t buflen, const Hwcentry *ctr, desc = ctr->metric ? hwc_i18n_metric (ctr) : NULL; format_columns (buf, buflen, ctr->name, ctr->int_name, hwc_memop_string (ctr->memop), timecvt_string (ctr->timecvt), - get_regnolist (regnolist, sizeof (regnolist), ctr->reg_list, 2), desc); return buf; } @@ -5157,7 +4788,7 @@ hwc_usage_internal (int forKernel, FILE *f_usage, const char *cmd, const char *d if (has_std_ctrs) { fprintf (f_usage, GTXT ("\nAliases for most useful HW counters:\n\n")); - format_columns (tmp, 1024, "alias", "raw name", "type ", "units", "regs", "description"); + format_columns (tmp, 1024, "alias", "raw name", "type ", "units", "description"); fprintf (f_usage, NTXT (" %s\n\n"), tmp); for (Hwcentry **pctr = std_ctrs; *pctr; pctr++) { @@ -5170,7 +4801,7 @@ hwc_usage_internal (int forKernel, FILE *f_usage, const char *cmd, const char *d { fprintf (f_usage, GTXT ("\nRaw HW counters:\n\n")); hwc_usage_raw_overview_sparc (f_usage, cpuver); - format_columns (tmp, 1024, "name", NULL, "type ", "units", "regs", "description"); + format_columns (tmp, 1024, "name", NULL, "type ", "units", "description"); fprintf (f_usage, NTXT (" %s\n\n"), tmp); for (Hwcentry **pctr = raw_ctrs; *pctr; pctr++) { @@ -5210,8 +4841,6 @@ static char* supported_pebs_counters[] = { }; /* callback, (see setup_cpc()) called for each valid regno/name combo */ - -/* builds rawlist,, creates and updates reg_list[] arrays in stdlist table */ static void hwc_cb (uint_t cpc_regno, const char *name) { @@ -5219,6 +4848,20 @@ hwc_cb (uint_t cpc_regno, const char *name) list_add (&unfiltered_raw, regno, name); } +static int +supported_hwc (Hwcentry *pctr) +{ + if (ABST_PLUS_BY_DEFAULT (pctr->memop) && + (cpcx_support_bitmask & SUPPORT_MEMORYSPACE_PROFILING) == 0) + return 0; + // remove specific PEBs counters when back end doesn't support sampling + if ((cpcx_support_bitmask & HWCFUNCS_SUPPORT_PEBS_SAMPLING) == 0) + for (int ii = 0; supported_pebs_counters[ii]; ii++) + if (strcmp (supported_pebs_counters[ii], pctr->name) == 0) + return 0; + return 1; +} + /* input: * forKernel: 1 - generate lists for er_kernel, 0 - generate lists for collect * @@ -5248,57 +4891,29 @@ hwc_process_raw_ctrs (int forKernel, Hwcentry ***pstd_out, // copy records from std [0] and generic [1] static input tables into table_copy[0],[1],or[2] for (int tt = 0; tt < 2; tt++) for (Hwcentry *pctr = static_tables[tt]; pctr && pctr->name; pctr++) - if (is_hidden_alias (pctr)) - list_append_shallow_copy (&table_copy[2], pctr); // hidden list - else - list_append_shallow_copy (&table_copy[tt], pctr); + { + if (!supported_hwc (pctr)) + continue; + if (is_hidden_alias (pctr)) + list_append_shallow_copy (&table_copy[2], pctr); // hidden list + else + list_append_shallow_copy (&table_copy[tt], pctr); + } // copy raw_unfiltered_in to raw_out for (int ii = 0; raw_unfiltered_in && raw_unfiltered_in[ii]; ii++) { Hwcentry *pctr = raw_unfiltered_in[ii]; - // filter out raw counters that don't work correctly - -#ifdef WORKAROUND_6231196_NIAGARA1_NO_CTR_0 - if (cpcx_cpuver == CPC_ULTRA_T1) - if (!regno_is_valid (pctr, 1)) - continue; /* Niagara can not profile on register zero; skip this */ -#endif - // remove specific PEBs counters when back end doesn't support sampling - const char *name = pctr->name; - if ((cpcx_support_bitmask & HWCFUNCS_SUPPORT_PEBS_SAMPLING) == 0 || forKernel) - { - int skip = 0; - for (int ii = 0; supported_pebs_counters[ii]; ii++) - if (strcmp (supported_pebs_counters[ii], name) == 0) - { - skip = 1; - break; - } - if (skip) - continue; - } - - Hwcentry *pnew = list_append_shallow_copy (raw_out, pctr); -#ifdef WORKAROUND_6231196_NIAGARA1_NO_CTR_0 - if (cpcx_cpuver == CPC_ULTRA_T1) - { - free (pnew->reg_list); - pnew->reg_list = NULL; - regno_add (pnew, 1); // only allow register 1 - } -#endif - } // raw_unfiltered_in + if (supported_hwc (pctr)) + list_append_shallow_copy (raw_out, pctr); + } // Scan raw counters to populate Hwcentry fields from matching static_tables entries - // Also populate reg_list for aliases found in table_copy[] for (int uu = 0; uu < raw_out->sz; uu++) { Hwcentry *praw = (Hwcentry*) raw_out->array[uu]; Hwcentry *pstd = NULL; // set if non-alias entry from std table matches char *name = praw->name; - /* in the standard counter and generic lists, - update reg_list for all matching items */ for (int tt = 0; tt < NUM_TABLES; tt++) { // std, generic, and hidden if (table_copy[tt].sz == 0) @@ -5315,24 +4930,6 @@ hwc_process_raw_ctrs (int forKernel, Hwcentry ***pstd_out, if (!is_same (name, pname, '~')) continue; - /* truncated pname matches <name>... */ - // check to see if table entry applies only to specific register - int specific_reg_num_only = 0; - if (pctr->reg_num != REGNO_ANY) - { - // table entry applies only to specific register - if (!regno_is_valid (praw, pctr->reg_num)) - continue; - specific_reg_num_only = 1; - } - - // Match! - // Update cpu_table_copy's supported registers - if (specific_reg_num_only) - regno_add (pctr, pctr->reg_num); - else - pctr->reg_list = praw->reg_list; - if (!is_visible_alias (pctr) && !is_hidden_alias (pctr)) { // Note: we could expand criteria to also allow aliases to set default rates for raw HWCs @@ -5366,20 +4963,6 @@ hwc_process_raw_ctrs (int forKernel, Hwcentry ***pstd_out, // prune unsupported rows from std table if (!is_visible_alias (pctr) && !is_hidden_alias (pctr)) continue; // only aliases - if (REG_LIST_IS_EMPTY (pctr->reg_list)) - { - if (is_numeric_alias (pctr)) - { -#if 1 //22844570 DTrace cpc provider does not accept numeric counter names - if (forKernel) - continue; -#endif - regno_add (pctr, REGNO_ANY); // hwcs specified by number allowed on any register - } - else - continue; - } - ptr_list *dest = (tt == 0) ? std_out : hidden_out; Hwcentry *isInList; if (pctr->short_desc == NULL) diff --git a/gprofng/src/Dbe.cc b/gprofng/src/Dbe.cc index 91a5aa5..95daa72 100644 --- a/gprofng/src/Dbe.cc +++ b/gprofng/src/Dbe.cc @@ -7121,10 +7121,7 @@ dbeGetHwcs (Hwcentry **hwcs) { Hwcentry *ctr = hwcs[i]; Vector<int> *registers = new Vector<int>(MAX_PICS); - regno_t *reglist = ctr->reg_list; - for (int k = 0; !REG_LIST_EOL (reglist[k]) && k < MAX_PICS; k++) - registers->store (k, reglist[k]); - + registers->store (0, REGNO_ANY); i18n->store (i, dbe_strdup (hwc_i18n_metric (ctr))); name->store (i, dbe_strdup (ctr->name)); int_name->store (i, dbe_strdup (ctr->int_name)); diff --git a/gprofng/src/collctrl.cc b/gprofng/src/collctrl.cc index ebf888c..7d2b23c 100644 --- a/gprofng/src/collctrl.cc +++ b/gprofng/src/collctrl.cc @@ -1361,20 +1361,6 @@ Coll_Ctrl::hwcentry_dup (Hwcentry *hnew, Hwcentry *_hwc) hnew->short_desc = strdup (_hwc->short_desc); else hnew->short_desc = NULL; - if (_hwc->reg_list != NULL) - { - hnew->reg_list = (regno_t*) malloc (sizeof (regno_t*) * MAX_PICS); - // poor way of dealing with malloc failure - if (hnew->reg_list) - { - for (int i = 0; i < MAX_PICS; i++) - { - hnew->reg_list[i] = _hwc->reg_list[i]; - if (hnew->reg_list[i] == REGNO_ANY) - break; - } - } - } } // Routine to initialize the HWC tables, set up the default experiment, etc. |