1 /* Some code common to C and ObjC front ends. 2 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 3 2009, 2010 Free Software Foundation, Inc. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 3, or (at your option) any later 10 version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 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/>. */ 20 21 #include "config.h" 22 #include "system.h" 23 #include "coretypes.h" 24 #include "tree.h" 25 #include "c-tree.h" 26 #include "intl.h" 27 #include "c-family/c-pretty-print.h" 28 #include "flags.h" 29 #include "diagnostic.h" 30 #include "tree-pretty-print.h" 31 #include "langhooks.h" 32 #include "c-objc-common.h" 33 34 static bool c_tree_printer (pretty_printer *, text_info *, const char *, 35 int, bool, bool, bool); 36 37 bool 38 c_missing_noreturn_ok_p (tree decl) 39 { 40 /* A missing noreturn is not ok for freestanding implementations and 41 ok for the `main' function in hosted implementations. */ 42 return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); 43 } 44 45 /* Called from check_global_declarations. */ 46 47 bool 48 c_warn_unused_global_decl (const_tree decl) 49 { 50 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) 51 return false; 52 if (DECL_IN_SYSTEM_HEADER (decl)) 53 return false; 54 55 return true; 56 } 57 58 /* Initialization common to C and Objective-C front ends. */ 59 bool 60 c_objc_common_init (void) 61 { 62 c_init_decl_processing (); 63 64 if (c_common_init () == false) 65 return false; 66 67 /* These were not defined in the Objective-C front end, but I'm 68 putting them here anyway. The diagnostic format decoder might 69 want an enhanced ObjC implementation. */ 70 diagnostic_format_decoder (global_dc) = &c_tree_printer; 71 72 return true; 73 } 74 75 /* Called during diagnostic message formatting process to print a 76 source-level entity onto BUFFER. The meaning of the format specifiers 77 is as follows: 78 %D: a general decl, 79 %E: an identifier or expression, 80 %F: a function declaration, 81 %T: a type. 82 %V: a list of type qualifiers from a tree. 83 %v: an explicit list of type qualifiers 84 %#v: an explicit list of type qualifiers of a function type. 85 86 Please notice when called, the `%' part was already skipped by the 87 diagnostic machinery. */ 88 static bool 89 c_tree_printer (pretty_printer *pp, text_info *text, const char *spec, 90 int precision, bool wide, bool set_locus, bool hash) 91 { 92 tree t = NULL_TREE; 93 tree name; 94 c_pretty_printer *cpp = (c_pretty_printer *) pp; 95 pp->padding = pp_none; 96 97 if (precision != 0 || wide) 98 return false; 99 100 if (*spec == 'K') 101 { 102 percent_K_format (text); 103 return true; 104 } 105 106 if (*spec != 'v') 107 { 108 t = va_arg (*text->args_ptr, tree); 109 if (set_locus && text->locus) 110 *text->locus = DECL_SOURCE_LOCATION (t); 111 } 112 113 switch (*spec) 114 { 115 case 'D': 116 if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) 117 { 118 t = DECL_DEBUG_EXPR (t); 119 if (!DECL_P (t)) 120 { 121 pp_c_expression (cpp, t); 122 return true; 123 } 124 } 125 /* FALLTHRU */ 126 127 case 'F': 128 if (DECL_NAME (t)) 129 { 130 pp_identifier (cpp, lang_hooks.decl_printable_name (t, 2)); 131 return true; 132 } 133 break; 134 135 case 'T': 136 gcc_assert (TYPE_P (t)); 137 name = TYPE_NAME (t); 138 139 if (name && TREE_CODE (name) == TYPE_DECL) 140 { 141 if (DECL_NAME (name)) 142 pp_identifier (cpp, lang_hooks.decl_printable_name (name, 2)); 143 else 144 pp_type_id (cpp, t); 145 return true; 146 } 147 else 148 { 149 pp_type_id (cpp, t); 150 return true; 151 } 152 break; 153 154 case 'E': 155 if (TREE_CODE (t) == IDENTIFIER_NODE) 156 pp_identifier (cpp, IDENTIFIER_POINTER (t)); 157 else 158 pp_expression (cpp, t); 159 return true; 160 161 case 'V': 162 pp_c_type_qualifier_list (cpp, t); 163 return true; 164 165 case 'v': 166 pp_c_cv_qualifiers (cpp, va_arg (*text->args_ptr, int), hash); 167 return true; 168 169 default: 170 return false; 171 } 172 173 pp_string (cpp, _("({anonymous})")); 174 return true; 175 } 176 177 /* In C and ObjC, all decls have "C" linkage. */ 178 bool 179 has_c_linkage (const_tree decl ATTRIBUTE_UNUSED) 180 { 181 return true; 182 } 183 184 void 185 c_initialize_diagnostics (diagnostic_context *context) 186 { 187 pretty_printer *base; 188 c_pretty_printer *pp; 189 190 c_common_initialize_diagnostics (context); 191 192 base = context->printer; 193 pp = XNEW (c_pretty_printer); 194 memcpy (pp_base (pp), base, sizeof (pretty_printer)); 195 pp_c_pretty_printer_init (pp); 196 context->printer = (pretty_printer *) pp; 197 198 /* It is safe to free this object because it was previously XNEW()'d. */ 199 XDELETE (base); 200 } 201 202 int 203 c_types_compatible_p (tree x, tree y) 204 { 205 return comptypes (TYPE_MAIN_VARIANT (x), TYPE_MAIN_VARIANT (y)); 206 } 207 208 /* Determine if the type is a vla type for the backend. */ 209 210 bool 211 c_vla_unspec_p (tree x, tree fn ATTRIBUTE_UNUSED) 212 { 213 return c_vla_type_p (x); 214 } 215