diff options
Diffstat (limited to 'gcc/objc')
-rw-r--r-- | gcc/objc/objc-act.c | 60 | ||||
-rw-r--r-- | gcc/objc/objc-act.h | 2 | ||||
-rw-r--r-- | gcc/objc/objc-lang.c | 15 |
3 files changed, 34 insertions, 43 deletions
diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index 1d76cc4..89abaf4 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -64,8 +64,6 @@ Boston, MA 02111-1307, USA. */ #include "diagnostic.h" #include "cgraph.h" -#define OBJC_VOID_AT_END build_tree_list (NULL_TREE, void_type_node) - /* This is the default way of generating a method name. */ /* I am not sure it is really correct. Perhaps there's a danger that it will make name conflicts @@ -161,7 +159,6 @@ static void generate_ivar_lists (void); static void generate_dispatch_tables (void); static void generate_shared_structures (void); static tree generate_protocol_list (tree); -static void generate_forward_declaration_to_string_table (void); static void build_protocol_reference (tree); static tree build_keyword_selector (tree); @@ -1238,7 +1235,7 @@ synth_module_prologue (void) = build_function_type (IMP_type, tree_cons (NULL_TREE, id_type, tree_cons (NULL_TREE, selector_type, - OBJC_VOID_AT_END))); + void_list_node))); umsg_decl = builtin_function (TAG_MSGSEND, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -1248,7 +1245,7 @@ synth_module_prologue (void) = build_function_type (IMP_type, tree_cons (NULL_TREE, super_type, tree_cons (NULL_TREE, selector_type, - OBJC_VOID_AT_END))); + void_list_node))); umsg_super_decl = builtin_function (TAG_MSGSENDSUPER, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -1259,7 +1256,7 @@ synth_module_prologue (void) temp_type = build_function_type (id_type, tree_cons (NULL_TREE, const_string_type_node, - OBJC_VOID_AT_END)); + void_list_node)); objc_get_class_decl = builtin_function (TAG_GETCLASS, temp_type, 0, NOT_BUILT_IN, @@ -1305,8 +1302,6 @@ synth_module_prologue (void) TREE_USED (UOBJC_SELECTOR_TABLE_decl) = 1; } - generate_forward_declaration_to_string_table (); - /* Forward declare constant_string_id and constant_string_type. */ if (!constant_string_class_name) constant_string_class_name = default_constant_string_class_name; @@ -1877,7 +1872,7 @@ build_module_descriptor (void) get_identifier (TAG_EXECCLASS), build_function_type (void_type_node, tree_cons (NULL_TREE, ptr_type_node, - OBJC_VOID_AT_END))); + void_list_node))); DECL_EXTERNAL (execclass_decl) = 1; DECL_ARTIFICIAL (execclass_decl) = 1; @@ -1892,7 +1887,7 @@ build_module_descriptor (void) start_function (void_list_node_1, build_nt (CALL_EXPR, init_function_name, tree_cons (NULL_TREE, NULL_TREE, - OBJC_VOID_AT_END), + void_list_node), NULL_TREE), NULL_TREE); store_parm_decls (); @@ -1919,22 +1914,6 @@ build_module_descriptor (void) } } -/* extern const char _OBJC_STRINGS[]; */ - -static void -generate_forward_declaration_to_string_table (void) -{ - tree sc_spec, decl_specs, expr_decl; - - sc_spec = tree_cons (NULL_TREE, ridpointers[(int) RID_EXTERN], NULL_TREE); - decl_specs = tree_cons (NULL_TREE, ridpointers[(int) RID_CHAR], sc_spec); - - expr_decl - = build_nt (ARRAY_REF, get_identifier ("_OBJC_STRINGS"), NULL_TREE); - - UOBJC_STRINGS_decl = define_decl (expr_decl, decl_specs); -} - /* Return the DECL of the string IDENT in the SECTION. */ static tree @@ -2699,7 +2678,7 @@ objc_enter_block (void) block = begin_compound_stmt (0); #else block = c_begin_compound_stmt (); - pushlevel (0); + push_scope (); clear_last_expr (); add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0); #endif @@ -2724,7 +2703,7 @@ objc_exit_block (void) finish_compound_stmt (0, block); #else scope_stmt = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0); - inner = poplevel (KEEP_MAYBE, 1, 0); + inner = pop_scope (); SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmt)) = SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmt)) @@ -3331,7 +3310,7 @@ build_objc_exception_stuff (void) = build_function_type (id_type, tree_cons (NULL_TREE, build_pointer_type (objc_exception_data_template), - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_extract_decl = builtin_function (TAG_EXCEPTIONEXTRACT, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); /* void objc_exception_try_enter(struct _objc_exception_data *); */ @@ -3340,7 +3319,7 @@ build_objc_exception_stuff (void) = build_function_type (void_type_node, tree_cons (NULL_TREE, build_pointer_type (objc_exception_data_template), - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_try_enter_decl = builtin_function (TAG_EXCEPTIONTRYENTER, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); objc_exception_try_exit_decl @@ -3350,7 +3329,7 @@ build_objc_exception_stuff (void) /* void objc_sync_exit(id); */ temp_type = build_function_type (void_type_node, tree_cons (NULL_TREE, id_type, - OBJC_VOID_AT_END)); + void_list_node)); objc_exception_throw_decl = builtin_function (TAG_EXCEPTIONTHROW, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); DECL_ATTRIBUTES (objc_exception_throw_decl) @@ -3363,7 +3342,7 @@ build_objc_exception_stuff (void) temp_type = build_function_type (integer_type_node, tree_cons (NULL_TREE, id_type, tree_cons (NULL_TREE, id_type, - OBJC_VOID_AT_END))); + void_list_node))); objc_exception_match_decl = builtin_function (TAG_EXCEPTIONMATCH, temp_type, 0, NOT_BUILT_IN, NULL, NULL_TREE); @@ -5463,7 +5442,7 @@ get_arg_type_list (tree meth, int context, int superflag) if (METHOD_ADD_ARGS (meth) == objc_ellipsis_node) /* We have a `, ...' immediately following the selector, - finalize the arglist...simulate get_parm_info (0). */ + finalize the arglist...simulate get_parm_info (true). */ ; else if (METHOD_ADD_ARGS (meth)) { @@ -5472,8 +5451,8 @@ get_arg_type_list (tree meth, int context, int superflag) chainon (arglist, add_arg_list); } else - /* finalize the arglist...simulate get_parm_info (1) */ - chainon (arglist, OBJC_VOID_AT_END); + /* finalize the arglist...simulate get_parm_info (false) */ + chainon (arglist, void_list_node); return arglist; } @@ -7539,7 +7518,8 @@ start_method_def (tree method) UOBJC_SUPER_decl = NULL_TREE; /* Must be called BEFORE start_function. */ - pushlevel (0); + push_scope (); + declare_parm_level (); /* Generate prototype declarations for arguments..."new-style". */ synth_self_and_ucmd_args (); @@ -7819,9 +7799,9 @@ continue_method_def (void) if (METHOD_ADD_ARGS (objc_method_context) == objc_ellipsis_node) /* We have a `, ...' immediately following the selector. */ - parmlist = get_parm_info (0); + parmlist = get_parm_info (/*ellipsis=*/true); else - parmlist = get_parm_info (1); /* place a `void_at_end' */ + parmlist = get_parm_info (/*ellipsis=*/false); #ifndef OBJCPLUS /* Set self_decl from the first argument...this global is used by @@ -7829,7 +7809,7 @@ continue_method_def (void) self_decl = TREE_PURPOSE (parmlist); #endif /* !OBJCPLUS */ - poplevel (0, 0, 0); + pop_scope (); really_start_method (objc_method_context, parmlist); store_parm_decls (); } @@ -8801,8 +8781,6 @@ finish_objc (void) objc_implementation_context = NULL_TREE; } - generate_forward_declaration_to_string_table (); - /* Process the static instances here because initialization of objc_symtab depends on them. */ if (objc_static_instances) diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index abbf656..db7eeca 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -234,7 +234,6 @@ enum objc_tree_index OCTI_MCLS_DECL, OCTI_SEL_TABLE_DECL, OCTI_MODULES_DECL, - OCTI_STRG_DECL, OCTI_INTF_CTX, OCTI_IMPL_CTX, @@ -360,7 +359,6 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define UOBJC_METACLASS_decl objc_global_trees[OCTI_MCLS_DECL] #define UOBJC_SELECTOR_TABLE_decl objc_global_trees[OCTI_SEL_TABLE_DECL] #define UOBJC_MODULES_decl objc_global_trees[OCTI_MODULES_DECL] -#define UOBJC_STRINGS_decl objc_global_trees[OCTI_STRG_DECL] /* The following are used when compiling a class implementation. implementation_template will normally be an interface, however if diff --git a/gcc/objc/objc-lang.c b/gcc/objc/objc-lang.c index 72c772c..877867a 100644 --- a/gcc/objc/objc-lang.c +++ b/gcc/objc/objc-lang.c @@ -55,6 +55,8 @@ enum c_language_kind c_language = clk_objc; #define LANG_HOOKS_SAFE_FROM_P c_safe_from_p #undef LANG_HOOKS_PARSE_FILE #define LANG_HOOKS_PARSE_FILE c_common_parse_file +#undef LANG_HOOKS_CLEAR_BINDING_STACK +#define LANG_HOOKS_CLEAR_BINDING_STACK lhd_do_nothing #undef LANG_HOOKS_EXPAND_EXPR #define LANG_HOOKS_EXPAND_EXPR c_expand_expr #undef LANG_HOOKS_MARK_ADDRESSABLE @@ -130,6 +132,19 @@ enum c_language_kind c_language = clk_objc; #undef LANG_HOOKS_TYPE_PROMOTES_TO #define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to +/* The C front end's scoping structure is very different from + that expected by the language-independent code; it is best + to disable all of pushlevel, poplevel, set_block, and getdecls. + This means it must also provide its own write_globals. */ + +#undef LANG_HOOKS_PUSHLEVEL +#define LANG_HOOKS_PUSHLEVEL lhd_do_nothing_i +#undef LANG_HOOKS_POPLEVEL +#define LANG_HOOKS_POPLEVEL lhd_do_nothing_iii_return_null_tree +#undef LANG_HOOKS_SET_BLOCK +#define LANG_HOOKS_SET_BLOCK lhd_do_nothing_t +#undef LANG_HOOKS_GETDECLS +#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v #undef LANG_HOOKS_WRITE_GLOBALS #define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations |