[PATCH] gprofng: use xmalloc/xrealloc/xcalloc/xstrdup/xstrndup from libiberty

Sam James sam@gentoo.org
Wed Oct 16 05:12:18 GMT 2024
Andreas Schwab <schwab@suse.de> writes:

> 	* src/Makefile.am (CSOURCES): Remove dbe_memmgr.c
> 	* src/Makefile.in: Regenerate.
> 	* src/dbe_memmgr.c: Remove.
> 	* src/gprofng.cc (main): Call xmalloc_set_program_name.
> 	* src/Application.cc: Use xmalloc, xrealloc, xcalloc, xstrdup,
> 	xstrndup instead of malloc, realloc, calloc, strdup, strndup.
> 	* src/BaseMetric.cc: Likewise.
> 	* src/CallStack.cc: Likewise.
> 	* src/ClassFile.cc: Likewise.
> 	* src/Data_window.cc: Likewise.
> 	* src/Dbe.cc: Likewise.
> 	* src/DbeJarFile.cc: Likewise.
> 	* src/DbeSession.cc: Likewise.
> 	* src/DbeView.cc: Likewise.
> 	* src/DerivedMetrics.cc: Likewise.
> 	* src/DwarfLib.cc: Likewise.
> 	* src/Elf.cc: Likewise.
> 	* src/Emsg.cc: Likewise.
> 	* src/Experiment.cc: Likewise.
> 	* src/Function.cc: Likewise.
> 	* src/Module.cc: Likewise.
> 	* src/Print.cc: Likewise.
> 	* src/QLParser.yy: Likewise.
> 	* src/SAXParserFactory.cc: Likewise.
> 	* src/Settings.cc: Likewise.
> 	* src/SourceFile.cc: Likewise.
> 	* src/StringBuilder.cc: Likewise.
> 	* src/StringMap.h: Likewise.
> 	* src/Table.cc: Likewise.
> 	* src/checks.cc: Likewise.
> 	* src/collctrl.cc: Likewise.
> 	* src/comp_com.c: Likewise.
> 	* src/count.cc: Likewise.
> 	* src/envsets.cc: Likewise.
> 	* src/gp-archive.cc: Likewise.
> 	* src/gp-display-src.cc: Likewise.
> 	* src/gp-display-text.cc: Likewise.
> 	* src/gprofng.cc: Likewise.
> 	* src/ipc.cc: Likewise.
> 	* src/ipcio.cc: Likewise.
> 	* src/vec.h: Likewise.
> 	* src/util.cc: Likewise.
> 	(get_prog_name): Remove.
> 	* src/util.h: Likewise.
> 	* src/dbe_hwc.h (malloc, realloc, calloc, strdup): Define.

Please tag PR32241 given it's relevant and we discussed this change in there.

