[PATCH 1/2] gprofng: remove old interface with libcpc

vladimir.mezentsev@oracle.com vladimir.mezentsev@oracle.com
Fri May 17 04:07:56 GMT 2024


From: Vladimir Mezentsev <vladimir.mezentsev@oracle.com>

interface with libcpc was used on Solaris.
gprofng doesn't support profiling on Solaris.
I removed this old code and other unused macros and variables.

gprofng/ChangeLog
2024-04-29  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

	PR gprofng/31123
	* common/hwcdrv.c: remove old interface with libcpc.
	* common/hwcdrv.h: Likewise.
	* common/hwcentry.h: Likewise.
	* common/hwcfuncs.c: Likewise.
	* common/hwcfuncs.h: Likewise.
	* common/hwctable.c: Likewise.
	* src/Dbe.cc: Likewise.
	* src/collctrl.cc: Likewise.
---
 gprofng/common/hwcdrv.c   |  83 +------
 gprofng/common/hwcdrv.h   |  32 ---
 gprofng/common/hwcentry.h |   3 -
 gprofng/common/hwcfuncs.c |  39 +--
 gprofng/common/hwcfuncs.h |  25 +-
 gprofng/common/hwctable.c | 501 ++++----------------------------------
 gprofng/src/Dbe.cc        |   5 +-
 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 2d549b0d6a5..0ada09d0ca8 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 1829ec88fac..0a5eb33df00 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 a35a363e693..946356eabe5 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 86d6935b321..fce711df6a6 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 7db0f725a13..f44b9a7b4ae 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 567f49f80d5..40b4cd850ba 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, &regno);
-  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 91a5aa5ef05..95daa727186 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 ebf888c5a20..7d2b23c12ac 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.
-- 
2.31.1



More information about the Binutils mailing list