annotate gcc/config/avr/avr-log.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Subroutines for log output for Atmel AVR back end.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2011-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Georg-Johann Lay (avr@gjlay.de)
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify
kono
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 GNU General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21 #define IN_TARGET_CODE 1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
22
111
kono
parents:
diff changeset
23 #include "config.h"
kono
parents:
diff changeset
24 #include "system.h"
kono
parents:
diff changeset
25 #include "coretypes.h"
kono
parents:
diff changeset
26 #include "tm.h"
kono
parents:
diff changeset
27 #include "function.h"
kono
parents:
diff changeset
28 #include "rtl.h"
kono
parents:
diff changeset
29 #include "tree.h"
kono
parents:
diff changeset
30 #include "tree-pass.h" /* for current_pass */
kono
parents:
diff changeset
31 #include "memmodel.h"
kono
parents:
diff changeset
32 #include "tm_p.h"
kono
parents:
diff changeset
33 #include "print-tree.h"
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 /* This file supplies some functions for AVR back-end developers
kono
parents:
diff changeset
36 with a printf-like interface. The functions are called through
kono
parents:
diff changeset
37 macros `avr_dump', `avr_edump' or `avr_fdump' from avr-protos.h:
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 avr_fdump (FILE *stream, const char *fmt, ...);
kono
parents:
diff changeset
40 avr_edump (fmt, ...) is a shortcut for avr_fdump (stderr, fmt, ...)
kono
parents:
diff changeset
41 avr_dump (fmt, ...) is a shortcut for avr_fdump (dump_file, fmt, ...)
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 == known %-codes ==
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 b: bool
kono
parents:
diff changeset
46 r: rtx
kono
parents:
diff changeset
47 t: tree
kono
parents:
diff changeset
48 T: tree (brief)
kono
parents:
diff changeset
49 C: enum rtx_code
kono
parents:
diff changeset
50 m: machine_mode
kono
parents:
diff changeset
51 R: enum reg_class
kono
parents:
diff changeset
52 L: insn list
kono
parents:
diff changeset
53 H: location_t
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 == no arguments ==
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 A: call abort()
kono
parents:
diff changeset
58 f: current_function_name()
kono
parents:
diff changeset
59 F: caller (via __FUNCTION__)
kono
parents:
diff changeset
60 P: Pass name and number
kono
parents:
diff changeset
61 ?: Print caller, current function and pass info
kono
parents:
diff changeset
62 !: Ditto, but only print if in a pass with static pass number,
kono
parents:
diff changeset
63 else return.
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 == same as printf ==
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 %: %
kono
parents:
diff changeset
68 c: char
kono
parents:
diff changeset
69 s: string
kono
parents:
diff changeset
70 d: int (decimal)
kono
parents:
diff changeset
71 x: int (hex)
kono
parents:
diff changeset
72 */
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 /* Set according to -mlog= option. */
kono
parents:
diff changeset
75 avr_log_t avr_log;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 /* The worker function implementing the %-codes */
kono
parents:
diff changeset
78 static void avr_log_vadump (FILE*, const char*, va_list);
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 /* Wrapper for avr_log_vadump. If STREAM is NULL we are called by avr_dump,
kono
parents:
diff changeset
81 i.e. output to dump_file if available. The 2nd argument is __FUNCTION__.
kono
parents:
diff changeset
82 The 3rd argument is the format string. */
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 int
kono
parents:
diff changeset
85 avr_vdump (FILE *stream, const char *caller, ...)
kono
parents:
diff changeset
86 {
kono
parents:
diff changeset
87 va_list ap;
kono
parents:
diff changeset
88
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
89 if (stream == NULL && dump_file)
111
kono
parents:
diff changeset
90 stream = dump_file;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 va_start (ap, caller);
kono
parents:
diff changeset
93 if (stream)
kono
parents:
diff changeset
94 avr_log_vadump (stream, caller, ap);
kono
parents:
diff changeset
95 va_end (ap);
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 return 1;
kono
parents:
diff changeset
98 }
kono
parents:
diff changeset
99
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 /* Worker function implementing the %-codes and forwarding to
kono
parents:
diff changeset
102 respective print/dump function. */
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 static void
kono
parents:
diff changeset
105 avr_log_vadump (FILE *file, const char *caller, va_list ap)
kono
parents:
diff changeset
106 {
kono
parents:
diff changeset
107 char bs[3] = {'\\', '?', '\0'};
kono
parents:
diff changeset
108
kono
parents:
diff changeset
109 /* 3rd proper argument is always the format string. */
kono
parents:
diff changeset
110 const char *fmt = va_arg (ap, const char*);
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 while (*fmt)
kono
parents:
diff changeset
113 {
kono
parents:
diff changeset
114 switch (*fmt++)
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 default:
kono
parents:
diff changeset
117 fputc (*(fmt-1), file);
kono
parents:
diff changeset
118 break;
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 case '\\':
kono
parents:
diff changeset
121 bs[1] = *fmt++;
kono
parents:
diff changeset
122 fputs (bs, file);
kono
parents:
diff changeset
123 break;
kono
parents:
diff changeset
124
kono
parents:
diff changeset
125 case '%':
kono
parents:
diff changeset
126 switch (*fmt++)
kono
parents:
diff changeset
127 {
kono
parents:
diff changeset
128 case '%':
kono
parents:
diff changeset
129 fputc ('%', file);
kono
parents:
diff changeset
130 break;
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 case 't':
kono
parents:
diff changeset
133 {
kono
parents:
diff changeset
134 tree t = va_arg (ap, tree);
kono
parents:
diff changeset
135 if (NULL_TREE == t)
kono
parents:
diff changeset
136 fprintf (file, "<NULL-TREE>");
kono
parents:
diff changeset
137 else
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 if (stderr == file)
kono
parents:
diff changeset
140 debug_tree (t);
kono
parents:
diff changeset
141 else
kono
parents:
diff changeset
142 {
kono
parents:
diff changeset
143 print_node (file, "", t, 0);
kono
parents:
diff changeset
144 putc ('\n', file);
kono
parents:
diff changeset
145 }
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147 break;
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 case 'T':
kono
parents:
diff changeset
151 {
kono
parents:
diff changeset
152 tree t = va_arg (ap, tree);
kono
parents:
diff changeset
153 if (NULL_TREE == t)
kono
parents:
diff changeset
154 fprintf (file, "<NULL-TREE>");
kono
parents:
diff changeset
155 else
kono
parents:
diff changeset
156 print_node_brief (file, "", t, 3);
kono
parents:
diff changeset
157 }
kono
parents:
diff changeset
158 break;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 case 'd':
kono
parents:
diff changeset
161 fprintf (file, "%d", va_arg (ap, int));
kono
parents:
diff changeset
162 break;
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 case 'x':
kono
parents:
diff changeset
165 fprintf (file, "%x", va_arg (ap, int));
kono
parents:
diff changeset
166 break;
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 case 'b':
kono
parents:
diff changeset
169 fprintf (file, "%s", va_arg (ap, int) ? "true" : "false");
kono
parents:
diff changeset
170 break;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 case 'c':
kono
parents:
diff changeset
173 fputc (va_arg (ap, int), file);
kono
parents:
diff changeset
174 break;
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 case 'r':
kono
parents:
diff changeset
177 print_inline_rtx (file, va_arg (ap, rtx), 0);
kono
parents:
diff changeset
178 break;
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 case 'L':
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 rtx_insn *insn = safe_as_a <rtx_insn *> (va_arg (ap, rtx));
kono
parents:
diff changeset
183
kono
parents:
diff changeset
184 while (insn)
kono
parents:
diff changeset
185 {
kono
parents:
diff changeset
186 print_inline_rtx (file, insn, 0);
kono
parents:
diff changeset
187 fprintf (file, "\n");
kono
parents:
diff changeset
188 insn = NEXT_INSN (insn);
kono
parents:
diff changeset
189 }
kono
parents:
diff changeset
190 break;
kono
parents:
diff changeset
191 }
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 case 'f':
kono
parents:
diff changeset
194 if (cfun && cfun->decl)
kono
parents:
diff changeset
195 fputs (current_function_name(), file);
kono
parents:
diff changeset
196 break;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 case 's':
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 const char *str = va_arg (ap, char*);
kono
parents:
diff changeset
201 fputs (str ? str : "(null)", file);
kono
parents:
diff changeset
202 }
kono
parents:
diff changeset
203 break;
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 case 'm':
kono
parents:
diff changeset
206 fputs (GET_MODE_NAME ((machine_mode) va_arg (ap, int)),
kono
parents:
diff changeset
207 file);
kono
parents:
diff changeset
208 break;
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 case 'C':
kono
parents:
diff changeset
211 fputs (rtx_name[va_arg (ap, int)], file);
kono
parents:
diff changeset
212 break;
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 case 'R':
kono
parents:
diff changeset
215 fputs (reg_class_names[va_arg (ap, int)], file);
kono
parents:
diff changeset
216 break;
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 case 'F':
kono
parents:
diff changeset
219 fputs (caller, file);
kono
parents:
diff changeset
220 break;
kono
parents:
diff changeset
221
kono
parents:
diff changeset
222 case 'H':
kono
parents:
diff changeset
223 {
kono
parents:
diff changeset
224 location_t loc = va_arg (ap, location_t);
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 if (BUILTINS_LOCATION == loc)
kono
parents:
diff changeset
227 fprintf (file, "<BUILTIN-LOCATION>");
kono
parents:
diff changeset
228 else if (UNKNOWN_LOCATION == loc)
kono
parents:
diff changeset
229 fprintf (file, "<UNKNOWN-LOCATION>");
kono
parents:
diff changeset
230 else
kono
parents:
diff changeset
231 fprintf (file, "%s:%d",
kono
parents:
diff changeset
232 LOCATION_FILE (loc), LOCATION_LINE (loc));
kono
parents:
diff changeset
233
kono
parents:
diff changeset
234 break;
kono
parents:
diff changeset
235 }
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 case '!':
kono
parents:
diff changeset
238 if (!current_pass)
kono
parents:
diff changeset
239 return;
kono
parents:
diff changeset
240 /* FALLTHRU */
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 case '?':
kono
parents:
diff changeset
243 avr_vdump (file, caller, "%F[%f:%P]");
kono
parents:
diff changeset
244 break;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 case 'P':
kono
parents:
diff changeset
247 if (current_pass)
kono
parents:
diff changeset
248 fprintf (file, "%s(%d)",
kono
parents:
diff changeset
249 current_pass->name,
kono
parents:
diff changeset
250 current_pass->static_pass_number);
kono
parents:
diff changeset
251 else
kono
parents:
diff changeset
252 fprintf (file, "pass=?");
kono
parents:
diff changeset
253
kono
parents:
diff changeset
254 break;
kono
parents:
diff changeset
255
kono
parents:
diff changeset
256 case 'A':
kono
parents:
diff changeset
257 fflush (file);
kono
parents:
diff changeset
258 abort();
kono
parents:
diff changeset
259
kono
parents:
diff changeset
260 default:
kono
parents:
diff changeset
261 /* Unknown %-code: Stop printing */
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 fprintf (file, "??? %%%c ???%s\n", *(fmt-1), fmt);
kono
parents:
diff changeset
264 fmt = "";
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 break;
kono
parents:
diff changeset
267 }
kono
parents:
diff changeset
268 break; /* % */
kono
parents:
diff changeset
269 }
kono
parents:
diff changeset
270 }
kono
parents:
diff changeset
271
kono
parents:
diff changeset
272 fflush (file);
kono
parents:
diff changeset
273 }
kono
parents:
diff changeset
274
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 /* Called from avr.c:avr_option_override().
kono
parents:
diff changeset
277 Parse argument of -mlog= and set respective fields in avr_log. */
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 void
kono
parents:
diff changeset
280 avr_log_set_avr_log (void)
kono
parents:
diff changeset
281 {
kono
parents:
diff changeset
282 bool all = TARGET_ALL_DEBUG != 0;
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 if (all)
kono
parents:
diff changeset
285 avr_log_details = "all";
kono
parents:
diff changeset
286
kono
parents:
diff changeset
287 if (all || avr_log_details)
kono
parents:
diff changeset
288 {
kono
parents:
diff changeset
289 /* Adding , at beginning and end of string makes searching easier. */
kono
parents:
diff changeset
290
kono
parents:
diff changeset
291 char *str = (char*) alloca (3 + strlen (avr_log_details));
kono
parents:
diff changeset
292 bool info;
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 str[0] = ',';
kono
parents:
diff changeset
295 strcat (stpcpy (str+1, avr_log_details), ",");
kono
parents:
diff changeset
296
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
297 all |= strstr (str, ",all,") != NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
298 info = strstr (str, ",?,") != NULL;
111
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 if (info)
kono
parents:
diff changeset
301 fprintf (stderr, "\n-mlog=");
kono
parents:
diff changeset
302
kono
parents:
diff changeset
303 #define SET_DUMP_DETAIL(S) \
kono
parents:
diff changeset
304 do { \
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305 avr_log.S = (all || strstr (str, "," #S ",") != NULL); \
111
kono
parents:
diff changeset
306 if (info) \
kono
parents:
diff changeset
307 fprintf (stderr, #S ","); \
kono
parents:
diff changeset
308 } while (0)
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 SET_DUMP_DETAIL (address_cost);
kono
parents:
diff changeset
311 SET_DUMP_DETAIL (builtin);
kono
parents:
diff changeset
312 SET_DUMP_DETAIL (constraints);
kono
parents:
diff changeset
313 SET_DUMP_DETAIL (insn_addresses);
kono
parents:
diff changeset
314 SET_DUMP_DETAIL (legitimate_address_p);
kono
parents:
diff changeset
315 SET_DUMP_DETAIL (legitimize_address);
kono
parents:
diff changeset
316 SET_DUMP_DETAIL (legitimize_reload_address);
kono
parents:
diff changeset
317 SET_DUMP_DETAIL (progmem);
kono
parents:
diff changeset
318 SET_DUMP_DETAIL (rtx_costs);
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 #undef SET_DUMP_DETAIL
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 if (info)
kono
parents:
diff changeset
323 fprintf (stderr, "?\n\n");
kono
parents:
diff changeset
324 }
kono
parents:
diff changeset
325 }