1 /* Implement classes and message passing for Objective C.
2 Copyright (C) 1992, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
4 Contributed by Steve Naroff.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
23 /* Purpose: This module implements the Objective-C 4.0 language.
25 compatibility issues (with the Stepstone translator):
27 - does not recognize the following 3.3 constructs.
28 @requires, @classes, @messages, = (...)
29 - methods with variable arguments must conform to ANSI standard.
30 - tagged structure definitions that appear in BOTH the interface
31 and implementation are not allowed.
32 - public/private: all instance variables are public within the
33 context of the implementation...I consider this to be a bug in
35 - statically allocated objects are not supported. the user will
36 receive an error if this service is requested.
38 code generation `options':
44 #include "coretypes.h"
61 #include "langhooks.h"
72 #include "diagnostic.h"
75 #include "tree-iterator.h"
78 #include "langhooks-def.h"
80 #define OBJC_VOID_AT_END void_list_node
82 static unsigned int should_call_super_dealloc = 0;
84 /* When building Objective-C++, we need in_late_binary_op. */
86 bool in_late_binary_op = false;
89 /* When building Objective-C++, we are not linking against the C front-end
90 and so need to replicate the C tree-construction functions in some way. */
92 #define OBJCP_REMAP_FUNCTIONS
93 #include "objcp-decl.h"
96 /* This is the default way of generating a method name. */
97 /* I am not sure it is really correct.
98 Perhaps there's a danger that it will make name conflicts
99 if method names contain underscores. -- rms. */
100 #ifndef OBJC_GEN_METHOD_LABEL
101 #define OBJC_GEN_METHOD_LABEL(BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME, NUM) \
104 sprintf ((BUF), "_%s_%s_%s_%s", \
105 ((IS_INST) ? "i" : "c"), \
107 ((CAT_NAME)? (CAT_NAME) : ""), \
109 for (temp = (BUF); *temp; temp++) \
110 if (*temp == ':') *temp = '_'; \
114 /* These need specifying. */
115 #ifndef OBJC_FORWARDING_STACK_OFFSET
116 #define OBJC_FORWARDING_STACK_OFFSET 0
119 #ifndef OBJC_FORWARDING_MIN_OFFSET
120 #define OBJC_FORWARDING_MIN_OFFSET 0
123 /* Set up for use of obstacks. */
127 /* This obstack is used to accumulate the encoding of a data type. */
128 static struct obstack util_obstack;
130 /* This points to the beginning of obstack contents, so we can free
131 the whole contents. */
134 /* The version identifies which language generation and runtime
135 the module (file) was compiled for, and is recorded in the
136 module descriptor. */
138 #define OBJC_VERSION (flag_next_runtime ? 6 : 8)
139 #define PROTOCOL_VERSION 2
141 /* (Decide if these can ever be validly changed.) */
142 #define OBJC_ENCODE_INLINE_DEFS 0
143 #define OBJC_ENCODE_DONT_INLINE_DEFS 1
145 /*** Private Interface (procedures) ***/
147 /* Used by compile_file. */
149 static void init_objc (void);
150 static void finish_objc (void);
152 /* Code generation. */
154 static tree objc_build_constructor (tree, tree);
155 static tree build_objc_method_call (location_t, int, tree, tree, tree, tree);
156 static tree get_proto_encoding (tree);
157 static tree lookup_interface (tree);
158 static tree objc_add_static_instance (tree, tree);
160 static tree start_class (enum tree_code, tree, tree, tree);
161 static tree continue_class (tree);
162 static void finish_class (tree);
163 static void start_method_def (tree);
165 static void objc_start_function (tree, tree, tree, tree);
167 static void objc_start_function (tree, tree, tree, struct c_arg_info *);
169 static tree start_protocol (enum tree_code, tree, tree);
170 static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
171 static tree objc_add_method (tree, tree, int);
172 static tree add_instance_variable (tree, int, tree);
173 static tree build_ivar_reference (tree);
174 static tree is_ivar (tree, tree);
176 static void build_objc_exception_stuff (void);
177 static void build_next_objc_exception_stuff (void);
179 /* We only need the following for ObjC; ObjC++ will use C++'s definition
180 of DERIVED_FROM_P. */
182 static bool objc_derived_from_p (tree, tree);
183 #define DERIVED_FROM_P(PARENT, CHILD) objc_derived_from_p (PARENT, CHILD)
185 static void objc_xref_basetypes (tree, tree);
187 static void build_class_template (void);
188 static void build_selector_template (void);
189 static void build_category_template (void);
190 static void build_super_template (void);
191 static tree build_protocol_initializer (tree, tree, tree, tree, tree);
192 static tree get_class_ivars (tree, bool);
193 static tree generate_protocol_list (tree);
194 static void build_protocol_reference (tree);
197 static void objc_generate_cxx_cdtors (void);
200 static const char *synth_id_with_class_suffix (const char *, tree);
202 /* Hash tables to manage the global pool of method prototypes. */
204 hash *nst_method_hash_list = 0;
205 hash *cls_method_hash_list = 0;
207 static hash hash_lookup (hash *, tree);
208 static tree lookup_method (tree, tree);
209 static tree lookup_method_static (tree, tree, int);
213 class_names, /* class, category, protocol, module names */
214 meth_var_names, /* method and variable names */
215 meth_var_types /* method and variable type descriptors */
218 static tree add_objc_string (tree, enum string_section);
219 static tree build_objc_string_decl (enum string_section);
220 static void build_selector_table_decl (void);
222 /* Protocol additions. */
224 static tree lookup_protocol (tree);
225 static tree lookup_and_install_protocols (tree);
229 static void encode_type_qualifiers (tree);
230 static void encode_type (tree, int, int);
231 static void encode_field_decl (tree, int, int);
234 static void really_start_method (tree, tree);
236 static void really_start_method (tree, struct c_arg_info *);
238 static int comp_proto_with_proto (tree, tree, int);
239 static void objc_push_parm (tree);
241 static tree objc_get_parm_info (int);
243 static struct c_arg_info *objc_get_parm_info (int);
246 /* Utilities for debugging and error diagnostics. */
248 static char *gen_type_name (tree);
249 static char *gen_type_name_0 (tree);
250 static char *gen_method_decl (tree);
251 static char *gen_declaration (tree);
253 /* Everything else. */
255 static tree create_field_decl (tree, const char *);
256 static void add_class_reference (tree);
257 static void build_protocol_template (void);
258 static tree encode_method_prototype (tree);
259 static void generate_classref_translation_entry (tree);
260 static void handle_class_ref (tree);
261 static void generate_struct_by_value_array (void)
263 static void mark_referenced_methods (void);
264 static void generate_objc_image_info (void);
266 /*** Private Interface (data) ***/
268 /* Reserved tag definitions. */
270 #define OBJECT_TYPEDEF_NAME "id"
271 #define CLASS_TYPEDEF_NAME "Class"
273 #define TAG_OBJECT "objc_object"
274 #define TAG_CLASS "objc_class"
275 #define TAG_SUPER "objc_super"
276 #define TAG_SELECTOR "objc_selector"
278 #define UTAG_CLASS "_objc_class"
279 #define UTAG_IVAR "_objc_ivar"
280 #define UTAG_IVAR_LIST "_objc_ivar_list"
281 #define UTAG_METHOD "_objc_method"
282 #define UTAG_METHOD_LIST "_objc_method_list"
283 #define UTAG_CATEGORY "_objc_category"
284 #define UTAG_MODULE "_objc_module"
285 #define UTAG_SYMTAB "_objc_symtab"
286 #define UTAG_SUPER "_objc_super"
287 #define UTAG_SELECTOR "_objc_selector"
289 #define UTAG_PROTOCOL "_objc_protocol"
290 #define UTAG_METHOD_PROTOTYPE "_objc_method_prototype"
291 #define UTAG_METHOD_PROTOTYPE_LIST "_objc__method_prototype_list"
293 /* Note that the string object global name is only needed for the
295 #define STRING_OBJECT_GLOBAL_FORMAT "_%sClassReference"
297 #define PROTOCOL_OBJECT_CLASS_NAME "Protocol"
299 static const char *TAG_GETCLASS;
300 static const char *TAG_GETMETACLASS;
301 static const char *TAG_MSGSEND;
302 static const char *TAG_MSGSENDSUPER;
303 /* The NeXT Objective-C messenger may have two extra entry points, for use
304 when returning a structure. */
305 static const char *TAG_MSGSEND_STRET;
306 static const char *TAG_MSGSENDSUPER_STRET;
307 static const char *default_constant_string_class_name;
309 /* Runtime metadata flags. */
310 #define CLS_FACTORY 0x0001L
311 #define CLS_META 0x0002L
312 #define CLS_HAS_CXX_STRUCTORS 0x2000L
314 #define OBJC_MODIFIER_STATIC 0x00000001
315 #define OBJC_MODIFIER_FINAL 0x00000002
316 #define OBJC_MODIFIER_PUBLIC 0x00000004
317 #define OBJC_MODIFIER_PRIVATE 0x00000008
318 #define OBJC_MODIFIER_PROTECTED 0x00000010
319 #define OBJC_MODIFIER_NATIVE 0x00000020
320 #define OBJC_MODIFIER_SYNCHRONIZED 0x00000040
321 #define OBJC_MODIFIER_ABSTRACT 0x00000080
322 #define OBJC_MODIFIER_VOLATILE 0x00000100
323 #define OBJC_MODIFIER_TRANSIENT 0x00000200
324 #define OBJC_MODIFIER_NONE_SPECIFIED 0x80000000
326 /* NeXT-specific tags. */
328 #define TAG_MSGSEND_NONNIL "objc_msgSendNonNil"
329 #define TAG_MSGSEND_NONNIL_STRET "objc_msgSendNonNil_stret"
330 #define TAG_EXCEPTIONEXTRACT "objc_exception_extract"
331 #define TAG_EXCEPTIONTRYENTER "objc_exception_try_enter"
332 #define TAG_EXCEPTIONTRYEXIT "objc_exception_try_exit"
333 #define TAG_EXCEPTIONMATCH "objc_exception_match"
334 #define TAG_EXCEPTIONTHROW "objc_exception_throw"
335 #define TAG_SYNCENTER "objc_sync_enter"
336 #define TAG_SYNCEXIT "objc_sync_exit"
337 #define TAG_SETJMP "_setjmp"
338 #define UTAG_EXCDATA "_objc_exception_data"
340 #define TAG_ASSIGNIVAR "objc_assign_ivar"
341 #define TAG_ASSIGNGLOBAL "objc_assign_global"
342 #define TAG_ASSIGNSTRONGCAST "objc_assign_strongCast"
344 /* Branch entry points. All that matters here are the addresses;
345 functions with these names do not really exist in libobjc. */
347 #define TAG_MSGSEND_FAST "objc_msgSend_Fast"
348 #define TAG_ASSIGNIVAR_FAST "objc_assign_ivar_Fast"
350 #define TAG_CXX_CONSTRUCT ".cxx_construct"
351 #define TAG_CXX_DESTRUCT ".cxx_destruct"
353 /* GNU-specific tags. */
355 #define TAG_EXECCLASS "__objc_exec_class"
356 #define TAG_GNUINIT "__objc_gnu_init"
358 /* Flags for lookup_method_static(). */
359 #define OBJC_LOOKUP_CLASS 1 /* Look for class methods. */
360 #define OBJC_LOOKUP_NO_SUPER 2 /* Do not examine superclasses. */
362 /* The OCTI_... enumeration itself is in objc/objc-act.h. */
363 tree objc_global_trees[OCTI_MAX];
365 static void handle_impent (struct imp_entry *);
367 struct imp_entry *imp_list = 0;
368 int imp_count = 0; /* `@implementation' */
369 int cat_count = 0; /* `@category' */
371 enum tree_code objc_inherit_code;
372 int objc_public_flag;
374 /* Use to generate method labels. */
375 static int method_slot = 0;
379 static char *errbuf; /* Buffer for error diagnostics */
381 /* Data imported from tree.c. */
383 extern enum debug_info_type write_symbols;
385 /* Data imported from toplev.c. */
387 extern const char *dump_base_name;
389 static int flag_typed_selectors;
391 /* Store all constructed constant strings in a hash table so that
392 they get uniqued properly. */
394 struct GTY(()) string_descriptor {
395 /* The literal argument . */
398 /* The resulting constant string. */
402 static GTY((param_is (struct string_descriptor))) htab_t string_htab;
404 /* Store the EH-volatilized types in a hash table, for easy retrieval. */
405 struct GTY(()) volatilized_type {
409 static GTY((param_is (struct volatilized_type))) htab_t volatilized_htab;
411 FILE *gen_declaration_file;
413 /* Tells "encode_pointer/encode_aggregate" whether we are generating
414 type descriptors for instance variables (as opposed to methods).
415 Type descriptors for instance variables contain more information
416 than methods (for static typing and embedded structures). */
418 static int generating_instance_variables = 0;
420 /* For building an objc struct. These may not be used when this file
421 is compiled as part of obj-c++. */
423 static bool objc_building_struct;
424 static struct c_struct_parse_info *objc_struct_info ATTRIBUTE_UNUSED;
426 /* Start building a struct for objc. */
429 objc_start_struct (tree name)
431 gcc_assert (!objc_building_struct);
432 objc_building_struct = true;
433 return start_struct (input_location, RECORD_TYPE, name, &objc_struct_info);
436 /* Finish building a struct for objc. */
439 objc_finish_struct (tree type, tree fieldlist)
441 gcc_assert (objc_building_struct);
442 objc_building_struct = false;
443 return finish_struct (input_location, type, fieldlist, NULL_TREE,
447 /* Some platforms pass small structures through registers versus
448 through an invisible pointer. Determine at what size structure is
449 the transition point between the two possibilities. */
452 generate_struct_by_value_array (void)
455 tree field_decl, field_decl_chain;
457 int aggregate_in_mem[32];
460 /* Presumably no platform passes 32 byte structures in a register. */
461 for (i = 1; i < 32; i++)
465 /* Create an unnamed struct that has `i' character components */
466 type = objc_start_struct (NULL_TREE);
468 strcpy (buffer, "c1");
469 field_decl = create_field_decl (char_type_node,
471 field_decl_chain = field_decl;
473 for (j = 1; j < i; j++)
475 sprintf (buffer, "c%d", j + 1);
476 field_decl = create_field_decl (char_type_node,
478 chainon (field_decl_chain, field_decl);
480 objc_finish_struct (type, field_decl_chain);
482 aggregate_in_mem[i] = aggregate_value_p (type, 0);
483 if (!aggregate_in_mem[i])
487 /* We found some structures that are returned in registers instead of memory
488 so output the necessary data. */
491 for (i = 31; i >= 0; i--)
492 if (!aggregate_in_mem[i])
494 printf ("#define OBJC_MAX_STRUCT_BY_VALUE %d\n\n", i);
496 /* The first member of the structure is always 0 because we don't handle
497 structures with 0 members */
498 printf ("static int struct_forward_array[] = {\n 0");
500 for (j = 1; j <= i; j++)
501 printf (", %d", aggregate_in_mem[j]);
512 if (cxx_init () == false)
514 if (c_objc_common_init () == false)
518 /* If gen_declaration desired, open the output file. */
519 if (flag_gen_declaration)
521 register char * const dumpname = concat (dump_base_name, ".decl", NULL);
522 gen_declaration_file = fopen (dumpname, "w");
523 if (gen_declaration_file == 0)
524 fatal_error ("can't open %s: %m", dumpname);
528 if (flag_next_runtime)
530 TAG_GETCLASS = "objc_getClass";
531 TAG_GETMETACLASS = "objc_getMetaClass";
532 TAG_MSGSEND = "objc_msgSend";
533 TAG_MSGSENDSUPER = "objc_msgSendSuper";
534 TAG_MSGSEND_STRET = "objc_msgSend_stret";
535 TAG_MSGSENDSUPER_STRET = "objc_msgSendSuper_stret";
536 default_constant_string_class_name = "NSConstantString";
540 TAG_GETCLASS = "objc_get_class";
541 TAG_GETMETACLASS = "objc_get_meta_class";
542 TAG_MSGSEND = "objc_msg_lookup";
543 TAG_MSGSENDSUPER = "objc_msg_lookup_super";
544 /* GNU runtime does not provide special functions to support
545 structure-returning methods. */
546 default_constant_string_class_name = "NXConstantString";
547 flag_typed_selectors = 1;
552 if (print_struct_values && !flag_compare_debug)
553 generate_struct_by_value_array ();
559 objc_finish_file (void)
561 mark_referenced_methods ();
564 /* We need to instantiate templates _before_ we emit ObjC metadata;
565 if we do not, some metadata (such as selectors) may go missing. */
567 instantiate_pending_templates (0);
570 /* Finalize Objective-C runtime data. No need to generate tables
571 and code if only checking syntax, or if generating a PCH file. */
572 if (!flag_syntax_only && !pch_file)
575 if (gen_declaration_file)
576 fclose (gen_declaration_file);
579 /* Return the first occurrence of a method declaration corresponding
580 to sel_name in rproto_list. Search rproto_list recursively.
581 If is_class is 0, search for instance methods, otherwise for class
584 lookup_method_in_protocol_list (tree rproto_list, tree sel_name,
590 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
592 p = TREE_VALUE (rproto);
594 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
596 if ((fnd = lookup_method (is_class
597 ? PROTOCOL_CLS_METHODS (p)
598 : PROTOCOL_NST_METHODS (p), sel_name)))
600 else if (PROTOCOL_LIST (p))
601 fnd = lookup_method_in_protocol_list (PROTOCOL_LIST (p),
606 ; /* An identifier...if we could not find a protocol. */
617 lookup_protocol_in_reflist (tree rproto_list, tree lproto)
621 /* Make sure the protocol is supported by the object on the rhs. */
622 if (TREE_CODE (lproto) == PROTOCOL_INTERFACE_TYPE)
625 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
627 p = TREE_VALUE (rproto);
629 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
634 else if (PROTOCOL_LIST (p))
635 fnd = lookup_protocol_in_reflist (PROTOCOL_LIST (p), lproto);
644 ; /* An identifier...if we could not find a protocol. */
651 objc_start_class_interface (tree klass, tree super_class, tree protos)
653 objc_interface_context
655 = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos);
656 objc_public_flag = 0;
660 objc_start_category_interface (tree klass, tree categ, tree protos)
662 objc_interface_context
663 = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos);
665 = continue_class (objc_interface_context);
669 objc_start_protocol (tree name, tree protos)
671 objc_interface_context
672 = start_protocol (PROTOCOL_INTERFACE_TYPE, name, protos);
676 objc_continue_interface (void)
679 = continue_class (objc_interface_context);
683 objc_finish_interface (void)
685 finish_class (objc_interface_context);
686 objc_interface_context = NULL_TREE;
690 objc_start_class_implementation (tree klass, tree super_class)
692 objc_implementation_context
694 = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE);
695 objc_public_flag = 0;
699 objc_start_category_implementation (tree klass, tree categ)
701 objc_implementation_context
702 = start_class (CATEGORY_IMPLEMENTATION_TYPE, klass, categ, NULL_TREE);
704 = continue_class (objc_implementation_context);
708 objc_continue_implementation (void)
711 = continue_class (objc_implementation_context);
715 objc_finish_implementation (void)
718 if (flag_objc_call_cxx_cdtors)
719 objc_generate_cxx_cdtors ();
722 if (objc_implementation_context)
724 finish_class (objc_implementation_context);
725 objc_ivar_chain = NULL_TREE;
726 objc_implementation_context = NULL_TREE;
729 warning (0, "%<@end%> must appear in an @implementation context");
733 objc_set_visibility (int visibility)
735 objc_public_flag = visibility;
739 objc_set_method_type (enum tree_code type)
741 objc_inherit_code = (type == PLUS_EXPR
743 : INSTANCE_METHOD_DECL);
747 objc_build_method_signature (tree rettype, tree selector,
748 tree optparms, bool ellipsis)
750 return build_method_decl (objc_inherit_code, rettype, selector,
755 objc_add_method_declaration (tree decl)
757 if (!objc_interface_context)
758 fatal_error ("method declaration not in @interface context");
760 objc_add_method (objc_interface_context,
762 objc_inherit_code == CLASS_METHOD_DECL);
766 objc_start_method_definition (tree decl)
768 if (!objc_implementation_context)
769 fatal_error ("method definition not in @implementation context");
771 objc_add_method (objc_implementation_context,
773 objc_inherit_code == CLASS_METHOD_DECL);
774 start_method_def (decl);
778 objc_add_instance_variable (tree decl)
780 (void) add_instance_variable (objc_ivar_context,
785 /* Return 1 if IDENT is an ObjC/ObjC++ reserved keyword in the context of
789 objc_is_reserved_word (tree ident)
791 unsigned char code = C_RID_CODE (ident);
793 return (OBJC_IS_AT_KEYWORD (code)
794 || code == RID_CLASS || code == RID_PUBLIC
795 || code == RID_PROTECTED || code == RID_PRIVATE
796 || code == RID_TRY || code == RID_THROW || code == RID_CATCH);
799 /* Return true if TYPE is 'id'. */
802 objc_is_object_id (tree type)
804 return OBJC_TYPE_NAME (type) == objc_object_id;
808 objc_is_class_id (tree type)
810 return OBJC_TYPE_NAME (type) == objc_class_id;
813 /* Construct a C struct with same name as KLASS, a base struct with tag
814 SUPER_NAME (if any), and FIELDS indicated. */
817 objc_build_struct (tree klass, tree fields, tree super_name)
819 tree name = CLASS_NAME (klass);
820 tree s = objc_start_struct (name);
821 tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE);
822 tree t, objc_info = NULL_TREE;
826 /* Prepend a packed variant of the base class into the layout. This
827 is necessary to preserve ObjC ABI compatibility. */
828 tree base = build_decl (input_location,
829 FIELD_DECL, NULL_TREE, super);
830 tree field = TYPE_FIELDS (super);
832 while (field && TREE_CHAIN (field)
833 && TREE_CODE (TREE_CHAIN (field)) == FIELD_DECL)
834 field = TREE_CHAIN (field);
836 /* For ObjC ABI purposes, the "packed" size of a base class is
837 the sum of the offset and the size (in bits) of the last field
840 = (field && TREE_CODE (field) == FIELD_DECL
841 ? size_binop (PLUS_EXPR,
842 size_binop (PLUS_EXPR,
845 convert (bitsizetype,
846 DECL_FIELD_OFFSET (field)),
847 bitsize_int (BITS_PER_UNIT)),
848 DECL_FIELD_BIT_OFFSET (field)),
850 : bitsize_zero_node);
851 DECL_SIZE_UNIT (base)
852 = size_binop (FLOOR_DIV_EXPR, convert (sizetype, DECL_SIZE (base)),
853 size_int (BITS_PER_UNIT));
854 DECL_ARTIFICIAL (base) = 1;
855 DECL_ALIGN (base) = 1;
856 DECL_FIELD_CONTEXT (base) = s;
858 DECL_FIELD_IS_BASE (base) = 1;
861 TREE_NO_WARNING (fields) = 1; /* Suppress C++ ABI warnings -- we */
862 #endif /* are following the ObjC ABI here. */
863 TREE_CHAIN (base) = fields;
867 /* NB: Calling finish_struct() may cause type TYPE_LANG_SPECIFIC fields
868 in all variants of this RECORD_TYPE to be clobbered, but it is therein
869 that we store protocol conformance info (e.g., 'NSObject <MyProtocol>').
870 Hence, we must squirrel away the ObjC-specific information before calling
871 finish_struct(), and then reinstate it afterwards. */
873 for (t = TYPE_NEXT_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t))
875 if (!TYPE_HAS_OBJC_INFO (t))
877 INIT_TYPE_OBJC_INFO (t);
878 TYPE_OBJC_INTERFACE (t) = klass;
881 = chainon (objc_info,
882 build_tree_list (NULL_TREE, TYPE_OBJC_INFO (t)));
885 /* Point the struct at its related Objective-C class. */
886 INIT_TYPE_OBJC_INFO (s);
887 TYPE_OBJC_INTERFACE (s) = klass;
889 s = objc_finish_struct (s, fields);
891 for (t = TYPE_NEXT_VARIANT (s); t;
892 t = TYPE_NEXT_VARIANT (t), objc_info = TREE_CHAIN (objc_info))
894 TYPE_OBJC_INFO (t) = TREE_VALUE (objc_info);
895 /* Replace the IDENTIFIER_NODE with an actual @interface. */
896 TYPE_OBJC_INTERFACE (t) = klass;
899 /* Use TYPE_BINFO structures to point at the super class, if any. */
900 objc_xref_basetypes (s, super);
902 /* Mark this struct as a class template. */
903 CLASS_STATIC_TEMPLATE (klass) = s;
908 /* Build a type differing from TYPE only in that TYPE_VOLATILE is set.
909 Unlike tree.c:build_qualified_type(), preserve TYPE_LANG_SPECIFIC in the
912 objc_build_volatilized_type (tree type)
916 /* Check if we have not constructed the desired variant already. */
917 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
919 /* The type qualifiers must (obviously) match up. */
920 if (!TYPE_VOLATILE (t)
921 || (TYPE_READONLY (t) != TYPE_READONLY (type))
922 || (TYPE_RESTRICT (t) != TYPE_RESTRICT (type)))
925 /* For pointer types, the pointees (and hence their TYPE_LANG_SPECIFIC
926 info, if any) must match up. */
927 if (POINTER_TYPE_P (t)
928 && (TREE_TYPE (t) != TREE_TYPE (type)))
931 /* Everything matches up! */
935 /* Ok, we could not re-use any of the pre-existing variants. Create
937 t = build_variant_type_copy (type);
938 TYPE_VOLATILE (t) = 1;
940 /* Set up the canonical type information. */
941 if (TYPE_STRUCTURAL_EQUALITY_P (type))
942 SET_TYPE_STRUCTURAL_EQUALITY (t);
943 else if (TYPE_CANONICAL (type) != type)
944 TYPE_CANONICAL (t) = objc_build_volatilized_type (TYPE_CANONICAL (type));
946 TYPE_CANONICAL (t) = t;
951 /* Mark DECL as being 'volatile' for purposes of Darwin
952 _setjmp()/_longjmp() exception handling. Called from
953 objc_mark_locals_volatile(). */
955 objc_volatilize_decl (tree decl)
957 /* Do not mess with variables that are 'static' or (already)
959 if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
960 && (TREE_CODE (decl) == VAR_DECL
961 || TREE_CODE (decl) == PARM_DECL))
963 tree t = TREE_TYPE (decl);
964 struct volatilized_type key;
967 t = objc_build_volatilized_type (t);
969 loc = htab_find_slot (volatilized_htab, &key, INSERT);
973 *loc = ggc_alloc (sizeof (key));
974 ((struct volatilized_type *) *loc)->type = t;
977 TREE_TYPE (decl) = t;
978 TREE_THIS_VOLATILE (decl) = 1;
979 TREE_SIDE_EFFECTS (decl) = 1;
980 DECL_REGISTER (decl) = 0;
982 C_DECL_REGISTER (decl) = 0;
987 /* Check if protocol PROTO is adopted (directly or indirectly) by class CLS
988 (including its categories and superclasses) or by object type TYP.
989 Issue a warning if PROTO is not adopted anywhere and WARN is set. */
992 objc_lookup_protocol (tree proto, tree cls, tree typ, bool warn)
994 bool class_type = (cls != NULL_TREE);
1000 /* Check protocols adopted by the class and its categories. */
1001 for (c = cls; c; c = CLASS_CATEGORY_LIST (c))
1003 if (lookup_protocol_in_reflist (CLASS_PROTOCOL_LIST (c), proto))
1007 /* Repeat for superclasses. */
1008 cls = lookup_interface (CLASS_SUPER_NAME (cls));
1011 /* Check for any protocols attached directly to the object type. */
1012 if (TYPE_HAS_OBJC_INFO (typ))
1014 if (lookup_protocol_in_reflist (TYPE_OBJC_PROTOCOL_LIST (typ), proto))
1021 gen_type_name_0 (class_type ? typ : TYPE_POINTER_TO (typ));
1022 /* NB: Types 'id' and 'Class' cannot reasonably be described as
1023 "implementing" a given protocol, since they do not have an
1026 warning (0, "class %qs does not implement the %qE protocol",
1027 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
1029 warning (0, "type %qs does not conform to the %qE protocol",
1030 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
1036 /* Check if class RCLS and instance struct type RTYP conform to at least the
1037 same protocols that LCLS and LTYP conform to. */
1040 objc_compare_protocols (tree lcls, tree ltyp, tree rcls, tree rtyp, bool warn)
1043 bool have_lproto = false;
1047 /* NB: We do _not_ look at categories defined for LCLS; these may or
1048 may not get loaded in, and therefore it is unreasonable to require
1049 that RCLS/RTYP must implement any of their protocols. */
1050 for (p = CLASS_PROTOCOL_LIST (lcls); p; p = TREE_CHAIN (p))
1054 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
1058 /* Repeat for superclasses. */
1059 lcls = lookup_interface (CLASS_SUPER_NAME (lcls));
1062 /* Check for any protocols attached directly to the object type. */
1063 if (TYPE_HAS_OBJC_INFO (ltyp))
1065 for (p = TYPE_OBJC_PROTOCOL_LIST (ltyp); p; p = TREE_CHAIN (p))
1069 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
1074 /* NB: If LTYP and LCLS have no protocols to search for, return 'true'
1075 vacuously, _unless_ RTYP is a protocol-qualified 'id'. We can get
1076 away with simply checking for 'id' or 'Class' (!RCLS), since this
1077 routine will not get called in other cases. */
1078 return have_lproto || (rcls != NULL_TREE);
1081 /* Determine if it is permissible to assign (if ARGNO is greater than -3)
1082 an instance of RTYP to an instance of LTYP or to compare the two
1083 (if ARGNO is equal to -3), per ObjC type system rules. Before
1084 returning 'true', this routine may issue warnings related to, e.g.,
1085 protocol conformance. When returning 'false', the routine must
1086 produce absolutely no warnings; the C or C++ front-end will do so
1087 instead, if needed. If either LTYP or RTYP is not an Objective-C type,
1088 the routine must return 'false'.
1090 The ARGNO parameter is encoded as follows:
1091 >= 1 Parameter number (CALLEE contains function being called);
1095 -3 Comparison (LTYP and RTYP may match in either direction). */
1098 objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
1100 tree lcls, rcls, lproto, rproto;
1101 bool pointers_compatible;
1103 /* We must be dealing with pointer types */
1104 if (!POINTER_TYPE_P (ltyp) || !POINTER_TYPE_P (rtyp))
1109 ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
1110 rtyp = TREE_TYPE (rtyp);
1112 while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
1114 /* Past this point, we are only interested in ObjC class instances,
1115 or 'id' or 'Class'. */
1116 if (TREE_CODE (ltyp) != RECORD_TYPE || TREE_CODE (rtyp) != RECORD_TYPE)
1119 if (!objc_is_object_id (ltyp) && !objc_is_class_id (ltyp)
1120 && !TYPE_HAS_OBJC_INFO (ltyp))
1123 if (!objc_is_object_id (rtyp) && !objc_is_class_id (rtyp)
1124 && !TYPE_HAS_OBJC_INFO (rtyp))
1127 /* Past this point, we are committed to returning 'true' to the caller.
1128 However, we can still warn about type and/or protocol mismatches. */
1130 if (TYPE_HAS_OBJC_INFO (ltyp))
1132 lcls = TYPE_OBJC_INTERFACE (ltyp);
1133 lproto = TYPE_OBJC_PROTOCOL_LIST (ltyp);
1136 lcls = lproto = NULL_TREE;
1138 if (TYPE_HAS_OBJC_INFO (rtyp))
1140 rcls = TYPE_OBJC_INTERFACE (rtyp);
1141 rproto = TYPE_OBJC_PROTOCOL_LIST (rtyp);
1144 rcls = rproto = NULL_TREE;
1146 /* If we could not find an @interface declaration, we must have
1147 only seen a @class declaration; for purposes of type comparison,
1148 treat it as a stand-alone (root) class. */
1150 if (lcls && TREE_CODE (lcls) == IDENTIFIER_NODE)
1153 if (rcls && TREE_CODE (rcls) == IDENTIFIER_NODE)
1156 /* If either type is an unqualified 'id', we're done. */
1157 if ((!lproto && objc_is_object_id (ltyp))
1158 || (!rproto && objc_is_object_id (rtyp)))
1161 pointers_compatible = (TYPE_MAIN_VARIANT (ltyp) == TYPE_MAIN_VARIANT (rtyp));
1163 /* If the underlying types are the same, and at most one of them has
1164 a protocol list, we do not need to issue any diagnostics. */
1165 if (pointers_compatible && (!lproto || !rproto))
1168 /* If exactly one of the types is 'Class', issue a diagnostic; any
1169 exceptions of this rule have already been handled. */
1170 if (objc_is_class_id (ltyp) ^ objc_is_class_id (rtyp))
1171 pointers_compatible = false;
1172 /* Otherwise, check for inheritance relations. */
1175 if (!pointers_compatible)
1177 = (objc_is_object_id (ltyp) || objc_is_object_id (rtyp));
1179 if (!pointers_compatible)
1180 pointers_compatible = DERIVED_FROM_P (ltyp, rtyp);
1182 if (!pointers_compatible && argno == -3)
1183 pointers_compatible = DERIVED_FROM_P (rtyp, ltyp);
1186 /* If the pointers match modulo protocols, check for protocol conformance
1188 if (pointers_compatible)
1190 pointers_compatible = objc_compare_protocols (lcls, ltyp, rcls, rtyp,
1193 if (!pointers_compatible && argno == -3)
1194 pointers_compatible = objc_compare_protocols (rcls, rtyp, lcls, ltyp,
1198 if (!pointers_compatible)
1200 /* NB: For the time being, we shall make our warnings look like their
1201 C counterparts. In the future, we may wish to make them more
1206 warning (0, "comparison of distinct Objective-C types lacks a cast");
1210 warning (0, "initialization from distinct Objective-C type");
1214 warning (0, "assignment from distinct Objective-C type");
1218 warning (0, "distinct Objective-C type in return");
1222 warning (0, "passing argument %d of %qE from distinct "
1223 "Objective-C type", argno, callee);
1231 /* Check if LTYP and RTYP have the same type qualifiers. If either type
1232 lives in the volatilized hash table, ignore the 'volatile' bit when
1233 making the comparison. */
1236 objc_type_quals_match (tree ltyp, tree rtyp)
1238 int lquals = TYPE_QUALS (ltyp), rquals = TYPE_QUALS (rtyp);
1239 struct volatilized_type key;
1243 if (htab_find_slot (volatilized_htab, &key, NO_INSERT))
1244 lquals &= ~TYPE_QUAL_VOLATILE;
1248 if (htab_find_slot (volatilized_htab, &key, NO_INSERT))
1249 rquals &= ~TYPE_QUAL_VOLATILE;
1251 return (lquals == rquals);
1255 /* Determine if CHILD is derived from PARENT. The routine assumes that
1256 both parameters are RECORD_TYPEs, and is non-reflexive. */
1259 objc_derived_from_p (tree parent, tree child)
1261 parent = TYPE_MAIN_VARIANT (parent);
1263 for (child = TYPE_MAIN_VARIANT (child);
1264 TYPE_BINFO (child) && BINFO_N_BASE_BINFOS (TYPE_BINFO (child));)
1266 child = TYPE_MAIN_VARIANT (BINFO_TYPE (BINFO_BASE_BINFO
1267 (TYPE_BINFO (child),
1270 if (child == parent)
1279 objc_build_component_ref (tree datum, tree component)
1281 /* If COMPONENT is NULL, the caller is referring to the anonymous
1282 base class field. */
1285 tree base = TYPE_FIELDS (TREE_TYPE (datum));
1287 return build3 (COMPONENT_REF, TREE_TYPE (base), datum, base, NULL_TREE);
1290 /* The 'build_component_ref' routine has been removed from the C++
1291 front-end, but 'finish_class_member_access_expr' seems to be
1292 a worthy substitute. */
1294 return finish_class_member_access_expr (datum, component, false,
1295 tf_warning_or_error);
1297 return build_component_ref (input_location, datum, component);
1301 /* Recursively copy inheritance information rooted at BINFO. To do this,
1302 we emulate the song and dance performed by cp/tree.c:copy_binfo(). */
1305 objc_copy_binfo (tree binfo)
1307 tree btype = BINFO_TYPE (binfo);
1308 tree binfo2 = make_tree_binfo (BINFO_N_BASE_BINFOS (binfo));
1312 BINFO_TYPE (binfo2) = btype;
1313 BINFO_OFFSET (binfo2) = BINFO_OFFSET (binfo);
1314 BINFO_BASE_ACCESSES (binfo2) = BINFO_BASE_ACCESSES (binfo);
1316 /* Recursively copy base binfos of BINFO. */
1317 for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
1319 tree base_binfo2 = objc_copy_binfo (base_binfo);
1321 BINFO_INHERITANCE_CHAIN (base_binfo2) = binfo2;
1322 BINFO_BASE_APPEND (binfo2, base_binfo2);
1328 /* Record superclass information provided in BASETYPE for ObjC class REF.
1329 This is loosely based on cp/decl.c:xref_basetypes(). */
1332 objc_xref_basetypes (tree ref, tree basetype)
1334 tree binfo = make_tree_binfo (basetype ? 1 : 0);
1336 TYPE_BINFO (ref) = binfo;
1337 BINFO_OFFSET (binfo) = size_zero_node;
1338 BINFO_TYPE (binfo) = ref;
1342 tree base_binfo = objc_copy_binfo (TYPE_BINFO (basetype));
1344 BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
1345 BINFO_BASE_ACCESSES (binfo) = VEC_alloc (tree, gc, 1);
1346 BINFO_BASE_APPEND (binfo, base_binfo);
1347 BINFO_BASE_ACCESS_APPEND (binfo, access_public_node);
1352 volatilized_hash (const void *ptr)
1354 const_tree const typ = ((const struct volatilized_type *)ptr)->type;
1356 return htab_hash_pointer(typ);
1360 volatilized_eq (const void *ptr1, const void *ptr2)
1362 const_tree const typ1 = ((const struct volatilized_type *)ptr1)->type;
1363 const_tree const typ2 = ((const struct volatilized_type *)ptr2)->type;
1365 return typ1 == typ2;
1368 /* Called from finish_decl. */
1371 objc_check_decl (tree decl)
1373 tree type = TREE_TYPE (decl);
1375 if (TREE_CODE (type) != RECORD_TYPE)
1377 if (OBJC_TYPE_NAME (type) && (type = objc_is_class_name (OBJC_TYPE_NAME (type))))
1378 error ("statically allocated instance of Objective-C class %qE",
1382 /* Construct a PROTOCOLS-qualified variant of INTERFACE, where INTERFACE may
1383 either name an Objective-C class, or refer to the special 'id' or 'Class'
1384 types. If INTERFACE is not a valid ObjC type, just return it unchanged. */
1387 objc_get_protocol_qualified_type (tree interface, tree protocols)
1389 /* If INTERFACE is not provided, default to 'id'. */
1390 tree type = (interface ? objc_is_id (interface) : objc_object_type);
1391 bool is_ptr = (type != NULL_TREE);
1395 type = objc_is_class_name (interface);
1398 type = xref_tag (RECORD_TYPE, type);
1405 type = build_variant_type_copy (type);
1407 /* For pointers (i.e., 'id' or 'Class'), attach the protocol(s)
1411 tree orig_pointee_type = TREE_TYPE (type);
1412 TREE_TYPE (type) = build_variant_type_copy (orig_pointee_type);
1414 /* Set up the canonical type information. */
1415 TYPE_CANONICAL (type)
1416 = TYPE_CANONICAL (TYPE_POINTER_TO (orig_pointee_type));
1418 TYPE_POINTER_TO (TREE_TYPE (type)) = type;
1419 type = TREE_TYPE (type);
1422 /* Look up protocols and install in lang specific list. */
1423 DUP_TYPE_OBJC_INFO (type, TYPE_MAIN_VARIANT (type));
1424 TYPE_OBJC_PROTOCOL_LIST (type) = lookup_and_install_protocols (protocols);
1426 /* For RECORD_TYPEs, point to the @interface; for 'id' and 'Class',
1427 return the pointer to the new pointee variant. */
1429 type = TYPE_POINTER_TO (type);
1431 TYPE_OBJC_INTERFACE (type)
1432 = TYPE_OBJC_INTERFACE (TYPE_MAIN_VARIANT (type));
1438 /* Check for circular dependencies in protocols. The arguments are
1439 PROTO, the protocol to check, and LIST, a list of protocol it
1443 check_protocol_recursively (tree proto, tree list)
1447 for (p = list; p; p = TREE_CHAIN (p))
1449 tree pp = TREE_VALUE (p);
1451 if (TREE_CODE (pp) == IDENTIFIER_NODE)
1452 pp = lookup_protocol (pp);
1455 fatal_error ("protocol %qE has circular dependency",
1456 PROTOCOL_NAME (pp));
1458 check_protocol_recursively (proto, PROTOCOL_LIST (pp));
1462 /* Look up PROTOCOLS, and return a list of those that are found.
1463 If none are found, return NULL. */
1466 lookup_and_install_protocols (tree protocols)
1469 tree return_value = NULL_TREE;
1471 for (proto = protocols; proto; proto = TREE_CHAIN (proto))
1473 tree ident = TREE_VALUE (proto);
1474 tree p = lookup_protocol (ident);
1477 return_value = chainon (return_value,
1478 build_tree_list (NULL_TREE, p));
1479 else if (ident != error_mark_node)
1480 error ("cannot find protocol declaration for %qE",
1484 return return_value;
1487 /* Create a declaration for field NAME of a given TYPE. */
1490 create_field_decl (tree type, const char *name)
1492 return build_decl (input_location,
1493 FIELD_DECL, get_identifier (name), type);
1496 /* Create a global, static declaration for variable NAME of a given TYPE. The
1497 finish_var_decl() routine will need to be called on it afterwards. */
1500 start_var_decl (tree type, const char *name)
1502 tree var = build_decl (input_location,
1503 VAR_DECL, get_identifier (name), type);
1505 TREE_STATIC (var) = 1;
1506 DECL_INITIAL (var) = error_mark_node; /* A real initializer is coming... */
1507 DECL_IGNORED_P (var) = 1;
1508 DECL_ARTIFICIAL (var) = 1;
1509 DECL_CONTEXT (var) = NULL_TREE;
1511 DECL_THIS_STATIC (var) = 1; /* squash redeclaration errors */
1517 /* Finish off the variable declaration created by start_var_decl(). */
1520 finish_var_decl (tree var, tree initializer)
1522 finish_decl (var, input_location, initializer, NULL_TREE, NULL_TREE);
1523 /* Ensure that the variable actually gets output. */
1524 mark_decl_referenced (var);
1525 /* Mark the decl to avoid "defined but not used" warning. */
1526 TREE_USED (var) = 1;
1527 /* We reserve the right for the runtime to use/modify these variables
1528 in ways that are opaque to us. */
1529 DECL_PRESERVE_P (var) = 1;
1530 /* ipa*.c/cgraphunit.c use lookup attribute rather than testing
1531 DECL_PRESERVE_P. Once they switch to testing DECL_PRESERVE_P,
1532 this can be removed. */
1533 DECL_ATTRIBUTES (var) = tree_cons (get_identifier ("used"), NULL,
1534 DECL_ATTRIBUTES (var)) ;
1537 /* Find the decl for the constant string class reference. This is only
1538 used for the NeXT runtime. */
1541 setup_string_decl (void)
1546 /* %s in format will provide room for terminating null */
1547 length = strlen (STRING_OBJECT_GLOBAL_FORMAT)
1548 + strlen (constant_string_class_name);
1549 name = XNEWVEC (char, length);
1550 sprintf (name, STRING_OBJECT_GLOBAL_FORMAT,
1551 constant_string_class_name);
1552 constant_string_global_id = get_identifier (name);
1553 string_class_decl = lookup_name (constant_string_global_id);
1555 return string_class_decl;
1558 /* Purpose: "play" parser, creating/installing representations
1559 of the declarations that are required by Objective-C.
1563 type_spec--------->sc_spec
1564 (tree_list) (tree_list)
1567 identifier_node identifier_node */
1570 synth_module_prologue (void)
1573 enum debug_info_type save_write_symbols = write_symbols;
1574 const struct gcc_debug_hooks *const save_hooks = debug_hooks;
1576 /* Suppress outputting debug symbols, because
1577 dbxout_init hasn't been called yet. */
1578 write_symbols = NO_DEBUG;
1579 debug_hooks = &do_nothing_debug_hooks;
1582 push_lang_context (lang_name_c); /* extern "C" */
1585 /* The following are also defined in <objc/objc.h> and friends. */
1587 objc_object_id = get_identifier (TAG_OBJECT);
1588 objc_class_id = get_identifier (TAG_CLASS);
1590 objc_object_reference = xref_tag (RECORD_TYPE, objc_object_id);
1591 objc_class_reference = xref_tag (RECORD_TYPE, objc_class_id);
1593 objc_object_type = build_pointer_type (objc_object_reference);
1594 objc_class_type = build_pointer_type (objc_class_reference);
1596 objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME);
1597 objc_class_name = get_identifier (CLASS_TYPEDEF_NAME);
1599 /* Declare the 'id' and 'Class' typedefs. */
1601 type = lang_hooks.decls.pushdecl (build_decl (input_location,
1605 TREE_NO_WARNING (type) = 1;
1606 type = lang_hooks.decls.pushdecl (build_decl (input_location,
1610 TREE_NO_WARNING (type) = 1;
1612 /* Forward-declare '@interface Protocol'. */
1614 type = get_identifier (PROTOCOL_OBJECT_CLASS_NAME);
1615 objc_declare_class (tree_cons (NULL_TREE, type, NULL_TREE));
1616 objc_protocol_type = build_pointer_type (xref_tag (RECORD_TYPE,
1619 /* Declare type of selector-objects that represent an operation name. */
1621 if (flag_next_runtime)
1622 /* `struct objc_selector *' */
1624 = build_pointer_type (xref_tag (RECORD_TYPE,
1625 get_identifier (TAG_SELECTOR)));
1627 /* `const struct objc_selector *' */
1629 = build_pointer_type
1630 (build_qualified_type (xref_tag (RECORD_TYPE,
1631 get_identifier (TAG_SELECTOR)),
1634 /* Declare receiver type used for dispatching messages to 'super'. */
1636 /* `struct objc_super *' */
1637 objc_super_type = build_pointer_type (xref_tag (RECORD_TYPE,
1638 get_identifier (TAG_SUPER)));
1640 /* Declare pointers to method and ivar lists. */
1641 objc_method_list_ptr = build_pointer_type
1642 (xref_tag (RECORD_TYPE,
1643 get_identifier (UTAG_METHOD_LIST)));
1644 objc_method_proto_list_ptr
1645 = build_pointer_type (xref_tag (RECORD_TYPE,
1646 get_identifier (UTAG_METHOD_PROTOTYPE_LIST)));
1647 objc_ivar_list_ptr = build_pointer_type
1648 (xref_tag (RECORD_TYPE,
1649 get_identifier (UTAG_IVAR_LIST)));
1651 /* TREE_NOTHROW is cleared for the message-sending functions,
1652 because the function that gets called can throw in Obj-C++, or
1653 could itself call something that can throw even in Obj-C. */
1655 if (flag_next_runtime)
1657 /* NB: In order to call one of the ..._stret (struct-returning)
1658 functions, the function *MUST* first be cast to a signature that
1659 corresponds to the actual ObjC method being invoked. This is
1660 what is done by the build_objc_method_call() routine below. */
1662 /* id objc_msgSend (id, SEL, ...); */
1663 /* id objc_msgSendNonNil (id, SEL, ...); */
1664 /* id objc_msgSend_stret (id, SEL, ...); */
1665 /* id objc_msgSendNonNil_stret (id, SEL, ...); */
1667 = build_function_type (objc_object_type,
1668 tree_cons (NULL_TREE, objc_object_type,
1669 tree_cons (NULL_TREE, objc_selector_type,
1671 umsg_decl = add_builtin_function (TAG_MSGSEND,
1672 type, 0, NOT_BUILT_IN,
1674 umsg_nonnil_decl = add_builtin_function (TAG_MSGSEND_NONNIL,
1675 type, 0, NOT_BUILT_IN,
1677 umsg_stret_decl = add_builtin_function (TAG_MSGSEND_STRET,
1678 type, 0, NOT_BUILT_IN,
1680 umsg_nonnil_stret_decl = add_builtin_function (TAG_MSGSEND_NONNIL_STRET,
1681 type, 0, NOT_BUILT_IN,
1684 /* These can throw, because the function that gets called can throw
1685 in Obj-C++, or could itself call something that can throw even
1687 TREE_NOTHROW (umsg_decl) = 0;
1688 TREE_NOTHROW (umsg_nonnil_decl) = 0;
1689 TREE_NOTHROW (umsg_stret_decl) = 0;
1690 TREE_NOTHROW (umsg_nonnil_stret_decl) = 0;
1692 /* id objc_msgSend_Fast (id, SEL, ...)
1693 __attribute__ ((hard_coded_address (OFFS_MSGSEND_FAST))); */
1694 #ifdef OFFS_MSGSEND_FAST
1695 umsg_fast_decl = add_builtin_function (TAG_MSGSEND_FAST,
1696 type, 0, NOT_BUILT_IN,
1698 TREE_NOTHROW (umsg_fast_decl) = 0;
1699 DECL_ATTRIBUTES (umsg_fast_decl)
1700 = tree_cons (get_identifier ("hard_coded_address"),
1701 build_int_cst (NULL_TREE, OFFS_MSGSEND_FAST),
1704 /* No direct dispatch available. */
1705 umsg_fast_decl = umsg_decl;
1708 /* id objc_msgSendSuper (struct objc_super *, SEL, ...); */
1709 /* id objc_msgSendSuper_stret (struct objc_super *, SEL, ...); */
1711 = build_function_type (objc_object_type,
1712 tree_cons (NULL_TREE, objc_super_type,
1713 tree_cons (NULL_TREE, objc_selector_type,
1715 umsg_super_decl = add_builtin_function (TAG_MSGSENDSUPER,
1716 type, 0, NOT_BUILT_IN,
1718 umsg_super_stret_decl = add_builtin_function (TAG_MSGSENDSUPER_STRET,
1719 type, 0, NOT_BUILT_IN, 0,
1721 TREE_NOTHROW (umsg_super_decl) = 0;
1722 TREE_NOTHROW (umsg_super_stret_decl) = 0;
1726 /* GNU runtime messenger entry points. */
1728 /* typedef id (*IMP)(id, SEL, ...); */
1730 = build_pointer_type
1731 (build_function_type (objc_object_type,
1732 tree_cons (NULL_TREE, objc_object_type,
1733 tree_cons (NULL_TREE, objc_selector_type,
1736 /* IMP objc_msg_lookup (id, SEL); */
1738 = build_function_type (IMP_type,
1739 tree_cons (NULL_TREE, objc_object_type,
1740 tree_cons (NULL_TREE, objc_selector_type,
1741 OBJC_VOID_AT_END)));
1742 umsg_decl = add_builtin_function (TAG_MSGSEND,
1743 type, 0, NOT_BUILT_IN,
1745 TREE_NOTHROW (umsg_decl) = 0;
1747 /* IMP objc_msg_lookup_super (struct objc_super *, SEL); */
1749 = build_function_type (IMP_type,
1750 tree_cons (NULL_TREE, objc_super_type,
1751 tree_cons (NULL_TREE, objc_selector_type,
1752 OBJC_VOID_AT_END)));
1753 umsg_super_decl = add_builtin_function (TAG_MSGSENDSUPER,
1754 type, 0, NOT_BUILT_IN,
1756 TREE_NOTHROW (umsg_super_decl) = 0;
1758 /* The following GNU runtime entry point is called to initialize
1761 __objc_exec_class (void *); */
1763 = build_function_type (void_type_node,
1764 tree_cons (NULL_TREE, ptr_type_node,
1766 execclass_decl = add_builtin_function (TAG_EXECCLASS,
1767 type, 0, NOT_BUILT_IN,
1771 /* id objc_getClass (const char *); */
1773 type = build_function_type (objc_object_type,
1774 tree_cons (NULL_TREE,
1775 const_string_type_node,
1779 = add_builtin_function (TAG_GETCLASS, type, 0, NOT_BUILT_IN,
1782 /* id objc_getMetaClass (const char *); */
1784 objc_get_meta_class_decl
1785 = add_builtin_function (TAG_GETMETACLASS, type, 0, NOT_BUILT_IN, NULL, NULL_TREE);
1787 build_class_template ();
1788 build_super_template ();
1789 build_protocol_template ();
1790 build_category_template ();
1791 build_objc_exception_stuff ();
1793 if (flag_next_runtime)
1794 build_next_objc_exception_stuff ();
1796 /* static SEL _OBJC_SELECTOR_TABLE[]; */
1798 if (! flag_next_runtime)
1799 build_selector_table_decl ();
1801 /* Forward declare constant_string_id and constant_string_type. */
1802 if (!constant_string_class_name)
1803 constant_string_class_name = default_constant_string_class_name;
1805 constant_string_id = get_identifier (constant_string_class_name);
1806 objc_declare_class (tree_cons (NULL_TREE, constant_string_id, NULL_TREE));
1808 /* Pre-build the following entities - for speed/convenience. */
1809 self_id = get_identifier ("self");
1810 ucmd_id = get_identifier ("_cmd");
1813 pop_lang_context ();
1816 write_symbols = save_write_symbols;
1817 debug_hooks = save_hooks;
1820 /* Ensure that the ivar list for NSConstantString/NXConstantString
1821 (or whatever was specified via `-fconstant-string-class')
1822 contains fields at least as large as the following three, so that
1823 the runtime can stomp on them with confidence:
1825 struct STRING_OBJECT_CLASS_NAME
1829 unsigned int length;
1833 check_string_class_template (void)
1835 tree field_decl = objc_get_class_ivars (constant_string_id);
1837 #define AT_LEAST_AS_LARGE_AS(F, T) \
1838 (F && TREE_CODE (F) == FIELD_DECL \
1839 && (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (F))) \
1840 >= TREE_INT_CST_LOW (TYPE_SIZE (T))))
1842 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
1845 field_decl = TREE_CHAIN (field_decl);
1846 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
1849 field_decl = TREE_CHAIN (field_decl);
1850 return AT_LEAST_AS_LARGE_AS (field_decl, unsigned_type_node);
1852 #undef AT_LEAST_AS_LARGE_AS
1855 /* Avoid calling `check_string_class_template ()' more than once. */
1856 static GTY(()) int string_layout_checked;
1858 /* Construct an internal string layout to be used as a template for
1859 creating NSConstantString/NXConstantString instances. */
1862 objc_build_internal_const_str_type (void)
1864 tree type = (*lang_hooks.types.make_type) (RECORD_TYPE);
1865 tree fields = build_decl (input_location,
1866 FIELD_DECL, NULL_TREE, ptr_type_node);
1867 tree field = build_decl (input_location,
1868 FIELD_DECL, NULL_TREE, ptr_type_node);
1870 TREE_CHAIN (field) = fields; fields = field;
1871 field = build_decl (input_location,
1872 FIELD_DECL, NULL_TREE, unsigned_type_node);
1873 TREE_CHAIN (field) = fields; fields = field;
1874 /* NB: The finish_builtin_struct() routine expects FIELD_DECLs in
1876 finish_builtin_struct (type, "__builtin_ObjCString",
1882 /* Custom build_string which sets TREE_TYPE! */
1885 my_build_string (int len, const char *str)
1887 return fix_string_type (build_string (len, str));
1890 /* Build a string with contents STR and length LEN and convert it to a
1894 my_build_string_pointer (int len, const char *str)
1896 tree string = my_build_string (len, str);
1897 tree ptrtype = build_pointer_type (TREE_TYPE (TREE_TYPE (string)));
1898 return build1 (ADDR_EXPR, ptrtype, string);
1902 string_hash (const void *ptr)
1904 const_tree const str = ((const struct string_descriptor *)ptr)->literal;
1905 const unsigned char *p = (const unsigned char *) TREE_STRING_POINTER (str);
1906 int i, len = TREE_STRING_LENGTH (str);
1909 for (i = 0; i < len; i++)
1910 h = ((h * 613) + p[i]);
1916 string_eq (const void *ptr1, const void *ptr2)
1918 const_tree const str1 = ((const struct string_descriptor *)ptr1)->literal;
1919 const_tree const str2 = ((const struct string_descriptor *)ptr2)->literal;
1920 int len1 = TREE_STRING_LENGTH (str1);
1922 return (len1 == TREE_STRING_LENGTH (str2)
1923 && !memcmp (TREE_STRING_POINTER (str1), TREE_STRING_POINTER (str2),
1927 /* Given a chain of STRING_CST's, build a static instance of
1928 NXConstantString which points at the concatenation of those
1929 strings. We place the string object in the __string_objects
1930 section of the __OBJC segment. The Objective-C runtime will
1931 initialize the isa pointers of the string objects to point at the
1932 NXConstantString class object. */
1935 objc_build_string_object (tree string)
1937 tree initlist, constructor, constant_string_class;
1940 struct string_descriptor *desc, key;
1943 /* Prep the string argument. */
1944 string = fix_string_type (string);
1945 TREE_SET_CODE (string, STRING_CST);
1946 length = TREE_STRING_LENGTH (string) - 1;
1948 /* Check whether the string class being used actually exists and has the
1949 correct ivar layout. */
1950 if (!string_layout_checked)
1952 string_layout_checked = -1;
1953 constant_string_class = lookup_interface (constant_string_id);
1954 internal_const_str_type = objc_build_internal_const_str_type ();
1956 if (!constant_string_class
1957 || !(constant_string_type
1958 = CLASS_STATIC_TEMPLATE (constant_string_class)))
1959 error ("cannot find interface declaration for %qE",
1960 constant_string_id);
1961 /* The NSConstantString/NXConstantString ivar layout is now known. */
1962 else if (!check_string_class_template ())
1963 error ("interface %qE does not have valid constant string layout",
1964 constant_string_id);
1965 /* For the NeXT runtime, we can generate a literal reference
1966 to the string class, don't need to run a constructor. */
1967 else if (flag_next_runtime && !setup_string_decl ())
1968 error ("cannot find reference tag for class %qE",
1969 constant_string_id);
1972 string_layout_checked = 1; /* Success! */
1973 add_class_reference (constant_string_id);
1977 if (string_layout_checked == -1)
1978 return error_mark_node;
1980 /* Perhaps we already constructed a constant string just like this one? */
1981 key.literal = string;
1982 loc = htab_find_slot (string_htab, &key, INSERT);
1983 desc = (struct string_descriptor *) *loc;
1988 *loc = desc = GGC_NEW (struct string_descriptor);
1989 desc->literal = string;
1991 /* GNU: (NXConstantString *) & ((__builtin_ObjCString) { NULL, string, length }) */
1992 /* NeXT: (NSConstantString *) & ((__builtin_ObjCString) { isa, string, length }) */
1993 fields = TYPE_FIELDS (internal_const_str_type);
1995 = build_tree_list (fields,
1997 ? build_unary_op (input_location,
1998 ADDR_EXPR, string_class_decl, 0)
1999 : build_int_cst (NULL_TREE, 0));
2000 fields = TREE_CHAIN (fields);
2001 initlist = tree_cons (fields, build_unary_op (input_location,
2002 ADDR_EXPR, string, 1),
2004 fields = TREE_CHAIN (fields);
2005 initlist = tree_cons (fields, build_int_cst (NULL_TREE, length),
2007 constructor = objc_build_constructor (internal_const_str_type,
2008 nreverse (initlist));
2010 if (!flag_next_runtime)
2012 = objc_add_static_instance (constructor, constant_string_type);
2015 var = build_decl (input_location,
2016 CONST_DECL, NULL, TREE_TYPE (constructor));
2017 DECL_INITIAL (var) = constructor;
2018 TREE_STATIC (var) = 1;
2019 pushdecl_top_level (var);
2022 desc->constructor = constructor;
2025 addr = convert (build_pointer_type (constant_string_type),
2026 build_unary_op (input_location,
2027 ADDR_EXPR, desc->constructor, 1));
2032 /* Declare a static instance of CLASS_DECL initialized by CONSTRUCTOR. */
2034 static GTY(()) int num_static_inst;
2037 objc_add_static_instance (tree constructor, tree class_decl)
2042 /* Find the list of static instances for the CLASS_DECL. Create one if
2044 for (chain = &objc_static_instances;
2045 *chain && TREE_VALUE (*chain) != class_decl;
2046 chain = &TREE_CHAIN (*chain));
2049 *chain = tree_cons (NULL_TREE, class_decl, NULL_TREE);
2050 add_objc_string (OBJC_TYPE_NAME (class_decl), class_names);
2053 sprintf (buf, "_OBJC_INSTANCE_%d", num_static_inst++);
2054 decl = build_decl (input_location,
2055 VAR_DECL, get_identifier (buf), class_decl);
2056 TREE_STATIC (decl) = 1;
2057 DECL_ARTIFICIAL (decl) = 1;
2058 TREE_USED (decl) = 1;
2059 DECL_INITIAL (decl) = constructor;
2061 /* We may be writing something else just now.
2062 Postpone till end of input. */
2063 DECL_DEFER_OUTPUT (decl) = 1;
2064 pushdecl_top_level (decl);
2065 rest_of_decl_compilation (decl, 1, 0);
2067 /* Add the DECL to the head of this CLASS' list. */
2068 TREE_PURPOSE (*chain) = tree_cons (NULL_TREE, decl, TREE_PURPOSE (*chain));
2073 /* Build a static constant CONSTRUCTOR
2074 with type TYPE and elements ELTS. */
2077 objc_build_constructor (tree type, tree elts)
2079 tree constructor = build_constructor_from_list (type, elts);
2081 TREE_CONSTANT (constructor) = 1;
2082 TREE_STATIC (constructor) = 1;
2083 TREE_READONLY (constructor) = 1;
2086 /* Adjust for impedance mismatch. We should figure out how to build
2087 CONSTRUCTORs that consistently please both the C and C++ gods. */
2088 if (!TREE_PURPOSE (elts))
2089 TREE_TYPE (constructor) = init_list_type_node;
2095 /* Take care of defining and initializing _OBJC_SYMBOLS. */
2097 /* Predefine the following data type:
2105 void *defs[cls_def_cnt + cat_def_cnt];
2109 build_objc_symtab_template (void)
2111 tree field_decl, field_decl_chain;
2113 objc_symtab_template = objc_start_struct (get_identifier (UTAG_SYMTAB));
2115 /* long sel_ref_cnt; */
2116 field_decl = create_field_decl (long_integer_type_node, "sel_ref_cnt");
2117 field_decl_chain = field_decl;
2120 field_decl = create_field_decl (build_pointer_type (objc_selector_type),
2122 chainon (field_decl_chain, field_decl);
2124 /* short cls_def_cnt; */
2125 field_decl = create_field_decl (short_integer_type_node, "cls_def_cnt");
2126 chainon (field_decl_chain, field_decl);
2128 /* short cat_def_cnt; */
2129 field_decl = create_field_decl (short_integer_type_node,
2131 chainon (field_decl_chain, field_decl);
2133 if (imp_count || cat_count || !flag_next_runtime)
2135 /* void *defs[imp_count + cat_count (+ 1)]; */
2136 /* NB: The index is one less than the size of the array. */
2137 int index = imp_count + cat_count
2138 + (flag_next_runtime? -1: 0);
2139 field_decl = create_field_decl
2142 build_index_type (build_int_cst (NULL_TREE, index))),
2144 chainon (field_decl_chain, field_decl);
2147 objc_finish_struct (objc_symtab_template, field_decl_chain);
2150 /* Create the initial value for the `defs' field of _objc_symtab.
2151 This is a CONSTRUCTOR. */
2154 init_def_list (tree type)
2156 tree expr, initlist = NULL_TREE;
2157 struct imp_entry *impent;
2160 for (impent = imp_list; impent; impent = impent->next)
2162 if (TREE_CODE (impent->imp_context) == CLASS_IMPLEMENTATION_TYPE)
2164 expr = build_unary_op (input_location,
2165 ADDR_EXPR, impent->class_decl, 0);
2166 initlist = tree_cons (NULL_TREE, expr, initlist);
2171 for (impent = imp_list; impent; impent = impent->next)
2173 if (TREE_CODE (impent->imp_context) == CATEGORY_IMPLEMENTATION_TYPE)
2175 expr = build_unary_op (input_location,
2176 ADDR_EXPR, impent->class_decl, 0);
2177 initlist = tree_cons (NULL_TREE, expr, initlist);
2181 if (!flag_next_runtime)
2183 /* statics = { ..., _OBJC_STATIC_INSTANCES, ... } */
2186 if (static_instances_decl)
2187 expr = build_unary_op (input_location,
2188 ADDR_EXPR, static_instances_decl, 0);
2190 expr = build_int_cst (NULL_TREE, 0);
2192 initlist = tree_cons (NULL_TREE, expr, initlist);
2195 return objc_build_constructor (type, nreverse (initlist));
2198 /* Construct the initial value for all of _objc_symtab. */
2201 init_objc_symtab (tree type)
2205 /* sel_ref_cnt = { ..., 5, ... } */
2207 initlist = build_tree_list (NULL_TREE,
2208 build_int_cst (long_integer_type_node, 0));
2210 /* refs = { ..., _OBJC_SELECTOR_TABLE, ... } */
2212 if (flag_next_runtime || ! sel_ref_chain)
2213 initlist = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, 0), initlist);
2216 = tree_cons (NULL_TREE,
2217 convert (build_pointer_type (objc_selector_type),
2218 build_unary_op (input_location, ADDR_EXPR,
2219 UOBJC_SELECTOR_TABLE_decl, 1)),
2222 /* cls_def_cnt = { ..., 5, ... } */
2224 initlist = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, imp_count), initlist);
2226 /* cat_def_cnt = { ..., 5, ... } */
2228 initlist = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, cat_count), initlist);
2230 /* cls_def = { ..., { &Foo, &Bar, ...}, ... } */
2232 if (imp_count || cat_count || !flag_next_runtime)
2235 tree field = TYPE_FIELDS (type);
2236 field = TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (TREE_CHAIN (field))));
2238 initlist = tree_cons (NULL_TREE, init_def_list (TREE_TYPE (field)),
2242 return objc_build_constructor (type, nreverse (initlist));
2245 /* Generate forward declarations for metadata such as
2246 'OBJC_CLASS_...'. */
2249 build_metadata_decl (const char *name, tree type)
2253 /* struct TYPE NAME_<name>; */
2254 decl = start_var_decl (type, synth_id_with_class_suffix
2256 objc_implementation_context));
2261 /* Push forward-declarations of all the categories so that
2262 init_def_list can use them in a CONSTRUCTOR. */
2265 forward_declare_categories (void)
2267 struct imp_entry *impent;
2268 tree sav = objc_implementation_context;
2270 for (impent = imp_list; impent; impent = impent->next)
2272 if (TREE_CODE (impent->imp_context) == CATEGORY_IMPLEMENTATION_TYPE)
2274 /* Set an invisible arg to synth_id_with_class_suffix. */
2275 objc_implementation_context = impent->imp_context;
2276 /* extern struct objc_category _OBJC_CATEGORY_<name>; */
2277 impent->class_decl = build_metadata_decl ("_OBJC_CATEGORY",
2278 objc_category_template);
2281 objc_implementation_context = sav;
2284 /* Create the declaration of _OBJC_SYMBOLS, with type `struct _objc_symtab'
2285 and initialized appropriately. */
2288 generate_objc_symtab_decl (void)
2290 /* forward declare categories */
2292 forward_declare_categories ();
2294 build_objc_symtab_template ();
2295 UOBJC_SYMBOLS_decl = start_var_decl (objc_symtab_template, "_OBJC_SYMBOLS");
2296 finish_var_decl (UOBJC_SYMBOLS_decl,
2297 init_objc_symtab (TREE_TYPE (UOBJC_SYMBOLS_decl)));
2301 init_module_descriptor (tree type)
2303 tree initlist, expr;
2305 /* version = { 1, ... } */
2307 expr = build_int_cst (long_integer_type_node, OBJC_VERSION);
2308 initlist = build_tree_list (NULL_TREE, expr);
2310 /* size = { ..., sizeof (struct _objc_module), ... } */
2312 expr = convert (long_integer_type_node,
2313 size_in_bytes (objc_module_template));
2314 initlist = tree_cons (NULL_TREE, expr, initlist);
2316 /* Don't provide any file name for security reasons. */
2317 /* name = { ..., "", ... } */
2319 expr = add_objc_string (get_identifier (""), class_names);
2320 initlist = tree_cons (NULL_TREE, expr, initlist);
2322 /* symtab = { ..., _OBJC_SYMBOLS, ... } */
2324 if (UOBJC_SYMBOLS_decl)
2325 expr = build_unary_op (input_location,
2326 ADDR_EXPR, UOBJC_SYMBOLS_decl, 0);
2328 expr = build_int_cst (NULL_TREE, 0);
2329 initlist = tree_cons (NULL_TREE, expr, initlist);
2331 return objc_build_constructor (type, nreverse (initlist));
2334 /* Write out the data structures to describe Objective C classes defined.
2336 struct _objc_module { ... } _OBJC_MODULE = { ... }; */
2339 build_module_descriptor (void)
2341 tree field_decl, field_decl_chain;
2344 push_lang_context (lang_name_c); /* extern "C" */
2347 objc_module_template = objc_start_struct (get_identifier (UTAG_MODULE));
2350 field_decl = create_field_decl (long_integer_type_node, "version");
2351 field_decl_chain = field_decl;
2354 field_decl = create_field_decl (long_integer_type_node, "size");
2355 chainon (field_decl_chain, field_decl);
2358 field_decl = create_field_decl (string_type_node, "name");
2359 chainon (field_decl_chain, field_decl);
2361 /* struct _objc_symtab *symtab; */
2363 = create_field_decl (build_pointer_type
2364 (xref_tag (RECORD_TYPE,
2365 get_identifier (UTAG_SYMTAB))),
2367 chainon (field_decl_chain, field_decl);
2369 objc_finish_struct (objc_module_template, field_decl_chain);
2371 /* Create an instance of "_objc_module". */
2372 UOBJC_MODULES_decl = start_var_decl (objc_module_template, "_OBJC_MODULES");
2373 finish_var_decl (UOBJC_MODULES_decl,
2374 init_module_descriptor (TREE_TYPE (UOBJC_MODULES_decl)));
2377 pop_lang_context ();
2381 /* The GNU runtime requires us to provide a static initializer function
2384 static void __objc_gnu_init (void) {
2385 __objc_exec_class (&L_OBJC_MODULES);
2389 build_module_initializer_routine (void)
2394 push_lang_context (lang_name_c); /* extern "C" */
2397 objc_push_parm (build_decl (input_location,
2398 PARM_DECL, NULL_TREE, void_type_node));
2399 objc_start_function (get_identifier (TAG_GNUINIT),
2400 build_function_type (void_type_node,
2402 NULL_TREE, objc_get_parm_info (0));
2404 body = c_begin_compound_stmt (true);
2405 add_stmt (build_function_call
2410 build_unary_op (input_location, ADDR_EXPR,
2411 UOBJC_MODULES_decl, 0))));
2412 add_stmt (c_end_compound_stmt (input_location, body, true));
2414 TREE_PUBLIC (current_function_decl) = 0;
2417 /* For Objective-C++, we will need to call __objc_gnu_init
2418 from objc_generate_static_init_call() below. */
2419 DECL_STATIC_CONSTRUCTOR (current_function_decl) = 1;
2422 GNU_INIT_decl = current_function_decl;
2426 pop_lang_context ();
2431 /* Return 1 if the __objc_gnu_init function has been synthesized and needs
2432 to be called by the module initializer routine. */
2435 objc_static_init_needed_p (void)
2437 return (GNU_INIT_decl != NULL_TREE);
2440 /* Generate a call to the __objc_gnu_init initializer function. */
2443 objc_generate_static_init_call (tree ctors ATTRIBUTE_UNUSED)
2445 add_stmt (build_stmt (input_location, EXPR_STMT,
2446 build_function_call (input_location,
2447 GNU_INIT_decl, NULL_TREE)));
2451 #endif /* OBJCPLUS */
2453 /* Return the DECL of the string IDENT in the SECTION. */
2456 get_objc_string_decl (tree ident, enum string_section section)
2460 if (section == class_names)
2461 chain = class_names_chain;
2462 else if (section == meth_var_names)
2463 chain = meth_var_names_chain;
2464 else if (section == meth_var_types)
2465 chain = meth_var_types_chain;
2469 for (; chain != 0; chain = TREE_CHAIN (chain))
2470 if (TREE_VALUE (chain) == ident)
2471 return (TREE_PURPOSE (chain));
2477 /* Output references to all statically allocated objects. Return the DECL
2478 for the array built. */
2481 generate_static_references (void)
2483 tree decls = NULL_TREE, expr = NULL_TREE;
2484 tree class_name, klass, decl, initlist;
2485 tree cl_chain, in_chain, type
2486 = build_array_type (build_pointer_type (void_type_node), NULL_TREE);
2487 int num_inst, num_class;
2490 if (flag_next_runtime)
2493 for (cl_chain = objc_static_instances, num_class = 0;
2494 cl_chain; cl_chain = TREE_CHAIN (cl_chain), num_class++)
2496 for (num_inst = 0, in_chain = TREE_PURPOSE (cl_chain);
2497 in_chain; num_inst++, in_chain = TREE_CHAIN (in_chain));
2499 sprintf (buf, "_OBJC_STATIC_INSTANCES_%d", num_class);
2500 decl = start_var_decl (type, buf);
2502 /* Output {class_name, ...}. */
2503 klass = TREE_VALUE (cl_chain);
2504 class_name = get_objc_string_decl (OBJC_TYPE_NAME (klass), class_names);
2505 initlist = build_tree_list (NULL_TREE,
2506 build_unary_op (input_location,
2507 ADDR_EXPR, class_name, 1));
2509 /* Output {..., instance, ...}. */
2510 for (in_chain = TREE_PURPOSE (cl_chain);
2511 in_chain; in_chain = TREE_CHAIN (in_chain))
2513 expr = build_unary_op (input_location,
2514 ADDR_EXPR, TREE_VALUE (in_chain), 1);
2515 initlist = tree_cons (NULL_TREE, expr, initlist);
2518 /* Output {..., NULL}. */
2519 initlist = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, 0), initlist);
2521 expr = objc_build_constructor (TREE_TYPE (decl), nreverse (initlist));
2522 finish_var_decl (decl, expr);
2524 = tree_cons (NULL_TREE, build_unary_op (input_location,
2525 ADDR_EXPR, decl, 1), decls);
2528 decls = tree_cons (NULL_TREE, build_int_cst (NULL_TREE, 0), decls);
2529 expr = objc_build_constructor (type, nreverse (decls));
2530 static_instances_decl = start_var_decl (type, "_OBJC_STATIC_INSTANCES");
2531 finish_var_decl (static_instances_decl, expr);
2534 static GTY(()) int selector_reference_idx;
2537 build_selector_reference_decl (void)
2542 sprintf (buf, "_OBJC_SELECTOR_REFERENCES_%d", selector_reference_idx++);
2543 decl = start_var_decl (objc_selector_type, buf);
2549 build_selector_table_decl (void)
2553 if (flag_typed_selectors)
2555 build_selector_template ();
2556 temp = build_array_type (objc_selector_template, NULL_TREE);
2559 temp = build_array_type (objc_selector_type, NULL_TREE);
2561 UOBJC_SELECTOR_TABLE_decl = start_var_decl (temp, "_OBJC_SELECTOR_TABLE");
2564 /* Just a handy wrapper for add_objc_string. */
2567 build_selector (tree ident)
2569 return convert (objc_selector_type,
2570 add_objc_string (ident, meth_var_names));
2574 build_selector_translation_table (void)
2576 tree chain, initlist = NULL_TREE;
2578 tree decl = NULL_TREE;
2580 for (chain = sel_ref_chain; chain; chain = TREE_CHAIN (chain))
2584 if (warn_selector && objc_implementation_context)
2588 for (method_chain = meth_var_names_chain;
2590 method_chain = TREE_CHAIN (method_chain))
2592 if (TREE_VALUE (method_chain) == TREE_VALUE (chain))
2601 if (flag_next_runtime && TREE_PURPOSE (chain))
2602 loc = DECL_SOURCE_LOCATION (TREE_PURPOSE (chain));
2604 loc = input_location;
2605 warning_at (loc, 0, "creating selector for nonexistent method %qE",
2606 TREE_VALUE (chain));
2610 expr = build_selector (TREE_VALUE (chain));
2611 /* add one for the '\0' character */
2612 offset += IDENTIFIER_LENGTH (TREE_VALUE (chain)) + 1;
2614 if (flag_next_runtime)
2616 decl = TREE_PURPOSE (chain);
2617 finish_var_decl (decl, expr);
2621 if (flag_typed_selectors)
2623 tree eltlist = NULL_TREE;
2624 tree encoding = get_proto_encoding (TREE_PURPOSE (chain));
2625 eltlist = tree_cons (NULL_TREE, expr, NULL_TREE);
2626 eltlist = tree_cons (NULL_TREE, encoding, eltlist);
2627 expr = objc_build_constructor (objc_selector_template,
2628 nreverse (eltlist));
2631 initlist = tree_cons (NULL_TREE, expr, initlist);
2635 if (! flag_next_runtime)
2637 /* Cause the selector table (previously forward-declared)
2638 to be actually output. */
2639 initlist = tree_cons (NULL_TREE,
2640 flag_typed_selectors
2641 ? objc_build_constructor
2642 (objc_selector_template,
2643 tree_cons (NULL_TREE,
2644 build_int_cst (NULL_TREE, 0),
2645 tree_cons (NULL_TREE,
2646 build_int_cst (NULL_TREE, 0),
2648 : build_int_cst (NULL_TREE, 0), initlist);
2649 initlist = objc_build_constructor (TREE_TYPE (UOBJC_SELECTOR_TABLE_decl),
2650 nreverse (initlist));
2651 finish_var_decl (UOBJC_SELECTOR_TABLE_decl, initlist);
2656 get_proto_encoding (tree proto)
2661 if (! METHOD_ENCODING (proto))
2663 encoding = encode_method_prototype (proto);
2664 METHOD_ENCODING (proto) = encoding;
2667 encoding = METHOD_ENCODING (proto);
2669 return add_objc_string (encoding, meth_var_types);
2672 return build_int_cst (NULL_TREE, 0);
2675 /* sel_ref_chain is a list whose "value" fields will be instances of
2676 identifier_node that represent the selector. LOC is the location of
2680 build_typed_selector_reference (location_t loc, tree ident, tree prototype)
2682 tree *chain = &sel_ref_chain;
2688 if (TREE_PURPOSE (*chain) == prototype && TREE_VALUE (*chain) == ident)
2689 goto return_at_index;
2692 chain = &TREE_CHAIN (*chain);
2695 *chain = tree_cons (prototype, ident, NULL_TREE);
2698 expr = build_unary_op (loc, ADDR_EXPR,
2699 build_array_ref (loc, UOBJC_SELECTOR_TABLE_decl,
2700 build_int_cst (NULL_TREE, index)),
2702 return convert (objc_selector_type, expr);
2706 build_selector_reference (location_t loc, tree ident)
2708 tree *chain = &sel_ref_chain;
2714 if (TREE_VALUE (*chain) == ident)
2715 return (flag_next_runtime
2716 ? TREE_PURPOSE (*chain)
2717 : build_array_ref (loc, UOBJC_SELECTOR_TABLE_decl,
2718 build_int_cst (NULL_TREE, index)));
2721 chain = &TREE_CHAIN (*chain);
2724 expr = (flag_next_runtime ? build_selector_reference_decl (): NULL_TREE);
2726 *chain = tree_cons (expr, ident, NULL_TREE);
2728 return (flag_next_runtime
2730 : build_array_ref (loc, UOBJC_SELECTOR_TABLE_decl,
2731 build_int_cst (NULL_TREE, index)));
2734 static GTY(()) int class_reference_idx;
2737 build_class_reference_decl (void)
2742 sprintf (buf, "_OBJC_CLASS_REFERENCES_%d", class_reference_idx++);
2743 decl = start_var_decl (objc_class_type, buf);
2748 /* Create a class reference, but don't create a variable to reference
2752 add_class_reference (tree ident)
2756 if ((chain = cls_ref_chain))
2761 if (ident == TREE_VALUE (chain))
2765 chain = TREE_CHAIN (chain);
2769 /* Append to the end of the list */
2770 TREE_CHAIN (tail) = tree_cons (NULL_TREE, ident, NULL_TREE);
2773 cls_ref_chain = tree_cons (NULL_TREE, ident, NULL_TREE);
2776 /* Get a class reference, creating it if necessary. Also create the
2777 reference variable. */
2780 objc_get_class_reference (tree ident)
2782 tree orig_ident = (DECL_P (ident)
2785 ? OBJC_TYPE_NAME (ident)
2787 bool local_scope = false;
2790 if (processing_template_decl)
2791 /* Must wait until template instantiation time. */
2792 return build_min_nt (CLASS_REFERENCE_EXPR, ident);
2795 if (TREE_CODE (ident) == TYPE_DECL)
2796 ident = (DECL_ORIGINAL_TYPE (ident)
2797 ? DECL_ORIGINAL_TYPE (ident)
2798 : TREE_TYPE (ident));
2801 if (TYPE_P (ident) && TYPE_CONTEXT (ident)
2802 && TYPE_CONTEXT (ident) != global_namespace)
2806 if (local_scope || !(ident = objc_is_class_name (ident)))
2808 error ("%qE is not an Objective-C class name or alias",
2810 return error_mark_node;
2813 if (flag_next_runtime && !flag_zero_link)
2818 for (chain = &cls_ref_chain; *chain; chain = &TREE_CHAIN (*chain))
2819 if (TREE_VALUE (*chain) == ident)
2821 if (! TREE_PURPOSE (*chain))
2822 TREE_PURPOSE (*chain) = build_class_reference_decl ();
2824 return TREE_PURPOSE (*chain);
2827 decl = build_class_reference_decl ();
2828 *chain = tree_cons (decl, ident, NULL_TREE);
2835 add_class_reference (ident);
2837 params = build_tree_list (NULL_TREE,
2838 my_build_string_pointer
2839 (IDENTIFIER_LENGTH (ident) + 1,
2840 IDENTIFIER_POINTER (ident)));
2842 assemble_external (objc_get_class_decl);
2843 return build_function_call (input_location, objc_get_class_decl, params);
2847 /* For each string section we have a chain which maps identifier nodes
2848 to decls for the strings. */
2851 add_objc_string (tree ident, enum string_section section)
2853 tree *chain, decl, type, string_expr;
2855 if (section == class_names)
2856 chain = &class_names_chain;
2857 else if (section == meth_var_names)
2858 chain = &meth_var_names_chain;
2859 else if (section == meth_var_types)
2860 chain = &meth_var_types_chain;
2866 if (TREE_VALUE (*chain) == ident)
2867 return convert (string_type_node,
2868 build_unary_op (input_location,
2869 ADDR_EXPR, TREE_PURPOSE (*chain), 1));
2871 chain = &TREE_CHAIN (*chain);
2874 decl = build_objc_string_decl (section);
2876 type = build_array_type
2879 (build_int_cst (NULL_TREE,
2880 IDENTIFIER_LENGTH (ident))));
2881 decl = start_var_decl (type, IDENTIFIER_POINTER (DECL_NAME (decl)));
2882 string_expr = my_build_string (IDENTIFIER_LENGTH (ident) + 1,
2883 IDENTIFIER_POINTER (ident));
2884 finish_var_decl (decl, string_expr);
2886 *chain = tree_cons (decl, ident, NULL_TREE);
2888 return convert (string_type_node, build_unary_op (input_location,
2889 ADDR_EXPR, decl, 1));
2892 static GTY(()) int class_names_idx;
2893 static GTY(()) int meth_var_names_idx;
2894 static GTY(()) int meth_var_types_idx;
2897 build_objc_string_decl (enum string_section section)
2902 if (section == class_names)
2903 sprintf (buf, "_OBJC_CLASS_NAME_%d", class_names_idx++);
2904 else if (section == meth_var_names)
2905 sprintf (buf, "_OBJC_METH_VAR_NAME_%d", meth_var_names_idx++);
2906 else if (section == meth_var_types)
2907 sprintf (buf, "_OBJC_METH_VAR_TYPE_%d", meth_var_types_idx++);
2909 ident = get_identifier (buf);
2911 decl = build_decl (input_location,
2912 VAR_DECL, ident, build_array_type (char_type_node, 0));
2913 DECL_EXTERNAL (decl) = 1;
2914 TREE_PUBLIC (decl) = 0;
2915 TREE_USED (decl) = 1;
2916 TREE_CONSTANT (decl) = 1;
2917 DECL_CONTEXT (decl) = 0;
2918 DECL_ARTIFICIAL (decl) = 1;
2920 DECL_THIS_STATIC (decl) = 1; /* squash redeclaration errors */
2923 make_decl_rtl (decl);
2924 pushdecl_top_level (decl);
2931 objc_declare_alias (tree alias_ident, tree class_ident)
2933 tree underlying_class;
2936 if (current_namespace != global_namespace) {
2937 error ("Objective-C declarations may only appear in global scope");
2939 #endif /* OBJCPLUS */
2941 if (!(underlying_class = objc_is_class_name (class_ident)))
2942 warning (0, "cannot find class %qE", class_ident);
2943 else if (objc_is_class_name (alias_ident))
2944 warning (0, "class %qE already exists", alias_ident);
2947 /* Implement @compatibility_alias as a typedef. */
2949 push_lang_context (lang_name_c); /* extern "C" */
2951 lang_hooks.decls.pushdecl (build_decl
2955 xref_tag (RECORD_TYPE, underlying_class)));
2957 pop_lang_context ();
2959 alias_chain = tree_cons (underlying_class, alias_ident, alias_chain);
2964 objc_declare_class (tree ident_list)
2968 if (current_namespace != global_namespace) {
2969 error ("Objective-C declarations may only appear in global scope");
2971 #endif /* OBJCPLUS */
2973 for (list = ident_list; list; list = TREE_CHAIN (list))
2975 tree ident = TREE_VALUE (list);
2977 if (! objc_is_class_name (ident))
2979 tree record = lookup_name (ident), type = record;
2983 if (TREE_CODE (record) == TYPE_DECL)
2984 type = DECL_ORIGINAL_TYPE (record);
2986 if (!TYPE_HAS_OBJC_INFO (type)
2987 || !TYPE_OBJC_INTERFACE (type))
2989 error ("%qE redeclared as different kind of symbol",
2991 error ("previous declaration of %q+D",
2996 record = xref_tag (RECORD_TYPE, ident);
2997 INIT_TYPE_OBJC_INFO (record);
2998 TYPE_OBJC_INTERFACE (record) = ident;
2999 class_chain = tree_cons (NULL_TREE, ident, class_chain);
3005 objc_is_class_name (tree ident)
3009 if (ident && TREE_CODE (ident) == IDENTIFIER_NODE
3010 && identifier_global_value (ident))
3011 ident = identifier_global_value (ident);
3012 while (ident && TREE_CODE (ident) == TYPE_DECL && DECL_ORIGINAL_TYPE (ident))
3013 ident = OBJC_TYPE_NAME (DECL_ORIGINAL_TYPE (ident));
3015 if (ident && TREE_CODE (ident) == RECORD_TYPE)
3016 ident = OBJC_TYPE_NAME (ident);
3018 if (ident && TREE_CODE (ident) == TYPE_DECL)
3019 ident = DECL_NAME (ident);
3021 if (!ident || TREE_CODE (ident) != IDENTIFIER_NODE)
3024 if (lookup_interface (ident))
3027 for (chain = class_chain; chain; chain = TREE_CHAIN (chain))
3029 if (ident == TREE_VALUE (chain))
3033 for (chain = alias_chain; chain; chain = TREE_CHAIN (chain))
3035 if (ident == TREE_VALUE (chain))
3036 return TREE_PURPOSE (chain);
3042 /* Check whether TYPE is either 'id' or 'Class'. */
3045 objc_is_id (tree type)
3047 if (type && TREE_CODE (type) == IDENTIFIER_NODE
3048 && identifier_global_value (type))
3049 type = identifier_global_value (type);
3051 if (type && TREE_CODE (type) == TYPE_DECL)
3052 type = TREE_TYPE (type);
3054 /* NB: This function may be called before the ObjC front-end has
3055 been initialized, in which case OBJC_OBJECT_TYPE will (still) be NULL. */
3056 return (objc_object_type && type
3057 && (IS_ID (type) || IS_CLASS (type) || IS_SUPER (type))
3062 /* Check whether TYPE is either 'id', 'Class', or a pointer to an ObjC
3063 class instance. This is needed by other parts of the compiler to
3064 handle ObjC types gracefully. */
3067 objc_is_object_ptr (tree type)
3071 type = TYPE_MAIN_VARIANT (type);
3072 if (!POINTER_TYPE_P (type))
3075 ret = objc_is_id (type);
3077 ret = objc_is_class_name (TREE_TYPE (type));
3083 objc_is_gcable_type (tree type, int or_strong_p)
3089 if (objc_is_id (TYPE_MAIN_VARIANT (type)))
3091 if (or_strong_p && lookup_attribute ("objc_gc", TYPE_ATTRIBUTES (type)))
3093 if (TREE_CODE (type) != POINTER_TYPE && TREE_CODE (type) != INDIRECT_REF)
3095 type = TREE_TYPE (type);
3096 if (TREE_CODE (type) != RECORD_TYPE)
3098 name = TYPE_NAME (type);
3099 return (objc_is_class_name (name) != NULL_TREE);
3103 objc_substitute_decl (tree expr, tree oldexpr, tree newexpr)
3105 if (expr == oldexpr)
3108 switch (TREE_CODE (expr))
3111 return objc_build_component_ref
3112 (objc_substitute_decl (TREE_OPERAND (expr, 0),
3115 DECL_NAME (TREE_OPERAND (expr, 1)));
3117 return build_array_ref (input_location,
3118 objc_substitute_decl (TREE_OPERAND (expr, 0),
3121 TREE_OPERAND (expr, 1));
3123 return build_indirect_ref (input_location,
3124 objc_substitute_decl (TREE_OPERAND (expr, 0),
3126 newexpr), RO_ARROW);
3133 objc_build_ivar_assignment (tree outervar, tree lhs, tree rhs)
3136 /* The LHS parameter contains the expression 'outervar->memberspec';
3137 we need to transform it into '&((typeof(outervar) *) 0)->memberspec',
3138 where memberspec may be arbitrarily complex (e.g., 'g->f.d[2].g[3]').
3141 = objc_substitute_decl
3142 (lhs, outervar, convert (TREE_TYPE (outervar), integer_zero_node));
3144 = (flag_objc_direct_dispatch
3145 ? objc_assign_ivar_fast_decl
3146 : objc_assign_ivar_decl);
3148 offs = convert (integer_type_node, build_unary_op (input_location,
3149 ADDR_EXPR, offs, 0));
3151 func_params = tree_cons (NULL_TREE,
3152 convert (objc_object_type, rhs),
3153 tree_cons (NULL_TREE, convert (objc_object_type, outervar),
3154 tree_cons (NULL_TREE, offs,
3157 assemble_external (func);
3158 return build_function_call (input_location, func, func_params);
3162 objc_build_global_assignment (tree lhs, tree rhs)
3164 tree func_params = tree_cons (NULL_TREE,
3165 convert (objc_object_type, rhs),
3166 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3167 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3170 assemble_external (objc_assign_global_decl);
3171 return build_function_call (input_location,
3172 objc_assign_global_decl, func_params);
3176 objc_build_strong_cast_assignment (tree lhs, tree rhs)
3178 tree func_params = tree_cons (NULL_TREE,
3179 convert (objc_object_type, rhs),
3180 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3181 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3184 assemble_external (objc_assign_strong_cast_decl);
3185 return build_function_call (input_location,
3186 objc_assign_strong_cast_decl, func_params);
3190 objc_is_gcable_p (tree expr)
3192 return (TREE_CODE (expr) == COMPONENT_REF
3193 ? objc_is_gcable_p (TREE_OPERAND (expr, 1))
3194 : TREE_CODE (expr) == ARRAY_REF
3195 ? (objc_is_gcable_p (TREE_TYPE (expr))
3196 || objc_is_gcable_p (TREE_OPERAND (expr, 0)))
3197 : TREE_CODE (expr) == ARRAY_TYPE
3198 ? objc_is_gcable_p (TREE_TYPE (expr))
3200 ? objc_is_gcable_type (expr, 1)
3201 : (objc_is_gcable_p (TREE_TYPE (expr))
3203 && lookup_attribute ("objc_gc", DECL_ATTRIBUTES (expr)))));
3207 objc_is_ivar_reference_p (tree expr)
3209 return (TREE_CODE (expr) == ARRAY_REF
3210 ? objc_is_ivar_reference_p (TREE_OPERAND (expr, 0))
3211 : TREE_CODE (expr) == COMPONENT_REF
3212 ? TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL
3217 objc_is_global_reference_p (tree expr)
3219 return (TREE_CODE (expr) == INDIRECT_REF || TREE_CODE (expr) == PLUS_EXPR
3220 ? objc_is_global_reference_p (TREE_OPERAND (expr, 0))
3222 ? (!DECL_CONTEXT (expr) || TREE_STATIC (expr))
3227 objc_generate_write_barrier (tree lhs, enum tree_code modifycode, tree rhs)
3229 tree result = NULL_TREE, outer;
3230 int strong_cast_p = 0, outer_gc_p = 0, indirect_p = 0;
3232 /* See if we have any lhs casts, and strip them out. NB: The lvalue casts
3233 will have been transformed to the form '*(type *)&expr'. */
3234 if (TREE_CODE (lhs) == INDIRECT_REF)
3236 outer = TREE_OPERAND (lhs, 0);
3238 while (!strong_cast_p
3239 && (CONVERT_EXPR_P (outer)
3240 || TREE_CODE (outer) == NON_LVALUE_EXPR))
3242 tree lhstype = TREE_TYPE (outer);
3244 /* Descend down the cast chain, and record the first objc_gc
3246 if (POINTER_TYPE_P (lhstype))
3249 = lookup_attribute ("objc_gc",
3250 TYPE_ATTRIBUTES (TREE_TYPE (lhstype)));
3256 outer = TREE_OPERAND (outer, 0);
3260 /* If we have a __strong cast, it trumps all else. */
3263 if (modifycode != NOP_EXPR)
3264 goto invalid_pointer_arithmetic;
3266 if (warn_assign_intercept)
3267 warning (0, "strong-cast assignment has been intercepted");
3269 result = objc_build_strong_cast_assignment (lhs, rhs);
3274 /* the lhs must be of a suitable type, regardless of its underlying
3276 if (!objc_is_gcable_p (lhs))
3282 && (TREE_CODE (outer) == COMPONENT_REF
3283 || TREE_CODE (outer) == ARRAY_REF))
3284 outer = TREE_OPERAND (outer, 0);
3286 if (TREE_CODE (outer) == INDIRECT_REF)
3288 outer = TREE_OPERAND (outer, 0);
3292 outer_gc_p = objc_is_gcable_p (outer);
3294 /* Handle ivar assignments. */
3295 if (objc_is_ivar_reference_p (lhs))
3297 /* if the struct to the left of the ivar is not an Objective-C object (__strong
3298 doesn't cut it here), the best we can do here is suggest a cast. */
3299 if (!objc_is_gcable_type (TREE_TYPE (outer), 0))
3301 /* We may still be able to use the global write barrier... */
3302 if (!indirect_p && objc_is_global_reference_p (outer))
3303 goto global_reference;
3306 if (modifycode == NOP_EXPR)
3308 if (warn_assign_intercept)
3309 warning (0, "strong-cast may possibly be needed");
3315 if (modifycode != NOP_EXPR)
3316 goto invalid_pointer_arithmetic;
3318 if (warn_assign_intercept)
3319 warning (0, "instance variable assignment has been intercepted");
3321 result = objc_build_ivar_assignment (outer, lhs, rhs);
3326 /* Likewise, intercept assignment to global/static variables if their type is
3328 if (objc_is_global_reference_p (outer))
3334 if (modifycode != NOP_EXPR)
3336 invalid_pointer_arithmetic:
3338 warning (0, "pointer arithmetic for garbage-collected objects not allowed");
3343 if (warn_assign_intercept)
3344 warning (0, "global/static variable assignment has been intercepted");
3346 result = objc_build_global_assignment (lhs, rhs);
3349 /* In all other cases, fall back to the normal mechanism. */
3354 struct GTY(()) interface_tuple {
3359 static GTY ((param_is (struct interface_tuple))) htab_t interface_htab;
3362 hash_interface (const void *p)
3364 const struct interface_tuple *d = (const struct interface_tuple *) p;
3365 return IDENTIFIER_HASH_VALUE (d->id);
3369 eq_interface (const void *p1, const void *p2)
3371 const struct interface_tuple *d = (const struct interface_tuple *) p1;
3376 lookup_interface (tree ident)
3379 if (ident && TREE_CODE (ident) == TYPE_DECL)
3380 ident = DECL_NAME (ident);
3383 if (ident == NULL_TREE || TREE_CODE (ident) != IDENTIFIER_NODE)
3387 struct interface_tuple **slot;
3392 slot = (struct interface_tuple **)
3393 htab_find_slot_with_hash (interface_htab, ident,
3394 IDENTIFIER_HASH_VALUE (ident),
3397 i = (*slot)->class_name;
3403 /* Implement @defs (<classname>) within struct bodies. */
3406 objc_get_class_ivars (tree class_name)
3408 tree interface = lookup_interface (class_name);
3411 return get_class_ivars (interface, true);
3413 error ("cannot find interface declaration for %qE",
3416 return error_mark_node;
3419 /* Used by: build_private_template, continue_class,
3420 and for @defs constructs. */
3423 get_class_ivars (tree interface, bool inherited)
3425 tree ivar_chain = copy_list (CLASS_RAW_IVARS (interface));
3427 /* Both CLASS_RAW_IVARS and CLASS_IVARS contain a list of ivars declared
3428 by the current class (i.e., they do not include super-class ivars).
3429 However, the CLASS_IVARS list will be side-effected by a call to
3430 finish_struct(), which will fill in field offsets. */
3431 if (!CLASS_IVARS (interface))
3432 CLASS_IVARS (interface) = ivar_chain;
3437 while (CLASS_SUPER_NAME (interface))
3439 /* Prepend super-class ivars. */
3440 interface = lookup_interface (CLASS_SUPER_NAME (interface));
3441 ivar_chain = chainon (copy_list (CLASS_RAW_IVARS (interface)),
3449 objc_create_temporary_var (tree type)
3453 decl = build_decl (input_location,
3454 VAR_DECL, NULL_TREE, type);
3455 TREE_USED (decl) = 1;
3456 DECL_ARTIFICIAL (decl) = 1;
3457 DECL_IGNORED_P (decl) = 1;
3458 DECL_CONTEXT (decl) = current_function_decl;
3463 /* Exception handling constructs. We begin by having the parser do most
3464 of the work and passing us blocks. What we do next depends on whether
3465 we're doing "native" exception handling or legacy Darwin setjmp exceptions.
3466 We abstract all of this in a handful of appropriately named routines. */
3468 /* Stack of open try blocks. */
3470 struct objc_try_context
3472 struct objc_try_context *outer;
3474 /* Statements (or statement lists) as processed by the parser. */
3478 /* Some file position locations. */
3479 location_t try_locus;
3480 location_t end_try_locus;
3481 location_t end_catch_locus;
3482 location_t finally_locus;
3483 location_t end_finally_locus;
3485 /* A STATEMENT_LIST of CATCH_EXPRs, appropriate for sticking into op1
3486 of a TRY_CATCH_EXPR. Even when doing Darwin setjmp. */
3489 /* The CATCH_EXPR of an open @catch clause. */
3492 /* The VAR_DECL holding the Darwin equivalent of __builtin_eh_pointer. */
3498 static struct objc_try_context *cur_try_context;
3500 static GTY(()) tree objc_eh_personality_decl;
3502 /* This hook, called via lang_eh_runtime_type, generates a runtime object
3503 that represents TYPE. For Objective-C, this is just the class name. */
3504 /* ??? Isn't there a class object or some such? Is it easy to get? */
3508 objc_eh_runtime_type (tree type)
3510 return add_objc_string (OBJC_TYPE_NAME (TREE_TYPE (type)), class_names);
3514 objc_eh_personality (void)
3516 if (!flag_objc_sjlj_exceptions
3517 && !objc_eh_personality_decl)
3518 objc_eh_personality_decl
3519 = build_personality_function (USING_SJLJ_EXCEPTIONS
3520 ? "__gnu_objc_personality_sj0"
3521 : "__gnu_objc_personality_v0");
3523 return objc_eh_personality_decl;
3527 /* Build __builtin_eh_pointer, or the moral equivalent. In the case
3528 of Darwin, we'll arrange for it to be initialized (and associated
3529 with a binding) later. */
3532 objc_build_exc_ptr (void)
3534 if (flag_objc_sjlj_exceptions)
3536 tree var = cur_try_context->caught_decl;
3539 var = objc_create_temporary_var (objc_object_type);
3540 cur_try_context->caught_decl = var;
3547 t = built_in_decls[BUILT_IN_EH_POINTER];
3548 t = build_call_expr (t, 1, integer_zero_node);
3549 return fold_convert (objc_object_type, t);
3553 /* Build "objc_exception_try_exit(&_stack)". */
3556 next_sjlj_build_try_exit (void)
3559 t = build_fold_addr_expr_loc (input_location, cur_try_context->stack_decl);
3560 t = tree_cons (NULL, t, NULL);
3561 t = build_function_call (input_location,
3562 objc_exception_try_exit_decl, t);
3567 objc_exception_try_enter (&_stack);
3568 if (_setjmp(&_stack.buf))
3572 Return the COND_EXPR. Note that the THEN and ELSE fields are left
3573 empty, ready for the caller to fill them in. */
3576 next_sjlj_build_enter_and_setjmp (void)
3578 tree t, enter, sj, cond;