1/* Some code common to C and ObjC front ends. 2 Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 3 4This file is part of GCC. 5 6GCC is free software; you can redistribute it and/or modify it under 7the terms of the GNU General Public License as published by the Free 8Software Foundation; either version 2, or (at your option) any later 9version. 10 11GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12WARRANTY; without even the implied warranty of MERCHANTABILITY or 13FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14for more details. 15 16You should have received a copy of the GNU General Public License 17along with GCC; see the file COPYING. If not, write to the Free 18Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 1902110-1301, USA. */ 20 21#include "config.h" 22#include "system.h" 23#include "coretypes.h" 24#include "tm.h" 25#include "tree.h" 26#include "rtl.h" 27#include "insn-config.h" 28#include "integrate.h" 29#include "c-tree.h" 30#include "c-pretty-print.h" 31#include "function.h" 32#include "flags.h" 33#include "toplev.h" 34#include "diagnostic.h" 35#include "tree-inline.h" 36#include "varray.h" 37#include "ggc.h" 38#include "langhooks.h" 39#include "tree-mudflap.h" 40#include "target.h" 41#include "c-objc-common.h" 42 43static bool c_tree_printer (pretty_printer *, text_info *, const char *, 44 int, bool, bool, bool); 45 46bool 47c_missing_noreturn_ok_p (tree decl) 48{ 49 /* A missing noreturn is not ok for freestanding implementations and 50 ok for the `main' function in hosted implementations. */ 51 return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); 52} 53 54/* We want to inline `extern inline' functions even if this would 55 violate inlining limits. Some glibc and linux constructs depend on 56 such functions always being inlined when optimizing. */ 57 58int 59c_disregard_inline_limits (tree fn) 60{ 61 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) != NULL) 62 return 1; 63 64 return (!flag_really_no_inline && DECL_DECLARED_INLINE_P (fn) 65 && DECL_EXTERNAL (fn)); 66} 67 68int 69c_cannot_inline_tree_fn (tree *fnp) 70{ 71 tree fn = *fnp; 72 bool do_warning = (warn_inline 73 && DECL_INLINE (fn) 74 && DECL_DECLARED_INLINE_P (fn) 75 && !DECL_IN_SYSTEM_HEADER (fn)); 76 77 if (flag_really_no_inline 78 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL) 79 { 80 if (do_warning) 81 warning (OPT_Winline, "function %q+F can never be inlined because it " 82 "is suppressed using -fno-inline", fn); 83 goto cannot_inline; 84 } 85 86 /* Don't auto-inline anything that might not be bound within 87 this unit of translation. */ 88 if (!DECL_DECLARED_INLINE_P (fn) && !targetm.binds_local_p (fn)) 89 { 90 if (do_warning) 91 warning (OPT_Winline, "function %q+F can never be inlined because it " 92 "might not be bound within this unit of translation", fn); 93 goto cannot_inline; 94 } 95 96 if (!function_attribute_inlinable_p (fn)) 97 { 98 if (do_warning) 99 warning (OPT_Winline, "function %q+F can never be inlined because it " 100 "uses attributes conflicting with inlining", fn); 101 goto cannot_inline; 102 } 103 104 return 0; 105 106 cannot_inline: 107 DECL_UNINLINABLE (fn) = 1; 108 return 1; 109} 110 111/* Called from check_global_declarations. */ 112 113bool 114c_warn_unused_global_decl (tree decl) 115{ 116 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) 117 return false; 118 if (DECL_IN_SYSTEM_HEADER (decl)) 119 return false; 120 121 return true; 122} 123 124/* Initialization common to C and Objective-C front ends. */ 125bool 126c_objc_common_init (void) 127{ 128 c_init_decl_processing (); 129 130 if (c_common_init () == false) 131 return false; 132 133 /* These were not defined in the Objective-C front end, but I'm 134 putting them here anyway. The diagnostic format decoder might 135 want an enhanced ObjC implementation. */ 136 diagnostic_format_decoder (global_dc) = &c_tree_printer; 137 138 /* If still unspecified, make it match -std=c99 139 (allowing for -pedantic-errors). */ 140 if (mesg_implicit_function_declaration < 0) 141 { 142 if (flag_isoc99) 143 mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1; 144 else 145 mesg_implicit_function_declaration = 0; 146 } 147 148 return true; 149} 150 151/* Called during diagnostic message formatting process to print a 152 source-level entity onto BUFFER. The meaning of the format specifiers 153 is as follows: 154 %D: a general decl, 155 %E: an identifier or expression, 156 %F: a function declaration, 157 %T: a type. 158 159 These format specifiers form a subset of the format specifiers set used 160 by the C++ front-end. 161 Please notice when called, the `%' part was already skipped by the 162 diagnostic machinery. */ 163static bool 164c_tree_printer (pretty_printer *pp, text_info *text, const char *spec, 165 int precision, bool wide, bool set_locus, bool hash) 166{ 167 tree t = va_arg (*text->args_ptr, tree); 168 tree name; 169 const char *n = "({anonymous})"; 170 c_pretty_printer *cpp = (c_pretty_printer *) pp; 171 pp->padding = pp_none; 172 173 if (precision != 0 || wide || hash) 174 return false; 175 176 if (set_locus && text->locus) 177 *text->locus = DECL_SOURCE_LOCATION (t); 178 179 switch (*spec) 180 { 181 case 'D': 182 if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) 183 { 184 t = DECL_DEBUG_EXPR (t); 185 if (!DECL_P (t)) 186 { 187 pp_c_expression (cpp, t); 188 return true; 189 } 190 } 191 /* FALLTHRU */ 192 193 case 'F': 194 if (DECL_NAME (t)) 195 n = lang_hooks.decl_printable_name (t, 2); 196 break; 197 198 case 'T': 199 gcc_assert (TYPE_P (t)); 200 name = TYPE_NAME (t); 201 202 if (name && TREE_CODE (name) == TYPE_DECL) 203 { 204 if (DECL_NAME (name)) 205 pp_string (cpp, lang_hooks.decl_printable_name (name, 2)); 206 else 207 pp_type_id (cpp, t); 208 return true; 209 } 210 else 211 { 212 pp_type_id (cpp, t); 213 return true; 214 } 215 break; 216 217 case 'E': 218 if (TREE_CODE (t) == IDENTIFIER_NODE) 219 n = IDENTIFIER_POINTER (t); 220 else 221 { 222 pp_expression (cpp, t); 223 return true; 224 } 225 break; 226 227 default: 228 return false; 229 } 230 231 pp_string (cpp, n); 232 return true; 233} 234 235/* In C and ObjC, all decls have "C" linkage. */ 236bool 237has_c_linkage (tree decl ATTRIBUTE_UNUSED) 238{ 239 return true; 240} 241 242void 243c_initialize_diagnostics (diagnostic_context *context) 244{ 245 pretty_printer *base = context->printer; 246 c_pretty_printer *pp = XNEW (c_pretty_printer); 247 memcpy (pp_base (pp), base, sizeof (pretty_printer)); 248 pp_c_pretty_printer_init (pp); 249 context->printer = (pretty_printer *) pp; 250 251 /* It is safe to free this object because it was previously XNEW()'d. */ 252 XDELETE (base); 253} 254 255int 256c_types_compatible_p (tree x, tree y) 257{ 258 return comptypes (TYPE_MAIN_VARIANT (x), TYPE_MAIN_VARIANT (y)); 259} 260 261/* Determine if the type is a vla type for the backend. */ 262 263bool 264c_vla_unspec_p (tree x, tree fn ATTRIBUTE_UNUSED) 265{ 266 return c_vla_type_p (x); 267} 268