1 /* Subroutines for log output for Atmel AVR back end.
2 Copyright (C) 2011 Free Software Foundation, Inc.
3 Contributed by Georg-Johann Lay (avr@gjlay.de)
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
31 #include "tree-pass.h"
33 /* This file supplies some functions for AVR back-end developers
34 with a printf-like interface. The functions are called through
35 macros avr_edump or avr_fdump from avr-protos.h:
37 avr_edump (const char *fmt, ...);
39 avr_fdump (FILE *stream, const char *fmt, ...);
41 avr_edump (fmt, ...) is a shortcut for avr_fdump (stderr, fmt, ...)
52 D: double_int (signed decimal)
53 X: double_int (unsigned hex)
60 f: current_function_name()
61 F: caller (via __FUNCTION__)
62 P: Pass name and number
63 ?: Print caller, current function and pass info
64 !: Ditto, but only print if in a pass with static pass number,
76 /* Set according to -mlog= option. */
79 /* The caller as of __FUNCTION__ */
80 static const char *avr_log_caller
= "?";
82 /* The worker function implementing the %-codes */
83 static void avr_log_vadump (FILE*, const char*, va_list);
85 /* As we have no variadic macros, avr_edump maps to a call to
86 avr_log_set_caller_e which saves __FUNCTION__ to avr_log_caller and
87 returns a function pointer to avr_log_fdump_e. avr_log_fdump_e
88 gets the printf-like arguments and calls avr_log_vadump, the
89 worker function. avr_fdump works the same way. */
91 /* Provide avr_log_fdump_e/f so that avr_log_set_caller_e/_f can return
95 avr_log_fdump_e (const char *fmt
, ...)
100 avr_log_vadump (stderr
, fmt
, ap
);
107 avr_log_fdump_f (FILE *stream
, const char *fmt
, ...)
113 avr_log_vadump (stream
, fmt
, ap
);
119 /* Macros avr_edump/avr_fdump map to calls of the following two functions,
120 respectively. You don't need to call them directly. */
123 avr_log_set_caller_e (const char *caller
)
126 avr_log_caller
= caller
;
128 return avr_log_fdump_e
;
132 avr_log_set_caller_f (const char *caller
)
133 )(FILE*, const char*, ...)
135 avr_log_caller
= caller
;
137 return avr_log_fdump_f
;
141 /* Copy-paste from double-int.c:double_int_split_digit (it's static there).
142 Splits last digit of *CST (taken as unsigned) in BASE and returns it. */
145 avr_double_int_pop_digit (double_int
*cst
, unsigned base
)
147 unsigned HOST_WIDE_INT resl
, reml
;
148 HOST_WIDE_INT resh
, remh
;
150 div_and_round_double (FLOOR_DIV_EXPR
, true, cst
->low
, cst
->high
, base
, 0,
151 &resl
, &resh
, &reml
, &remh
);
159 /* Dump VAL as hex value to FILE. */
162 avr_dump_double_int_hex (FILE *file
, double_int val
)
166 digit
[0] = avr_double_int_pop_digit (&val
, 1 << 16);
167 digit
[1] = avr_double_int_pop_digit (&val
, 1 << 16);
168 digit
[2] = avr_double_int_pop_digit (&val
, 1 << 16);
169 digit
[3] = avr_double_int_pop_digit (&val
, 1 << 16);
171 fprintf (file
, "0x");
173 if (digit
[3] | digit
[2])
174 fprintf (file
, "%04x%04x", digit
[3], digit
[2]);
176 if (digit
[3] | digit
[2] | digit
[1] | digit
[0])
177 fprintf (file
, "%04x%04x", digit
[1], digit
[0]);
183 /* Worker function implementing the %-codes and forwarding to
184 respective print/dump function. */
187 avr_log_vadump (FILE *file
, const char *fmt
, va_list ap
)
189 char bs
[3] = {'\\', '?', '\0'};
196 fputc (*(fmt
-1), file
);
213 tree t
= va_arg (ap
, tree
);
215 fprintf (file
, "<NULL-TREE>");
222 print_node (file
, "", t
, 0);
230 print_node_brief (file
, "", va_arg (ap
, tree
), 3);
234 fprintf (file
, "%d", va_arg (ap
, int));
238 dump_double_int (file
, va_arg (ap
, double_int
), false);
242 avr_dump_double_int_hex (file
, va_arg (ap
, double_int
));
246 fprintf (file
, "%x", va_arg (ap
, int));
250 fprintf (file
, "%s", va_arg (ap
, int) ? "true" : "false");
254 fputc (va_arg (ap
, int), file
);
258 print_inline_rtx (file
, va_arg (ap
, rtx
), 0);
263 rtx insn
= va_arg (ap
, rtx
);
267 print_inline_rtx (file
, insn
, 0);
268 fprintf (file
, "\n");
269 insn
= NEXT_INSN (insn
);
275 if (cfun
&& cfun
->decl
)
276 fputs (current_function_name(), file
);
281 const char *str
= va_arg (ap
, char*);
282 fputs (str
? str
: "(null)", file
);
287 fputs (GET_MODE_NAME (va_arg (ap
, enum machine_mode
)), file
);
291 fputs (rtx_name
[va_arg (ap
, enum rtx_code
)], file
);
295 fputs (reg_class_names
[va_arg (ap
, enum reg_class
)], file
);
299 fputs (avr_log_caller
, file
);
304 location_t loc
= va_arg (ap
, location_t
);
306 if (BUILTINS_LOCATION
== loc
)
307 fprintf (file
, "<BUILTIN-LOCATION>");
308 else if (UNKNOWN_LOCATION
== loc
)
309 fprintf (file
, "<UNKNOWN-LOCATION>");
311 fprintf (file
, "%s:%d",
312 LOCATION_FILE (loc
), LOCATION_LINE (loc
));
323 avr_log_fdump_f (file
, "%F[%f:%P]");
328 fprintf (file
, "%s(%d)",
330 current_pass
->static_pass_number
);
332 fprintf (file
, "pass=?");
341 /* Unknown %-code: Stop printing */
343 fprintf (file
, "??? %%%c ???%s\n", *(fmt
-1), fmt
);
356 /* Called from avr.c:avr_option_override().
357 Parse argument of -mlog= and set respective fields in avr_log. */
360 avr_log_set_avr_log (void)
362 bool all
= TARGET_ALL_DEBUG
!= 0;
364 if (all
|| avr_log_details
)
366 /* Adding , at beginning and end of string makes searching easier. */
368 char *str
= (char*) alloca (3 + strlen (avr_log_details
));
372 strcat (stpcpy (str
+1, avr_log_details
), ",");
374 all
|= NULL
!= strstr (str
, ",all,");
375 info
= NULL
!= strstr (str
, ",?,");
378 fprintf (stderr
, "\n-mlog=");
380 #define SET_DUMP_DETAIL(S) \
382 avr_log.S = (all || NULL != strstr (str, "," #S ",")); \
384 fprintf (stderr, #S ","); \
387 SET_DUMP_DETAIL (address_cost
);
388 SET_DUMP_DETAIL (builtin
);
389 SET_DUMP_DETAIL (constraints
);
390 SET_DUMP_DETAIL (legitimate_address_p
);
391 SET_DUMP_DETAIL (legitimize_address
);
392 SET_DUMP_DETAIL (legitimize_reload_address
);
393 SET_DUMP_DETAIL (progmem
);
394 SET_DUMP_DETAIL (rtx_costs
);
396 #undef SET_DUMP_DETAIL
399 fprintf (stderr
, "?\n\n");