X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-lang.c;h=0f8bf4ea49a3d0ad718093dbb83c9bb0f1adbc9f;hb=ecbfdc878159c748742c4a5e8d416e4edd90cac9;hp=36d73d29c5eeb73578f28c8aa1c0f7538cf6fa7e;hpb=f12b58b3384f7b4faba39eaa3ebc67c3049f2a3c;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-lang.c b/gcc/c-lang.c index 36d73d29c5e..0f8bf4ea49a 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -1,6 +1,6 @@ /* Language-specific hook definitions for C front end. Copyright (C) 1991, 1995, 1997, 1998, - 1999, 2000, 2001 Free Software Foundation, Inc. + 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. This file is part of GCC. @@ -22,289 +22,180 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "config.h" #include "system.h" +#include "coretypes.h" +#include "tm.h" #include "tree.h" -#include "function.h" -#include "input.h" -#include "toplev.h" -#include "diagnostic.h" -#include "output.h" -#include "flags.h" -#include "ggc.h" -#include "rtl.h" -#include "expr.h" #include "c-tree.h" -#include "c-lex.h" -#include "cpplib.h" - -static int c_tree_printer PARAMS ((output_buffer *)); -static int c_missing_noreturn_ok_p PARAMS ((tree)); -static void c_init PARAMS ((void)); -static void c_init_options PARAMS ((void)); -static void c_post_options PARAMS ((void)); +#include "c-common.h" +#include "ggc.h" +#include "langhooks.h" +#include "langhooks-def.h" +#include "diagnostic.h" +#include "c-pretty-print.h" + +static void c_initialize_diagnostics (diagnostic_context *); + +enum c_language_kind c_language = clk_c; + +/* ### When changing hooks, consider if ObjC needs changing too!! ### */ + +#undef LANG_HOOKS_NAME +#define LANG_HOOKS_NAME "GNU C" +#undef LANG_HOOKS_INIT +#define LANG_HOOKS_INIT c_objc_common_init +#undef LANG_HOOKS_FINISH +#define LANG_HOOKS_FINISH c_common_finish +#undef LANG_HOOKS_INIT_OPTIONS +#define LANG_HOOKS_INIT_OPTIONS c_common_init_options +#undef LANG_HOOKS_INITIALIZE_DIAGNOSTICS +#define LANG_HOOKS_INITIALIZE_DIAGNOSTICS c_initialize_diagnostics +#undef LANG_HOOKS_HANDLE_OPTION +#define LANG_HOOKS_HANDLE_OPTION c_common_handle_option +#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 c_common_get_alias_set +#undef LANG_HOOKS_SAFE_FROM_P +#define LANG_HOOKS_SAFE_FROM_P c_safe_from_p +#undef LANG_HOOKS_EXPAND_EXPR +#define LANG_HOOKS_EXPAND_EXPR c_expand_expr +#undef LANG_HOOKS_MARK_ADDRESSABLE +#define LANG_HOOKS_MARK_ADDRESSABLE c_mark_addressable +#undef LANG_HOOKS_PARSE_FILE +#define LANG_HOOKS_PARSE_FILE c_common_parse_file +#undef LANG_HOOKS_TRUTHVALUE_CONVERSION +#define LANG_HOOKS_TRUTHVALUE_CONVERSION c_objc_common_truthvalue_conversion +#undef LANG_HOOKS_FINISH_INCOMPLETE_DECL +#define LANG_HOOKS_FINISH_INCOMPLETE_DECL c_finish_incomplete_decl +#undef LANG_HOOKS_UNSAFE_FOR_REEVAL +#define LANG_HOOKS_UNSAFE_FOR_REEVAL c_common_unsafe_for_reeval +#undef LANG_HOOKS_STATICP +#define LANG_HOOKS_STATICP c_staticp +#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME +#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME c_static_assembler_name +#undef LANG_HOOKS_NO_BODY_BLOCKS +#define LANG_HOOKS_NO_BODY_BLOCKS true +#undef LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL +#define LANG_HOOKS_WARN_UNUSED_GLOBAL_DECL c_warn_unused_global_decl +#undef LANG_HOOKS_PRINT_IDENTIFIER +#define LANG_HOOKS_PRINT_IDENTIFIER c_print_identifier +#undef LANG_HOOKS_FUNCTION_ENTER_NESTED +#define LANG_HOOKS_FUNCTION_ENTER_NESTED c_push_function_context +#undef LANG_HOOKS_FUNCTION_LEAVE_NESTED +#define LANG_HOOKS_FUNCTION_LEAVE_NESTED c_pop_function_context +#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL +#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL c_dup_lang_specific_decl +#undef LANG_HOOKS_DECL_UNINIT +#define LANG_HOOKS_DECL_UNINIT c_decl_uninit + +#undef LANG_HOOKS_RTL_EXPAND_STMT +#define LANG_HOOKS_RTL_EXPAND_STMT expand_stmt + +/* 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_TREE_INLINING_CANNOT_INLINE_TREE_FN +#define LANG_HOOKS_TREE_INLINING_CANNOT_INLINE_TREE_FN \ + c_cannot_inline_tree_fn +#undef LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS +#define LANG_HOOKS_TREE_INLINING_DISREGARD_INLINE_LIMITS \ + c_disregard_inline_limits +#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_CONVERT_PARM_FOR_INLINING +#define LANG_HOOKS_TREE_INLINING_CONVERT_PARM_FOR_INLINING \ + c_convert_parm_for_inlining +#undef LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS +#define LANG_HOOKS_TREE_INLINING_ESTIMATE_NUM_INSNS c_estimate_num_insns +#undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN +#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN c_dump_tree + +#undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION +#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION c_expand_body + +#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 c_incomplete_type_error +#undef LANG_HOOKS_TYPE_PROMOTES_TO +#define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to +#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE +#define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type + +#undef LANG_HOOKS_WRITE_GLOBALS +#define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations + +/* ### When changing hooks, consider if ObjC needs changing too!! ### */ /* Each front end provides its own. */ -struct lang_hooks lang_hooks = {c_init, - NULL, /* c_finish */ - c_init_options, - c_decode_option, - c_post_options}; +const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; -/* Post-switch processing. */ -static void -c_post_options () -{ - cpp_post_options (parse_in); -} - -static void -c_init_options () -{ - /* Make identifier nodes long enough for the language-specific slots. */ - set_identifier_size (sizeof (struct lang_identifier)); +/* Tree code classes. */ - parse_in = cpp_create_reader (ident_hash, CLK_GNUC89); +#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE, - /* Mark as "unspecified". */ - flag_bounds_check = -1; -} +const char tree_code_type[] = { +#include "tree.def" + 'x', +#include "c-common.def" +}; +#undef DEFTREECODE -static void -c_init () -{ - c_common_lang_init (); +/* Table indexed by tree code giving number of expression + operands beyond the fixed part of the node structure. + Not used for types or decls. */ - /* If still unspecified, make it match -std=c99 - (allowing for -pedantic-errors). */ - if (mesg_implicit_function_declaration < 0) - { - if (flag_isoc99) - mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1; - else - mesg_implicit_function_declaration = 0; - } +#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH, - save_lang_status = &push_c_function_context; - restore_lang_status = &pop_c_function_context; - mark_lang_status = &mark_c_function_context; - lang_expand_expr = &c_expand_expr; - lang_safe_from_p = &c_safe_from_p; - diagnostic_format_decoder (global_dc) = &c_tree_printer; - lang_expand_decl_stmt = &c_expand_decl_stmt; - lang_missing_noreturn_ok_p = &c_missing_noreturn_ok_p; +const unsigned char tree_code_length[] = { +#include "tree.def" + 0, +#include "c-common.def" +}; +#undef DEFTREECODE - c_parse_init (); -} +/* Names of tree components. + Used for printing out the tree and error messages. */ +#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME, -const char * -lang_identify () -{ - return "c"; -} +const char *const tree_code_name[] = { +#include "tree.def" + "@@dummy", +#include "c-common.def" +}; +#undef DEFTREECODE void -print_lang_statistics () -{ -} - -/* used by print-tree.c */ - -void -lang_print_xnode (file, node, indent) - FILE *file ATTRIBUTE_UNUSED; - tree node ATTRIBUTE_UNUSED; - int indent ATTRIBUTE_UNUSED; -{ -} - -/* Used by c-lex.c, but only for objc. */ - -tree -lookup_interface (arg) - tree arg ATTRIBUTE_UNUSED; -{ - return 0; -} - -tree -is_class_name (arg) - tree arg ATTRIBUTE_UNUSED; -{ - return 0; -} - -void -maybe_objc_check_decl (decl) - tree decl ATTRIBUTE_UNUSED; -{ -} - -int -maybe_objc_comptypes (lhs, rhs, reflexive) - tree lhs ATTRIBUTE_UNUSED; - tree rhs ATTRIBUTE_UNUSED; - int reflexive ATTRIBUTE_UNUSED; -{ - return -1; -} - -tree -maybe_building_objc_message_expr () +finish_file (void) { - return 0; -} - -int -recognize_objc_keyword () -{ - return 0; -} - -/* Used by c-typeck.c (build_external_ref), but only for objc. */ - -tree -lookup_objc_ivar (id) - tree id ATTRIBUTE_UNUSED; -{ - return 0; -} - -#if !defined(ASM_OUTPUT_CONSTRUCTOR) || !defined(ASM_OUTPUT_DESTRUCTOR) -extern tree static_ctors; -extern tree static_dtors; - -static tree start_cdtor PARAMS ((int)); -static void finish_cdtor PARAMS ((tree)); - -static tree -start_cdtor (method_type) - int method_type; -{ - tree fnname = get_file_function_name (method_type); - tree void_list_node_1 = build_tree_list (NULL_TREE, void_type_node); - tree body; - - start_function (void_list_node_1, - build_nt (CALL_EXPR, fnname, - tree_cons (NULL_TREE, NULL_TREE, void_list_node_1), - NULL_TREE), - NULL_TREE); - store_parm_decls (); - - current_function_cannot_inline - = "static constructors and destructors cannot be inlined"; - - body = c_begin_compound_stmt (); - - pushlevel (0); - clear_last_expr (); - add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); - - return body; + c_objc_common_finish_file (); } static void -finish_cdtor (body) - tree body; -{ - tree scope; - tree block; - - scope = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); - block = poplevel (0, 0, 0); - SCOPE_STMT_BLOCK (TREE_PURPOSE (scope)) = block; - SCOPE_STMT_BLOCK (TREE_VALUE (scope)) = block; - - RECHAIN_STMTS (body, COMPOUND_BODY (body)); - - finish_function (0); -} -#endif - -/* Called at end of parsing, but before end-of-file processing. */ - -void -finish_file () +c_initialize_diagnostics (diagnostic_context *context) { -#ifndef ASM_OUTPUT_CONSTRUCTOR - if (static_ctors) - { - tree body = start_cdtor ('I'); - - for (; static_ctors; static_ctors = TREE_CHAIN (static_ctors)) - c_expand_expr_stmt (build_function_call (TREE_VALUE (static_ctors), - NULL_TREE)); - - finish_cdtor (body); - } -#endif -#ifndef ASM_OUTPUT_DESTRUCTOR - if (static_dtors) - { - tree body = start_cdtor ('D'); - - for (; static_dtors; static_dtors = TREE_CHAIN (static_dtors)) - c_expand_expr_stmt (build_function_call (TREE_VALUE (static_dtors), - NULL_TREE)); - - finish_cdtor (body); - } -#endif + pretty_printer *base = context->printer; + c_pretty_printer *pp = xmalloc (sizeof (c_pretty_printer)); + memcpy (pp_base (pp), base, sizeof (pretty_printer)); + pp_c_pretty_printer_init (pp); + context->printer = (pretty_printer *) pp; - if (back_end_hook) - (*back_end_hook) (getdecls ()); - - { - int flags; - FILE *stream = dump_begin (TDI_all, &flags); - - if (stream) - { - dump_node (getdecls (), flags & ~TDF_SLIM, stream); - dump_end (TDI_all, stream); - } - } + /* It is safe to free this object because it was previously malloc()'d. */ + free (base); } -/* Called during diagnostic message formatting process to print a - source-level entity onto BUFFER. The meaning of the format specifiers - is as follows: - %D: a general decl, - %F: a function declaration, - %T: a type. - - These format specifiers form a subset of the format specifiers set used - by the C++ front-end. - Please notice when called, the `%' part was already skipped by the - diagnostic machinery. */ -static int -c_tree_printer (buffer) - output_buffer *buffer; -{ - tree t = va_arg (output_buffer_format_args (buffer), tree); - - switch (*output_buffer_text_cursor (buffer)) - { - case 'D': - case 'F': - case 'T': - { - const char *n = DECL_NAME (t) - ? (*decl_printable_name) (t, 2) - : "({anonymous})"; - output_add_string (buffer, n); - } - return 1; - - default: - return 0; - } -} - -static int -c_missing_noreturn_ok_p (decl) - tree decl; -{ - /* A missing noreturn is not ok for freestanding implementations and - ok for the `main' function in hosted implementations. */ - return flag_hosted && MAIN_NAME_P (DECL_ASSEMBLER_NAME (decl)); -} +#include "gtype-c.h"