diff options
author | Ziemowit Laski <zlaski@apple.com> | 2004-08-31 18:51:08 +0000 |
---|---|---|
committer | Ziemowit Laski <zlaski@gcc.gnu.org> | 2004-08-31 18:51:08 +0000 |
commit | 11bb4b2798ebb30c614f486d4c405a8f969f72c4 (patch) | |
tree | dff740e6130eb0b1821f2508cf868efe2cd89df2 /gcc/cp/cp-lang.c | |
parent | c61eceebfae296bfab51a3af14bf09f2808d260c (diff) | |
download | gcc-11bb4b2798ebb30c614f486d4c405a8f969f72c4.zip gcc-11bb4b2798ebb30c614f486d4c405a8f969f72c4.tar.gz gcc-11bb4b2798ebb30c614f486d4c405a8f969f72c4.tar.bz2 |
Make-lang.in (CXX_AND_OBJCXX_OBJS): Add cp/cp-objcp-common.o.
2004-08-31 Ziemowit Laski <zlaski@apple.com>
* Make-lang.in (CXX_AND_OBJCXX_OBJS): Add cp/cp-objcp-common.o.
(cp/cp-lang.o): Depend on debug.h, gtype-cp.h and cp/cp-objcp-common.h.
(cp/cp-decl.c): Do not depend on gtype-cp.h.
(cp/cp-objcp-common.o): New target.
* cp-lang.c: Include debug.h, cp-objcp-common.h and gtype-cp.h.
(cxx_get_alias_set, cxx_warn_unused_global_decl, cp_expr_size,
cp_tree_size, cp_var_mod_type_p, cxx_initialize_diagnostics): Move
prototypes and definitions to cp-objcp-common.h and cp-objcp-common.c,
respectively.
(LANG_HOOKS_TREE_SIZE, LANG_HOOKS_FINISH,
LANG_HOOKS_CLEAR_BINDING_STACK, LANG_HOOKS_INIT_OPTIONS,
LANG_HOOKS_INITIALIZE_DIAGNOSTICS, LANG_HOOKS_HANDLE_OPTION,
LANG_HOOKS_HANDLE_FILENAME, LANG_HOOKS_MISSING_ARGUMENT,
LANG_HOOKS_POST_OPTIONS, LANG_HOOKS_GET_ALIAS_SET,
LANG_HOOKS_EXPAND_CONSTANT, LANG_HOOKS_EXPAND_EXPR,
LANG_HOOKS_EXPAND_DECL, LANG_HOOKS_PARSE_FILE,
LANG_HOOKS_DUP_LANG_SPECIFIC_DECL, LANG_HOOKS_TRUTHVALUE_CONVERSION,
LANG_HOOKS_SET_DECL_ASSEMBLER_NAME, LANG_HOOKS_MARK_ADDRESSABLE,
LANG_HOOKS_PRINT_STATISTICS, LANG_HOOKS_PRINT_XNODE,
LANG_HOOKS_PRINT_DECL, LANG_HOOKS_PRINT_TYPE,
LANG_HOOKS_PRINT_IDENTIFIER, LANG_HOOKS_PRINT_ERROR_FUNCTION,
LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL, LANG_HOOKS_WRITE_GLOBALS,
LANG_HOOKS_FUNCTION_INIT, LANG_HOOKS_FUNCTION_FINAL,
LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P,
LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE,
LANG_HOOKS_ATTRIBUTE_TABLE, LANG_HOOKS_TREE_INLINING_WALK_SUBTREES,
LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN,
LANG_HOOKS_TREE_INLINING_ADD_PENDING_FN_DECLS,
LANG_HOOKS_TREE_INLINING_AUTO_VAR_IN_FN_P,
LANG_HOOKS_TREE_INLINING_ANON_AGGR_TYPE_P,
LANG_HOOKS_TREE_INLINING_VAR_MOD_TYPE_P,
LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN,
LANG_HOOKS_TREE_DUMP_TYPE_QUALS_FN, LANG_HOOKS_EXPR_SIZE,
LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR,
LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION, LANG_HOOKS_MAKE_TYPE,
LANG_HOOKS_TYPE_FOR_MODE, LANG_HOOKS_TYPE_FOR_SIZE,
LANG_HOOKS_SIGNED_TYPE, LANG_HOOKS_UNSIGNED_TYPE,
LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, LANG_HOOKS_INCOMPLETE_TYPE_ERROR,
LANG_HOOKS_TYPE_PROMOTES_TO, LANG_HOOKS_REGISTER_BUILTIN_TYPE,
LANG_HOOKS_GIMPLIFY_EXPR, LANG_HOOKS_FOLD_OBJ_TYPE_REF): Move
hooks to cp-objcp-common.h.
(finish_file): New function.
* cp-objcp-common.c: New file.
* cp-objcp-common.h: New file.
* cp-tree.h (cp_finish_file): New prototype.
* decl.c: Do not include gtype-cp.h.
* decl2.c (finish_file): Rename to cp_finish_file.
From-SVN: r86837
Diffstat (limited to 'gcc/cp/cp-lang.c')
-rw-r--r-- | gcc/cp/cp-lang.c | 266 |
1 files changed, 18 insertions, 248 deletions
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index a1359cd..ac89be0 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -31,146 +31,26 @@ Boston, MA 02111-1307, USA. */ #include "langhooks-def.h" #include "diagnostic.h" #include "cxx-pretty-print.h" +#include "debug.h" +#include "cp-objcp-common.h" enum c_language_kind c_language = clk_cxx; -static HOST_WIDE_INT cxx_get_alias_set (tree); -static bool cxx_warn_unused_global_decl (tree); -static tree cp_expr_size (tree); -static size_t cp_tree_size (enum tree_code); -static bool cp_var_mod_type_p (tree, tree); +/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h; + consequently, there should be very few hooks below. */ + static int cxx_types_compatible_p (tree, tree); -static void cxx_initialize_diagnostics (diagnostic_context *); #undef LANG_HOOKS_NAME #define LANG_HOOKS_NAME "GNU C++" -#undef LANG_HOOKS_TREE_SIZE -#define LANG_HOOKS_TREE_SIZE cp_tree_size #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 c_common_init_options -#undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS -#define LANG_HOOKS_INITIALIZE_DIAGNOSTICS cxx_initialize_diagnostics -#undef LANG_HOOKS_HANDLE_OPTION -#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option -#undef LANG_HOOKS_HANDLE_FILENAME -#define LANG_HOOKS_HANDLE_FILENAME c_common_handle_filename -#undef LANG_HOOKS_MISSING_ARGUMENT -#define LANG_HOOKS_MISSING_ARGUMENT c_common_missing_argument -#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_EXPAND_EXPR -#define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr -#undef LANG_HOOKS_EXPAND_DECL -#define LANG_HOOKS_EXPAND_DECL c_expand_decl -#undef LANG_HOOKS_PARSE_FILE -#define LANG_HOOKS_PARSE_FILE c_common_parse_file -#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL -#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL cxx_dup_lang_specific_decl -#undef LANG_HOOKS_TRUTHVALUE_CONVERSION -#define LANG_HOOKS_TRUTHVALUE_CONVERSION c_common_truthvalue_conversion -#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME -#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME mangle_decl -#undef LANG_HOOKS_MARK_ADDRESSABLE -#define LANG_HOOKS_MARK_ADDRESSABLE cxx_mark_addressable -#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_DECL_PRINTABLE_NAME #define LANG_HOOKS_DECL_PRINTABLE_NAME cxx_printable_name -#undef LANG_HOOKS_PRINT_ERROR_FUNCTION -#define LANG_HOOKS_PRINT_ERROR_FUNCTION cxx_print_error_function -#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL -#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL cxx_warn_unused_global_decl -#undef LANG_HOOKS_WRITE_GLOBALS -#define LANG_HOOKS_WRITE_GLOBALS lhd_do_nothing - - -#undef LANG_HOOKS_FUNCTION_INIT -#define LANG_HOOKS_FUNCTION_INIT cxx_push_function_context -#undef LANG_HOOKS_FUNCTION_FINAL -#define LANG_HOOKS_FUNCTION_FINAL cxx_pop_function_context -#undef LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P -#define LANG_HOOKS_FUNCTION_MISSING_NORETURN_OK_P cp_missing_noreturn_ok_p - -/* Attribute hooks. */ -#undef LANG_HOOKS_COMMON_ATTRIBUTE_TABLE -#define LANG_HOOKS_COMMON_ATTRIBUTE_TABLE c_common_attribute_table -#undef LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE -#define LANG_HOOKS_FORMAT_ATTRIBUTE_TABLE c_common_format_attribute_table -#undef LANG_HOOKS_ATTRIBUTE_TABLE -#define LANG_HOOKS_ATTRIBUTE_TABLE cxx_attribute_table - -#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_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_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_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 - -#undef LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR -#define LANG_HOOKS_CALLGRAPH_ANALYZE_EXPR cxx_callgraph_analyze_expr -#undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION -#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION expand_body - -#undef LANG_HOOKS_MAKE_TYPE -#define LANG_HOOKS_MAKE_TYPE cxx_make_type -#undef LANG_HOOKS_TYPE_FOR_MODE -#define LANG_HOOKS_TYPE_FOR_MODE c_common_type_for_mode -#undef LANG_HOOKS_TYPE_FOR_SIZE -#define LANG_HOOKS_TYPE_FOR_SIZE c_common_type_for_size -#undef LANG_HOOKS_SIGNED_TYPE -#define LANG_HOOKS_SIGNED_TYPE c_common_signed_type -#undef LANG_HOOKS_UNSIGNED_TYPE -#define LANG_HOOKS_UNSIGNED_TYPE c_common_unsigned_type -#undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE -#define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE c_common_signed_or_unsigned_type -#undef LANG_HOOKS_INCOMPLETE_TYPE_ERROR -#define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error -#undef LANG_HOOKS_TYPE_PROMOTES_TO -#define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to #undef LANG_HOOKS_TYPES_COMPATIBLE_P #define LANG_HOOKS_TYPES_COMPATIBLE_P cxx_types_compatible_p -#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE -#define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type -#undef LANG_HOOKS_GIMPLIFY_EXPR -#define LANG_HOOKS_GIMPLIFY_EXPR cp_gimplify_expr -#undef LANG_HOOKS_FOLD_OBJ_TYPE_REF -#define LANG_HOOKS_FOLD_OBJ_TYPE_REF cp_fold_obj_type_ref -/* Each front end provides its own hooks, for toplev.c. */ +/* Each front end provides its own lang hook initializer. */ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; /* Tree code classes. */ @@ -214,104 +94,8 @@ const char *const tree_code_name[] = { }; #undef DEFTREECODE -/* Special routine to get the alias set for C++. */ - -static HOST_WIDE_INT -cxx_get_alias_set (tree t) -{ - if (IS_FAKE_BASE_TYPE (t)) - /* The base variant of a type must be in the same alias set as the - complete type. */ - return get_alias_set (TYPE_CONTEXT (t)); - - /* Punt on PMFs until we canonicalize functions properly. */ - if (TYPE_PTRMEMFUNC_P (t)) - return 0; - - return c_common_get_alias_set (t); -} - -/* Called from check_global_declarations. */ - -static bool -cxx_warn_unused_global_decl (tree decl) -{ - if (TREE_CODE (decl) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (decl)) - return false; - if (DECL_IN_SYSTEM_HEADER (decl)) - return false; - - /* Const variables take the place of #defines in C++. */ - if (TREE_CODE (decl) == VAR_DECL && TREE_READONLY (decl)) - return false; - - return true; -} - -/* 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 (tree exp) -{ - if (CLASS_TYPE_P (TREE_TYPE (exp))) - { - /* The backend should not be interested in the size of an expression - of a type with both of these set; all copies of such types must go - through a constructor or assignment op. */ - gcc_assert (!TYPE_HAS_COMPLEX_INIT_REF (TREE_TYPE (exp)) - || !TYPE_HAS_COMPLEX_ASSIGN_REF (TREE_TYPE (exp)) - /* But storing a CONSTRUCTOR isn't a copy. */ - || TREE_CODE (exp) == CONSTRUCTOR); - - /* This would be wrong for a type with virtual bases, but they are - caught by the assert above. */ - return (is_empty_class (TREE_TYPE (exp)) - ? size_zero_node - : CLASSTYPE_SIZE_UNIT (TREE_TYPE (exp))); - } - else - /* Use the default code. */ - return lhd_expr_size (exp); -} - -/* Langhook for tree_size: determine size of our 'x' and 'c' nodes. */ -static size_t -cp_tree_size (enum tree_code code) -{ - switch (code) - { - case TINST_LEVEL: return sizeof (struct tinst_level_s); - case PTRMEM_CST: return sizeof (struct ptrmem_cst); - case BASELINK: return sizeof (struct tree_baselink); - case TEMPLATE_PARM_INDEX: return sizeof (template_parm_index); - case DEFAULT_ARG: return sizeof (struct tree_default_arg); - case OVERLOAD: return sizeof (struct tree_overload); - default: - gcc_unreachable (); - } - /* NOTREACHED */ -} - -/* Returns true if T is a variably modified type, in the sense of C99. - FN is as passed to variably_modified_p. - This routine needs only check cases that cannot be handled by the - language-independent logic in tree.c. */ - -static bool -cp_var_mod_type_p (tree type, tree fn) -{ - /* If TYPE is a pointer-to-member, it is variably modified if either - the class or the member are variably modified. */ - if (TYPE_PTR_TO_MEMBER_P (type)) - return (variably_modified_type_p (TYPE_PTRMEM_CLASS_TYPE (type), fn) - || variably_modified_type_p (TYPE_PTRMEM_POINTED_TO_TYPE (type), - fn)); - - /* All other types are not variably modified. */ - return false; -} +/* Lang hook routines common to C++ and ObjC++ appear in cp/cp-objcp-common.c; + there should be very few routines below. */ /* This compares two types for equivalence ("compatible" in C-based languages). This routine should only return 1 if it is sure. It should not be used @@ -332,35 +116,21 @@ static int cxx_types_compatible_p (tree x, tree y) return 0; } -/* Construct a C++-aware pretty-printer for CONTEXT. It is assumed - that CONTEXT->printer is an already constructed basic pretty_printer. */ -static void -cxx_initialize_diagnostics (diagnostic_context *context) -{ - pretty_printer *base = context->printer; - cxx_pretty_printer *pp = xmalloc (sizeof (cxx_pretty_printer)); - memcpy (pp_base (pp), base, sizeof (pretty_printer)); - pp_cxx_pretty_printer_init (pp); - context->printer = (pretty_printer *) pp; +/* The following function does something real, but only in Objective-C++. */ - /* It is safe to free this object because it was previously malloc()'d. */ - free (base); -} - -/* Stubs to keep c-opts.c happy. */ -void -push_file_scope (void) +tree +objcp_tsubst_copy_and_build (tree t ATTRIBUTE_UNUSED, tree args ATTRIBUTE_UNUSED, + tsubst_flags_t complain ATTRIBUTE_UNUSED, + tree in_decl ATTRIBUTE_UNUSED, + bool function_p ATTRIBUTE_UNUSED) { + return NULL_TREE; } void -pop_file_scope (void) +finish_file (void) { + cp_finish_file (); } -/* c-pragma.c needs to query whether a decl has extern "C" linkage. */ -bool -has_c_linkage (tree decl) -{ - return DECL_EXTERN_C_P (decl); -} +#include "gtype-cp.h" |