cp-lang.c revision 132718
1/* Language-dependent hooks for C++. 2 Copyright 2001, 2002 Free Software Foundation, Inc. 3 Contributed by Alexandre Oliva <aoliva@redhat.com> 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GCC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to 19the Free Software Foundation, 59 Temple Place - Suite 330, 20Boston, MA 02111-1307, USA. */ 21 22#include "config.h" 23#include "system.h" 24#include "coretypes.h" 25#include "tm.h" 26#include "tree.h" 27#include "cp-tree.h" 28#include "c-common.h" 29#include "toplev.h" 30#include "langhooks.h" 31#include "langhooks-def.h" 32#include "diagnostic.h" 33#include "cxx-pretty-print.h" 34 35enum c_language_kind c_language = clk_cxx; 36 37static HOST_WIDE_INT cxx_get_alias_set (tree); 38static bool ok_to_generate_alias_set_for_type (tree); 39static bool cxx_warn_unused_global_decl (tree); 40static tree cp_expr_size (tree); 41static size_t cp_tree_size (enum tree_code); 42static bool cp_var_mod_type_p (tree); 43static void cxx_initialize_diagnostics (diagnostic_context *); 44 45#undef LANG_HOOKS_NAME 46#define LANG_HOOKS_NAME "GNU C++" 47#undef LANG_HOOKS_TREE_SIZE 48#define LANG_HOOKS_TREE_SIZE cp_tree_size 49#undef LANG_HOOKS_INIT 50#define LANG_HOOKS_INIT cxx_init 51#undef LANG_HOOKS_FINISH 52#define LANG_HOOKS_FINISH cxx_finish 53#undef LANG_HOOKS_CLEAR_BINDING_STACK 54#define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything 55#undef LANG_HOOKS_INIT_OPTIONS 56#define LANG_HOOKS_INIT_OPTIONS c_common_init_options 57#undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS 58#define LANG_HOOKS_INITIALIZE_DIAGNOSTICS cxx_initialize_diagnostics 59#undef LANG_HOOKS_HANDLE_OPTION 60#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option 61#undef LANG_HOOKS_HANDLE_FILENAME 62#define LANG_HOOKS_HANDLE_FILENAME c_common_handle_filename 63#undef LANG_HOOKS_MISSING_ARGUMENT 64#define LANG_HOOKS_MISSING_ARGUMENT c_common_missing_argument 65#undef LANG_HOOKS_POST_OPTIONS 66#define LANG_HOOKS_POST_OPTIONS c_common_post_options 67#undef LANG_HOOKS_GET_ALIAS_SET 68#define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set 69#undef LANG_HOOKS_EXPAND_CONSTANT 70#define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant 71#undef LANG_HOOKS_EXPAND_EXPR 72#define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr 73#undef LANG_HOOKS_SAFE_FROM_P 74#define LANG_HOOKS_SAFE_FROM_P c_safe_from_p 75#undef LANG_HOOKS_PARSE_FILE 76#define LANG_HOOKS_PARSE_FILE c_common_parse_file 77#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL 78#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl 79#undef LANG_HOOKS_UNSAVE_EXPR_NOW 80#define LANG_HOOKS_UNSAVE_EXPR_NOW cxx_unsave_expr_now 81#undef LANG_HOOKS_MAYBE_BUILD_CLEANUP 82#define LANG_HOOKS_MAYBE_BUILD_CLEANUP cxx_maybe_build_cleanup 83#undef LANG_HOOKS_TRUTHVALUE_CONVERSION 84#define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion 85#undef LANG_HOOKS_UNSAFE_FOR_REEVAL 86#define LANG_HOOKS_UNSAFE_FOR_REEVAL c_common_unsafe_for_reeval 87#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME 88#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME mangle_decl 89#undef LANG_HOOKS_MARK_ADDRESSABLE 90#define LANG_HOOKS_MARK_ADDRESSABLE cxx_mark_addressable 91#undef LANG_HOOKS_PRINT_STATISTICS 92#define LANG_HOOKS_PRINT_STATISTICS cxx_print_statistics 93#undef LANG_HOOKS_PRINT_XNODE 94#define LANG_HOOKS_PRINT_XNODE cxx_print_xnode 95#undef LANG_HOOKS_PRINT_DECL 96#define LANG_HOOKS_PRINT_DECL cxx_print_decl 97#undef LANG_HOOKS_PRINT_TYPE 98#define LANG_HOOKS_PRINT_TYPE cxx_print_type 99#undef LANG_HOOKS_PRINT_IDENTIFIER 100#define LANG_HOOKS_PRINT_IDENTIFIER cxx_print_identifier 101#undef LANG_HOOKS_DECL_PRINTABLE_NAME 102#define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name 103#undef LANG_HOOKS_PRINT_ERROR_FUNCTION 104#define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function 105#undef LANG_HOOKS_BUILTIN_TYPE_DECLS 106#define LANG_HOOKS_BUILTIN_TYPE_DECLS cxx_builtin_type_decls 107#undef LANG_HOOKS_PUSHLEVEL 108#define LANG_HOOKS_PUSHLEVEL lhd_do_nothing_i 109#undef LANG_HOOKS_POPLEVEL 110#define LANG_HOOKS_POPLEVEL lhd_do_nothing_iii_return_null_tree 111#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL 112#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl 113#undef LANG_HOOKS_WRITE_GLOBALS 114#define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing 115#undef LANG_HOOKS_DECL_UNINIT 116#define LANG_HOOKS_DECL_UNINIT c_decl_uninit 117 118 119#undef LANG_HOOKS_FUNCTION_INIT 120#define LANG_HOOKS_FUNCTION_INIT cxx_push_function_context 121#undef LANG_HOOKS_FUNCTION_FINAL 122#define LANG_HOOKS_FUNCTION_FINAL cxx_pop_function_context 123 124#undef LANG_HOOKS_RTL_EXPAND_START 125#define LANG_HOOKS_RTL_EXPAND_START cxx_expand_function_start 126#undef LANG_HOOKS_RTL_EXPAND_STMT 127#define LANG_HOOKS_RTL_EXPAND_STMT expand_stmt 128 129/* Attribute hooks. */ 130#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE 131#define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table 132#undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE 133#define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table 134#undef LANG_HOOKS_ATTRIBUTE_TABLE 135#define LANG_HOOKS_ATTRIBUTE_TABLE cxx_attribute_table 136 137#undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES 138#define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \ 139 cp_walk_subtrees 140#undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN 141#define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ 142 cp_cannot_inline_tree_fn 143#undef LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS 144#define LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS \ 145 cp_add_pending_fn_decls 146#undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P 147#define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \ 148 cp_is_overload_p 149#undef LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P 150#define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \ 151 cp_auto_var_in_fn_p 152#undef LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING 153#define LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING \ 154 cp_copy_res_decl_for_inlining 155#undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P 156#define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p 157#undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P 158#define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P cp_var_mod_type_p 159#undef LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS 160#define LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS c_estimate_num_insns 161#undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN 162#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree 163#undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN 164#define LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN cp_type_quals 165#undef LANG_HOOKS_EXPR_SIZE 166#define LANG_HOOKS_EXPR_SIZE cp_expr_size 167 168#undef LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR 169#define LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR cxx_callgraph_analyze_expr 170#undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION 171#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION expand_body 172 173#undef LANG_HOOKS_MAKE_TYPE 174#define LANG_HOOKS_MAKE_TYPE cxx_make_type 175#undef LANG_HOOKS_TYPE_FOR_MODE 176#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode 177#undef LANG_HOOKS_TYPE_FOR_SIZE 178#define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size 179#undef LANG_HOOKS_SIGNED_TYPE 180#define LANG_HOOKS_SIGNED_TYPE c_common_signed_type 181#undef LANG_HOOKS_UNSIGNED_TYPE 182#define LANG_HOOKS_UNSIGNED_TYPE c_common_unsigned_type 183#undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE 184#define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type 185#undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR 186#define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error 187#undef LANG_HOOKS_TYPE_PROMOTES_TO 188#define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to 189#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE 190#define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type 191 192/* Each front end provides its own hooks, for toplev.c. */ 193const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; 194 195/* Tree code classes. */ 196 197#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, 198 199const char tree_code_type[] = { 200#include "tree.def" 201 'x', 202#include "c-common.def" 203 'x', 204#include "cp-tree.def" 205}; 206#undef DEFTREECODE 207 208/* Table indexed by tree code giving number of expression 209 operands beyond the fixed part of the node structure. 210 Not used for types or decls. */ 211 212#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, 213 214const unsigned char tree_code_length[] = { 215#include "tree.def" 216 0, 217#include "c-common.def" 218 0, 219#include "cp-tree.def" 220}; 221#undef DEFTREECODE 222 223/* Names of tree components. 224 Used for printing out the tree and error messages. */ 225#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, 226 227const char *const tree_code_name[] = { 228#include "tree.def" 229 "@@dummy", 230#include "c-common.def" 231 "@@dummy", 232#include "cp-tree.def" 233}; 234#undef DEFTREECODE 235 236/* Check if a C++ type is safe for aliasing. 237 Return TRUE if T safe for aliasing FALSE otherwise. */ 238 239static bool 240ok_to_generate_alias_set_for_type (tree t) 241{ 242 if (TYPE_PTRMEMFUNC_P (t)) 243 return true; 244 if (AGGREGATE_TYPE_P (t)) 245 { 246 if ((TREE_CODE (t) == RECORD_TYPE) || (TREE_CODE (t) == UNION_TYPE)) 247 { 248 tree fields; 249 /* Backend-created structs are safe. */ 250 if (! CLASS_TYPE_P (t)) 251 return true; 252 /* PODs are safe. */ 253 if (! CLASSTYPE_NON_POD_P(t)) 254 return true; 255 /* Classes with virtual baseclasses are not. */ 256 if (TYPE_USES_VIRTUAL_BASECLASSES (t)) 257 return false; 258 /* Recursively check the base classes. */ 259 if (TYPE_BINFO (t) != NULL && TYPE_BINFO_BASETYPES (t) != NULL) 260 { 261 int i; 262 for (i = 0; i < TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (t)); i++) 263 { 264 tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (t), i); 265 if (!ok_to_generate_alias_set_for_type (BINFO_TYPE (binfo))) 266 return false; 267 } 268 } 269 /* Check all the fields. */ 270 for (fields = TYPE_FIELDS (t); fields; fields = TREE_CHAIN (fields)) 271 { 272 if (TREE_CODE (fields) != FIELD_DECL) 273 continue; 274 if (! ok_to_generate_alias_set_for_type (TREE_TYPE (fields))) 275 return false; 276 } 277 return true; 278 } 279 else if (TREE_CODE (t) == ARRAY_TYPE) 280 return ok_to_generate_alias_set_for_type (TREE_TYPE (t)); 281 else 282 /* This should never happen, we dealt with all the aggregate 283 types that can appear in C++ above. */ 284 abort (); 285 } 286 else 287 return true; 288} 289 290/* Special routine to get the alias set for C++. */ 291 292static HOST_WIDE_INT 293cxx_get_alias_set (tree t) 294{ 295 if (TREE_CODE (t) == RECORD_TYPE 296 && TYPE_CONTEXT (t) && CLASS_TYPE_P (TYPE_CONTEXT (t)) 297 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t) 298 /* The base variant of a type must be in the same alias set as the 299 complete type. */ 300 return get_alias_set (TYPE_CONTEXT (t)); 301 302 if (/* It's not yet safe to use alias sets for some classes in C++. */ 303 !ok_to_generate_alias_set_for_type (t) 304 /* Nor is it safe to use alias sets for pointers-to-member 305 functions, due to the fact that there may be more than one 306 RECORD_TYPE type corresponding to the same pointer-to-member 307 type. */ 308 || TYPE_PTRMEMFUNC_P (t)) 309 return 0; 310 311 return c_common_get_alias_set (t); 312} 313 314/* Called from check_global_declarations. */ 315 316static bool 317cxx_warn_unused_global_decl (tree decl) 318{ 319 if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) 320 return false; 321 if (DECL_IN_SYSTEM_HEADER (decl)) 322 return false; 323 324 /* Const variables take the place of #defines in C++. */ 325 if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)) 326 return false; 327 328 return true; 329} 330 331/* Langhook for expr_size: Tell the backend that the value of an expression 332 of non-POD class type does not include any tail padding; a derived class 333 might have allocated something there. */ 334 335static tree 336cp_expr_size (tree exp) 337{ 338 if (CLASS_TYPE_P (TREE_TYPE (exp))) 339 { 340 /* The backend should not be interested in the size of an expression 341 of a type with both of these set; all copies of such types must go 342 through a constructor or assignment op. */ 343 if (TYPE_HAS_COMPLEX_INIT_REF (TREE_TYPE (exp)) 344 && TYPE_HAS_COMPLEX_ASSIGN_REF (TREE_TYPE (exp)) 345 /* But storing a CONSTRUCTOR isn't a copy. */ 346 && TREE_CODE (exp) != CONSTRUCTOR) 347 abort (); 348 /* This would be wrong for a type with virtual bases, but they are 349 caught by the abort above. */ 350 return (is_empty_class (TREE_TYPE (exp)) 351 ? size_zero_node 352 : CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp))); 353 } 354 else 355 /* Use the default code. */ 356 return lhd_expr_size (exp); 357} 358 359/* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */ 360static size_t 361cp_tree_size (enum tree_code code) 362{ 363 switch (code) 364 { 365 case PTRMEM_CST: return sizeof (struct ptrmem_cst); 366 case BASELINK: return sizeof (struct tree_baselink); 367 case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index); 368 case DEFAULT_ARG: return sizeof (struct tree_default_arg); 369 case OVERLOAD: return sizeof (struct tree_overload); 370 case WRAPPER: return sizeof (struct tree_wrapper); 371 default: 372 abort (); 373 } 374 /* NOTREACHED */ 375} 376 377/* Returns true if T is a variably modified type, in the sense of C99. 378 This routine needs only check cases that cannot be handled by the 379 language-independent logic in tree-inline.c. */ 380 381static bool 382cp_var_mod_type_p (tree type) 383{ 384 /* If TYPE is a pointer-to-member, it is variably modified if either 385 the class or the member are variably modified. */ 386 if (TYPE_PTR_TO_MEMBER_P (type)) 387 return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type)) 388 || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))); 389 390 /* All other types are not variably modified. */ 391 return false; 392} 393 394/* Stub routine to tell people that this doesn't work yet. */ 395void 396c_reset_state (void) 397{ 398 sorry ("inter-module optimisations not implemented yet"); 399} 400 401/* Construct a C++-aware pretty-printer for CONTEXT. It is assumed 402 that CONTEXT->printer is an already constructed basic pretty_printer. */ 403static void 404cxx_initialize_diagnostics (diagnostic_context *context) 405{ 406 pretty_printer *base = context->printer; 407 cxx_pretty_printer *pp = xmalloc (sizeof (cxx_pretty_printer)); 408 memcpy (pp_base (pp), base, sizeof (pretty_printer)); 409 pp_cxx_pretty_printer_init (pp); 410 context->printer = (pretty_printer *) pp; 411 412 /* It is safe to free this object because it was previously malloc()'d. */ 413 free (base); 414} 415