annotate gcc/tree-diagnostic-path.cc @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* Paths through the code associated with a diagnostic.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Contributed by David Malcolm <dmalcolm@redhat.com>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 This file is part of GCC.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 version.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 for more details.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "config.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "system.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "coretypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "tree.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include "diagnostic.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include "tree-pretty-print.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 #include "gimple-pretty-print.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 #include "tree-diagnostic.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #include "langhooks.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 #include "intl.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 #include "diagnostic-path.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #include "json.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #include "gcc-rich-location.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #include "diagnostic-color.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 #include "diagnostic-event-id.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 #include "selftest.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 #include "selftest-diagnostic.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 /* Anonymous namespace for path-printing code. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 namespace {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 /* Subclass of range_label for showing a particular event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 when showing a consecutive run of events within a diagnostic_path as
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 labelled ranges within one gcc_rich_location. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 class path_label : public range_label
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 path_label (const diagnostic_path *path, unsigned start_idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 : m_path (path), m_start_idx (start_idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 label_text get_text (unsigned range_idx) const FINAL OVERRIDE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 unsigned event_idx = m_start_idx + range_idx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 const diagnostic_event &event = m_path->get_event (event_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 /* Get the description of the event, perhaps with colorization:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 normally, we don't colorize within a range_label, but this
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 is special-cased for diagnostic paths. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 bool colorize = pp_show_color (global_dc->printer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 label_text event_text (event.get_desc (colorize));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 gcc_assert (event_text.m_buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 pretty_printer pp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 pp_show_color (&pp) = pp_show_color (global_dc->printer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 diagnostic_event_id_t event_id (event_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 pp_printf (&pp, "%@ %s", &event_id, event_text.m_buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 event_text.maybe_free ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 label_text result = label_text::take (xstrdup (pp_formatted_text (&pp)));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 return result;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 const diagnostic_path *m_path;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 unsigned m_start_idx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 /* Return true if E1 and E2 can be consolidated into the same run of events
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 when printing a diagnostic_path. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 can_consolidate_events (const diagnostic_event &e1,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 const diagnostic_event &e2,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 bool check_locations)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 if (e1.get_fndecl () != e2.get_fndecl ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 if (e1.get_stack_depth () != e2.get_stack_depth ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 if (check_locations)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 location_t loc1 = e1.get_location ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 location_t loc2 = e2.get_location ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 if (loc1 < RESERVED_LOCATION_COUNT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 || loc2 < RESERVED_LOCATION_COUNT)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 /* Neither can be macro-based. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 if (linemap_location_from_macro_expansion_p (line_table, loc1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 if (linemap_location_from_macro_expansion_p (line_table, loc2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 /* Passed all the tests. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 /* A class for grouing together the events in a diagnostic_path into
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 ranges of events, partitioned by stack frame (i.e. by fndecl and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 stack depth). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 class path_summary
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 /* A range of consecutive events within a diagnostic_path,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 all with the same fndecl and stack_depth, and which are suitable
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 to print with a single call to diagnostic_show_locus. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 struct event_range
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 event_range (const diagnostic_path *path, unsigned start_idx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 const diagnostic_event &initial_event)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 : m_path (path),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 m_initial_event (initial_event),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 m_fndecl (initial_event.get_fndecl ()),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 m_stack_depth (initial_event.get_stack_depth ()),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 m_start_idx (start_idx), m_end_idx (start_idx),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 m_path_label (path, start_idx),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 m_richloc (initial_event.get_location (), &m_path_label)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 bool maybe_add_event (const diagnostic_event &new_ev, unsigned idx,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 bool check_rich_locations)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 if (!can_consolidate_events (m_initial_event, new_ev,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 check_rich_locations))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 if (check_rich_locations)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 if (!m_richloc.add_location_if_nearby (new_ev.get_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 false, &m_path_label))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 m_end_idx = idx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 /* Print the events in this range to DC, typically as a single
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 call to the printer's diagnostic_show_locus. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 void print (diagnostic_context *dc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 location_t initial_loc = m_initial_event.get_location ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 /* Emit a span indicating the filename (and line/column) if the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 line has changed relative to the last call to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 diagnostic_show_locus. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 if (dc->show_caret)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 expanded_location exploc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 = linemap_client_expand_location_to_spelling_point
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 (initial_loc, LOCATION_ASPECT_CARET);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 if (exploc.file != LOCATION_FILE (dc->last_location))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 dc->start_span (dc, exploc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 /* If we have an UNKNOWN_LOCATION (or BUILTINS_LOCATION) as the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 primary location for an event, diagnostic_show_locus won't print
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 anything.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 In particular the label for the event won't get printed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 Fail more gracefully in this case by showing the event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 index and text, at no particular location. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 if (get_pure_location (initial_loc) <= BUILTINS_LOCATION)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 for (unsigned i = m_start_idx; i <= m_end_idx; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 const diagnostic_event &iter_event = m_path->get_event (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 diagnostic_event_id_t event_id (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 label_text event_text (iter_event.get_desc (true));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 pretty_printer *pp = dc->printer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 pp_printf (pp, " %@: %s", &event_id, event_text.m_buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 event_text.maybe_free ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 /* Call diagnostic_show_locus to show the events using labels. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 diagnostic_show_locus (dc, &m_richloc, DK_DIAGNOSTIC_PATH);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 /* If we have a macro expansion, show the expansion to the user. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 if (linemap_location_from_macro_expansion_p (line_table, initial_loc))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 gcc_assert (m_start_idx == m_end_idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 maybe_unwind_expanded_macro_loc (dc, initial_loc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 const diagnostic_path *m_path;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 const diagnostic_event &m_initial_event;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 tree m_fndecl;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 int m_stack_depth;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 unsigned m_start_idx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 unsigned m_end_idx;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 path_label m_path_label;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 gcc_rich_location m_richloc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 path_summary (const diagnostic_path &path, bool check_rich_locations);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 void print (diagnostic_context *dc, bool show_depths) const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 unsigned get_num_ranges () const { return m_ranges.length (); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 private:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 auto_delete_vec <event_range> m_ranges;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 /* path_summary's ctor. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 path_summary::path_summary (const diagnostic_path &path,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 bool check_rich_locations)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 const unsigned num_events = path.num_events ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 event_range *cur_event_range = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 for (unsigned idx = 0; idx < num_events; idx++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 const diagnostic_event &event = path.get_event (idx);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 if (cur_event_range)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 if (cur_event_range->maybe_add_event (event, idx, check_rich_locations))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 continue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 cur_event_range = new event_range (&path, idx, event);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 m_ranges.safe_push (cur_event_range);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 /* Write SPACES to PP. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 write_indent (pretty_printer *pp, int spaces)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 for (int i = 0; i < spaces; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 pp_space (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 /* Print FNDDECL to PP, quoting it if QUOTED is true.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 We can't use "%qE" here since we can't guarantee the capabilities
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 of PP. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 print_fndecl (pretty_printer *pp, tree fndecl, bool quoted)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 const char *n = DECL_NAME (fndecl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 ? identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 : _("<anonymous>");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 if (quoted)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 pp_printf (pp, "%qs", n);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 pp_string (pp, n);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 /* Print this path_summary to DC, giving an overview of the interprocedural
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 calls and returns.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 Print the event descriptions in a nested form, printing the event
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 descriptions within calls to diagnostic_show_locus, using labels to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 show the events:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 'foo' (events 1-2)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 +--> 'bar' (events 3-4)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 +--> 'baz' (events 5-6)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 <------------ +
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 'foo' (events 7-8)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 +--> 'bar' (events 9-10)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 +--> 'baz' (events 11-12)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 | NN |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 If SHOW_DEPTHS is true, append " (depth N)" to the header of each run
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 of events.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 For events with UNKNOWN_LOCATION, print a summary of each the event. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 path_summary::print (diagnostic_context *dc, bool show_depths) const
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 pretty_printer *pp = dc->printer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 const int per_frame_indent = 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 const char *const line_color = "path";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 const char *start_line_color
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 = colorize_start (pp_show_color (pp), line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 const char *end_line_color = colorize_stop (pp_show_color (pp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 /* Keep track of column numbers of existing '|' characters for
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 stack depths we've already printed. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 const int EMPTY = -1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 const int DELETED = -2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 typedef int_hash <int, EMPTY, DELETED> vbar_hash;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 hash_map <vbar_hash, int> vbar_column_for_depth;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 /* Print the ranges. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 const int base_indent = 2;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 int cur_indent = base_indent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 unsigned i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 event_range *range;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 FOR_EACH_VEC_ELT (m_ranges, i, range)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 write_indent (pp, cur_indent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 if (i > 0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 const path_summary::event_range *prev_range
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 = m_ranges[i - 1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 if (range->m_stack_depth > prev_range->m_stack_depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 /* Show pushed stack frame(s). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 const char *push_prefix = "+--> ";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 pp_string (pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 pp_string (pp, push_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 pp_string (pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 cur_indent += strlen (push_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 if (range->m_fndecl)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 print_fndecl (pp, range->m_fndecl, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 pp_string (pp, ": ");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 if (range->m_start_idx == range->m_end_idx)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 pp_printf (pp, "event %i",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 range->m_start_idx + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 pp_printf (pp, "events %i-%i",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 range->m_start_idx + 1, range->m_end_idx + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 if (show_depths)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 pp_printf (pp, " (depth %i)", range->m_stack_depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 /* Print a run of events. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 write_indent (pp, cur_indent + per_frame_indent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 pp_string (pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 pp_string (pp, "|");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 pp_string (pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 char *saved_prefix = pp_take_prefix (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 char *prefix;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 pretty_printer tmp_pp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 write_indent (&tmp_pp, cur_indent + per_frame_indent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 pp_string (&tmp_pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 pp_string (&tmp_pp, "|");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 pp_string (&tmp_pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 prefix = xstrdup (pp_formatted_text (&tmp_pp));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 pp_set_prefix (pp, prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 pp_prefixing_rule (pp) = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 range->print (dc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 pp_set_prefix (pp, saved_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 write_indent (pp, cur_indent + per_frame_indent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 pp_string (pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 pp_string (pp, "|");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 pp_string (pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 if (i < m_ranges.length () - 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 const path_summary::event_range *next_range
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 = m_ranges[i + 1];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 if (range->m_stack_depth > next_range->m_stack_depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 if (vbar_column_for_depth.get (next_range->m_stack_depth))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 /* Show returning from stack frame(s), by printing
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 something like:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 " <------------ +\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 " |\n". */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 int vbar_for_next_frame
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 = *vbar_column_for_depth.get (next_range->m_stack_depth);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 int indent_for_next_frame
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 = vbar_for_next_frame - per_frame_indent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 write_indent (pp, vbar_for_next_frame);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 pp_string (pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 pp_character (pp, '<');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 for (int i = indent_for_next_frame + per_frame_indent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 i < cur_indent + per_frame_indent - 1; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 pp_character (pp, '-');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 pp_character (pp, '+');
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 pp_string (pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 cur_indent = indent_for_next_frame;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 write_indent (pp, vbar_for_next_frame);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 pp_string (pp, start_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 pp_printf (pp, "|");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 pp_string (pp, end_line_color);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 pp_newline (pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 /* Handle disjoint paths (e.g. a callback at some later
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 time). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 cur_indent = base_indent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 else if (range->m_stack_depth < next_range->m_stack_depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 /* Prepare to show pushed stack frame. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 gcc_assert (range->m_stack_depth != EMPTY);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 gcc_assert (range->m_stack_depth != DELETED);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 vbar_column_for_depth.put (range->m_stack_depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 cur_indent + per_frame_indent);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 cur_indent += per_frame_indent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 } /* end of anonymous namespace for path-printing code. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 /* Print PATH to CONTEXT, according to CONTEXT's path_format. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 default_tree_diagnostic_path_printer (diagnostic_context *context,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 const diagnostic_path *path)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 gcc_assert (path);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 const unsigned num_events = path->num_events ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 switch (context->path_format)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 case DPF_NONE:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 /* Do nothing. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 return;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 case DPF_SEPARATE_EVENTS:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 /* A note per event. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 for (unsigned i = 0; i < num_events; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 const diagnostic_event &event = path->get_event (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 label_text event_text (event.get_desc (false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 gcc_assert (event_text.m_buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 diagnostic_event_id_t event_id (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 inform (event.get_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 "%@ %s", &event_id, event_text.m_buffer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 event_text.maybe_free ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 break;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 case DPF_INLINE_EVENTS:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 /* Consolidate related events. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 path_summary summary (*path, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 char *saved_prefix = pp_take_prefix (context->printer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 pp_set_prefix (context->printer, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 summary.print (context, context->show_path_depths);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 pp_flush (context->printer);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 pp_set_prefix (context->printer, saved_prefix);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 /* This has to be here, rather than diagnostic-format-json.cc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492 since diagnostic-format-json.o is within OBJS-libcommon and thus
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 doesn't have access to trees (for m_fndecl). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 json::value *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496 default_tree_make_json_for_path (diagnostic_context *,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 const diagnostic_path *path)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 json::array *path_array = new json::array ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 for (unsigned i = 0; i < path->num_events (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 const diagnostic_event &event = path->get_event (i);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504 json::object *event_obj = new json::object ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 if (event.get_location ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 event_obj->set ("location",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507 json_from_expanded_location (event.get_location ()));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 label_text event_text (event.get_desc (false));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 event_obj->set ("description", new json::string (event_text.m_buffer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510 event_text.maybe_free ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 if (tree fndecl = event.get_fndecl ())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 const char *function
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 = identifier_to_locale (lang_hooks.decl_printable_name (fndecl, 2));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 event_obj->set ("function", new json::string (function));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517 event_obj->set ("depth",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 new json::integer_number (event.get_stack_depth ()));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
519 path_array->append (event_obj);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
520 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
521 return path_array;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
522 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
523
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
524 #if CHECKING_P
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
525
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
526 namespace selftest {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
527
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
528 /* A subclass of simple_diagnostic_path that adds member functions
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
529 for adding test events. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
530
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
531 class test_diagnostic_path : public simple_diagnostic_path
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
532 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
533 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
534 test_diagnostic_path (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
535 : simple_diagnostic_path (event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
536 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
537 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
538
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
539 void add_entry (tree fndecl, int stack_depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
540 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
541 add_event (UNKNOWN_LOCATION, fndecl, stack_depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
542 "entering %qE", fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
543 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
545 void add_return (tree fndecl, int stack_depth)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
546 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
547 add_event (UNKNOWN_LOCATION, fndecl, stack_depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
548 "returning to %qE", fndecl);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
549 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
550
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
551 void add_call (tree caller, int caller_stack_depth, tree callee)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
552 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
553 add_event (UNKNOWN_LOCATION, caller, caller_stack_depth,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
554 "calling %qE", callee);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
555 add_entry (callee, caller_stack_depth + 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
556 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
557 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
558
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
559 /* Verify that empty paths are handled gracefully. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
560
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
561 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
562 test_empty_path (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
563 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
564 test_diagnostic_path path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
565 ASSERT_FALSE (path.interprocedural_p ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
566
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
567 path_summary summary (path, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
568 ASSERT_EQ (summary.get_num_ranges (), 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
569
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
570 test_diagnostic_context dc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
571 summary.print (&dc, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
572 ASSERT_STREQ ("",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
573 pp_formatted_text (dc.printer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
574 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
575
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
576 /* Verify that print_path_summary works on a purely intraprocedural path. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
577
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
578 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
579 test_intraprocedural_path (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
580 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
581 tree fntype_void_void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
582 = build_function_type_array (void_type_node, 0, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
583 tree fndecl_foo = build_fn_decl ("foo", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
584
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
585 test_diagnostic_path path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
586 path.add_event (UNKNOWN_LOCATION, fndecl_foo, 0, "first %qs", "free");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
587 path.add_event (UNKNOWN_LOCATION, fndecl_foo, 0, "double %qs", "free");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
588
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
589 ASSERT_FALSE (path.interprocedural_p ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
590
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
591 path_summary summary (path, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
592 ASSERT_EQ (summary.get_num_ranges (), 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
593
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
594 test_diagnostic_context dc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
595 summary.print (&dc, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
596 ASSERT_STREQ (" `foo': events 1-2 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
597 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
598 " | (1): first `free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
599 " | (2): double `free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
600 " |\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
601 pp_formatted_text (dc.printer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
602 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
603
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
604 /* Verify that print_path_summary works on an interprocedural path. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
605
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
606 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
607 test_interprocedural_path_1 (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
608 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
609 /* Build fndecls. The types aren't quite right, but that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
610 doesn't matter for the purposes of this test. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
611 tree fntype_void_void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
612 = build_function_type_array (void_type_node, 0, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
613 tree fndecl_test = build_fn_decl ("test", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
614 tree fndecl_make_boxed_int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
615 = build_fn_decl ("make_boxed_int", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
616 tree fndecl_wrapped_malloc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
617 = build_fn_decl ("wrapped_malloc", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
618 tree fndecl_free_boxed_int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
619 = build_fn_decl ("free_boxed_int", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
620 tree fndecl_wrapped_free
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
621 = build_fn_decl ("wrapped_free", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
622
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
623 test_diagnostic_path path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
624 path.add_entry (fndecl_test, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
625 path.add_call (fndecl_test, 0, fndecl_make_boxed_int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
626 path.add_call (fndecl_make_boxed_int, 1, fndecl_wrapped_malloc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
627 path.add_event (UNKNOWN_LOCATION, fndecl_wrapped_malloc, 2, "calling malloc");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
628 path.add_return (fndecl_test, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
629 path.add_call (fndecl_test, 0, fndecl_free_boxed_int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
630 path.add_call (fndecl_free_boxed_int, 1, fndecl_wrapped_free);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
631 path.add_event (UNKNOWN_LOCATION, fndecl_wrapped_free, 2, "calling free");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
632 path.add_return (fndecl_test, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
633 path.add_call (fndecl_test, 0, fndecl_free_boxed_int);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
634 path.add_call (fndecl_free_boxed_int, 1, fndecl_wrapped_free);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
635 path.add_event (UNKNOWN_LOCATION, fndecl_wrapped_free, 2, "calling free");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
636 ASSERT_EQ (path.num_events (), 18);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
637
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
638 ASSERT_TRUE (path.interprocedural_p ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
639
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
640 path_summary summary (path, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
641 ASSERT_EQ (summary.get_num_ranges (), 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
642
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
643 test_diagnostic_context dc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
644 summary.print (&dc, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
645 ASSERT_STREQ
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
646 (" `test': events 1-2 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
647 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
648 " | (1): entering `test'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
649 " | (2): calling `make_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
650 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
651 " +--> `make_boxed_int': events 3-4 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
652 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
653 " | (3): entering `make_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
654 " | (4): calling `wrapped_malloc'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
655 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
656 " +--> `wrapped_malloc': events 5-6 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
657 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
658 " | (5): entering `wrapped_malloc'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
659 " | (6): calling malloc\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
660 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
661 " <-------------+\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
662 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
663 " `test': events 7-8 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
664 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
665 " | (7): returning to `test'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
666 " | (8): calling `free_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
667 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
668 " +--> `free_boxed_int': events 9-10 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
669 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
670 " | (9): entering `free_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
671 " | (10): calling `wrapped_free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
672 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
673 " +--> `wrapped_free': events 11-12 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
674 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
675 " | (11): entering `wrapped_free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
676 " | (12): calling free\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
677 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
678 " <-------------+\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
679 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
680 " `test': events 13-14 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
681 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
682 " | (13): returning to `test'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
683 " | (14): calling `free_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
684 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
685 " +--> `free_boxed_int': events 15-16 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
686 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
687 " | (15): entering `free_boxed_int'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
688 " | (16): calling `wrapped_free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
689 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
690 " +--> `wrapped_free': events 17-18 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
691 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
692 " | (17): entering `wrapped_free'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
693 " | (18): calling free\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
694 " |\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
695 pp_formatted_text (dc.printer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
696 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
697
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
698 /* Example where we pop the stack to an intermediate frame, rather than the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
699 initial one. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
700
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
701 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
702 test_interprocedural_path_2 (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
703 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
704 /* Build fndecls. The types aren't quite right, but that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
705 doesn't matter for the purposes of this test. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
706 tree fntype_void_void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
707 = build_function_type_array (void_type_node, 0, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
708 tree fndecl_foo = build_fn_decl ("foo", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
709 tree fndecl_bar = build_fn_decl ("bar", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
710 tree fndecl_baz = build_fn_decl ("baz", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
711
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
712 test_diagnostic_path path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
713 path.add_entry (fndecl_foo, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
714 path.add_call (fndecl_foo, 0, fndecl_bar);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
715 path.add_call (fndecl_bar, 1, fndecl_baz);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
716 path.add_return (fndecl_bar, 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
717 path.add_call (fndecl_bar, 1, fndecl_baz);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
718 ASSERT_EQ (path.num_events (), 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
719
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
720 ASSERT_TRUE (path.interprocedural_p ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
721
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
722 path_summary summary (path, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
723 ASSERT_EQ (summary.get_num_ranges (), 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
724
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
725 test_diagnostic_context dc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
726 summary.print (&dc, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
727 ASSERT_STREQ
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
728 (" `foo': events 1-2 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
729 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
730 " | (1): entering `foo'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
731 " | (2): calling `bar'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
732 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
733 " +--> `bar': events 3-4 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
734 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
735 " | (3): entering `bar'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
736 " | (4): calling `baz'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
737 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
738 " +--> `baz': event 5 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
739 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
740 " | (5): entering `baz'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
741 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
742 " <------+\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
743 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
744 " `bar': events 6-7 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
745 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
746 " | (6): returning to `bar'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
747 " | (7): calling `baz'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
748 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
749 " +--> `baz': event 8 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
750 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
751 " | (8): entering `baz'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
752 " |\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
753 pp_formatted_text (dc.printer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
754 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
755
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
756 /* Verify that print_path_summary is sane in the face of a recursive
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
757 diagnostic_path. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
758
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
759 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
760 test_recursion (pretty_printer *event_pp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
761 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
762 tree fntype_void_void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
763 = build_function_type_array (void_type_node, 0, NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
764 tree fndecl_factorial = build_fn_decl ("factorial", fntype_void_void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
765
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
766 test_diagnostic_path path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
767 path.add_entry (fndecl_factorial, 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
768 for (int depth = 0; depth < 3; depth++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
769 path.add_call (fndecl_factorial, depth, fndecl_factorial);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
770 ASSERT_EQ (path.num_events (), 7);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
771
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
772 ASSERT_TRUE (path.interprocedural_p ());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
773
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
774 path_summary summary (path, false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
775 ASSERT_EQ (summary.get_num_ranges (), 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
776
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
777 test_diagnostic_context dc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
778 summary.print (&dc, true);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
779 ASSERT_STREQ
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
780 (" `factorial': events 1-2 (depth 0)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
781 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
782 " | (1): entering `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
783 " | (2): calling `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
784 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
785 " +--> `factorial': events 3-4 (depth 1)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
786 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
787 " | (3): entering `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
788 " | (4): calling `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
789 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
790 " +--> `factorial': events 5-6 (depth 2)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
791 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
792 " | (5): entering `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
793 " | (6): calling `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
794 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
795 " +--> `factorial': event 7 (depth 3)\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
796 " |\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
797 " | (7): entering `factorial'\n"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
798 " |\n",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
799 pp_formatted_text (dc.printer));
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
800 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
801
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
802 /* Run all of the selftests within this file. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
803
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
804 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
805 tree_diagnostic_path_cc_tests ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
806 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
807 auto_fix_quotes fix_quotes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
808 pretty_printer *event_pp = global_dc->printer->clone ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
809 pp_show_color (event_pp) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
810 test_empty_path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
811 test_intraprocedural_path (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
812 test_interprocedural_path_1 (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
813 test_interprocedural_path_2 (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
814 test_recursion (event_pp);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
815 delete event_pp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
816 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
817
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
818 } // namespace selftest
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
819
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
820 #endif /* #if CHECKING_P */