> ---
>  gprofng/src/Application.cc      |   2 +-
>  gprofng/src/BaseMetric.cc       |   6 +-
>  gprofng/src/CallStack.cc        |   6 +-
>  gprofng/src/ClassFile.cc        |  14 +-
>  gprofng/src/Data_window.cc      |   4 +-
>  gprofng/src/Dbe.cc              |  28 +--
>  gprofng/src/DbeJarFile.cc       |   6 +-
>  gprofng/src/DbeSession.cc       |   2 +-
>  gprofng/src/DbeView.cc          |   4 +-
>  gprofng/src/DerivedMetrics.cc   |   4 +-
>  gprofng/src/DwarfLib.cc         |   6 +-
>  gprofng/src/Elf.cc              |   6 +-
>  gprofng/src/Emsg.cc             |   6 +-
>  gprofng/src/Experiment.cc       |  41 ++--
>  gprofng/src/Function.cc         |   6 +-
>  gprofng/src/Makefile.am         |   1 -
>  gprofng/src/Makefile.in         |   4 +-
>  gprofng/src/Module.cc           |  26 +--
>  gprofng/src/Print.cc            |   8 +-
>  gprofng/src/QLParser.yy         |   6 +-
>  gprofng/src/SAXParserFactory.cc |  12 +-
>  gprofng/src/Settings.cc         |   4 +-
>  gprofng/src/SourceFile.cc       |   2 +-
>  gprofng/src/StringBuilder.cc    |  11 +-
>  gprofng/src/StringMap.h         |   2 +-
>  gprofng/src/Table.cc            |  18 +-
>  gprofng/src/checks.cc           |  12 +-
>  gprofng/src/collctrl.cc         | 335 +++++++++++++++-----------------
>  gprofng/src/comp_com.c          |   5 +-
>  gprofng/src/count.cc            |   7 +-
>  gprofng/src/dbe_hwc.h           |   6 +
>  gprofng/src/dbe_memmgr.c        | 118 -----------
>  gprofng/src/envsets.cc          |   6 +-
>  gprofng/src/gp-archive.cc       |   6 +-
>  gprofng/src/gp-display-src.cc   |   4 +-
>  gprofng/src/gp-display-text.cc  |  14 +-
>  gprofng/src/gprofng.cc          |   3 +-
>  gprofng/src/ipc.cc              |   3 +-
>  gprofng/src/ipcio.cc            |   4 +-
>  gprofng/src/util.cc             |  80 +++-----
>  gprofng/src/util.h              |   4 +-
>  gprofng/src/vec.h               |   7 +-
>  42 files changed, 352 insertions(+), 497 deletions(-)
>  delete mode 100644 gprofng/src/dbe_memmgr.c
>
> diff --git a/gprofng/src/Application.cc b/gprofng/src/Application.cc
> index 98caebab4d0..ee461b3109b 100644
> --- a/gprofng/src/Application.cc
> +++ b/gprofng/src/Application.cc
> @@ -112,7 +112,7 @@ Application::get_realpath (const char *_name)
>  	      path = s + 1;
>  	    }
>      }
> -  return strdup (_name);
> +  return xstrdup (_name);
>  }
>  
>  // Set the directory where all binaries are found
> diff --git a/gprofng/src/BaseMetric.cc b/gprofng/src/BaseMetric.cc
> index ae0ee32adf8..b7475e2ecd1 100644
> --- a/gprofng/src/BaseMetric.cc
> +++ b/gprofng/src/BaseMetric.cc
> @@ -238,7 +238,7 @@ BaseMetric::BaseMetric (const BaseMetric& m)
>      default_visbits[ii] = m.default_visbits[ii];
>    if (m.cond_spec)
>      {
> -      cond_spec = strdup (m.cond_spec);
> +      cond_spec = xstrdup (m.cond_spec);
>        cond = m.cond->copy ();
>      }
>    else
> @@ -248,7 +248,7 @@ BaseMetric::BaseMetric (const BaseMetric& m)
>      }
>    if (m.val_spec)
>      {
> -      val_spec = strdup (m.val_spec);
> +      val_spec = xstrdup (m.val_spec);
>        val = m.val->copy ();
>      }
>    else
> @@ -258,7 +258,7 @@ BaseMetric::BaseMetric (const BaseMetric& m)
>      }
>    if (m.expr_spec)
>      {
> -      expr_spec = strdup (m.expr_spec);
> +      expr_spec = xstrdup (m.expr_spec);
>        expr = m.expr->copy ();
>      }
>    else
> diff --git a/gprofng/src/CallStack.cc b/gprofng/src/CallStack.cc
> index 5bfafb7b2ca..15594a286c0 100644
> --- a/gprofng/src/CallStack.cc
> +++ b/gprofng/src/CallStack.cc
> @@ -89,7 +89,7 @@ Descendants::insert (int ind, CallStackNode* item)
>    if (old_cnt + 1 >= limit)
>      {
>        int new_limit = (limit == 0) ? DELTA : limit * 2;
> -      CallStackNode **new_data = (CallStackNode **) malloc (new_limit * sizeof (CallStackNode *));
> +      CallStackNode **new_data = (CallStackNode **) xmalloc (new_limit * sizeof (CallStackNode *));
>        for (int i = 0; i < ind; i++)
>  	new_data[i] = old_data[i];
>        new_data[ind] = item;
> @@ -204,12 +204,12 @@ CallStackP::new_Node (CallStackNode *anc, Histable *pcval)
>        nchunks++;
>  
>        // Reallocate Node chunk array
> -      chunks = (CallStackNode **) malloc (nchunks * sizeof (CallStackNode *));
> +      chunks = (CallStackNode **) xmalloc (nchunks * sizeof (CallStackNode *));
>        for (int i = 0; i < nchunks - 1; i++)
>  	chunks[i] = old_chunks[i];
>        free (old_chunks);
>        // Allocate new chunk for nodes.
> -      chunks[nchunks - 1] = (CallStackNode *) malloc (CHUNKSZ * sizeof (CallStackNode));
> +      chunks[nchunks - 1] = (CallStackNode *) xmalloc (CHUNKSZ * sizeof (CallStackNode));
>      }
>    nodes++;
>    CallStackNode *node = get_node (nodes - 1);
> diff --git a/gprofng/src/ClassFile.cc b/gprofng/src/ClassFile.cc
> index 37dd0ff2f71..51bb0c298b1 100644
> --- a/gprofng/src/ClassFile.cc
> +++ b/gprofng/src/ClassFile.cc
> @@ -957,7 +957,7 @@ BinaryConstantPool::getString (int index)
>        return NULL;
>      }
>    u2 len = input->readUnsignedShort ();
> -  strings[index] = (char *) malloc (len + 1);
> +  strings[index] = (char *) xmalloc (len + 1);
>    input->copy_bytes (strings[index], len);
>    return strings[index];
>  }
> @@ -1014,7 +1014,7 @@ ClassFile::openFile (const char *fname)
>        return;
>      }
>    cf_bufsz = stat_buf.st_size;
> -  cf_buf = (unsigned char *) malloc (cf_bufsz);
> +  cf_buf = (unsigned char *) xmalloc (cf_bufsz);
>    if (cf_bufsz != read_from_file (fd, cf_buf, cf_bufsz))
>      {
>        free (cf_buf);
> @@ -1409,7 +1409,7 @@ ClassFile::readFile ()
>        class_filename = dbe_strdup (bcpool->getString (classNameInd));
>        if (class_filename)
>  	{
> -	  class_name = strdup (class_filename);
> +	  class_name = xstrdup (class_filename);
>  	  convertName (class_name);
>  	}
>  
> @@ -1527,7 +1527,7 @@ ClassFile::readFile ()
>    if (class_filename)
>      {
>        if (strcmp (class_filename, get_name ()) != 0)
> -	set_name (strdup (class_filename));
> +	set_name (xstrdup (class_filename));
>        if (source_name)
>  	{
>  	  char *bname = strrchr (class_filename, '/');
> @@ -1535,13 +1535,13 @@ ClassFile::readFile ()
>  	    fnm = dbe_sprintf (NTXT ("%.*s/%s"), (int) (bname - class_filename),
>  			       class_filename, source_name);
>  	  else
> -	    fnm = strdup (source_name);
> +	    fnm = xstrdup (source_name);
>  	}
>        else
>  	fnm = get_java_file_name (class_filename, false);
>      }
>    else if (source_name)
> -    fnm = strdup (source_name);
> +    fnm = xstrdup (source_name);
>    if (fnm)
>      {
>        set_file_name (fnm);
> @@ -1631,7 +1631,7 @@ ClassFile::get_java_file_name (char *clname, bool classSuffix)
>        if (tmp)
>  	len = tmp - clname;
>      }
> -  char *clpath = (char *) malloc (len + 10);
> +  char *clpath = (char *) xmalloc (len + 10);
>    for (size_t i = 0; i < len; i++)
>      clpath[i] = (clname[i] == '.') ? '/' : clname[i];
>    snprintf (clpath + len, 10, classSuffix ? NTXT (".class") : NTXT (".java"));
> diff --git a/gprofng/src/Data_window.cc b/gprofng/src/Data_window.cc
> index da142f033f8..be08559c162 100644
> --- a/gprofng/src/Data_window.cc
> +++ b/gprofng/src/Data_window.cc
> @@ -149,7 +149,7 @@ Data_window::bind (Span *span, int64_t minSize)
>  	    { // Need to realloc 'base'
>  	      free (base);
>  	      basesize = wsize;
> -	      base = (void *) malloc (basesize);
> +	      base = (void *) xmalloc (basesize);
>  	      Dprintf (DEBUG_DATA_WINDOW,
>  		       NTXT ("Data_window:bind:%d realloc basesize=%llx woffset=%lld \n"),
>  		       (int) __LINE__, (long long) basesize, (long long) woffset);
> @@ -188,7 +188,7 @@ Data_window::get_data (int64_t offset, int64_t size, void *datap)
>      return NULL;
>    if (datap == NULL && !mmap_on_file)
>      // Can be remmaped or reallocated. Need to make a copy
> -    datap = (void *) malloc (size);
> +    datap = (void *) xmalloc (size);
>    if (datap)
>      {
>        memcpy (datap, buf, (size_t) size);
> diff --git a/gprofng/src/Dbe.cc b/gprofng/src/Dbe.cc
> index 09b7f94eaa8..c46313ab488 100644
> --- a/gprofng/src/Dbe.cc
> +++ b/gprofng/src/Dbe.cc
> @@ -353,7 +353,7 @@ dbeReadFile (const char *pathname)
>  {
>    Vector<char*> *result = new Vector<char*>(2);
>    int limit = 1024 * 1024; // Temporary limit: 1 MB
> -  char * contents = (char *) malloc (limit);
> +  char * contents = (char *) xmalloc (limit);
>    StringBuilder sb;
>    if (NULL == contents)
>      {
> @@ -4960,7 +4960,7 @@ dbeGetFuncList (int dbevindex, int type, int subtype)
>  	      //	it needs to be
>  	      // first, scan all the lines, to get the maximum line number
>  	      bufsz = 1024;
> -	      buf = (char *) malloc (bufsz);
> +	      buf = (char *) xmalloc (bufsz);
>  	      int max_lineno = 0;
>  	      int hidx;
>  	      Hist_data::HistItem *hitem;
> @@ -5047,7 +5047,7 @@ dbeGetFuncList (int dbevindex, int type, int subtype)
>  			      // Reallocate the buffer
>  			      size_t curlen = d - buf;
>  			      bufsz += 1024;
> -			      char *buf_new = (char *) malloc (bufsz);
> +			      char *buf_new = (char *) xmalloc (bufsz);
>  			      strncpy (buf_new, buf, curlen);
>  			      buf_new[curlen] = '\0';
>  			      free (buf);
> @@ -5243,7 +5243,7 @@ dbeGetFuncListV2 (int dbevindex, int mtype, Obj sel_obj, int type, int subtype)
>  	    //	it needs to be
>  	    // first, scan all the lines, to get the maximum line number
>  	    bufsz = 1024;
> -	    buf = (char *) malloc (bufsz);
> +	    buf = (char *) xmalloc (bufsz);
>  	    int max_lineno = 0;
>  	    int hidx;
>  	    Hist_data::HistItem *hitem;
> @@ -5334,7 +5334,7 @@ dbeGetFuncListV2 (int dbevindex, int mtype, Obj sel_obj, int type, int subtype)
>  			    // Reallocate the buffer
>  			    size_t curlen = d - buf;
>  			    bufsz += 1024;
> -			    char *buf_new = (char *) malloc (bufsz);
> +			    char *buf_new = (char *) xmalloc (bufsz);
>  			    strncpy (buf_new, buf, curlen);
>  			    buf_new[curlen] = '\0';
>  			    free (buf);
> @@ -6089,7 +6089,7 @@ dbeGetStatisList (int dbevindex)
>      return NULL;
>  
>    // Get statistics data
> -  data = (Stats_data **) malloc ((size + 1) * sizeof (Stats_data *));
> +  data = (Stats_data **) xmalloc ((size + 1) * sizeof (Stats_data *));
>    data[0] = new Stats_data ();
>    for (index = 1; index <= size; index++)
>      {
> @@ -7006,8 +7006,8 @@ dbeGetSummary (int dbevindex, Vector<Obj> *sel_objs, int type, int subtype)
>        if (map != NULL)
>  	{
>  	  int nmetrics = mvec->size ();
> -	  double *evalues = (double *) malloc (nmetrics * sizeof (double));
> -	  double *ivalues = (double *) malloc (nmetrics * sizeof (double));
> +	  double *evalues = (double *) xmalloc (nmetrics * sizeof (double));
> +	  double *ivalues = (double *) xmalloc (nmetrics * sizeof (double));
>  	  for (index2 = 0; index2 < nmetrics; index2++)
>  	    {
>  	      evalues[index2] = excl_list->fetch (index2);
> @@ -7090,8 +7090,8 @@ dbeGetHwcSets (int /*dbevindex*/, bool forKernel)
>    Vector<char*> *name = new Vector<char*>(1); // Internal name
>    if (NULL != defctrs)
>      {
> -      i18n->store (0, strdup (defctrs));
> -      name->store (0, strdup (NTXT ("default")));
> +      i18n->store (0, xstrdup (defctrs));
> +      name->store (0, xstrdup (NTXT ("default")));
>      }
>    list->store (0, i18n);
>    list->store (1, name);
> @@ -8692,8 +8692,8 @@ dbeGetDataDescriptorsV2 (int exp_id)
>        int data_id = dataDscr->getId ();
>        int aux_prop_id = (data_id == DATA_HWC) ? PROP_HWCTAG : PROP_NONE;
>        dataId->append (data_id);
> -      dataName->append (strdup (dataDscr->getName ()));
> -      dataUName->append (strdup (dataDscr->getUName ()));
> +      dataName->append (xstrdup (dataDscr->getName ()));
> +      dataUName->append (xstrdup (dataDscr->getUName ()));
>        auxProp->append (aux_prop_id);
>      }
>    delete ddscr;
> @@ -9921,8 +9921,8 @@ dbeGetLineInfo (Obj pc)
>    if (dbeline != NULL)
>      snprintf (lineno, sizeof (lineno), NTXT ("%d"), dbeline->lineno);
>    Vector<char*> *res = new Vector<char*>(2);
> -  res->store (0, strdup (fname));
> -  res->store (1, strdup (lineno));
> +  res->store (0, xstrdup (fname));
> +  res->store (1, xstrdup (lineno));
>    return res;
>  }
>  
> diff --git a/gprofng/src/DbeJarFile.cc b/gprofng/src/DbeJarFile.cc
> index fe3427f0b54..b2bb3558785 100644
> --- a/gprofng/src/DbeJarFile.cc
> +++ b/gprofng/src/DbeJarFile.cc
> @@ -123,7 +123,7 @@ template<> void Vector<ZipEntry *>::dump (const char *msg)
>  
>  DbeJarFile::DbeJarFile (const char *jarName)
>  {
> -  name = strdup (jarName);
> +  name = xstrdup (jarName);
>    fnames = NULL;
>    dwin = new Data_window (name);
>    get_entries ();
> @@ -211,7 +211,7 @@ DbeJarFile::get_entries ()
>        char *nm = (char *) dwin->bind (offset + 46, name_len);
>        if (nm)
>  	{
> -	  ze->name = (char *) malloc (name_len + 1);
> +	  ze->name = (char *) xmalloc (name_len + 1);
>  	  strncpy (ze->name, nm, name_len);
>  	  ze->name[name_len] = 0;
>  	}
> @@ -320,7 +320,7 @@ DbeJarFile::copy (char *toFileNname, int fromEntryNum)
>    strm.avail_in = ze->csize;
>    strm.next_in = b;
>    int retval = ze->size;
> -  unsigned char *buf = (unsigned char *) malloc (ze->size);
> +  unsigned char *buf = (unsigned char *) xmalloc (ze->size);
>    for (;;)
>      {
>        strm.next_out = buf;
> diff --git a/gprofng/src/DbeSession.cc b/gprofng/src/DbeSession.cc
> index 3649357bc79..2a8a6f2c039 100644
> --- a/gprofng/src/DbeSession.cc
> +++ b/gprofng/src/DbeSession.cc
> @@ -1245,7 +1245,7 @@ DbeSession::open_experiment (Experiment *exp, char *path)
>      {
>        if (t_exp_list[j] == NULL) continue;
>        Experiment *dexp = t_exp_list[j];
> -      exp_ctx *new_ctx = (exp_ctx*) malloc (sizeof (exp_ctx));
> +      exp_ctx *new_ctx = (exp_ctx*) xmalloc (sizeof (exp_ctx));
>        new_ctx->path = NULL;
>        new_ctx->exp = dexp;
>        new_ctx->ds = this;
> diff --git a/gprofng/src/DbeView.cc b/gprofng/src/DbeView.cc
> index 6b0c3a40cb3..872ebcd7a34 100644
> --- a/gprofng/src/DbeView.cc
> +++ b/gprofng/src/DbeView.cc
> @@ -552,7 +552,7 @@ DbeView::get_metric_list (MetricType mtype)
>  
>        // set the defaults
>        if (settings->str_dmetrics == NULL)
> -	settings->str_dmetrics = strdup (Command::DEFAULT_METRICS);
> +	settings->str_dmetrics = xstrdup (Command::DEFAULT_METRICS);
>        char *status = setMetrics (settings->str_dmetrics, true);
>        if (status != NULL)
>  	{
> @@ -1122,7 +1122,7 @@ DbeView::setSort (char * sort_list, MetricType mtype, bool fromRcFile)
>    if ((sort_list == NULL) || (strcmp (sort_list, Command::DEFAULT_CMD) == 0))
>      {
>        if (settings->str_dsort == NULL)
> -	settings->str_dsort = strdup (Command::DEFAULT_METRICS);
> +	settings->str_dsort = xstrdup (Command::DEFAULT_METRICS);
>        sort_list = settings->get_default_sort ();
>      }
>    mlist = get_metric_list (mtype);
> diff --git a/gprofng/src/DerivedMetrics.cc b/gprofng/src/DerivedMetrics.cc
> index ee14ea01542..14026d6b76b 100644
> --- a/gprofng/src/DerivedMetrics.cc
> +++ b/gprofng/src/DerivedMetrics.cc
> @@ -119,7 +119,7 @@ DerivedMetrics::construct_map (Vector<Metric*> *mitems, BaseMetric::SubType st,
>    int nmetrics = mitems->size ();
>  
>    // allocate arrays for the mapping between derived metrics and requested values
> -  int *map = (int *) malloc (ndm * sizeof (int));
> +  int *map = (int *) xmalloc (ndm * sizeof (int));
>  
>    // map derived metrics to requested metrics    // EUGENE explain this more clearly
>    //   0  means not mapped
> @@ -194,7 +194,7 @@ DerivedMetrics::get_dependencies (definition *def)
>    int n = items->size ();
>  
>    // zero out a vector representing definitions
> -  int *vec = (int *) malloc (n * sizeof (int));
> +  int *vec = (int *) xmalloc (n * sizeof (int));
>    for (int i = 0; i < n; i++)
>      vec[i] = 0;
>    fill_dependencies (def, vec);
> diff --git a/gprofng/src/DwarfLib.cc b/gprofng/src/DwarfLib.cc
> index a150c76cdd5..3872cc2de46 100644
> --- a/gprofng/src/DwarfLib.cc
> +++ b/gprofng/src/DwarfLib.cc
> @@ -1523,7 +1523,7 @@ DwrLineRegs::read_file_names_dwarf5 ()
>  	   (long long) debug_lineSec->offset, efmt_cnt);
>    if (efmt_cnt == 0)
>      return NULL;
> -  t_entry_fmt *efmt = (t_entry_fmt *) malloc (sizeof (t_entry_fmt) * efmt_cnt);
> +  t_entry_fmt *efmt = (t_entry_fmt *) xmalloc (sizeof (t_entry_fmt) * efmt_cnt);
>    for (int i = 0; i < efmt_cnt; i++)
>      {
>        efmt[i].type_code = debug_lineSec->GetULEB128 ();
> @@ -2350,8 +2350,8 @@ DwrCU::map_dwarf_lines (Module *mod)
>    if (isGNU && (inlinedSubrCnt > 0))
>      {
>        Function *func = NULL;
> -      mod->inlinedSubr = (InlinedSubr *) malloc (inlinedSubrCnt
> -						 * sizeof (InlinedSubr));
> +      mod->inlinedSubr = (InlinedSubr *) xmalloc (inlinedSubrCnt
> +						  * sizeof (InlinedSubr));
>        for (long i = 0; i < inlinedSubrCnt; i++)
>  	{
>  	  DwrInlinedSubr *inlinedSubr = dwrInlinedSubrs->get (i);
> diff --git a/gprofng/src/Elf.cc b/gprofng/src/Elf.cc
> index 45f88931642..7c715616ac7 100644
> --- a/gprofng/src/Elf.cc
> +++ b/gprofng/src/Elf.cc
> @@ -405,7 +405,7 @@ Elf::elf_getdata (unsigned int sec)
>  {
>    if (data == NULL)
>      {
> -      data = (Elf_Data **) malloc (ehdrp->e_shnum * sizeof (Elf_Data *));
> +      data = (Elf_Data **) xmalloc (ehdrp->e_shnum * sizeof (Elf_Data *));
>        for (int i = 0; i < (int) ehdrp->e_shnum; i++)
>  	data[i] = NULL;
>      }
> @@ -744,7 +744,7 @@ Elf::get_bfd_symbols()
>  	bfd_symcnt = bfd_get_symtab_upper_bound (abfd);
>        if (bfd_symcnt > 0)
>  	{
> -	  bfd_sym = (asymbol **) malloc (bfd_symcnt);
> +	  bfd_sym = (asymbol **) xmalloc (bfd_symcnt);
>  	  bfd_symcnt = bfd_canonicalize_symtab (abfd, bfd_sym);
>  	  if (bfd_symcnt < 0)
>  	    {
> @@ -761,7 +761,7 @@ Elf::get_bfd_symbols()
>        bfd_dynsymcnt = bfd_get_dynamic_symtab_upper_bound (abfd);
>        if (bfd_dynsymcnt > 0)
>  	{
> -	  bfd_dynsym = (asymbol **) malloc (bfd_dynsymcnt);
> +	  bfd_dynsym = (asymbol **) xmalloc (bfd_dynsymcnt);
>  	  bfd_dynsymcnt = bfd_canonicalize_dynamic_symtab (abfd, bfd_dynsym);
>  	  if (bfd_dynsymcnt < 0)
>  	    {
> diff --git a/gprofng/src/Emsg.cc b/gprofng/src/Emsg.cc
> index 01620590b91..eada9aec418 100644
> --- a/gprofng/src/Emsg.cc
> +++ b/gprofng/src/Emsg.cc
> @@ -39,7 +39,7 @@ Emsg::Emsg (Cmsg_warn w, const char *i18n_text)
>    warn = w;
>    flavor = 0;
>    par = NULL;
> -  text = strdup (i18n_text);
> +  text = xstrdup (i18n_text);
>    next = NULL;
>  }
>  
> @@ -436,7 +436,7 @@ Emsgqueue::Emsgqueue (char *_qname)
>  {
>    first = NULL;
>    last = NULL;
> -  qname = strdup (_qname);
> +  qname = xstrdup (_qname);
>  }
>  
>  Emsgqueue::~Emsgqueue ()
> @@ -584,7 +584,7 @@ DbeMessages::append_msg (Cmsg_warn w, const char *fmt, ...)
>    else
>      {
>        va_start (vp, fmt);
> -      char *buf = (char *) malloc (buf_size);
> +      char *buf = (char *) xmalloc (buf_size);
>        vsnprintf (buf, buf_size, fmt, vp);
>        va_end (vp);
>        msg = new Emsg (w, buf);
> diff --git a/gprofng/src/Experiment.cc b/gprofng/src/Experiment.cc
> index 3e1e1a7d39e..3c63f9f018f 100644
> --- a/gprofng/src/Experiment.cc
> +++ b/gprofng/src/Experiment.cc
> @@ -252,9 +252,7 @@ Experiment::ExperimentFile::fgets ()
>    if (bufsz == 0)
>      {
>        bufsz = 1024;
> -      buffer = (char *) malloc (bufsz);
> -      if (buffer == NULL)
> -	return NULL;
> +      buffer = (char *) xmalloc (bufsz);
>        buffer[bufsz - 1] = (char) 1; // sentinel
>      }
>    char *res = ::fgets (buffer, bufsz, fh);
> @@ -263,9 +261,7 @@ Experiment::ExperimentFile::fgets ()
>    while (buffer[bufsz - 1] == (char) 0)
>      {
>        int newsz = bufsz + 1024;
> -      char *newbuf = (char *) malloc (newsz);
> -      if (newbuf == NULL)
> -	return NULL;
> +      char *newbuf = (char *) xmalloc (newsz);
>        memcpy (newbuf, buffer, bufsz);
>        free (buffer);
>        buffer = newbuf;
> @@ -451,19 +447,19 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>        if (str != NULL)
>  	{
>  	  found = 1;
> -	  exp->coll_params.start_delay = strdup (str);
> +	  exp->coll_params.start_delay = xstrdup (str);
>  	}
>        str = attrs->getValue (SP_JCMD_TERMINATE);
>        if (str != NULL)
>  	{
>  	  found = 1;
> -	  exp->coll_params.terminate = strdup (str);
> +	  exp->coll_params.terminate = xstrdup (str);
>  	}
>        str = attrs->getValue (SP_JCMD_PAUSE_SIG);
>        if (str != NULL)
>  	{
>  	  found = 1;
> -	  exp->coll_params.pause_sig = strdup (str);
> +	  exp->coll_params.pause_sig = xstrdup (str);
>  	}
>        str = attrs->getValue (SP_JCMD_SAMPLE_PERIOD);
>        if (str != NULL)
> @@ -491,7 +487,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>        if (str != NULL)
>  	{
>  	  found = 1;
> -	  exp->coll_params.linetrace = strdup (str);
> +	  exp->coll_params.linetrace = xstrdup (str);
>  	}
>  
>        str = attrs->getValue (SP_JCMD_COLLENV);
> @@ -524,11 +520,11 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>        pushElem (EL_SYSTEM);
>        const char *str = attrs->getValue (NTXT ("hostname"));
>        if (str != NULL)
> -	exp->hostname = strdup (str);
> +	exp->hostname = xstrdup (str);
>        str = attrs->getValue (NTXT ("os"));
>        if (str != NULL)
>  	{
> -	  exp->os_version = strdup (str);
> +	  exp->os_version = xstrdup (str);
>  	  /* For Linux experiments expect sparse thread ID's */
>  	  if (strncmp (str, NTXT ("SunOS"), 5) != 0)
>  	    exp->sparse_threads = true;
> @@ -547,7 +543,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>  	    exp->platform = Sparc;
>  	  exp->need_swap_endian = (DbeSession::platform == Sparc) ?
>  		  (exp->platform != Sparc) : (exp->platform == Sparc);
> -	  exp->architecture = strdup (str);
> +	  exp->architecture = xstrdup (str);
>  	}
>        str = attrs->getValue (NTXT ("pagesz"));
>        if (str != NULL)
> @@ -624,7 +620,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>  	exp->sid = atoi (str);
>        str = attrs->getValue (NTXT ("cwd"));
>        if (str != NULL)
> -	exp->ucwd = strdup (str);
> +	exp->ucwd = xstrdup (str);
>        str = attrs->getValue (NTXT ("pagesz"));
>        if (str != NULL)
>  	exp->page_size = atoi (str);
> @@ -1061,7 +1057,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>  	  exp->has_java = true;
>  	  str = attrs->getValue (NTXT ("jversion"));
>  	  if (str != NULL)
> -	    exp->jversion = strdup (str);
> +	    exp->jversion = xstrdup (str);
>  	}
>        else if (strcmp (str, NTXT ("datarace")) == 0)
>  	{
> @@ -1148,7 +1144,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>  		{
>  		  fldDscr->vtype = TYPE_DATE;
>  		  const char *fmt = attrs->getValue (NTXT ("format"));
> -		  fldDscr->format = strdup (fmt ? fmt : "");
> +		  fldDscr->format = xstrdup (fmt ? fmt : "");
>  		}
>  	    }
>  	  propDscr->vtype = fldDscr->vtype;
> @@ -1173,7 +1169,7 @@ Experiment::ExperimentHandler::startElement (char*, char*, char *qName, Attribut
>  
>  	  str = attrs->getValue (NTXT ("uname"));
>  	  if (str)
> -	    propDscr->uname = strdup (PTXT ((char*) str));
> +	    propDscr->uname = xstrdup (PTXT ((char*) str));
>  	  str = attrs->getValue (NTXT ("noshow"));
>  	  if (str && atoi (str) != 0)
>  	    propDscr->flags |= PRFLAG_NOSHOW;
> @@ -4589,7 +4585,7 @@ Experiment::readPacket (Data_window *dwin, Data_window::Span *span)
>  		else
>  		  {
>  		    // bug 6909545: garbage in 64-bit JAVA_INFO
> -		    char *nstack = (char*) malloc (stack_size);
> +		    char *nstack = (char*) xmalloc (stack_size);
>  		    char *dst = nstack;
>  		    char *srcmax = stack + stack_size - sizeof (uint64_t);
>  		    for (char *src = stack; src <= srcmax;)
> @@ -5845,7 +5841,7 @@ Experiment::checkFileInArchive (const char *fname, bool archiveFile)
>        DbeFile *df = archiveMap->get (aname);
>        free (aname);
>        if (df)
> -	return strdup (df->get_location ());
> +	return xstrdup (df->get_location ());
>        return NULL;
>      }
>    if (founder_exp)
> @@ -6591,12 +6587,7 @@ Experiment::copy_file_to_common_archive (const char *name, const char *aname,
>  	  fprintf (stderr, GTXT ("gp-archive: Fatal error: pathconf(\".\", _PC_PATH_MAX) failed\n"));
>  	  return 1;
>  	}
> -      char *buf = (char *) malloc ((size_t) size);
> -      if (buf == NULL)
> -	{
> -	  fprintf (stderr, GTXT ("gp-archive: Fatal error: unable to allocate memory\n"));
> -	  return 1;
> -	}
> +      char *buf = (char *) xmalloc ((size_t) size);
>        char *ptr = getcwd (buf, (size_t) size);
>        if (ptr == NULL)
>  	{
> diff --git a/gprofng/src/Function.cc b/gprofng/src/Function.cc
> index 1d8ae45dbdd..dd9a2c7bb3f 100644
> --- a/gprofng/src/Function.cc
> +++ b/gprofng/src/Function.cc
> @@ -129,14 +129,14 @@ Function::get_name (NameFormat nfmt)
>    bool soname_fmt = Histable::soname_fmt (nfmt);
>    int fname_fmt = Histable::fname_fmt (nfmt);
>    if (fname_fmt == Histable::MANGLED)
> -    name_buf = strdup (mangled_name);
> +    name_buf = xstrdup (mangled_name);
>    else
>      {
>        if (module && module->is_fortran ()
>  	  && (streq (name, "MAIN") || streq (name, "MAIN_")))
> -	name_buf = strdup (match_name);
> +	name_buf = xstrdup (match_name);
>        else
> -	name_buf = strdup (name);
> +	name_buf = xstrdup (name);
>  
>        if (fname_fmt == Histable::SHORT)
>  	{
> diff --git a/gprofng/src/Makefile.am b/gprofng/src/Makefile.am
> index fb4b8a0fafa..41795071185 100644
> --- a/gprofng/src/Makefile.am
> +++ b/gprofng/src/Makefile.am
> @@ -92,7 +92,6 @@ CSOURCES = \
>  	dbe_hwcdrv.c \
>  	dbe_hwcfuncs.c \
>  	dbe_hwctable.c \
> -	dbe_memmgr.c \
>  	gethrtime.c \
>  	$(NULL)
>  
> diff --git a/gprofng/src/Makefile.in b/gprofng/src/Makefile.in
> index cef4b275305..4c25d017d0e 100644
> --- a/gprofng/src/Makefile.in
> +++ b/gprofng/src/Makefile.in
> @@ -178,7 +178,7 @@ am__objects_1 = Application.lo BaseMetric.lo BaseMetricTreeNode.lo \
>  	QLParser.tab.lo dbe_collctrl.lo i18n.lo parse.lo UserLabel.lo \
>  	util.lo Dbe.lo
>  am__objects_2 = dbe_hwcdrv.lo dbe_hwcfuncs.lo dbe_hwctable.lo \
> -	dbe_memmgr.lo gethrtime.lo
> +	gethrtime.lo
>  am_libgprofng_la_OBJECTS = $(am__objects_1) $(am__objects_2)
>  libgprofng_la_OBJECTS = $(am_libgprofng_la_OBJECTS)
>  AM_V_lt = $(am__v_lt_@AM_V@)
> @@ -519,7 +519,6 @@ CSOURCES = \
>  	dbe_hwcdrv.c \
>  	dbe_hwcfuncs.c \
>  	dbe_hwctable.c \
> -	dbe_memmgr.c \
>  	gethrtime.c \
>  	$(NULL)
>  
> @@ -786,7 +785,6 @@ distclean-compile:
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbe_hwcdrv.Plo@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbe_hwcfuncs.Plo@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbe_hwctable.Plo@am__quote@
> -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbe_memmgr.Plo@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envsets.Po@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gethrtime.Plo@am__quote@
>  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gp-archive.Po@am__quote@
> diff --git a/gprofng/src/Module.cc b/gprofng/src/Module.cc
> index d5255dcd05f..064581c3874 100644
> --- a/gprofng/src/Module.cc
> +++ b/gprofng/src/Module.cc
> @@ -368,7 +368,7 @@ Module::read_ar (int ar, int obj, char *obj_base)
>    if (!strncmp (hdr.ar_name, NTXT ("//"), 2))
>      {
>        longnames_size = get_ar_size (hdr.ar_size, sizeof (hdr.ar_size));
> -      longnames = (char *) malloc (longnames_size + 1);
> +      longnames = (char *) xmalloc (longnames_size + 1);
>        int64_t cnt = read_from_file (ar, longnames, longnames_size);
>        if (cnt != (int64_t) longnames_size)
>  	{
> @@ -519,8 +519,8 @@ Module::setFile ()
>        char *path = loadobject->dbeFile->get_location ();
>        if (path)
>  	{
> -	  disPath = strdup (path);
> -	  disName = strdup (path);
> +	  disPath = xstrdup (path);
> +	  disName = xstrdup (path);
>  	  disMTime = loadobject->dbeFile->sbuf.st_mtime;
>  	}
>  
> @@ -535,7 +535,7 @@ Module::setFile ()
>  	  size_t last = strlen (base) - 1;
>  	  base[last] = '\0';
>  	  stabsTmp = dbeSession->get_tmp_file_name (base, false);
> -	  dbeSession->tmp_files->append (strdup (stabsTmp));
> +	  dbeSession->tmp_files->append (xstrdup (stabsTmp));
>  
>  	  DbeFile *dbf = dbeSession->getDbeFile (namebuf,
>  					DbeFile::F_DOT_A_LIB | DbeFile::F_FILE);
> @@ -553,8 +553,8 @@ Module::setFile ()
>  	      dbeFile->check_access (stabsTmp); // init 'sbuf'
>  	      dbeFile->sbuf.st_mtime = 0; // Don't check timestamps
>  	      dbeFile->container = dbf;
> -	      stabsPath = strdup (stabsTmp);
> -	      stabsName = strdup (path);
> +	      stabsPath = xstrdup (stabsTmp);
> +	      stabsName = xstrdup (path);
>  	      stabsMTime = dbeFile->sbuf.st_mtime;
>  	    }
>  	  else
> @@ -573,8 +573,8 @@ Module::setFile ()
>  	  path = dbeFile->get_location ();
>  	  if (path != NULL)
>  	    {
> -	      stabsPath = strdup (path);
> -	      stabsName = strdup (path);
> +	      stabsPath = xstrdup (path);
> +	      stabsName = xstrdup (path);
>  	      stabsMTime = hasDwarf ? 0 : dbeFile->sbuf.st_mtime;
>  	    }
>  	}
> @@ -585,14 +585,14 @@ Module::setFile ()
>  	{
>  	  if (disPath == NULL)
>  	    return false;
> -	  stabsPath = strdup (disPath);
> -	  stabsName = strdup (disName);
> +	  stabsPath = xstrdup (disPath);
> +	  stabsName = xstrdup (disName);
>  	  stabsMTime = disMTime;
>  	}
>        else if (disPath == NULL)
>  	{
> -	  disPath = strdup (stabsPath);
> -	  disName = strdup (stabsName);
> +	  disPath = xstrdup (stabsPath);
> +	  disName = xstrdup (stabsName);
>  	  disMTime = stabsMTime;
>  	}
>      }
> @@ -1278,7 +1278,7 @@ Module::set_src_data (Function *func, int vis_bits, int cmpline_visible,
>      {
>        Hist_data::HistItem *item = src_items->new_hist_item (NULL, AT_EMPTY,
>  							    empty);
> -      item->value[name_idx].l = strdup (NTXT (""));
> +      item->value[name_idx].l = xstrdup (NTXT (""));
>        data_items->append_hist_item (item);
>        item = src_items->new_hist_item (NULL, AT_COM, empty);
>        item->value[name_idx].l = dbe_sprintf (GTXT ("Compile flags: %s"),
> diff --git a/gprofng/src/Print.cc b/gprofng/src/Print.cc
> index 32a51783f3a..76d9fbd8bd8 100644
> --- a/gprofng/src/Print.cc
> +++ b/gprofng/src/Print.cc
> @@ -60,7 +60,7 @@ er_print_common_display::open (Print_params *params)
>    if (params->dest == DEST_PRINTER)
>      {
>        tmp_file = dbeSession->get_tmp_file_name (NTXT ("print"), false);
> -      dbeSession->tmp_files->append (strdup (tmp_file));
> +      dbeSession->tmp_files->append (xstrdup (tmp_file));
>        out_file = fopen (tmp_file, NTXT ("w"));
>      }
>    else if (params->dest == DEST_OPEN_FILE)
> @@ -128,7 +128,7 @@ er_print_common_display::get_output (int maxsize)
>    if (f == NULL)
>      return dbe_sprintf (GTXT ("Error: cannot open temporary file: %s\n"),
>  			tmp_file);
> -  char *report = (char *) malloc (max);
> +  char *report = (char *) xmalloc (max);
>    if (report)
>      {
>        if (1 != fread (report, max - 1, 1, f))
> @@ -2382,7 +2382,7 @@ print_html_label (FILE *out_file, MetricList *metrics_list)
>  	ncols++;
>        if (ncols == 0)
>  	continue;
> -      char *name = strdup (mitem->get_name ());
> +      char *name = xstrdup (mitem->get_name ());
>        char *name2 = split_metric_name (name);
>        const char *style = index == metrics_list->get_sort_ref_index () ? "G" : "";
>  
> @@ -2608,7 +2608,7 @@ print_delim_label (FILE *out_file, MetricList *metrics_list, char delim)
>        if (!(mitem->is_visible () || mitem->is_tvisible ()
>  	    || mitem->is_pvisible ()))
>  	continue;
> -      char *name = strdup (mitem->get_name ());
> +      char *name = xstrdup (mitem->get_name ());
>        char *name2 = split_metric_name (name);
>  
>        if (mitem->is_tvisible ())
> diff --git a/gprofng/src/QLParser.yy b/gprofng/src/QLParser.yy
> index c0d7329eb1b..1b0998026a9 100644
> --- a/gprofng/src/QLParser.yy
> +++ b/gprofng/src/QLParser.yy
> @@ -26,11 +26,13 @@
>  %language "C++"
>  
>  %code top {
> +#include "config.h"
>  #include <stdio.h>
>  #include <string.h>
>  #include <string>
>  }
>  %code requires {
> +#include "libiberty.h"
>  #include "QLParser.h"
>  #include "DbeSession.h"
>  #include "Expression.h"
> @@ -274,7 +276,7 @@ namespace QL
>        case '"':
>  	{
>  	  int  maxsz = 16;
> -	  char *str = (char *) malloc (maxsz);
> +	  char *str = (char *) xmalloc (maxsz);
>  	  char *ptr = str;
>  
>  	  for (;;)
> @@ -301,7 +303,7 @@ namespace QL
>  		    {
>  		      size_t len = ptr - str;
>  		      maxsz = maxsz > 8192 ? maxsz + 8192 : maxsz * 2;
> -		      char *new_s = (char *) realloc (str, maxsz);
> +		      char *new_s = (char *) xrealloc (str, maxsz);
>  		      str = new_s;
>  		      ptr = str + len;
>  		    }
> diff --git a/gprofng/src/SAXParserFactory.cc b/gprofng/src/SAXParserFactory.cc
> index 1099ca33a1b..eedda263644 100644
> --- a/gprofng/src/SAXParserFactory.cc
> +++ b/gprofng/src/SAXParserFactory.cc
> @@ -112,15 +112,15 @@ AttributesP::append (char *qName, char *value)
>   */
>  SAXException::SAXException ()
>  {
> -  message = strdup ("null");
> +  message = xstrdup ("null");
>  }
>  
>  SAXException::SAXException (const char *_message)
>  {
>    if (_message == NULL)
> -    message = strdup ("null");
> +    message = xstrdup ("null");
>    else
> -    message = strdup (_message);
> +    message = xstrdup (_message);
>  }
>  
>  SAXException::~SAXException ()
> @@ -197,7 +197,7 @@ SAXParserP::SAXParserP ()
>  {
>    dh = NULL;
>    bufsz = 0x2000;
> -  buffer = (char*) malloc (bufsz);
> +  buffer = (char*) xmalloc (bufsz);
>    cntsz = 0;
>    idx = 0;
>    line = 1;
> @@ -214,7 +214,7 @@ SAXParserP::reset ()
>  {
>    dh = NULL;
>    bufsz = 8192;
> -  buffer = (char*) realloc (buffer, bufsz);
> +  buffer = (char*) xrealloc (buffer, bufsz);
>    cntsz = 0;
>    idx = 0;
>    line = 1;
> @@ -244,7 +244,7 @@ SAXParserP::parse (File *f, DefaultHandler *_dh)
>  	{
>  	  int oldbufsz = bufsz;
>  	  bufsz = bufsz >= 0x100000 ? bufsz + 0x100000 : bufsz * 2;
> -	  buffer = (char*) realloc (buffer, bufsz);
> +	  buffer = (char*) xrealloc (buffer, bufsz);
>  	  rem = bufsz - oldbufsz;
>  	}
>      }
> diff --git a/gprofng/src/Settings.cc b/gprofng/src/Settings.cc
> index 6d1d357a175..1af0a2309aa 100644
> --- a/gprofng/src/Settings.cc
> +++ b/gprofng/src/Settings.cc
> @@ -1346,13 +1346,13 @@ Settings::proc_tabs (bool _rdtMode)
>    if (_rdtMode == true)
>      {
>        if (str_rtabs == NULL)
> -	str_rtabs = strdup ("header");
> +	str_rtabs = xstrdup ("header");
>        cmd = str_rtabs;
>      }
>    else
>      {
>        if (str_tabs == NULL)
> -	str_tabs = strdup ("header");
> +	str_tabs = xstrdup ("header");
>        cmd = str_tabs;
>      }
>    if (strcmp (cmd, NTXT ("none")) == 0)
> diff --git a/gprofng/src/SourceFile.cc b/gprofng/src/SourceFile.cc
> index b9f4f131ac9..ac14935aff5 100644
> --- a/gprofng/src/SourceFile.cc
> +++ b/gprofng/src/SourceFile.cc
> @@ -101,7 +101,7 @@ SourceFile::readSource ()
>        status = OS_NOSRC;
>        return false;
>      }
> -  char *srcMap = (char *) malloc (srcLen + 1);
> +  char *srcMap = (char *) xmalloc (srcLen + 1);
>    int64_t sz = read_from_file (fd, srcMap, srcLen);
>    if (sz != (int64_t) srcLen)
>      append_msg (CMSG_ERROR, GTXT ("%s: Can read only %lld bytes instead %lld"),
> diff --git a/gprofng/src/StringBuilder.cc b/gprofng/src/StringBuilder.cc
> index 9901b62c1a7..c89afd76f6e 100644
> --- a/gprofng/src/StringBuilder.cc
> +++ b/gprofng/src/StringBuilder.cc
> @@ -26,6 +26,7 @@
>  #include <stdarg.h>
>  #include <unistd.h>
>  
> +#include "libiberty.h"
>  #include "gp-defs.h"
>  #include "StringBuilder.h"
>  #include "i18n.h"
> @@ -34,7 +35,7 @@ StringBuilder::StringBuilder ()
>  {
>    count = 0;
>    maxCapacity = 16;
> -  value = (char *) malloc (maxCapacity);
> +  value = (char *) xmalloc (maxCapacity);
>    memset (value, 0, maxCapacity);
>  }
>  
> @@ -42,7 +43,7 @@ StringBuilder::StringBuilder (int capacity)
>  {
>    count = 0;
>    maxCapacity = capacity;
> -  value = (char *) malloc (maxCapacity);
> +  value = (char *) xmalloc (maxCapacity);
>    memset (value, 0, maxCapacity);
>  }
>  
> @@ -66,7 +67,7 @@ StringBuilder::expandCapacity (int minimumCapacity)
>      newCapacity = MAXINT;
>    else if (minimumCapacity > newCapacity)
>      newCapacity = minimumCapacity;
> -  char *newValue = (char *) malloc (newCapacity);
> +  char *newValue = (char *) xmalloc (newCapacity);
>    maxCapacity = newCapacity;
>    memcpy (newValue, value, count);
>    memset (newValue + count, 0, maxCapacity - count);
> @@ -79,7 +80,7 @@ StringBuilder::trimToSize ()
>  {
>    if (count < maxCapacity)
>      {
> -      char *newValue = (char *) malloc (count);
> +      char *newValue = (char *) xmalloc (count);
>        maxCapacity = count;
>        memcpy (newValue, value, count);
>        free (value);
> @@ -425,7 +426,7 @@ StringBuilder::reverse ()
>  char *
>  StringBuilder::toString ()
>  {
> -  char *str = (char *) malloc (count + 1);
> +  char *str = (char *) xmalloc (count + 1);
>    memcpy (str, value, count);
>    str[count] = '\0';
>    return str;
> diff --git a/gprofng/src/StringMap.h b/gprofng/src/StringMap.h
> index db949ad77ee..d4702d3f1b8 100644
> --- a/gprofng/src/StringMap.h
> +++ b/gprofng/src/StringMap.h
> @@ -154,7 +154,7 @@ StringMap<Value_t>::put (const char *key, Value_t val)
>        chunks[nchunks - 1] = new Entry[CHUNK_SIZE];
>      }
>    entry = &chunks[entries / CHUNK_SIZE][entries % CHUNK_SIZE];
> -  entry->key = strdup (key);
> +  entry->key = xstrdup (key);
>    entry->val = val;
>    index->insert (lo, entry);
>    hashTable[idx] = entry;
> diff --git a/gprofng/src/Table.cc b/gprofng/src/Table.cc
> index 5e8883e6b43..4ec0a76d039 100644
> --- a/gprofng/src/Table.cc
> +++ b/gprofng/src/Table.cc
> @@ -85,7 +85,7 @@ int assert_level = 0; // set to 1 to bypass problematic asserts
>  PropDescr::PropDescr (int _propID, const char *_name)
>  {
>    propID = _propID;
> -  name = strdup (_name ? _name : NTXT (""));
> +  name = xstrdup (_name ? _name : NTXT (""));
>    uname = NULL;
>    vtype = TYPE_NONE;
>    flags = 0;
> @@ -116,10 +116,10 @@ PropDescr::addState (int value, const char *stname, const char *stuname)
>      return;
>    if (stateNames == NULL)
>      stateNames = new Vector<char*>;
> -  stateNames->store (value, strdup (stname));
> +  stateNames->store (value, xstrdup (stname));
>    if (stateUNames == NULL)
>      stateUNames = new Vector<char*>;
> -  stateUNames->store (value, strdup (stuname));
> +  stateUNames->store (value, xstrdup (stuname));
>  }
>  
>  char *
> @@ -145,7 +145,7 @@ PropDescr::getStateUName (int value)
>  FieldDescr::FieldDescr (int _propID, const char *_name)
>  {
>    propID = _propID;
> -  name = _name ? strdup (_name) : NULL;
> +  name = _name ? xstrdup (_name) : NULL;
>    offset = 0;
>    vtype = TYPE_NONE;
>    format = NULL;
> @@ -820,7 +820,7 @@ public:
>    virtual char *
>    fetchString (long i)
>    {
> -    return strdup (data->fetch (i));
> +    return xstrdup (data->fetch (i));
>    }
>  
>    virtual double
> @@ -1008,8 +1008,8 @@ DataDescriptor::DataDescriptor (int _id, const char *_name, const char *_uname,
>  {
>    isMaster = true;
>    id = _id;
> -  name = _name ? strdup (_name) : strdup (NTXT (""));
> -  uname = _uname ? strdup (_uname) : strdup (NTXT (""));
> +  name = _name ? xstrdup (_name) : xstrdup (NTXT (""));
> +  uname = _uname ? xstrdup (_uname) : xstrdup (NTXT (""));
>    flags = _flags;
>  
>    // master data, shared with reference copies:
> @@ -1029,8 +1029,8 @@ DataDescriptor::DataDescriptor (int _id, const char *_name, const char *_uname,
>  {
>    isMaster = false;
>    id = _id;
> -  name = _name ? strdup (_name) : strdup (NTXT (""));
> -  uname = _uname ? strdup (_uname) : strdup (NTXT (""));
> +  name = _name ? xstrdup (_name) : xstrdup (NTXT (""));
> +  uname = _uname ? xstrdup (_uname) : xstrdup (NTXT (""));
>    flags = dDscr->flags;
>  
>    // references point to master DataDescriptor
> diff --git a/gprofng/src/checks.cc b/gprofng/src/checks.cc
> index 4fe850d6509..f6d9b0e08ca 100644
> --- a/gprofng/src/checks.cc
> +++ b/gprofng/src/checks.cc
> @@ -51,7 +51,7 @@ collect::check_target (int argc, char **argv)
>      {
>      case EXEC_OK:
>        njargs = cc->get_java_arg_cnt ();
> -      arglist = (char **) calloc (nargs + 5 + njargs, sizeof (char *));
> +      arglist = (char **) xcalloc (nargs + 5 + njargs, sizeof (char *));
>        jargs = cc->get_java_args ();
>  
>        // store the first argument -- target name
> @@ -96,7 +96,7 @@ collect::check_target (int argc, char **argv)
>  	  exit (1);
>  	}
>        njargs = cc->get_java_arg_cnt ();
> -      arglist = (char **) calloc (nargs + 5 + njargs, sizeof (char *));
> +      arglist = (char **) xcalloc (nargs + 5 + njargs, sizeof (char *));
>        jargs = cc->get_java_args ();
>  
>        a = find_java ();
> @@ -140,7 +140,7 @@ collect::check_target (int argc, char **argv)
>  	}
>        jargs = cc->get_java_args ();
>        njargs = cc->get_java_arg_cnt ();
> -      arglist = (char **) calloc (nargs + 4 + njargs, sizeof (char *));
> +      arglist = (char **) xcalloc (nargs + 4 + njargs, sizeof (char *));
>  
>        a = find_java ();
>        if (a == NULL)
> @@ -377,7 +377,7 @@ collect::status_str (Exec_status rv, char *target_name)
>      case EXEC_OPEN_FAIL:
>        return dbe_sprintf (GTXT ("Can't open target executable `%s'\n"), target_name);
>      case EXEC_ELF_LIB:
> -      return strdup (GTXT ("Internal error: Not a working version of ELF library\n"));
> +      return xstrdup (GTXT ("Internal error: Not a working version of ELF library\n"));
>      case EXEC_ELF_HEADER:
>        return dbe_sprintf (GTXT ("Target `%s' is not a valid ELF executable\n"), target_name);
>      case EXEC_ELF_ARCH:
> @@ -450,11 +450,11 @@ collect::find_java (void)
>    switch (rv)
>      {
>      case EXEC_OK:
> -      java_path = strdup (buf);
> +      java_path = xstrdup (buf);
>        if (verbose == 1)
>  	dbe_write (2, GTXT ("Path to `%s' (set from %s) used for Java profiling\n"),
>  		   java_path, java_how);
> -      return ( strdup (buf));
> +      return xstrdup (buf);
>      default:
>        dbe_write (2, GTXT ("Path to `%s' (set from %s) does not point to a JVM executable\n"),
>  		 buf, java_how);
> diff --git a/gprofng/src/collctrl.cc b/gprofng/src/collctrl.cc
> index 2fa9a883147..3dae531c315 100644
> --- a/gprofng/src/collctrl.cc
> +++ b/gprofng/src/collctrl.cc
> @@ -64,7 +64,7 @@ read_str (char *from, char **to)
>  	  {
>  	    if (s[i] != '\n' && s[i] != ' ' && s[i] != '\t')
>  	      {
> -		*to = strndup (s, i + 1);
> +		*to = xstrndup (s, i + 1);
>  		return;
>  	      }
>  	  }
> @@ -131,7 +131,7 @@ read_cpuinfo ()
>      }
>    if (cpu_info.cpu_vendorstr == NULL)
>  #if defined(__aarch64__)
> -    cpu_info.cpu_vendorstr = strdup (AARCH64_VENDORSTR_ARM);
> +    cpu_info.cpu_vendorstr = xstrdup (AARCH64_VENDORSTR_ARM);
>  #else
>      cpu_info.cpu_vendorstr = GTXT ("Unknown processor");
>  #endif
> @@ -149,11 +149,11 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC, bool _kernelHWC)
>  
>    /* set this host's parameters */
>    gethostname (hostname, 1023);
> -  node_name = strdup (hostname);
> +  node_name = xstrdup (hostname);
>    char *p = strchr (node_name, (int) '.');
>    if (p != NULL)
>      *p = 0;
> -  default_stem = strdup ("test");
> +  default_stem = xstrdup ("test");
>  
>    cpu_info_t *cpu_p = read_cpuinfo ();
>    ncpus = cpu_p->cpu_cnt;
> @@ -186,7 +186,7 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC, bool _kernelHWC)
>    follow_spec_usr = NULL;
>    follow_spec_cmp = NULL;
>    prof_idle = 1;
> -  archive_mode = strdup ("on");
> +  archive_mode = xstrdup ("on");
>    pauseresume_sig = 0;
>    sample_sig = 0;
>    uinterrupt = 0;
> @@ -201,7 +201,7 @@ Coll_Ctrl::Coll_Ctrl (int _interactive, bool _defHWC, bool _kernelHWC)
>    base_name = NULL;
>    udir_name = NULL;
>    store_dir = NULL;
> -  prev_store_dir = strdup ("");
> +  prev_store_dir = xstrdup ("");
>    store_ptr = NULL;
>    expt_group = NULL;
>    target_name = NULL;
> @@ -256,8 +256,8 @@ Coll_Ctrl::Coll_Ctrl (Coll_Ctrl * cc)
>    interactive = cc->interactive;
>    defHWC = cc->defHWC;
>    kernelHWC = cc->kernelHWC;
> -  node_name = strdup (cc->node_name);
> -  default_stem = strdup (cc->default_stem);
> +  node_name = xstrdup (cc->node_name);
> +  default_stem = xstrdup (cc->default_stem);
>    ncpus = cc->ncpus;
>    cpu_clk_freq = cc->cpu_clk_freq;
>    npages = cc->npages;
> @@ -272,15 +272,15 @@ Coll_Ctrl::Coll_Ctrl (Coll_Ctrl * cc)
>    follow_default = cc->follow_default;
>    if (cc->follow_spec_usr)
>      {
> -      follow_spec_usr = strdup (cc->follow_spec_usr);
> -      follow_spec_cmp = strdup (cc->follow_spec_cmp);
> +      follow_spec_usr = xstrdup (cc->follow_spec_usr);
> +      follow_spec_cmp = xstrdup (cc->follow_spec_cmp);
>      }
>    else
>      {
>        follow_spec_usr = NULL;
>        follow_spec_cmp = NULL;
>      }
> -  archive_mode = strdup (cc->archive_mode);
> +  archive_mode = xstrdup (cc->archive_mode);
>    pauseresume_sig = cc->pauseresume_sig;
>    sample_sig = cc->sample_sig;
>    time_run = cc->time_run;
> @@ -295,12 +295,12 @@ Coll_Ctrl::Coll_Ctrl (Coll_Ctrl * cc)
>    hwcprof_default = cc->hwcprof_default;
>    hwcprof_enabled_cnt = cc->hwcprof_enabled_cnt;
>    if (cc->hwc_string != NULL)
> -    hwc_string = strdup (cc->hwc_string);
> +    hwc_string = xstrdup (cc->hwc_string);
>    else
>      hwc_string = NULL;
>    for (int i = 0; i < hwcprof_enabled_cnt; i++)
>      hwcentry_dup (&hwctr[i], &(cc->hwctr[i]));
> -  project_home = cc->project_home ? strdup (cc->project_home) : NULL;
> +  project_home = cc->project_home ? xstrdup (cc->project_home) : NULL;
>    synctrace_enabled = cc->synctrace_enabled;
>    synctrace_thresh = cc->synctrace_thresh;
>    synctrace_scope = cc->synctrace_scope;
> @@ -324,16 +324,16 @@ Coll_Ctrl::Coll_Ctrl (Coll_Ctrl * cc)
>    // these represent user settings
>    expt_group = NULL;
>    if (cc->expt_group != NULL)
> -    expt_group = strdup (cc->expt_group);
> +    expt_group = xstrdup (cc->expt_group);
>    uexpt_name = NULL;
>    if (cc->uexpt_name != NULL)
> -    uexpt_name = strdup (cc->uexpt_name);
> +    uexpt_name = xstrdup (cc->uexpt_name);
>    udir_name = NULL;
>    if (cc->udir_name != NULL)
> -    udir_name = strdup (cc->udir_name);
> +    udir_name = xstrdup (cc->udir_name);
>  
>    /* clear the string pointers */
> -  prev_store_dir = strdup ("");
> +  prev_store_dir = xstrdup ("");
>    store_ptr = NULL;
>    target_name = NULL;
>    data_desc = NULL;
> @@ -408,11 +408,11 @@ char *
>  Coll_Ctrl::enable_expt ()
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (cpu_clk_freq == 0)
> -    return strdup (GTXT ("Can not determine CPU clock frequency.\n"));
> +    return xstrdup (GTXT ("Can not determine CPU clock frequency.\n"));
>    if (sys_resolution == 0)
> -    return strdup (GTXT ("System clock profile resolution can not be determined.\n"));
> +    return xstrdup (GTXT ("System clock profile resolution can not be determined.\n"));
>    enabled = 1;
>    return NULL;
>  }
> @@ -450,14 +450,14 @@ Coll_Ctrl::check_consistency ()
>  {
>    /* check for Java arguments, but not Java profiling */
>    if (java_args != NULL && java_mode == 0)
> -    return strdup (GTXT ("Java arguments can not be set if Java profiling is not enabled.\n"));
> +    return xstrdup (GTXT ("Java arguments can not be set if Java profiling is not enabled.\n"));
>  
>    /* if count data, no other data is allowed */
>    if (count_enabled != 0
>        && ((clkprof_default != 1 && clkprof_enabled != 0)
>  	  || hwcprof_enabled_cnt != 0 || synctrace_enabled != 0
>  	  || heaptrace_mode != NULL || iotrace_enabled != 0))
> -    return strdup (GTXT ("Count data cannot be collected along with any other data.\n"));
> +    return xstrdup (GTXT ("Count data cannot be collected along with any other data.\n"));
>  
>    /* if count data, various other options are not allowed */
>    if (count_enabled != 0
> @@ -466,10 +466,10 @@ Coll_Ctrl::check_consistency ()
>  	  || (follow_mode != 0 && follow_default != 1)
>  	  || pauseresume_sig != 0 || sample_sig != 0
>  	  || (sample_default != 1 && sample_period != 0) || time_run != 0))
> -    return strdup (GTXT ("Count data cannot be collected with any of -F -S -y -l -j -J -x -t .\n"));
> +    return xstrdup (GTXT ("Count data cannot be collected with any of -F -S -y -l -j -J -x -t .\n"));
>    /* if not count data, I and N options are not allowed */
>    if (count_enabled == 0 && (Iflag != 0 || Nflag != 0))
> -    return strdup (GTXT ("-I or -N can only be specified with count data.\n"));
> +    return xstrdup (GTXT ("-I or -N can only be specified with count data.\n"));
>    return NULL;
>  }
>  
> @@ -483,12 +483,12 @@ Coll_Ctrl::check_expt (char **warn)
>      return ret;
>    /* check for heaptrace and java -- warn that it covers native allocations only */
>    if (heaptrace_mode != NULL && java_mode == 1 && java_default == 0)
> -    *warn = strdup (GTXT ("Note: Heap profiling will only trace native allocations, not Java allocations.\n"));
> +    *warn = xstrdup (GTXT ("Note: Heap profiling will only trace native allocations, not Java allocations.\n"));
>  
>    /* if no profiling data selected, warn the user */
>    if (clkprof_enabled == 0 && hwcprof_enabled_cnt == 0 && synctrace_enabled == 0
>        && heaptrace_mode == NULL && iotrace_enabled == 0 && count_enabled == 0)
> -    *warn = strdup (GTXT ("Warning: No function level data requested; only statistics will be collected.\n\n"));
> +    *warn = xstrdup (GTXT ("Warning: No function level data requested; only statistics will be collected.\n\n"));
>    build_data_desc ();
>  
>    /* verify that the directory exists */
> @@ -677,22 +677,20 @@ char **
>  Coll_Ctrl::get_collect_args ()
>  {
>    char **p;
> -  char **argv = (char **) calloc (MAX_COLLECT_ARGS, sizeof (char *));
> -  if (argv == NULL) // poor way of dealing with calloc failure
> -    abort ();
> +  char **argv = (char **) xcalloc (MAX_COLLECT_ARGS, sizeof (char *));
>    p = argv;
> -  *p++ = strdup ("collect");
> +  *p++ = xstrdup ("collect");
>    if (debug_mode == 1)
> -    *p++ = strdup ("-x");
> +    *p++ = xstrdup ("-x");
>    if (clkprof_enabled != 0)
>      {
> -      *p++ = strdup ("-p");
> +      *p++ = xstrdup ("-p");
>        *p++ = dbe_sprintf ("%du", clkprof_timer);
>      }
>    if (hwcprof_enabled_cnt > 0)
>      {
>        StringBuilder sb;
> -      *p++ = strdup ("-h");
> +      *p++ = xstrdup ("-h");
>        for (int ii = 0; ii < hwcprof_enabled_cnt; ii++)
>  	{
>  	  char*rateString = hwc_rate_string (&hwctr[ii], 1); //"1" is for temporary goldfile compatibility. TBR YXXX!!
> @@ -711,90 +709,90 @@ Coll_Ctrl::get_collect_args ()
>      }
>    if (heaptrace_mode != NULL)
>      {
> -      *p++ = strdup ("-H");
> -      *p++ = strdup (heaptrace_mode);
> +      *p++ = xstrdup ("-H");
> +      *p++ = xstrdup (heaptrace_mode);
>      }
>    if (iotrace_enabled != 0)
>      {
> -      *p++ = strdup ("-i");
> -      *p++ = strdup ("on");
> +      *p++ = xstrdup ("-i");
> +      *p++ = xstrdup ("on");
>      }
>    if (synctrace_enabled != 0)
>      {
> -      *p++ = strdup ("-s");
> +      *p++ = xstrdup ("-s");
>        if (synctrace_thresh < 0)
> -	*p++ = strdup ("calibrate");
> +	*p++ = xstrdup ("calibrate");
>        else if (synctrace_thresh == 0)
> -	*p++ = strdup ("all");
> +	*p++ = xstrdup ("all");
>        else
>  	*p++ = dbe_sprintf ("%d", synctrace_thresh);
>        *p++ = dbe_sprintf (",%d", synctrace_scope);
>      }
>    if (follow_mode != 0)
>      {
> -      *p++ = strdup ("-F");
> +      *p++ = xstrdup ("-F");
>        char * fs = get_follow_usr_spec ();
>        if (fs)
> -	*p++ = strdup (fs);
> +	*p++ = xstrdup (fs);
>        else
>  	{
>  	  switch (get_follow_mode ())
>  	    {
>  	    case FOLLOW_ON:
> -	      *p++ = strdup ("on");
> +	      *p++ = xstrdup ("on");
>  	      break;
>  	    case FOLLOW_ALL:
> -	      *p++ = strdup ("all");
> +	      *p++ = xstrdup ("all");
>  	      break;
>  	    case FOLLOW_NONE:
>  	    default:
> -	      *p++ = strdup ("off");
> +	      *p++ = xstrdup ("off");
>  	      break;
>  	    }
>  	}
>      }
> -  *p++ = strdup ("-a");
> -  *p++ = strdup (get_archive_mode ());
> +  *p++ = xstrdup ("-a");
> +  *p++ = xstrdup (get_archive_mode ());
>    if (java_mode != 0)
>      {
> -      *p++ = strdup ("-j");
> -      *p++ = strdup ("on");
> +      *p++ = xstrdup ("-j");
> +      *p++ = xstrdup ("on");
>      }
>    if (pauseresume_sig != 0)
>      {
> -      *p++ = strdup ("-y");
> +      *p++ = xstrdup ("-y");
>        *p++ = dbe_sprintf ("%d%s", pauseresume_sig,
>  			  (pauseresume_pause == 0 ? ",r" : ""));
>      }
>    if (sample_sig != 0)
>      {
> -      *p++ = strdup ("-l");
> +      *p++ = xstrdup ("-l");
>        *p++ = dbe_sprintf ("%d", sample_sig);
>      }
>    if (sample_period != 0)
>      {
> -      *p++ = strdup ("-S");
> +      *p++ = xstrdup ("-S");
>        *p++ = dbe_sprintf ("%d", sample_period);
>      }
>    if (size_limit != 0)
>      {
> -      *p++ = strdup ("-L");
> +      *p++ = xstrdup ("-L");
>        *p++ = dbe_sprintf ("%d", size_limit);
>      }
>    if (expt_group != NULL)
>      {
> -      *p++ = strdup ("-g");
> -      *p++ = strdup (expt_group);
> +      *p++ = xstrdup ("-g");
> +      *p++ = xstrdup (expt_group);
>      }
>    if (udir_name != 0)
>      {
> -      *p++ = strdup ("-d");
> -      *p++ = strdup (udir_name);
> +      *p++ = xstrdup ("-d");
> +      *p++ = xstrdup (udir_name);
>      }
>    if (expt_name != 0)
>      {
> -      *p++ = strdup ("-o");
> -      *p++ = strdup (expt_name);
> +      *p++ = xstrdup ("-o");
> +      *p++ = xstrdup (expt_name);
>      }
>    if (p - argv >= MAX_COLLECT_ARGS) // argument list too small -- fatal error
>      abort ();
> @@ -852,10 +850,10 @@ Coll_Ctrl::set_clkprof (const char *string, char** warn)
>    int prevclkprof_default;
>    *warn = NULL;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    /* if the first character is a +, warn user that it is no longer supported */
>    if (string[0] == '+')
> -    return strdup (GTXT ("Warning: clock-based memoryspace and dataspace profiling is no longer supported\n"));
> +    return xstrdup (GTXT ("Warning: clock-based memoryspace and dataspace profiling is no longer supported\n"));
>    if (strcmp (string, "off") == 0)
>      {
>        clkprof_enabled = 0;
> @@ -946,7 +944,7 @@ char *
>  Coll_Ctrl::set_synctrace (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    char *comma_p = NULL;
>    if (string == NULL)
>      {
> @@ -962,7 +960,7 @@ Coll_Ctrl::set_synctrace (const char *string)
>  	}
>        return NULL;
>      }
> -  char *val = strdup (string);
> +  char *val = xstrdup (string);
>    /* see if there's a comma in the string */
>    char *next = strchr (val, (int) ',');
>    if (next != NULL)
> @@ -1042,14 +1040,14 @@ char *
>  Coll_Ctrl::set_heaptrace (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    free(heaptrace_mode);
>    heaptrace_mode = NULL;  // Same as "off"
>    if (string != NULL && strcmp (string, "off") == 0)
>      return NULL;
>  
>    if (string == NULL || strlen (string) == 0 || strcmp (string, "on") == 0)
> -    heaptrace_mode = strdup ("on");
> +    heaptrace_mode = xstrdup ("on");
>    else if (isdigit (*string))
>      {
>        char *s;
> @@ -1064,7 +1062,7 @@ Coll_Ctrl::set_heaptrace (const char *string)
>        if (*s != 0)
>  	return dbe_sprintf (
>  	       GTXT ("Incorrect range in heap trace parameter '%s'\n"), string);
> -      heaptrace_mode = strdup (string);
> +      heaptrace_mode = xstrdup (string);
>      }
>    else
>      return dbe_sprintf (GTXT ("Unrecognized heap tracing parameter `%s'\n"),
> @@ -1083,7 +1081,7 @@ char *
>  Coll_Ctrl::set_iotrace (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0 || strcmp (string, "on") == 0)
>      {
>        iotrace_enabled = 1;
> @@ -1108,7 +1106,7 @@ Coll_Ctrl::set_count (const char *string)
>  {
>    int ret = -1;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0 || strcmp (string, "off") == 0)
>      {
>        count_enabled = 0;
> @@ -1161,9 +1159,9 @@ char *
>  Coll_Ctrl::set_time_run (const char *valarg)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (valarg == NULL) /* invalid setting */
> -    return strdup (GTXT ("time parameter can not be NULL\n"));
> +    return xstrdup (GTXT ("time parameter can not be NULL\n"));
>    /* the string should be a number >= 0 */
>    int prev_start_delay = start_delay;
>    int prev_time_run = time_run;
> @@ -1233,9 +1231,9 @@ char *
>  Coll_Ctrl::set_attach_pid (char *valarg)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (valarg == NULL)
> -    return strdup (GTXT ("Specified PID can not be NULL\n"));
> +    return xstrdup (GTXT ("Specified PID can not be NULL\n"));
>  
>    /* the string should be a number corresponding to an active process' pid */
>    char *endchar = NULL;
> @@ -1269,19 +1267,19 @@ Coll_Ctrl::hwcentry_dup (Hwcentry *hnew, Hwcentry *_hwc)
>  {
>    *hnew = *_hwc;
>    if (_hwc->name != NULL)
> -    hnew->name = strdup (_hwc->name);
> +    hnew->name = xstrdup (_hwc->name);
>    else
>      hnew->name = NULL;
>    if (_hwc->int_name != NULL)
> -    hnew->int_name = strdup (_hwc->int_name);
> +    hnew->int_name = xstrdup (_hwc->int_name);
>    else
>      hnew->int_name = NULL;
>    if (_hwc->metric != NULL)
> -    hnew->metric = strdup (_hwc->metric);
> +    hnew->metric = xstrdup (_hwc->metric);
>    else
>      hnew->metric = NULL;
>    if (_hwc->short_desc != NULL)
> -    hnew->short_desc = strdup (_hwc->short_desc);
> +    hnew->short_desc = xstrdup (_hwc->short_desc);
>    else
>      hnew->short_desc = NULL;
>  }
> @@ -1378,7 +1376,7 @@ Coll_Ctrl::add_hwcstring (const char *string, char **warnmsg)
>    char *emsg;
>    char *wmsg;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (hwcprof_default == 0)
>      {
>        /* Copy the counters already defined */
> @@ -1472,14 +1470,12 @@ Coll_Ctrl::add_default_hwcstring (const char *resolution, char **warnmsg, bool a
>      }
>    /* allocate return string */
>    int retsize = 2 * len + 10;
> -  char *ret = (char *) malloc (retsize);
> -  if (ret == NULL)
> -    return strdup (GTXT ("internal error formating HW counter set; malloc failed\n"));
> +  char *ret = (char *) xmalloc (retsize);
>    *ret = 0;
>    char *retp = ret;
>    char *stringp = def_string;
>    int first = 1;
> -  char *hwc_defaultx = strdup (def_string);
> +  char *hwc_defaultx = xstrdup (def_string);
>  
>    /* now massage the string in order to insert resolution for each counter */
>    for (;;)
> @@ -1608,7 +1604,7 @@ Coll_Ctrl::set_sample_period (const char *string)
>  {
>    int val;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strcmp (string, "on") == 0)
>      val = 1;
>    else if (strcmp (string, "off") == 0)
> @@ -1638,7 +1634,7 @@ char *
>  Coll_Ctrl::set_size_limit (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0
>        || strcmp (string, "unlimited") == 0 || strcmp (string, "none") == 0)
>      {
> @@ -1776,7 +1772,7 @@ Coll_Ctrl::join_group ()
>  	  if (uinterrupt == 1)
>  	    {
>  	      close (groupfd);
> -	      return strdup (GTXT ("user interrupt\n"));
> +	      return xstrdup (GTXT ("user interrupt\n"));
>  	    }
>  	  // it's opened, now lock it
>  	  if (fcntl (groupfd, F_SETLK, &flockbuf) != -1)
> @@ -1820,7 +1816,7 @@ Coll_Ctrl::join_group ()
>  	      // can't get the lock, close the file and try again
>  	      close (groupfd);
>  	      if (uinterrupt == 1)
> -		return strdup (GTXT ("user interrupt\n"));
> +		return xstrdup (GTXT ("user interrupt\n"));
>  	      if (tries == 11900)
>  		return dbe_sprintf (GTXT ("Timed out: waiting for group file %s\n"), group_file);
>  #if 0
> @@ -1883,7 +1879,7 @@ Coll_Ctrl::set_directory (char *dir, char **warn)
>    struct stat statbuf;
>    *warn = NULL;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (stat (dir, &statbuf) != 0)
>      return dbe_sprintf (GTXT ("Can't set directory `%s': %s\n"),
>  			dir, strerror (errno));
> @@ -1891,7 +1887,7 @@ Coll_Ctrl::set_directory (char *dir, char **warn)
>      return dbe_sprintf (GTXT ("Can't set directory `%s': %s\n"),
>  			dir, strerror (ENOTDIR));
>    free (udir_name);
> -  udir_name = strdup (dir);
> +  udir_name = xstrdup (dir);
>  
>    // Process new setting
>    *warn = preprocess_names ();
> @@ -1922,14 +1918,14 @@ Coll_Ctrl::set_target (char* targetname)
>    free (target_name);
>    target_name = NULL;
>    if (targetname != NULL)
> -    target_name = strdup (targetname);
> +    target_name = xstrdup (targetname);
>    return 0;
>  }
>  
>  void
>  Coll_Ctrl::set_default_stem (const char* stem)
>  {
> -  default_stem = strdup (stem);
> +  default_stem = xstrdup (stem);
>    preprocess_names ();
>    (void) update_expt_name (false, false); // no warnings
>  }
> @@ -1944,7 +1940,7 @@ Coll_Ctrl::set_expt (const char *ename, char **warn, bool overwriteExp)
>        uexpt_name = NULL;
>        return NULL;
>      }
> -  char *exptname = canonical_path (strdup (ename));
> +  char *exptname = canonical_path (xstrdup (ename));
>    size_t i = strlen (exptname);
>    if (i < 4 || strcmp (&exptname[i - 3], ".er") != 0)
>      {
> @@ -1980,7 +1976,7 @@ char *
>  Coll_Ctrl::set_group (char *groupname)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (expt_group != NULL)
>      {
>        free (expt_group);
> @@ -1996,7 +1992,7 @@ Coll_Ctrl::set_group (char *groupname)
>    int i = (int) strlen (groupname);
>    if (i < 5 || strcmp (&groupname[i - 4], ".erg") != 0)
>      return dbe_sprintf (GTXT ("Experiment group name `%s'must end in `.erg'\n"), groupname);
> -  expt_group = strdup (groupname);
> +  expt_group = xstrdup (groupname);
>    preprocess_names ();
>    (void) update_expt_name (true, false);
>    return NULL;
> @@ -2007,7 +2003,7 @@ Coll_Ctrl::set_java_mode (const char *string)
>  {
>    struct stat statbuf;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0 || strcmp (string, "on") == 0)
>      {
>  #if defined(GPROFNG_JAVA_PROFILING)
> @@ -2024,7 +2020,7 @@ Coll_Ctrl::set_java_mode (const char *string)
>  	}
>        return NULL;
>  #else
> -      return strdup (GTXT ("gprofng was built without support for profiling Java applications\n"));
> +      return xstrdup (GTXT ("gprofng was built without support for profiling Java applications\n"));
>  #endif
>      }
>    if (strcmp (string, "off") == 0)
> @@ -2071,9 +2067,9 @@ char *
>  Coll_Ctrl::set_java_path (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    free (java_path);
> -  java_path = strdup (string);
> +  java_path = xstrdup (string);
>    return NULL;
>  }
>  
> @@ -2082,12 +2078,12 @@ Coll_Ctrl::set_java_args (char *string)
>  {
>    char *next;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    char *prev_java_args = java_args;
>    if (string == NULL || strlen (string) == 0)
> -    java_args = strdup ("");
> +    java_args = xstrdup ("");
>    else
> -    java_args = strdup (string);
> +    java_args = xstrdup (string);
>    // now count the number of Java arguments
>    for (next = java_args; *next; next++)
>      {
> @@ -2116,7 +2112,7 @@ char *
>  Coll_Ctrl::set_follow_mode (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    free (follow_spec_usr);
>    free (follow_spec_cmp);
>    follow_spec_usr = NULL;
> @@ -2143,18 +2139,13 @@ Coll_Ctrl::set_follow_mode (const char *string)
>        int ercode;
>        const char *userspec = &string[1];
>        size_t newstrlen = strlen (userspec) + 3;
> -      char * str = (char *) malloc (newstrlen);
> -      if (str)
> -	{
> -	  snprintf (str, newstrlen, "^%s$", userspec);
> -	  assert (strlen (str) == newstrlen - 1);
> -	  ercode = regcomp (&regex_desc, str, REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
> -	}
> -      else
> -	ercode = 1;
> +      char * str = (char *) xmalloc (newstrlen);
> +      snprintf (str, newstrlen, "^%s$", userspec);
> +      assert (strlen (str) == newstrlen - 1);
> +      ercode = regcomp (&regex_desc, str, REG_EXTENDED | REG_NOSUB | REG_NEWLINE);
>        if (!ercode)
>  	{
> -	  follow_spec_usr = strdup (string);
> +	  follow_spec_usr = xstrdup (string);
>  	  /* Ideally, follow_spec_cmp = [serialized regex_desc], */
>  	  /* so that libcollector wouldn't have to recompile it. */
>  	  /* For now, just copy the regular expression into follow_spec_cmp */
> @@ -2173,7 +2164,7 @@ char *
>  Coll_Ctrl::set_prof_idle (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0 || strcmp (string, "on") == 0)
>      {
>        prof_idle = 1;
> @@ -2191,7 +2182,7 @@ char *
>  Coll_Ctrl::set_archive_mode (const char *string)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (string == NULL || strlen (string) == 0)
>      string = "on";
>    if (strcasecmp (string, "on") == 0 || strcasecmp (string, "off") == 0
> @@ -2201,7 +2192,7 @@ Coll_Ctrl::set_archive_mode (const char *string)
>        || strcasecmp (string, "all") == 0)
>      {
>        free (archive_mode);
> -      archive_mode = strdup (string);
> +      archive_mode = xstrdup (string);
>        return NULL;
>      }
>    return dbe_sprintf (GTXT ("Unrecognized archive-mode parameter `%s'\n"), string);
> @@ -2212,7 +2203,7 @@ Coll_Ctrl::set_sample_signal (int value)
>  {
>    const char *buf;
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (value == 0)
>      {
>        sample_sig = 0;
> @@ -2241,9 +2232,7 @@ Coll_Ctrl::find_sig (const char *string)
>    if (strncmp (string, "SIG", 3) != 0)
>      {
>        // no: add it
> -      signame_alloc = (char *) malloc (strlen (string) + 3 + 1);
> -      if (signame_alloc == NULL)
> -	return -1;
> +      signame_alloc = (char *) xmalloc (strlen (string) + 3 + 1);
>        strcpy (signame_alloc, "SIG");
>        strcpy (&signame_alloc[3], string);
>        signame = signame_alloc;
> @@ -2266,7 +2255,7 @@ char *
>  Coll_Ctrl::set_pauseresume_signal (int value, int resume)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    if (value == 0)
>      {
>        pauseresume_sig = 0;
> @@ -2299,7 +2288,7 @@ char *
>  Coll_Ctrl::set_debug_mode (int value)
>  {
>    if (opened == 1)
> -    return strdup (GTXT ("Experiment is active; command ignored.\n"));
> +    return xstrdup (GTXT ("Experiment is active; command ignored.\n"));
>    debug_mode = value;
>    return NULL;
>  }
> @@ -2373,7 +2362,7 @@ Coll_Ctrl::preprocess_names ()
>      }
>    expno = 1;
>    if (uexpt_name != NULL)
> -    expt_name = strdup (uexpt_name);
> +    expt_name = xstrdup (uexpt_name);
>    else
>      {
>        // no user name -- pick a default
> @@ -2382,12 +2371,12 @@ Coll_Ctrl::preprocess_names ()
>        char *stembase;
>        if (expt_group == NULL)
>  	{
> -	  stem = strdup (default_stem);
> +	  stem = xstrdup (default_stem);
>  	  stembase = stem;
>  	}
>        else
>  	{
> -	  stem = strdup (expt_group);
> +	  stem = xstrdup (expt_group);
>  	  stem[strlen (stem) - 4] = 0;
>  	  stembase = stem;
>  	  // now remove any leading directory
> @@ -2401,7 +2390,7 @@ Coll_Ctrl::preprocess_names ()
>  	  if (strlen (stembase) == 0)
>  	    {
>  	      free (stem);
> -	      stem = strdup (default_stem);
> +	      stem = xstrdup (default_stem);
>  	      stembase = stem;
>  	    }
>  	}
> @@ -2417,35 +2406,35 @@ Coll_Ctrl::preprocess_names ()
>    char *s = strrchr (expt_name, '/');
>    if (s == NULL)
>      {
> -      expt_dir = strdup (".");
> -      base_name = strdup (expt_name);
> +      expt_dir = xstrdup (".");
> +      base_name = xstrdup (expt_name);
>      }
>    else
>      {
>        expt_dir = dbe_strndup (expt_name, s - expt_name);
> -      base_name = strdup (s + 1);
> +      base_name = xstrdup (s + 1);
>      }
>  
>    if (expt_dir[0] == '/')
> -    store_dir = strdup (expt_dir);
> +    store_dir = xstrdup (expt_dir);
>    else if ((udir_name == NULL) || (udir_name[0] == 0))
>      {
>        if (expt_dir[0] == 0)
> -	store_dir = strdup (".");
> +	store_dir = xstrdup (".");
>        else
> -	store_dir = strdup (expt_dir);
> +	store_dir = xstrdup (expt_dir);
>      }
>    else
>      {
>        /* udir_name is a non-empty string */
>        if (expt_dir[0] == 0)
> -	store_dir = strdup (udir_name);
> +	store_dir = xstrdup (udir_name);
>        else
>  	store_dir = dbe_sprintf ("%s/%s", udir_name, expt_dir);
>      }
>    free (store_ptr);
>    if (strcmp (store_dir, ".") == 0)
> -    store_ptr = strdup (base_name);
> +    store_ptr = xstrdup (base_name);
>    else
>      store_ptr = dbe_sprintf ("%s/%s", store_dir, base_name);
>  
> @@ -2453,7 +2442,7 @@ Coll_Ctrl::preprocess_names ()
>    if (strcmp (store_dir, prev_store_dir) != 0)
>      {
>        free (prev_store_dir);
> -      prev_store_dir = strdup (store_dir);
> +      prev_store_dir = xstrdup (store_dir);
>        const char *fstype = get_fstype (store_dir);
>        if (interactive && enabled && (fstype != NULL) && (nofswarn == 0))
>  	sb.appendf (GTXT ("Experiment directory is set to a file system of type \"%s\",\n"
> @@ -2513,7 +2502,7 @@ Coll_Ctrl::update_expt_name (bool chgmsg, bool chkonly, bool newname)
>      return NULL;
>  
>    // save the name for a changed message
> -  char *oldbase = strdup (base_name);
> +  char *oldbase = xstrdup (base_name);
>  
>    // the name is of the from prefix.nnn.er; extract the value of nnn
>    int version = atoi (&base_name[pcount + 1]);
> @@ -2568,17 +2557,17 @@ Coll_Ctrl::update_expt_name (bool chgmsg, bool chkonly, bool newname)
>    else
>      free (oldbase);
>    free (base_name);
> -  base_name = strdup (newbase);
> +  base_name = xstrdup (newbase);
>  
>    // now, reset expt_name to reflect new setting
>    free (expt_name);
>    if (expt_dir[0] == 0)
> -    expt_name = strdup (base_name);
> +    expt_name = xstrdup (base_name);
>    else
>      expt_name = dbe_sprintf ("%s/%s", expt_dir, base_name);
>    free (store_ptr);
>    if (strcmp (store_dir, ".") == 0)
> -    store_ptr = strdup (base_name);
> +    store_ptr = xstrdup (base_name);
>    else
>      store_ptr = dbe_sprintf ("%s/%s", store_dir, base_name);
>    closedir (dir);
> @@ -2712,7 +2701,7 @@ Coll_Ctrl::find_signal_name (int signal)
>    char *str_signal = NULL;
>    const char *buf = strsignal (signal);
>    if (buf != NULL)
> -    str_signal = strdup (buf);
> +    str_signal = xstrdup (buf);
>    return str_signal;
>  }
>  
> @@ -2729,7 +2718,7 @@ Coll_Ctrl::get (char * control)
>      {
>        if ((size_limit > 0))
>  	return dbe_sprintf ("%d", size_limit);
> -      return strdup (ipc_str_unlimited);
> +      return xstrdup (ipc_str_unlimited);
>      }
>    if (!strncmp (control, ipc_str_time_limit, len))
>      {
> @@ -2743,67 +2732,67 @@ Coll_Ctrl::get (char * control)
>  	    }
>  	  return dbe_sprintf ("0s-%ds", time_run);
>  	}
> -      return strdup (ipc_str_unlimited);
> +      return xstrdup (ipc_str_unlimited);
>      }
>    if (strncmp (control, ipc_str_arch_exp, len) == 0)
> -    return strdup (get_archive_mode ());
> +    return xstrdup (get_archive_mode ());
>    if (!strncmp (control, ipc_str_descendant, len))
>      {
>        switch (get_follow_mode ())
>  	{
>  	case FOLLOW_ON:
> -	  return strdup (ipc_str_on);
> +	  return xstrdup (ipc_str_on);
>  	case FOLLOW_ALL:
> -	  return strdup (ipc_str_on);
> +	  return xstrdup (ipc_str_on);
>  	case FOLLOW_NONE:
>  	default:
> -	  return strdup (ipc_str_off);
> +	  return xstrdup (ipc_str_off);
>  	}
>      }
>    if (!strncmp (control, ipc_str_prof_idle, len))
>      {
>        if (prof_idle == 0)
> -	return strdup (ipc_str_off);
> -      return strdup (ipc_str_on);
> +	return xstrdup (ipc_str_off);
> +      return xstrdup (ipc_str_on);
>      }
>    if (!strncmp (control, ipc_str_clkprof, len))
>      {
>        if (clkprof_default == 1 && clkprof_enabled == 1) // Default value
> -	return strdup (ipc_str_empty);
> +	return xstrdup (ipc_str_empty);
>        if (clkprof_enabled == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        if ((clkprof_timer > 0))
>  	return dbe_sprintf ("%d", clkprof_timer / 1000);
> -      return strdup (ipc_str_internal_error);
> +      return xstrdup (ipc_str_internal_error);
>      }
>    if (!strncmp (control, ipc_str_hwcprof, len))
>      {
>        if (hwcprof_enabled_cnt == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        if (hwc_string != NULL)
>  	return dbe_sprintf ("on\n%s", hwc_string);
> -      return strdup (ipc_str_on); // XXX need more details?
> +      return xstrdup (ipc_str_on); // XXX need more details?
>      }
>    if (!strncmp (control, ipc_str_javaprof, len))
>      {
>        if (java_mode == 0)
> -	return strdup (ipc_str_off);
> -      return strdup (ipc_str_on);
> +	return xstrdup (ipc_str_off);
> +      return xstrdup (ipc_str_on);
>      }
>    if (!strncmp (control, ipc_str_sample, len))
>      {
>        if (sample_default == 1 && sample_period == 1) // Default value
> -	return strdup (ipc_str_empty);
> +	return xstrdup (ipc_str_empty);
>        if (sample_period == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        if (sample_period > 0)
>  	return dbe_sprintf ("%d", sample_period);
> -      return strdup (ipc_str_internal_error);
> +      return xstrdup (ipc_str_internal_error);
>      }
>    if (!strncmp (control, ipc_str_sample_sig, len))
>      {
>        if (sample_sig == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        char *str_signal = find_signal_name (sample_sig);
>        if (str_signal != NULL)
>  	return str_signal;
> @@ -2812,7 +2801,7 @@ Coll_Ctrl::get (char * control)
>    if (!strncmp (control, ipc_str_pause_resume_sig, len))
>      {
>        if (pauseresume_sig == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        char *str_signal = find_signal_name (pauseresume_sig);
>        if (str_signal != NULL)
>  	return str_signal;
> @@ -2821,34 +2810,34 @@ Coll_Ctrl::get (char * control)
>    if (!strncmp (control, ipc_str_synctrace, len))
>      {
>        if (synctrace_enabled == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        if (synctrace_thresh < 0)
> -	return strdup ("on\nthreshold: calibrate");
> +	return xstrdup ("on\nthreshold: calibrate");
>        if (synctrace_thresh == 0)
> -	return strdup ("on\nthreshold: all");
> +	return xstrdup ("on\nthreshold: all");
>        return dbe_sprintf ("on\nthreshold: %d", synctrace_thresh);
>      }
>    if (!strncmp (control, ipc_str_heaptrace, len))
>      {
>        if (heaptrace_mode == NULL)
> -	return strdup (ipc_str_off);
> -      return strdup (ipc_str_on);
> +	return xstrdup (ipc_str_off);
> +      return xstrdup (ipc_str_on);
>      }
>    if (!strncmp (control, ipc_str_iotrace, len))
>      {
>        if (iotrace_enabled == 0)
> -	return strdup (ipc_str_off);
> -      return strdup (ipc_str_on);
> +	return xstrdup (ipc_str_off);
> +      return xstrdup (ipc_str_on);
>      }
>    if (!strncmp (control, ipc_str_count, len))
>      {
>        if (count_enabled == 0)
> -	return strdup (ipc_str_off);
> +	return xstrdup (ipc_str_off);
>        if (count_enabled < 0)
> -	return strdup ("on\nstatic");
> -      return strdup (ipc_str_on);
> +	return xstrdup ("on\nstatic");
> +      return xstrdup (ipc_str_on);
>      }
> -  return strdup (ipc_str_unknown_control);
> +  return xstrdup (ipc_str_unknown_control);
>  }
>  
>  /**
> @@ -2914,7 +2903,7 @@ Coll_Ctrl::set (char * control, const char * value)
>      return set_sample_signal (find_sig (value));
>    if (!strncmp (control, ipc_str_pause_resume_sig, len))
>      {
> -      char *str_signal = strdup (value);
> +      char *str_signal = xstrdup (value);
>        char *str_state = strchr (str_signal, (int) '\n');
>        if (str_state != NULL)
>  	{
> @@ -2936,7 +2925,7 @@ Coll_Ctrl::set (char * control, const char * value)
>      return set_iotrace (value);
>    if (!strncmp (control, ipc_str_count, len))
>      return set_count (value);
> -  return strdup (ipc_str_unknown_control);
> +  return xstrdup (ipc_str_unknown_control);
>  }
>  
>  /**
> @@ -2957,7 +2946,7 @@ Coll_Ctrl::unset (char * control)
>      }
>    if (!strncmp (control, ipc_str_arch_exp, len))
>      {
> -      archive_mode = strdup ("on");
> +      archive_mode = xstrdup ("on");
>        return NULL;
>      }
>    if (!strncmp (control, ipc_str_descendant, len))
> @@ -3031,12 +3020,12 @@ Coll_Ctrl::unset (char * control)
>        Nflag = 0;
>        return NULL;
>      }
> -  return strdup (ipc_str_unknown_control);
> +  return xstrdup (ipc_str_unknown_control);
>  }
>  
>  void
>  Coll_Ctrl::set_project_home (char *s)
>  {
>    if (s)
> -    project_home = strdup (s);
> +    project_home = xstrdup (s);
>  }
> diff --git a/gprofng/src/comp_com.c b/gprofng/src/comp_com.c
> index 79d14eb22cc..636bcf36705 100644
> --- a/gprofng/src/comp_com.c
> +++ b/gprofng/src/comp_com.c
> @@ -25,6 +25,7 @@
>  #include <values.h>
>  #include <assert.h>
>  
> +#include "libiberty.h"
>  #include "comp_com.h"
>  
>  /*
> @@ -839,9 +840,7 @@ ccm_vis_init ()
>      return;
>    done = 1;
>    size = ccm_vis_index ((COMPMSG_ID) (CCMV_BASIC << 8));
> -  ccm_attrs = (Ccm_Attr_t *) calloc (size, sizeof (Ccm_Attr_t));
> -  if (ccm_attrs == NULL)
> -    exit (1);
> +  ccm_attrs = (Ccm_Attr_t *) xcalloc (size, sizeof (Ccm_Attr_t));
>    vindex = ccm_vis_index (CCM_MODDATE);
>    ccm_attrs[vindex].vis = CCMV_VER | CCMV_BASIC | CCMV_UNIMPL;
>    ccm_attrs[vindex].name = "CCM_MODDATE";
> diff --git a/gprofng/src/count.cc b/gprofng/src/count.cc
> index 41fa092c097..42f990e0e12 100644
> --- a/gprofng/src/count.cc
> +++ b/gprofng/src/count.cc
> @@ -33,6 +33,7 @@
>  #include <collctrl.h>
>  #include <StringBuilder.h>
>  #include "collect.h"
> +#include "libiberty.h"
>  
>  /* get_count_data -- format exec of bit to do the real work */
>  void
> @@ -44,7 +45,7 @@ collect::get_count_data ()
>  
>    // reserve space for original args, plus 30 arguments to bit
>    nargs = origargc + 30;
> -  char **narglist = (char **) calloc (nargs, sizeof (char *));
> +  char **narglist = (char **) xcalloc (nargs, sizeof (char *));
>    arglist = narglist;
>  
>    // construct the command for bit
> @@ -57,7 +58,7 @@ collect::get_count_data ()
>        if (stat (command, &statbuf) == -1)
>  	{
>  	  // if bit command does not exist there
> -	  char *first_look = strdup (command);
> +	  char *first_look = xstrdup (command);
>  	  snprintf (command, sizeof (command), NTXT ("%s"), run_dir);
>  	  s = strstr (command, NTXT ("/bin"));
>  	  snprintf (s, sizeof (command) - (s - command), NTXT ("/prod/bin/bit"));
> @@ -69,7 +70,7 @@ collect::get_count_data ()
>  	    }
>  	  free (first_look);
>  	}
> -      *arglist++ = strdup (command);
> +      *arglist++ = xstrdup (command);
>      }
>    else
>      {
> diff --git a/gprofng/src/dbe_hwc.h b/gprofng/src/dbe_hwc.h
> index 951ebaf7479..c303ac8dc41 100644
> --- a/gprofng/src/dbe_hwc.h
> +++ b/gprofng/src/dbe_hwc.h
> @@ -24,8 +24,14 @@
>  #include <stdio.h>
>  #include <stdarg.h>
>  
> +#include "libiberty.h"
>  #include "i18n.h"
>  
> +#define malloc(s) xmalloc (s)
> +#define realloc(p, s) xrealloc (p, s)
> +#define calloc(n, s) xcalloc (n, s)
> +#define strdup(s) xstrdup (s)
> +
>  #define HWC_TRACELEVEL -1
>  #if HWC_TRACELEVEL < 0
>  #define TprintfT(x1,...)
> diff --git a/gprofng/src/dbe_memmgr.c b/gprofng/src/dbe_memmgr.c
> deleted file mode 100644
> index 8c451cfb165..00000000000
> --- a/gprofng/src/dbe_memmgr.c
> +++ /dev/null
> @@ -1,118 +0,0 @@
> -/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
> -   Contributed by Oracle.
> -
> -   This file is part of GNU Binutils.
> -
> -   This program is free software; you can redistribute it and/or modify
> -   it under the terms of the GNU General Public License as published by
> -   the Free Software Foundation; either version 3, or (at your option)
> -   any later version.
> -
> -   This program is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> -   GNU General Public License for more details.
> -
> -   You should have received a copy of the GNU General Public License
> -   along with this program; if not, write to the Free Software
> -   Foundation, 51 Franklin Street - Fifth Floor, Boston,
> -   MA 02110-1301, USA.  */
> -
> -#include "config.h"
> -#include <dlfcn.h>
> -#include "util.h"
> -
> -#define CHECK_OUT_OF_MEM(ptr, size) if (ptr == NULL) err_out_of_memory(size)
> -
> -/* Report Out of Memory error and exit */
> -static void
> -err_out_of_memory (unsigned nbytes)
> -{
> -  char *nm = get_prog_name (1);
> -  if (nm)
> -    fprintf (stderr, GTXT ("%s: Error: Memory capacity exceeded.\n"), nm);
> -  else
> -    fprintf (stderr, GTXT ("Error: Memory capacity exceeded.\n"));
> -  fprintf (stderr, GTXT ("  Requested %u bytes.\n"), nbytes);
> -  exit (16);
> -}
> -
> -#define CALL_REAL(x) (__real_##x)
> -#define NULL_PTR(x) ( __real_##x == NULL )
> -
> -static void *(*__real_malloc)(size_t) = NULL;
> -static void (*__real_free)(void *) = NULL;
> -static void *(*__real_realloc)(void *, size_t) = NULL;
> -static void *(*__real_calloc)(size_t, size_t) = NULL;
> -static char *(*__real_strdup)(const char*) = NULL;
> -static volatile int in_init = 0;
> -
> -static int
> -init_heap_intf ()
> -{
> -  in_init = 1;
> -  __real_malloc = (void*(*)(size_t))dlsym (RTLD_NEXT, "malloc");
> -  __real_free = (void(*)(void *))dlsym (RTLD_NEXT, "free");
> -  __real_realloc = (void*(*)(void *, size_t))dlsym (RTLD_NEXT, "realloc");
> -  __real_calloc = (void*(*)(size_t, size_t))dlsym (RTLD_NEXT, "calloc");
> -  __real_strdup = (char*(*)(const char*))dlsym (RTLD_NEXT, "strdup");
> -  in_init = 0;
> -  return 0;
> -}
> -
> -/* --------------------------------------------------------------------------- */
> -/* libc's memory management functions substitutions */
> -
> -/* Allocate memory and make sure we got some */
> -void *
> -malloc (size_t size)
> -{
> -  if (NULL_PTR (malloc))
> -    init_heap_intf ();
> -  void *ptr = CALL_REAL (malloc)(size);
> -  CHECK_OUT_OF_MEM (ptr, size);
> -  return ptr;
> -}
> -
> -
> -/* Implement a workaround for a libdl recursion problem */
> -void *
> -calloc (size_t nelem, size_t size)
> -{
> -  if (NULL_PTR (calloc))
> -    {
> -      /* If a program is linked with libpthread then the following
> -       * calling sequence occurs:
> -       * init_heap_intf -> dlsym -> calloc -> malloc -> init_heap_intf
> -       * We break some performance improvement in libdl by returning
> -       * NULL but preserve functionality.
> -       */
> -      if (in_init)
> -	return NULL;
> -      init_heap_intf ();
> -    }
> -  return CALL_REAL (calloc)(nelem, size);
> -}
> -
> -/* Free the storage associated with data */
> -void
> -free (void *ptr)
> -{
> -  if (ptr == NULL)
> -    return;
> -  if (NULL_PTR (free))
> -    init_heap_intf ();
> -  CALL_REAL (free)(ptr);
> -  return;
> -}
> -
> -/* Reallocate buffer */
> -void *
> -realloc (void *ptr, size_t size)
> -{
> -  if (NULL_PTR (realloc))
> -    init_heap_intf ();
> -  ptr = CALL_REAL (realloc)(ptr, size);
> -  CHECK_OUT_OF_MEM (ptr, size);
> -  return ptr;
> -}
> diff --git a/gprofng/src/envsets.cc b/gprofng/src/envsets.cc
> index 70510fbd4bd..b7d3d9da0ef 100644
> --- a/gprofng/src/envsets.cc
> +++ b/gprofng/src/envsets.cc
> @@ -136,7 +136,7 @@ int
>  collect::putenv_libcollector_ld_misc ()
>  {
>  #if 0 // XXX 1 turns on LD_DEBUG
> -  putenv (strdup ("LD_DEBUG=audit,bindings,detail"));
> +  putenv (xstrdup ("LD_DEBUG=audit,bindings,detail"));
>  #endif
>    // workaround to have the dynamic linker use absolute names
>    if (add_env (dbe_strdup ("LD_ORIGIN=yes")))
> @@ -156,7 +156,7 @@ collect::putenv_libcollector_ld_misc ()
>    if (ev)
>      { /* GPROFNG_PRELOAD_LIBDIRS is used only in the gprofng testing.
>         * Use these directories first.  */
> -      ev = strdup (ev);
> +      ev = xstrdup (ev);
>        for (char *s = ev; s;)
>  	{
>  	  char *s1 = strchr (s, ':');
> @@ -246,7 +246,7 @@ collect::add_ld_preload (const char *lib)
>      {
>        char *old_sp = sp_preload_list[ii];
>        if (old_sp == NULL)
> -	sp_preload_list[ii] = strdup (lib);
> +	sp_preload_list[ii] = xstrdup (lib);
>        else
>  	{
>  	  sp_preload_list[ii] = dbe_sprintf ("%s %s", old_sp, lib);
> diff --git a/gprofng/src/gp-archive.cc b/gprofng/src/gp-archive.cc
> index ff6816da6a2..9750db172c3 100644
> --- a/gprofng/src/gp-archive.cc
> +++ b/gprofng/src/gp-archive.cc
> @@ -528,7 +528,7 @@ er_archive::check_args (int argc, char *argv[])
>  	  if (dseen)
>  	    fprintf (stderr, GTXT ("Warning: option -d was specified several times. Last value is used.\n"));
>  	  free (common_archive_dir);
> -	  common_archive_dir = strdup (optarg);
> +	  common_archive_dir = xstrdup (optarg);
>  	  dseen = 1;
>  	  break;
>  	case 'q':
> @@ -546,7 +546,7 @@ er_archive::check_args (int argc, char *argv[])
>  	  if (rseen)
>  	    fprintf (stderr, GTXT ("Warning: option -r was specified several times. Last value is used.\n"));
>  	  free (common_archive_dir);
> -	  common_archive_dir = strdup (optarg);
> +	  common_archive_dir = xstrdup (optarg);
>  	  use_relative_path = 1;
>  	  rseen = 1;
>  	  break;
> @@ -667,7 +667,7 @@ er_archive::check_env_var ()
>      }
>    if (opts->size () > 0)
>      {
> -      char **arr = (char **) malloc (sizeof (char *) *opts->size ());
> +      char **arr = (char **) xmalloc (sizeof (char *) *opts->size ());
>        for (long i = 0; i < opts->size (); i++)
>  	arr[i] = opts->get (i);
>        if (-1 == check_args (opts->size (), arr))
> diff --git a/gprofng/src/gp-display-src.cc b/gprofng/src/gp-display-src.cc
> index 24af375edf1..c486e022316 100644
> --- a/gprofng/src/gp-display-src.cc
> +++ b/gprofng/src/gp-display-src.cc
> @@ -216,7 +216,7 @@ er_src::set_outfile (char *cmd, FILE *&set_file)
>        else if ((fname = strstr (cmd, "~")) != NULL && home != NULL)
>  	cmdpath = dbe_sprintf ("/home/%s", fname + 1);
>        else
> -	cmdpath = strdup (cmd);
> +	cmdpath = xstrdup (cmd);
>        new_file = fopen (cmdpath, "w");
>        if (new_file == NULL)
>  	{
> @@ -666,7 +666,7 @@ er_src::open (char *exe)
>    Vector<Histable*> *module_lst;
>  
>    // Construct the Segment structure
> -  char *path = strdup (exe);
> +  char *path = xstrdup (exe);
>    lo = dbeSession->createLoadObject (path);
>    if (NULL == lo->dbeFile->find_file (lo->dbeFile->get_name ()))
>      {
> diff --git a/gprofng/src/gp-display-text.cc b/gprofng/src/gp-display-text.cc
> index 3d7774a150a..4869affd3dc 100644
> --- a/gprofng/src/gp-display-text.cc
> +++ b/gprofng/src/gp-display-text.cc
> @@ -533,7 +533,7 @@ er_print::process_object_select (char *names)
>    if (!got_err)
>      { // good coverage string
>        free (cov_string);
> -      cov_string = strdup (names);
> +      cov_string = xstrdup (names);
>      }
>    else
>      { // bad, restore original coverage
> @@ -1662,9 +1662,9 @@ er_print::exp_list ()
>    for (index = 0; index < size; index++)
>      {
>        lists[0][index] = dbe_sprintf (NTXT ("%d"), index + 1);
> -      lists[1][index] = strdup (dbev->get_exp_enable (index) ? GTXT ("yes") : GTXT ("no"));
> +      lists[1][index] = xstrdup (dbev->get_exp_enable (index) ? GTXT ("yes") : GTXT ("no"));
>        lists[2][index] = dbe_sprintf (NTXT ("%d"), dbeSession->get_exp (index)->getPID ());
> -      lists[3][index] = strdup (dbeSession->get_exp (index)->get_expt_name ());
> +      lists[3][index] = xstrdup (dbeSession->get_exp (index)->get_expt_name ());
>      }
>    disp_list (4, size, align, header, lists);
>    for (int i = 0; i < 4; i++)
> @@ -1834,9 +1834,9 @@ er_print::seg_list ()
>  	  continue;
>        }
>      bool expand = dbev->get_lo_expand (lo->seg_idx);
> -    lists[0][new_index] = strdup (expand ? GTXT ("yes") : GTXT ("no"));
> +    lists[0][new_index] = xstrdup (expand ? GTXT ("yes") : GTXT ("no"));
>      lists[1][new_index] = dbe_sprintf (NTXT ("%lld"), (ll_t) lo->get_size ());
> -    lists[2][new_index] = strdup (lo->get_pathname ());
> +    lists[2][new_index] = xstrdup (lo->get_pathname ());
>      new_index++;
>    }
>  
> @@ -1903,7 +1903,7 @@ er_print::filter_list (CmdType cmd_type)
>  	continue;
>        lists[0][new_index] = dbe_sprintf (NTXT ("%d"), index + 1);
>        pattern = dbev->get_exp_enable (index) ? select->get_pattern () : NULL;
> -      lists[1][new_index] = strdup (pattern && *pattern ? pattern : GTXT ("none"));
> +      lists[1][new_index] = xstrdup (pattern && *pattern ? pattern : GTXT ("none"));
>        lists[2][new_index] = dbe_sprintf (NTXT ("%lld"), (ll_t) select->nelem ());
>        lists[3][new_index] = select->get_status ();
>        new_index++;
> @@ -2822,7 +2822,7 @@ er_print::set_outfile (char *cmd, FILE *&set_file, bool append)
>        else if ((fname = strstr (cmd, NTXT ("~"))) != NULL && home != NULL)
>  	path = dbe_sprintf (NTXT ("/home/%s"), fname + 1);
>        else
> -	path = strdup (cmd);
> +	path = xstrdup (cmd);
>        new_file = fopen (path, append ? NTXT ("a") : NTXT ("w"));
>        if (new_file == NULL)
>  	{
> diff --git a/gprofng/src/gprofng.cc b/gprofng/src/gprofng.cc
> index a59fdb2af6d..385b0977154 100644
> --- a/gprofng/src/gprofng.cc
> +++ b/gprofng/src/gprofng.cc
> @@ -49,6 +49,7 @@ private:
>  int
>  main (int argc, char *argv[])
>  {
> +  xmalloc_set_program_name (argv[0]);
>    Gprofng *gprofng = new Gprofng (argc, argv);
>    gprofng->start();
>    delete gprofng;
> @@ -228,7 +229,7 @@ Gprofng::exec_cmd (char *tool_name, int argc, char **argv)
>  
>    const char *aname = app_names[first].app_name;
>  
> -  char **arr = (char **) malloc ((argc + 5) * sizeof (char *));
> +  char **arr = (char **) xmalloc ((argc + 5) * sizeof (char *));
>    char *pname = get_name ();
>    char *exe_name = dbe_sprintf ("%.*s%s",
>  			(int) (get_basename (pname) - pname), pname, aname);
> diff --git a/gprofng/src/ipc.cc b/gprofng/src/ipc.cc
> index d5f377123ab..3e706dbc9d0 100644
> --- a/gprofng/src/ipc.cc
> +++ b/gprofng/src/ipc.cc
> @@ -28,6 +28,7 @@
>  #include <sys/wait.h>   // wait
>  #include <locale.h>
>  
> +#include "libiberty.h"
>  #include "DbeApplication.h"
>  #include "Histable.h"
>  #include "ipcio.h"
> @@ -2686,7 +2687,7 @@ ipc_mainLoop (int argc, char *argv[])
>    if (er_print_catch_crash)
>      {
>        /* reserve memory for fatal error processing */
> -      fatalErrorDynamicMemory = (char *) malloc (4 * 1024 * 1024); // reserve 4 MB
> +      fatalErrorDynamicMemory = (char *) xmalloc (4 * 1024 * 1024); // reserve 4 MB
>        /* install a handler for SIGABRT */
>        ipc_request_trace (TRACE_LVL_1, "Installing SIGABRT handler to send message to analyzer\n");
>        sigemptyset (&act.sa_mask);
> diff --git a/gprofng/src/ipcio.cc b/gprofng/src/ipcio.cc
> index 29d699dea54..8ff16d5a8e2 100644
> --- a/gprofng/src/ipcio.cc
> +++ b/gprofng/src/ipcio.cc
> @@ -63,7 +63,7 @@ IPCrequest::IPCrequest (int sz, int reqID, int chID)
>    channelID = chID;
>    status = INITIALIZED;
>    idx = 0;
> -  buf = (char *) malloc (size);
> +  buf = (char *) xmalloc (size);
>    cancelImmediate = false;
>  }
>  
> @@ -149,7 +149,7 @@ readSVal (IPCrequest *req)
>        ipc_trace ("  readSVal: <NULL>\n");
>        return NULL;
>      }
> -  char *str = (char *) malloc (len + 1);
> +  char *str = (char *) xmalloc (len + 1);
>    char *s = str;
>    *s = (char) 0;
>    while (len--)
> diff --git a/gprofng/src/util.cc b/gprofng/src/util.cc
> index 228140b61ae..e4919995db6 100644
> --- a/gprofng/src/util.cc
> +++ b/gprofng/src/util.cc
> @@ -35,7 +35,7 @@
>  #include "dbe_structs.h"
>  #include "StringBuilder.h"
>  #include "StringMap.h"      // For directory names
> -#include "Application.h"    // Only for get_prog_name
> +#include "Application.h"
>  #include "vec.h"
>  
>  void
> @@ -340,7 +340,7 @@ read_line (FILE *fptr)
>  {
>    // get an input line, no size limit
>    int line_sz = 128; // starting size
> -  char *line = (char *) malloc (line_sz);
> +  char *line = (char *) xmalloc (line_sz);
>  
>    // read as much of the line as will fit in memory
>    line[0] = 0;
> @@ -353,7 +353,7 @@ read_line (FILE *fptr)
>  	  if (len == 0 || line[len - 1] == '\n')
>  	    break;
>  	  // increase the buffer
> -	  char *lineNew = (char *) malloc (2 * line_sz);
> +	  char *lineNew = (char *) xmalloc (2 * line_sz);
>  	  strncpy (lineNew, line, line_sz);
>  	  lineNew[line_sz] = '\0';
>  	  free (line);
> @@ -531,7 +531,7 @@ parse_fname (char *in_str, char **fcontext)
>    int ch = '`';
>    if (in_str == NULL)
>      return NULL;
> -  char *copy = strdup (in_str);
> +  char *copy = xstrdup (in_str);
>    char *p = strchr (copy, ch);
>    if (p != NULL)
>      {
> @@ -556,7 +556,7 @@ parse_fname (char *in_str, char **fcontext)
>  	  return NULL;
>  	}
>        free (*fcontext);
> -      *fcontext = strdup (p);
> +      *fcontext = xstrdup (p);
>      }
>    return copy;
>  }
> @@ -777,25 +777,12 @@ get_relative_link (const char *path_from, const char *path_to)
>    return lname;
>  }
>  
> -char *
> -get_prog_name (int basename)
> -{
> -  char *nm = NULL;
> -  if (theApplication)
> -    {
> -      nm = theApplication->get_name ();
> -      if (nm && basename)
> -	nm = get_basename (nm);
> -    }
> -  return nm;
> -}
> -
>  char *
>  dbe_strndup (const char *str, size_t len)
>  {
>    if (str == NULL)
>      return NULL;
> -  char *s = (char *) malloc (len + 1);
> +  char *s = (char *) xmalloc (len + 1);
>    strncpy (s, str, len);
>    s[len] = '\0';
>    return s;
> @@ -815,11 +802,11 @@ dbe_sprintf (const char *fmt, ...)
>      {
>        if (buf_size <= 1)
>  	buffer[0] = 0;
> -      return strdup (buffer);
> +      return xstrdup (buffer);
>      }
>  
>    va_start (vp, fmt);
> -  char *buf = (char *) malloc (buf_size);
> +  char *buf = (char *) xmalloc (buf_size);
>    vsnprintf (buf, buf_size, fmt, vp);
>    va_end (vp);
>    return buf;
> @@ -843,7 +830,7 @@ dbe_write (int f, const char *fmt, ...)
>      }
>  
>    va_start (vp, fmt);
> -  char *buf = (char *) malloc (buf_size);
> +  char *buf = (char *) xmalloc (buf_size);
>    vsnprintf (buf, buf_size, fmt, vp);
>    va_end (vp);
>    ssize_t val = write (f, buf, strlen (buf));
> @@ -1064,35 +1051,32 @@ dbe_stat_internal (const char *path, dbe_stat_t *sbuf, bool file_only)
>        if (theApplication->get_number_of_worker_threads () > 0)
>  	{
>  	  struct worker_thread_info *wt_info;
> -	  wt_info = (worker_thread_info *) calloc (1, sizeof (worker_thread_info));
> -	  if (wt_info != NULL)
> +	  wt_info = (worker_thread_info *) xcalloc (1, sizeof (worker_thread_info));
> +	  int res = dbe_dispatch_on_thread (path, wt_info);
> +	  if (THREAD_FINISHED == res)
>  	    {
> -	      int res = dbe_dispatch_on_thread (path, wt_info);
> -	      if (THREAD_FINISHED == res)
> -		{
> -		  int st = wt_info->result;
> -		  extract_and_save_dirname (path, st);
> -		  if (st == 0 && file_only)
> -		    if (S_ISREG ((wt_info->statbuf).st_mode) == 0)
> -		      st = -1; // It is not a regular file
> -		  if (sbuf != NULL)
> -		    *sbuf = wt_info->statbuf;
> -		  free (wt_info);
> -		  return st;
> -		}
> -	      else
> +	      int st = wt_info->result;
> +	      extract_and_save_dirname (path, st);
> +	      if (st == 0 && file_only)
> +		if (S_ISREG ((wt_info->statbuf).st_mode) == 0)
> +		  st = -1; // It is not a regular file
> +	      if (sbuf != NULL)
> +		*sbuf = wt_info->statbuf;
> +	      free (wt_info);
> +	      return st;
> +	    }
> +	  else
> +	    {
> +	      if (THREAD_CANCEL == res)
>  		{
> -		  if (THREAD_CANCEL == res)
> -		    {
> -		      // Worker thread hung. Cannot free wt_info.
> -		      // Allocated memory will be freed by worker thread.
> -		      // save directory
> -		      extract_and_save_dirname (path, 1);
> -		      return 1; // stat64 failed
> -		    }
> -		  else  // THREAD_NOT_CREATED - continue on current thread
> -		    free (wt_info);
> +		  // Worker thread hung. Cannot free wt_info.
> +		  // Allocated memory will be freed by worker thread.
> +		  // save directory
> +		  extract_and_save_dirname (path, 1);
> +		  return 1; // stat64 failed
>  		}
> +	      else  // THREAD_NOT_CREATED - continue on current thread
> +		free (wt_info);
>  	    }
>  	}
>      }
> diff --git a/gprofng/src/util.h b/gprofng/src/util.h
> index cbbc2f7e118..ca2480b30d4 100644
> --- a/gprofng/src/util.h
> +++ b/gprofng/src/util.h
> @@ -27,6 +27,7 @@
>  #include <sys/stat.h>
>  #include <stdint.h>
>  
> +#include "libiberty.h"
>  #include "gp-defs.h"
>  #include "gp-time.h"
>  #include "i18n.h"
> @@ -105,7 +106,7 @@ get_basename (const char* name)
>  inline char *
>  dbe_strdup (const char *str)
>  {
> -  return str ? strdup (str) : NULL;
> +  return str ? xstrdup (str) : NULL;
>  }
>  
>  inline long
> @@ -170,7 +171,6 @@ extern "C"
>    char *canonical_path (char *path);
>    char *get_relative_path (char *name);
>    char *get_relative_link (const char *path_to, const char *path_from);
> -  char *get_prog_name (int basename);
>    char *dbe_strndup (const char *str, size_t len);
>    int dbe_stat (const char *path, dbe_stat_t *sbuf);
>    int dbe_stat_file (const char *path, dbe_stat_t *sbuf);
> diff --git a/gprofng/src/vec.h b/gprofng/src/vec.h
> index 7d5be1f0b57..4ee4642d78a 100644
> --- a/gprofng/src/vec.h
> +++ b/gprofng/src/vec.h
> @@ -25,6 +25,7 @@
>  #include <inttypes.h>
>  #include <string.h>
>  #include <stdlib.h>
> +#include "libiberty.h"
>  
>  // This package implements a vector of items.
>  
> @@ -222,7 +223,7 @@ Vector<ITEM>::Vector (long sz)
>  {
>    count = 0;
>    limit = sz > 0 ? sz : KILOCHUNK; // was 0;
> -  data = limit ? (ITEM *) malloc (sizeof (ITEM) * limit) : NULL;
> +  data = limit ? (ITEM *) xmalloc (sizeof (ITEM) * limit) : NULL;
>    sorted = false;
>  }
>  
> @@ -241,7 +242,7 @@ Vector<ITEM>
>        else
>  	limit = limit * 2;
>      }
> -  data = (ITEM *) realloc (data, limit * sizeof (ITEM));
> +  data = (ITEM *) xrealloc (data, limit * sizeof (ITEM));
>  }
>  
>  template <typename ITEM> void
> @@ -269,7 +270,7 @@ Vector<ITEM>::copy ()
>    vector = new Vector<ITEM>;
>    vector->count = count;
>    vector->limit = limit;
> -  vector->data = (ITEM *) malloc (sizeof (ITEM) * limit);
> +  vector->data = (ITEM *) xmalloc (sizeof (ITEM) * limit);
>    (void) memcpy ((char *) vector->data, (char *) data, sizeof (ITEM) * count);
>    return vector;
>  }
> -- 
> 2.47.0


More information about the Binutils mailing list