mirror of
https://github.com/bminor/binutils-gdb.git
synced 2026-02-06 10:41:30 +00:00
Adds two new external authors to etc/update-copyright.py to cover bfd/ax_tls.m4, and adds gprofng to dirs handled automatically, then updates copyright messages as follows: 1) Update cgen/utils.scm emitted copyrights. 2) Run "etc/update-copyright.py --this-year" with an extra external author I haven't committed, 'Kalray SA.', to cover gas testsuite files (which should have their copyright message removed). 3) Build with --enable-maintainer-mode --enable-cgen-maint=yes. 4) Check out */po/*.pot which we don't update frequently.
204 lines
6.0 KiB
C++
204 lines
6.0 KiB
C++
/* 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 <search.h> // For the tsearch stuff
|
|
#include <assert.h>
|
|
//#include <stdlib.h>
|
|
#include "Table.h"
|
|
#include "Sample.h"
|
|
#include "Stats_data.h"
|
|
#include "util.h"
|
|
#include "i18n.h"
|
|
|
|
//XXX: The fundamental problem with this package of routines is that
|
|
//XXX: they should look a lot more like overview data. The result
|
|
//XXX: is that it is not possible to share as much code as would
|
|
//XXX: otherwise be possible.
|
|
|
|
int
|
|
Stats_data::size ()
|
|
{
|
|
// Return the number of Stats_item values associated with "this".
|
|
if (stats_items == NULL)
|
|
return 0;
|
|
return stats_items->size ();
|
|
}
|
|
|
|
Stats_data::Stats_item
|
|
Stats_data::fetch (int index)
|
|
{
|
|
// Routine will return the "index"'th Stats_item associated with "this".
|
|
assert (index >= 0 && index < stats_items->size ());
|
|
return *(stats_items->fetch (index));
|
|
}
|
|
|
|
Stats_data::Stats_data ()
|
|
{
|
|
// this constructor for use with sum()
|
|
packets = NULL;
|
|
stats_items = NULL;
|
|
}
|
|
|
|
Stats_data::Stats_data (DataView *_packets)
|
|
{
|
|
packets = _packets;
|
|
stats_items = NULL;
|
|
compute_data (); // reads all data
|
|
}
|
|
|
|
Stats_data::~Stats_data ()
|
|
{
|
|
if (stats_items)
|
|
{
|
|
stats_items->destroy ();
|
|
delete stats_items;
|
|
}
|
|
}
|
|
|
|
void
|
|
Stats_data::sum (Stats_data *data)
|
|
{
|
|
int index;
|
|
Stats_item *stats_item, *data_item;
|
|
if (stats_items == NULL)
|
|
{
|
|
stats_items = new Vector<Stats_item*>;
|
|
Vec_loop (Stats_item*, data->stats_items, index, data_item)
|
|
{
|
|
stats_item = create_stats_item (data_item->value.ll, data_item->label);
|
|
stats_items->append (stats_item);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Vec_loop (Stats_item*, data->stats_items, index, data_item)
|
|
{
|
|
stats_items->fetch (index)->value.ll += data_item->value.ll;
|
|
}
|
|
}
|
|
}
|
|
|
|
Stats_data::Stats_item *
|
|
Stats_data::create_stats_item (long long v, char *l)
|
|
{
|
|
Stats_data::Stats_item *st_it;
|
|
st_it = new Stats_data::Stats_item;
|
|
st_it->label = l;
|
|
st_it->value.sign = false;
|
|
st_it->value.ll = v;
|
|
st_it->value.tag = VT_LLONG;
|
|
return st_it;
|
|
}
|
|
|
|
PrUsage *
|
|
Stats_data::fetchPrUsage (long index)
|
|
{
|
|
// Return the data values corresponding to the "index"'th sample.
|
|
PrUsage *prusage;
|
|
if (packets->getSize () > 0)
|
|
{
|
|
Sample* sample = (Sample*) packets->getObjValue (PROP_SMPLOBJ, index);
|
|
prusage = sample->get_usage ();
|
|
if (prusage != NULL)
|
|
return prusage;
|
|
}
|
|
return new PrUsage;
|
|
}
|
|
|
|
void
|
|
Stats_data::compute_data ()
|
|
{
|
|
Stats_data::Stats_item *stats_item;
|
|
PrUsage *tots, *temp;
|
|
stats_items = new Vector<Stats_data::Stats_item*>;
|
|
|
|
// Precomputation is needed.
|
|
long size = packets->getSize ();
|
|
tots = new PrUsage ();
|
|
for (long index = 0; index < size; index++)
|
|
{
|
|
temp = fetchPrUsage (index);
|
|
tots->pr_tstamp += temp->pr_tstamp;
|
|
tots->pr_create += temp->pr_create;
|
|
tots->pr_term += temp->pr_term;
|
|
tots->pr_rtime += temp->pr_rtime;
|
|
tots->pr_utime += temp->pr_utime;
|
|
tots->pr_stime += temp->pr_stime;
|
|
tots->pr_ttime += temp->pr_ttime;
|
|
tots->pr_tftime += temp->pr_tftime;
|
|
tots->pr_dftime += temp->pr_dftime;
|
|
tots->pr_kftime += temp->pr_kftime;
|
|
tots->pr_slptime += temp->pr_slptime;
|
|
tots->pr_ltime += temp->pr_ltime;
|
|
tots->pr_wtime += temp->pr_wtime;
|
|
tots->pr_stoptime += temp->pr_stoptime;
|
|
tots->pr_minf += temp->pr_minf;
|
|
tots->pr_majf += temp->pr_majf;
|
|
tots->pr_nswap += temp->pr_nswap;
|
|
tots->pr_inblk += temp->pr_inblk;
|
|
tots->pr_oublk += temp->pr_oublk;
|
|
tots->pr_msnd += temp->pr_msnd;
|
|
tots->pr_mrcv += temp->pr_mrcv;
|
|
tots->pr_sigs += temp->pr_sigs;
|
|
tots->pr_vctx += temp->pr_vctx;
|
|
tots->pr_ictx += temp->pr_ictx;
|
|
tots->pr_sysc += temp->pr_sysc;
|
|
tots->pr_ioch += temp->pr_ioch;
|
|
}
|
|
stats_item = create_stats_item ((long long) tots->pr_minf,
|
|
GTXT ("Minor Page Faults"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_majf,
|
|
GTXT ("Major Page Faults"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_nswap,
|
|
GTXT ("Process swaps"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_inblk,
|
|
GTXT ("Input blocks"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_oublk,
|
|
GTXT ("Output blocks"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_msnd,
|
|
GTXT ("Messages sent"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_mrcv,
|
|
GTXT ("Messages received"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_sigs,
|
|
GTXT ("Signals handled"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_vctx,
|
|
GTXT ("Voluntary context switches"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_ictx,
|
|
GTXT ("Involuntary context switches"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_sysc,
|
|
GTXT ("System calls"));
|
|
stats_items->append (stats_item);
|
|
stats_item = create_stats_item ((long long) tots->pr_ioch,
|
|
GTXT ("Characters of I/O"));
|
|
stats_items->append (stats_item);
|
|
delete tots;
|
|
}
|