|  | /* Support for plotting bar charts in dumps. | 
|  | Copyright (C) 2020-2025 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 */ |