diff options
Diffstat (limited to 'gcc/tree-diagnostic-path.cc')
-rw-r--r-- | gcc/tree-diagnostic-path.cc | 86 |
1 files changed, 57 insertions, 29 deletions
diff --git a/gcc/tree-diagnostic-path.cc b/gcc/tree-diagnostic-path.cc index 8247192..33389ef 100644 --- a/gcc/tree-diagnostic-path.cc +++ b/gcc/tree-diagnostic-path.cc @@ -141,6 +141,8 @@ public: const char *get_name () const { return m_name.get (); } unsigned get_swimlane_index () const { return m_swimlane_idx; } + bool interprocedural_p () const; + private: friend struct path_summary; friend class thread_event_printer; @@ -293,6 +295,26 @@ private: } }; +/* Return true iff there is more than one stack frame used by the events + of this thread. */ + +bool +per_thread_summary::interprocedural_p () const +{ + if (m_event_ranges.is_empty ()) + return false; + tree first_fndecl = m_event_ranges[0]->m_fndecl; + int first_stack_depth = m_event_ranges[0]->m_stack_depth; + for (auto range : m_event_ranges) + { + if (range->m_fndecl != first_fndecl) + return true; + if (range->m_stack_depth != first_stack_depth) + return true; + } + return false; +} + /* path_summary's ctor. */ path_summary::path_summary (const diagnostic_path &path, @@ -391,11 +413,14 @@ public: = colorize_start (pp_show_color (pp), line_color); const char *end_line_color = colorize_stop (pp_show_color (pp)); + const bool interprocedural_p = m_per_thread_summary.interprocedural_p (); + write_indent (pp, m_cur_indent); if (const event_range *prev_range = get_any_prev_range ()) { if (range->m_stack_depth > prev_range->m_stack_depth) { + gcc_assert (interprocedural_p); /* Show pushed stack frame(s). */ const char *push_prefix = "+--> "; pp_string (pp, start_line_color); @@ -420,34 +445,37 @@ public: pp_newline (pp); /* Print a run of events. */ - { - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_string (pp, "|"); - pp_string (pp, end_line_color); - pp_newline (pp); - - char *saved_prefix = pp_take_prefix (pp); - char *prefix; + if (interprocedural_p) { - pretty_printer tmp_pp; - write_indent (&tmp_pp, m_cur_indent + per_frame_indent); - pp_string (&tmp_pp, start_line_color); - pp_string (&tmp_pp, "|"); - pp_string (&tmp_pp, end_line_color); - prefix = xstrdup (pp_formatted_text (&tmp_pp)); + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_string (pp, "|"); + pp_string (pp, end_line_color); + pp_newline (pp); + + char *saved_prefix = pp_take_prefix (pp); + char *prefix; + { + pretty_printer tmp_pp; + write_indent (&tmp_pp, m_cur_indent + per_frame_indent); + pp_string (&tmp_pp, start_line_color); + pp_string (&tmp_pp, "|"); + pp_string (&tmp_pp, end_line_color); + prefix = xstrdup (pp_formatted_text (&tmp_pp)); + } + pp_set_prefix (pp, prefix); + pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + range->print (dc, pp); + pp_set_prefix (pp, saved_prefix); + + write_indent (pp, m_cur_indent + per_frame_indent); + pp_string (pp, start_line_color); + pp_string (pp, "|"); + pp_string (pp, end_line_color); + pp_newline (pp); } - pp_set_prefix (pp, prefix); - pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE; + else range->print (dc, pp); - pp_set_prefix (pp, saved_prefix); - - write_indent (pp, m_cur_indent + per_frame_indent); - pp_string (pp, start_line_color); - pp_string (pp, "|"); - pp_string (pp, end_line_color); - pp_newline (pp); - } if (const event_range *next_range = get_any_next_range ()) { @@ -460,6 +488,7 @@ public: " |\n" " <------------ +\n" " |\n". */ + gcc_assert (interprocedural_p); int vbar_for_next_frame = *m_vbar_column_for_depth.get (next_range->m_stack_depth); @@ -492,6 +521,7 @@ public: else if (range->m_stack_depth < next_range->m_stack_depth) { /* Prepare to show pushed stack frame. */ + gcc_assert (interprocedural_p); gcc_assert (range->m_stack_depth != EMPTY); gcc_assert (range->m_stack_depth != DELETED); m_vbar_column_for_depth.put (range->m_stack_depth, @@ -766,10 +796,8 @@ test_intraprocedural_path (pretty_printer *event_pp) test_diagnostic_context dc; print_path_summary_as_text (&summary, &dc, true); ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n" - " |\n" - " | (1): first `free'\n" - " | (2): double `free'\n" - " |\n", + " (1): first `free'\n" + " (2): double `free'\n", pp_formatted_text (dc.printer)); } |