103 lines
2.8 KiB
C++
103 lines
2.8 KiB
C++
/* Support for plotting bar charts in dumps.
|
|
Copyright (C) 2020-2021 Free Software Foundation, Inc.
|
|
Contributed by David Malcolm <dmalcolm@redhat.com>.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC 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.
|
|
|
|
GCC 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 GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#include "coretypes.h"
|
|
#include "pretty-print.h"
|
|
#include "analyzer/bar-chart.h"
|
|
|
|
#if ENABLE_ANALYZER
|
|
|
|
namespace ana {
|
|
|
|
/* class bar_chart. */
|
|
|
|
/* Add an item, taking a copy of NAME. */
|
|
|
|
void
|
|
bar_chart::add_item (const char *name, value_t value)
|
|
{
|
|
m_items.safe_push (new item (name, value));
|
|
}
|
|
|
|
/* Print the data to PP. */
|
|
|
|
void
|
|
bar_chart::print (pretty_printer *pp) const
|
|
{
|
|
/* Get maximum printing widths and maximum value. */
|
|
size_t max_width_name = 0;
|
|
size_t max_width_value = 0;
|
|
value_t max_value = 0;
|
|
unsigned i;
|
|
item *item;
|
|
char digit_buffer[128];
|
|
FOR_EACH_VEC_ELT (m_items, i, item)
|
|
{
|
|
max_width_name = MAX (max_width_name, item->m_strlen);
|
|
sprintf (digit_buffer, "%li", item->m_value);
|
|
max_width_value = MAX (max_width_value, strlen (digit_buffer));
|
|
max_value = MAX (max_value, item->m_value);
|
|
}
|
|
|
|
/* Print items. */
|
|
FOR_EACH_VEC_ELT (m_items, i, item)
|
|
{
|
|
/* Print left-aligned name, padding to max_width_name. */
|
|
pp_string (pp, item->m_name);
|
|
print_padding (pp, max_width_name - item->m_strlen);
|
|
|
|
pp_string (pp, ": ");
|
|
|
|
/* Print right-aligned name, padding to max_width_value. */
|
|
sprintf (digit_buffer, "%li", item->m_value);
|
|
const size_t value_width = strlen (digit_buffer);
|
|
print_padding (pp, max_width_value - value_width);
|
|
pp_string (pp, digit_buffer);
|
|
|
|
pp_character (pp, '|');
|
|
|
|
/* Print bar, scaled in proportion to max value. */
|
|
const int max_width_bar
|
|
= MIN (max_value, 76 - (max_width_name + max_width_value + 4));
|
|
const int bar_width
|
|
= (max_value > 0 ? (max_width_bar * item->m_value) / max_value : 0);
|
|
for (int j = 0; j < bar_width; j++)
|
|
pp_character (pp, '#');
|
|
print_padding (pp, max_width_bar - bar_width);
|
|
pp_character (pp, '|');
|
|
pp_newline (pp);
|
|
}
|
|
}
|
|
|
|
/* Print COUNT spaces to PP. */
|
|
|
|
void
|
|
bar_chart::print_padding (pretty_printer *pp, size_t count)
|
|
{
|
|
for (size_t i = 0; i < count; i++)
|
|
pp_character (pp, ' ');
|
|
}
|
|
|
|
} // namespace ana
|
|
|
|
#endif /* #if ENABLE_ANALYZER */
|