static void write_ts_decl_common_tree_pointers (struct output_block *ob, tree expr, bool ref_p) { stream_write_tree (ob, DECL_SIZE (expr), ref_p); stream_write_tree (ob, DECL_SIZE_UNIT (expr), ref_p); /* Note, DECL_INITIAL is not handled here. Since DECL_INITIAL needs special handling in LTO, it must be handled by streamer hooks. */ stream_write_tree (ob, DECL_ATTRIBUTES (expr), ref_p); /* Do not stream DECL_ABSTRACT_ORIGIN. We cannot handle debug information for early inlining so drop it on the floor instead of ICEing in dwarf2out.c. */ if (TREE_CODE (expr) == PARM_DECL) streamer_write_chain (ob, TREE_CHAIN (expr), ref_p); if ((TREE_CODE (expr) == VAR_DECL || TREE_CODE (expr) == PARM_DECL) && DECL_HAS_VALUE_EXPR_P (expr)) stream_write_tree (ob, DECL_VALUE_EXPR (expr), ref_p); if (TREE_CODE (expr) == VAR_DECL) stream_write_tree (ob, DECL_DEBUG_EXPR (expr), ref_p); }
/* Default tree printer. Handles declarations only. */ extern "C" bool default_tree_printer(pretty_printer * pp, text_info *text, const char *spec, int precision, bool wide, bool set_locus, bool hash) { tree t; /* FUTURE: %+x should set the locus. */ if(precision != 0 || wide || hash) return false; switch(*spec) { case 'D': t = va_arg(*text->args_ptr, tree); if(DECL_DEBUG_EXPR_IS_FROM(t) && DECL_DEBUG_EXPR(t)) t = DECL_DEBUG_EXPR(t); break; case 'F': case 'T': t = va_arg(*text->args_ptr, tree); break; default: return false; } if(set_locus && text->locus) *text->locus = DECL_SOURCE_LOCATION(t); if(DECL_P(t)) { const char *n = DECL_NAME(t) ? lang_hooks.decl_printable_name(t, 2) : "<anonymous>"; pp_string(pp, n); } else dump_generic_node(pp, t, 0, 0, 0); return true; }
/* Called during diagnostic message formatting process to print a source-level entity onto BUFFER. The meaning of the format specifiers is as follows: %D: a general decl, %E: an identifier or expression, %F: a function declaration, %T: a type. These format specifiers form a subset of the format specifiers set used by the C++ front-end. Please notice when called, the `%' part was already skipped by the diagnostic machinery. */ static bool c_tree_printer (pretty_printer *pp, text_info *text, const char *spec, int precision, bool wide, bool set_locus, bool hash) { tree t = va_arg (*text->args_ptr, tree); tree name; c_pretty_printer *cpp = (c_pretty_printer *) pp; pp->padding = pp_none; if (precision != 0 || wide || hash) return false; if (set_locus && text->locus) *text->locus = DECL_SOURCE_LOCATION (t); switch (*spec) { case 'D': if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) { t = DECL_DEBUG_EXPR (t); if (!DECL_P (t)) { pp_c_expression (cpp, t); return true; } } /* FALLTHRU */ case 'F': if (DECL_NAME (t)) { pp_identifier (cpp, lang_hooks.decl_printable_name (t, 2)); return true; } break; case 'T': gcc_assert (TYPE_P (t)); name = TYPE_NAME (t); if (name && TREE_CODE (name) == TYPE_DECL) { if (DECL_NAME (name)) pp_identifier (cpp, lang_hooks.decl_printable_name (name, 2)); else pp_type_id (cpp, t); return true; } else { pp_type_id (cpp, t); return true; } break; case 'E': if (TREE_CODE (t) == IDENTIFIER_NODE) pp_identifier (cpp, IDENTIFIER_POINTER (t)); else pp_expression (cpp, t); return true; default: return false; } pp_string (cpp, _("({anonymous})")); return true; }