/* Language-dependent hooks for C++. Copyright 2001, 2002 Free Software Foundation, Inc. Contributed by Alexandre Oliva This file is part of GNU CC. GNU CC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #include "system.h" #include "tree.h" #include "cp-tree.h" #include "c-common.h" #include "toplev.h" #include "langhooks.h" #include "langhooks-def.h" static HOST_WIDE_INT cxx_get_alias_set PARAMS ((tree)); static tree cp_expr_size PARAMS ((tree)); static bool cp_var_mod_type_p PARAMS ((tree)); #undef LANG_HOOKS_NAME #define LANG_HOOKS_NAME "GNU C++" #undef LANG_HOOKS_INIT #define LANG_HOOKS_INIT cxx_init #undef LANG_HOOKS_FINISH #define LANG_HOOKS_FINISH cxx_finish #undef LANG_HOOKS_CLEAR_BINDING_STACK #define LANG_HOOKS_CLEAR_BINDING_STACK pop_everything #undef LANG_HOOKS_INIT_OPTIONS #define LANG_HOOKS_INIT_OPTIONS cxx_init_options #undef LANG_HOOKS_DECODE_OPTION #define LANG_HOOKS_DECODE_OPTION cxx_decode_option #undef LANG_HOOKS_POST_OPTIONS #define LANG_HOOKS_POST_OPTIONS c_common_post_options #undef LANG_HOOKS_GET_ALIAS_SET #define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set #undef LANG_HOOKS_EXPAND_CONSTANT #define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant #undef LANG_HOOKS_SAFE_FROM_P #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p #undef LANG_HOOKS_PRINT_STATISTICS #define LANG_HOOKS_PRINT_STATISTICS cxx_print_statistics #undef LANG_HOOKS_PRINT_XNODE #define LANG_HOOKS_PRINT_XNODE cxx_print_xnode #undef LANG_HOOKS_PRINT_DECL #define LANG_HOOKS_PRINT_DECL cxx_print_decl #undef LANG_HOOKS_PRINT_TYPE #define LANG_HOOKS_PRINT_TYPE cxx_print_type #undef LANG_HOOKS_PRINT_IDENTIFIER #define LANG_HOOKS_PRINT_IDENTIFIER cxx_print_identifier #undef LANG_HOOKS_SET_YYDEBUG #define LANG_HOOKS_SET_YYDEBUG cxx_set_yydebug #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES \ cp_walk_subtrees #undef LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN #define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ cp_cannot_inline_tree_fn #undef LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS #define LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS \ cp_add_pending_fn_decls #undef LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P #define LANG_HOOKS_TREE_INLINING_TREE_CHAIN_MATTERS_P \ cp_is_overload_p #undef LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P #define LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P \ cp_auto_var_in_fn_p #undef LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING #define LANG_HOOKS_TREE_INLINING_COPY_RES_DECL_FOR_INLINING \ cp_copy_res_decl_for_inlining #undef LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P #define LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P anon_aggr_type_p #undef LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P #define LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P cp_var_mod_type_p #undef LANG_HOOKS_TREE_INLINING_START_INLINING #define LANG_HOOKS_TREE_INLINING_START_INLINING cp_start_inlining #undef LANG_HOOKS_TREE_INLINING_END_INLINING #define LANG_HOOKS_TREE_INLINING_END_INLINING cp_end_inlining #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN cp_dump_tree #undef LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN #define LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN cp_type_quals #undef LANG_HOOKS_EXPR_SIZE #define LANG_HOOKS_EXPR_SIZE cp_expr_size /* Each front end provides its own hooks, for toplev.c. */ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; /* Special routine to get the alias set for C++. */ static HOST_WIDE_INT cxx_get_alias_set (t) tree t; { /* It's not yet safe to use alias sets for classes in C++ because the TYPE_FIELDs list for a class doesn't mention base classes. */ if (AGGREGATE_TYPE_P (t)) return 0; return c_common_get_alias_set (t); } /* Langhook for expr_size: Tell the backend that the value of an expression of non-POD class type does not include any tail padding; a derived class might have allocated something there. */ static tree cp_expr_size (exp) tree exp; { if (CLASS_TYPE_P (TREE_TYPE (exp))) { /* This would be wrong for a type with virtual bases, but they should not get here. */ return CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp)); } else /* Use the default code. */ return lhd_expr_size (exp); } /* Returns true if T is a variably modified type, in the sense of C99. This routine needs only check cases that cannot be handled by the language-independent logic in tree-inline.c. */ static bool cp_var_mod_type_p (tree type) { /* If TYPE is a pointer-to-member, it is variably modified if either the class or the member are variably modified. */ if (TYPE_PTRMEM_P (type) || TYPE_PTRMEMFUNC_P (type)) return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type)) || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type))); /* All other types are not variably modified. */ return false; }