In gcc/c-family/: 2011-04-14 Nicola Pero <nicola.pero@meta-innovation.com>
[official-gcc.git] / gcc / objc / objc-act.c
blobf75fa75a865bbf659310a5bd2510916a676ec51a
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, 2010, 2011
4 Free Software Foundation, Inc.
5 Contributed by Steve Naroff.
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "tree.h"
29 #ifdef OBJCPLUS
30 #include "cp-tree.h"
31 #else
32 #include "c-tree.h"
33 #include "c-lang.h"
34 #endif
36 #include "c-family/c-common.h"
37 #include "c-family/c-objc.h"
38 #include "c-family/c-pragma.h"
39 #include "c-family/c-format.h"
40 #include "flags.h"
41 #include "langhooks.h"
42 #include "objc-act.h"
43 #include "input.h"
44 #include "function.h"
45 #include "output.h"
46 #include "toplev.h"
47 #include "ggc.h"
48 #include "debug.h"
49 #include "c-family/c-target.h"
50 #include "diagnostic-core.h"
51 #include "intl.h"
52 #include "cgraph.h"
53 #include "tree-iterator.h"
54 #include "hashtab.h"
55 #include "langhooks-def.h"
56 /* Different initialization, code gen and meta data generation for each
57 runtime. */
58 #include "objc-runtime-hooks.h"
59 /* Routines used mainly by the runtimes. */
60 #include "objc-runtime-shared-support.h"
61 /* For default_tree_printer (). */
62 #include "tree-pretty-print.h"
64 /* For enum gimplify_status */
65 #include "gimple.h"
67 static unsigned int should_call_super_dealloc = 0;
69 /* When building Objective-C++, we are not linking against the C front-end
70 and so need to replicate the C tree-construction functions in some way. */
71 #ifdef OBJCPLUS
72 #define OBJCP_REMAP_FUNCTIONS
73 #include "objcp-decl.h"
74 #endif /* OBJCPLUS */
76 /* This is the default way of generating a method name. */
77 /* This has the problem that "test_method:argument:" and
78 "test:method_argument:" will generate the same name
79 ("_i_Test__test_method_argument_" for an instance method of the
80 class "Test"), so you can't have them both in the same class!
81 Moreover, the demangling (going from
82 "_i_Test__test_method_argument" back to the original name) is
83 undefined because there are two correct ways of demangling the
84 name. */
85 #ifndef OBJC_GEN_METHOD_LABEL
86 #define OBJC_GEN_METHOD_LABEL(BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME, NUM) \
87 do { \
88 char *temp; \
89 sprintf ((BUF), "_%s_%s_%s_%s", \
90 ((IS_INST) ? "i" : "c"), \
91 (CLASS_NAME), \
92 ((CAT_NAME)? (CAT_NAME) : ""), \
93 (SEL_NAME)); \
94 for (temp = (BUF); *temp; temp++) \
95 if (*temp == ':') *temp = '_'; \
96 } while (0)
97 #endif
99 /* These need specifying. */
100 #ifndef OBJC_FORWARDING_STACK_OFFSET
101 #define OBJC_FORWARDING_STACK_OFFSET 0
102 #endif
104 #ifndef OBJC_FORWARDING_MIN_OFFSET
105 #define OBJC_FORWARDING_MIN_OFFSET 0
106 #endif
108 /* Set up for use of obstacks. */
110 #include "obstack.h"
112 /* This obstack is used to accumulate the encoding of a data type. */
113 struct obstack util_obstack;
115 /* This points to the beginning of obstack contents, so we can free
116 the whole contents. */
117 char *util_firstobj;
119 /*** Private Interface (procedures) ***/
121 /* Init stuff. */
122 static void synth_module_prologue (void);
124 /* Code generation. */
126 static tree start_class (enum tree_code, tree, tree, tree, tree);
127 static tree continue_class (tree);
128 static void finish_class (tree);
129 static void start_method_def (tree);
131 static tree start_protocol (enum tree_code, tree, tree, tree);
132 static tree build_method_decl (enum tree_code, tree, tree, tree, bool);
133 static tree objc_add_method (tree, tree, int, bool);
134 static tree add_instance_variable (tree, objc_ivar_visibility_kind, tree);
135 static tree build_ivar_reference (tree);
136 static tree is_ivar (tree, tree);
138 /* We only need the following for ObjC; ObjC++ will use C++'s definition
139 of DERIVED_FROM_P. */
140 #ifndef OBJCPLUS
141 static bool objc_derived_from_p (tree, tree);
142 #define DERIVED_FROM_P(PARENT, CHILD) objc_derived_from_p (PARENT, CHILD)
143 #endif
145 /* Property. */
146 static void objc_gen_property_data (tree, tree);
147 static void objc_synthesize_getter (tree, tree, tree);
148 static void objc_synthesize_setter (tree, tree, tree);
149 static char *objc_build_property_setter_name (tree);
150 static tree lookup_property (tree, tree);
151 static tree lookup_property_in_list (tree, tree);
152 static tree lookup_property_in_protocol_list (tree, tree);
153 static void build_common_objc_property_accessor_helpers (void);
155 static void objc_xref_basetypes (tree, tree);
157 static tree get_class_ivars (tree, bool);
159 static void build_fast_enumeration_state_template (void);
161 #ifdef OBJCPLUS
162 static void objc_generate_cxx_cdtors (void);
163 #endif
165 /* objc attribute */
166 static void objc_decl_method_attributes (tree*, tree, int);
167 static tree build_keyword_selector (tree);
169 /* Hash tables to manage the global pool of method prototypes. */
170 static void hash_init (void);
172 hash *nst_method_hash_list = 0;
173 hash *cls_method_hash_list = 0;
175 /* Hash tables to manage the global pool of class names. */
177 hash *cls_name_hash_list = 0;
178 hash *als_name_hash_list = 0;
180 hash *ivar_offset_hash_list = 0;
182 static void hash_class_name_enter (hash *, tree, tree);
183 static hash hash_class_name_lookup (hash *, tree);
185 static hash hash_lookup (hash *, tree);
186 static tree lookup_method (tree, tree);
187 static tree lookup_method_static (tree, tree, int);
189 static tree add_class (tree, tree);
190 static void add_category (tree, tree);
191 static inline tree lookup_category (tree, tree);
193 /* Protocols. */
195 static tree lookup_protocol (tree, bool, bool);
196 static tree lookup_and_install_protocols (tree, bool);
198 /* Type encoding. */
200 static void encode_type_qualifiers (tree);
201 static void encode_type (tree, int, int);
203 #ifdef OBJCPLUS
204 static void really_start_method (tree, tree);
205 #else
206 static void really_start_method (tree, struct c_arg_info *);
207 #endif
208 static int comp_proto_with_proto (tree, tree, int);
209 static tree objc_decay_parm_type (tree);
211 /* Utilities for debugging and error diagnostics. */
213 static char *gen_type_name (tree);
214 static char *gen_type_name_0 (tree);
215 static char *gen_method_decl (tree);
216 static char *gen_declaration (tree);
218 /* Everything else. */
220 static void generate_struct_by_value_array (void) ATTRIBUTE_NORETURN;
222 static void mark_referenced_methods (void);
223 static bool objc_type_valid_for_messaging (tree type, bool allow_classes);
224 static tree check_duplicates (hash, int, int);
226 /*** Private Interface (data) ***/
227 /* Flags for lookup_method_static(). */
229 /* Look for class methods. */
230 #define OBJC_LOOKUP_CLASS 1
231 /* Do not examine superclasses. */
232 #define OBJC_LOOKUP_NO_SUPER 2
233 /* Disable returning an instance method of a root class when a class
234 method can't be found. */
235 #define OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS 4
237 /* The OCTI_... enumeration itself is in objc/objc-act.h. */
238 tree objc_global_trees[OCTI_MAX];
240 struct imp_entry *imp_list = 0;
241 int imp_count = 0; /* `@implementation' */
242 int cat_count = 0; /* `@category' */
244 objc_ivar_visibility_kind objc_ivar_visibility;
246 /* Use to generate method labels. */
247 static int method_slot = 0;
249 /* Flag to say whether methods in a protocol are optional or
250 required. */
251 static bool objc_method_optional_flag = false;
253 static int objc_collecting_ivars = 0;
255 /* Flag that is set to 'true' while we are processing a class
256 extension. Since a class extension just "reopens" the main
257 @interface, this can be used to determine if we are in the main
258 @interface, or in a class extension. */
259 static bool objc_in_class_extension = false;
261 static char *errbuf; /* Buffer for error diagnostics */
263 /* An array of all the local variables in the current function that
264 need to be marked as volatile. */
265 VEC(tree,gc) *local_variables_to_volatilize = NULL;
267 /* Store all constructed constant strings in a hash table so that
268 they get uniqued properly. */
270 struct GTY(()) string_descriptor {
271 /* The literal argument . */
272 tree literal;
274 /* The resulting constant string. */
275 tree constructor;
278 static GTY((param_is (struct string_descriptor))) htab_t string_htab;
280 FILE *gen_declaration_file;
282 /* Tells "encode_pointer/encode_aggregate" whether we are generating
283 type descriptors for instance variables (as opposed to methods).
284 Type descriptors for instance variables contain more information
285 than methods (for static typing and embedded structures). */
287 int generating_instance_variables = 0;
289 /* Hooks for stuff that differs between runtimes. */
290 objc_runtime_hooks runtime;
292 /* Create a temporary variable of type 'type'. If 'name' is set, uses
293 the specified name, else use no name. Returns the declaration of
294 the type. The 'name' is mostly useful for debugging.
296 tree
297 objc_create_temporary_var (tree type, const char *name)
299 tree decl;
301 if (name != NULL)
303 decl = build_decl (input_location,
304 VAR_DECL, get_identifier (name), type);
306 else
308 decl = build_decl (input_location,
309 VAR_DECL, NULL_TREE, type);
311 TREE_USED (decl) = 1;
312 DECL_ARTIFICIAL (decl) = 1;
313 DECL_IGNORED_P (decl) = 1;
314 DECL_CONTEXT (decl) = current_function_decl;
316 return decl;
319 /* Some platforms pass small structures through registers versus
320 through an invisible pointer. Determine at what size structure is
321 the transition point between the two possibilities. */
323 static void
324 generate_struct_by_value_array (void)
326 tree type;
327 tree decls;
328 int i, j;
329 int aggregate_in_mem[32];
330 int found = 0;
332 /* Presumably no platform passes 32 byte structures in a register. */
333 /* ??? As an example, m64/ppc/Darwin can pass up to 8*long+13*double
334 in registers. */
335 for (i = 1; i < 32; i++)
337 char buffer[5];
338 tree *chain = NULL;
340 /* Create an unnamed struct that has `i' character components */
341 type = objc_start_struct (NULL_TREE);
343 strcpy (buffer, "c1");
344 decls = add_field_decl (char_type_node, buffer, &chain);
346 for (j = 1; j < i; j++)
348 sprintf (buffer, "c%d", j + 1);
349 add_field_decl (char_type_node, buffer, &chain);
351 objc_finish_struct (type, decls);
353 aggregate_in_mem[i] = aggregate_value_p (type, 0);
354 if (!aggregate_in_mem[i])
355 found = 1;
358 /* We found some structures that are returned in registers instead of memory
359 so output the necessary data. */
360 if (found)
362 for (i = 31; i >= 0; i--)
363 if (!aggregate_in_mem[i])
364 break;
365 printf ("#define OBJC_MAX_STRUCT_BY_VALUE %d\n", i);
368 exit (0);
371 bool
372 objc_init (void)
374 bool ok;
375 #ifdef OBJCPLUS
376 if (cxx_init () == false)
377 #else
378 if (c_objc_common_init () == false)
379 #endif
380 return false;
382 /* print_struct_values is triggered by -print-runtime-info (used
383 when building libobjc, with an empty file as input). It does not
384 require any ObjC setup, and it never returns.
386 -fcompare-debug is used to check the compiler output; we are
387 executed twice, once with flag_compare_debug set, and once with
388 it not set. If the flag is used together with
389 -print-runtime-info, we want to print the runtime info only once,
390 else it would be output in duplicate. So we check
391 flag_compare_debug to output it in only one of the invocations.
393 As a side effect, this also that means -fcompare-debug
394 -print-runtime-info will run the compiler twice, and compare the
395 generated assembler file; the first time the compiler exits
396 immediately (producing no file), and the second time it compiles
397 an empty file. This checks, as a side effect, that compiling an
398 empty file produces no assembler output. */
399 if (print_struct_values && !flag_compare_debug)
400 generate_struct_by_value_array ();
402 /* Set up stuff used by FE parser and all runtimes. */
403 errbuf = XNEWVEC (char, 1024 * 10);
404 hash_init ();
405 gcc_obstack_init (&util_obstack);
406 util_firstobj = (char *) obstack_finish (&util_obstack);
408 /* ... and then check flags and set-up for the selected runtime ... */
409 if (flag_next_runtime && flag_objc_abi >= 2)
410 ok = objc_next_runtime_abi_02_init (&runtime);
411 else if (flag_next_runtime)
412 ok = objc_next_runtime_abi_01_init (&runtime);
413 else
414 ok = objc_gnu_runtime_abi_01_init (&runtime);
416 /* If that part of the setup failed - bail out immediately. */
417 if (!ok)
418 return false;
420 /* Generate general types and push runtime-specific decls to file scope. */
421 synth_module_prologue ();
423 return true;
426 /* This is called automatically (at the very end of compilation) by
427 c_write_global_declarations and cp_write_global_declarations. */
428 void
429 objc_write_global_declarations (void)
431 mark_referenced_methods ();
433 /* A missing @end might not be detected by the parser. */
434 if (objc_implementation_context)
436 warning (0, "%<@end%> missing in implementation context");
437 finish_class (objc_implementation_context);
438 objc_ivar_chain = NULL_TREE;
439 objc_implementation_context = NULL_TREE;
442 if (warn_selector)
444 int slot;
445 hash hsh;
447 /* Run through the selector hash tables and print a warning for any
448 selector which has multiple methods. */
450 for (slot = 0; slot < SIZEHASHTABLE; slot++)
452 for (hsh = cls_method_hash_list[slot]; hsh; hsh = hsh->next)
453 check_duplicates (hsh, 0, 1);
454 for (hsh = nst_method_hash_list[slot]; hsh; hsh = hsh->next)
455 check_duplicates (hsh, 0, 0);
459 /* TODO: consider an early exit here if either errorcount or sorrycount
460 is non-zero. Not only is it wasting time to generate the metadata,
461 it needlessly imposes need to re-check for things that are already
462 determined to be errors. */
464 /* Finalize Objective-C runtime data. No need to generate tables
465 and code if only checking syntax, or if generating a PCH file. */
466 if (!flag_syntax_only && !pch_file)
468 location_t saved_location;
470 /* If gen_declaration desired, open the output file. */
471 if (flag_gen_declaration)
473 char * const dumpname = concat (dump_base_name, ".decl", NULL);
474 gen_declaration_file = fopen (dumpname, "w");
475 if (gen_declaration_file == 0)
476 fatal_error ("can%'t open %s: %m", dumpname);
477 free (dumpname);
480 /* Set the input location to BUILTINS_LOCATION. This is good
481 for error messages, in case any is generated while producing
482 the metadata, but it also silences warnings that would be
483 produced when compiling with -Wpadded in case when padding is
484 automatically added to the built-in runtime data structure
485 declarations. We know about this padding, and it is fine; we
486 don't want users to see any warnings about it if they use
487 -Wpadded. */
488 saved_location = input_location;
489 input_location = BUILTINS_LOCATION;
491 /* Compute and emit the meta-data tables for this runtime. */
492 (*runtime.generate_metadata) ();
494 /* Restore the original location, just in case it mattered. */
495 input_location = saved_location;
497 /* ... and then close any declaration file we opened. */
498 if (gen_declaration_file)
499 fclose (gen_declaration_file);
503 /* Return the first occurrence of a method declaration corresponding
504 to sel_name in rproto_list. Search rproto_list recursively.
505 If is_class is 0, search for instance methods, otherwise for class
506 methods. */
507 static tree
508 lookup_method_in_protocol_list (tree rproto_list, tree sel_name,
509 int is_class)
511 tree rproto, p, m;
513 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
515 p = TREE_VALUE (rproto);
516 m = NULL_TREE;
518 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
520 /* First, search the @required protocol methods. */
521 if (is_class)
522 m = lookup_method (PROTOCOL_CLS_METHODS (p), sel_name);
523 else
524 m = lookup_method (PROTOCOL_NST_METHODS (p), sel_name);
526 if (m)
527 return m;
529 /* If still not found, search the @optional protocol methods. */
530 if (is_class)
531 m = lookup_method (PROTOCOL_OPTIONAL_CLS_METHODS (p), sel_name);
532 else
533 m = lookup_method (PROTOCOL_OPTIONAL_NST_METHODS (p), sel_name);
535 if (m)
536 return m;
538 /* If still not found, search the attached protocols. */
539 if (PROTOCOL_LIST (p))
540 m = lookup_method_in_protocol_list (PROTOCOL_LIST (p),
541 sel_name, is_class);
542 if (m)
543 return m;
545 else
547 ; /* An identifier...if we could not find a protocol. */
551 return 0;
554 static tree
555 lookup_protocol_in_reflist (tree rproto_list, tree lproto)
557 tree rproto, p;
559 /* Make sure the protocol is supported by the object on the rhs. */
560 if (TREE_CODE (lproto) == PROTOCOL_INTERFACE_TYPE)
562 tree fnd = 0;
563 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
565 p = TREE_VALUE (rproto);
567 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
569 if (lproto == p)
570 fnd = lproto;
572 else if (PROTOCOL_LIST (p))
573 fnd = lookup_protocol_in_reflist (PROTOCOL_LIST (p), lproto);
576 if (fnd)
577 return fnd;
580 else
582 ; /* An identifier...if we could not find a protocol. */
585 return 0;
588 void
589 objc_start_class_interface (tree klass, tree super_class,
590 tree protos, tree attributes)
592 if (flag_objc1_only && attributes)
593 error_at (input_location, "class attributes are not available in Objective-C 1.0");
595 objc_interface_context
596 = objc_ivar_context
597 = start_class (CLASS_INTERFACE_TYPE, klass, super_class, protos, attributes);
598 objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
601 void
602 objc_start_category_interface (tree klass, tree categ,
603 tree protos, tree attributes)
605 if (attributes)
607 if (flag_objc1_only)
608 error_at (input_location, "category attributes are not available in Objective-C 1.0");
609 else
610 warning_at (input_location, OPT_Wattributes,
611 "category attributes are not available in this version"
612 " of the compiler, (ignored)");
614 if (categ == NULL_TREE)
616 if (flag_objc1_only)
617 error_at (input_location, "class extensions are not available in Objective-C 1.0");
618 else
620 /* Iterate over all the classes and categories implemented
621 up to now in this compilation unit. */
622 struct imp_entry *t;
624 for (t = imp_list; t; t = t->next)
626 /* If we find a class @implementation with the same name
627 as the one we are extending, produce an error. */
628 if (TREE_CODE (t->imp_context) == CLASS_IMPLEMENTATION_TYPE
629 && IDENTIFIER_POINTER (CLASS_NAME (t->imp_context)) == IDENTIFIER_POINTER (klass))
630 error_at (input_location,
631 "class extension for class %qE declared after its %<@implementation%>",
632 klass);
636 objc_interface_context
637 = start_class (CATEGORY_INTERFACE_TYPE, klass, categ, protos, NULL_TREE);
638 objc_ivar_chain
639 = continue_class (objc_interface_context);
642 void
643 objc_start_protocol (tree name, tree protos, tree attributes)
645 if (flag_objc1_only && attributes)
646 error_at (input_location, "protocol attributes are not available in Objective-C 1.0");
648 objc_interface_context
649 = start_protocol (PROTOCOL_INTERFACE_TYPE, name, protos, attributes);
650 objc_method_optional_flag = false;
653 void
654 objc_continue_interface (void)
656 objc_ivar_chain
657 = continue_class (objc_interface_context);
660 void
661 objc_finish_interface (void)
663 finish_class (objc_interface_context);
664 objc_interface_context = NULL_TREE;
665 objc_method_optional_flag = false;
666 objc_in_class_extension = false;
669 void
670 objc_start_class_implementation (tree klass, tree super_class)
672 objc_implementation_context
673 = objc_ivar_context
674 = start_class (CLASS_IMPLEMENTATION_TYPE, klass, super_class, NULL_TREE,
675 NULL_TREE);
676 objc_ivar_visibility = OBJC_IVAR_VIS_PROTECTED;
679 void
680 objc_start_category_implementation (tree klass, tree categ)
682 objc_implementation_context
683 = start_class (CATEGORY_IMPLEMENTATION_TYPE, klass, categ, NULL_TREE,
684 NULL_TREE);
685 objc_ivar_chain
686 = continue_class (objc_implementation_context);
689 void
690 objc_continue_implementation (void)
692 objc_ivar_chain
693 = continue_class (objc_implementation_context);
696 void
697 objc_finish_implementation (void)
699 #ifdef OBJCPLUS
700 if (flag_objc_call_cxx_cdtors)
701 objc_generate_cxx_cdtors ();
702 #endif
704 if (objc_implementation_context)
706 finish_class (objc_implementation_context);
707 objc_ivar_chain = NULL_TREE;
708 objc_implementation_context = NULL_TREE;
710 else
711 warning (0, "%<@end%> must appear in an @implementation context");
714 void
715 objc_set_visibility (objc_ivar_visibility_kind visibility)
717 if (visibility == OBJC_IVAR_VIS_PACKAGE)
719 if (flag_objc1_only)
720 error ("%<@package%> is not available in Objective-C 1.0");
721 else
722 warning (0, "%<@package%> presently has the same effect as %<@public%>");
724 objc_ivar_visibility = visibility;
727 void
728 objc_set_method_opt (bool optional)
730 if (flag_objc1_only)
732 if (optional)
733 error_at (input_location, "%<@optional%> is not available in Objective-C 1.0");
734 else
735 error_at (input_location, "%<@required%> is not available in Objective-C 1.0");
738 objc_method_optional_flag = optional;
739 if (!objc_interface_context
740 || TREE_CODE (objc_interface_context) != PROTOCOL_INTERFACE_TYPE)
742 if (optional)
743 error ("%<@optional%> is allowed in @protocol context only");
744 else
745 error ("%<@required%> is allowed in @protocol context only");
746 objc_method_optional_flag = false;
750 /* This routine looks for a given PROPERTY in a list of CLASS, CATEGORY, or
751 PROTOCOL. */
752 static tree
753 lookup_property_in_list (tree chain, tree property)
755 tree x;
756 for (x = CLASS_PROPERTY_DECL (chain); x; x = TREE_CHAIN (x))
757 if (PROPERTY_NAME (x) == property)
758 return x;
759 return NULL_TREE;
762 /* This routine looks for a given PROPERTY in the tree chain of RPROTO_LIST. */
763 static tree lookup_property_in_protocol_list (tree rproto_list, tree property)
765 tree rproto, x;
766 for (rproto = rproto_list; rproto; rproto = TREE_CHAIN (rproto))
768 tree p = TREE_VALUE (rproto);
769 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
771 if ((x = lookup_property_in_list (p, property)))
772 return x;
773 if (PROTOCOL_LIST (p))
774 return lookup_property_in_protocol_list (PROTOCOL_LIST (p), property);
776 else
778 ; /* An identifier...if we could not find a protocol. */
781 return NULL_TREE;
784 /* This routine looks up the PROPERTY in current INTERFACE, its categories and up the
785 chain of interface hierarchy. */
786 static tree
787 lookup_property (tree interface_type, tree property)
789 tree inter = interface_type;
790 while (inter)
792 tree x, category;
793 if ((x = lookup_property_in_list (inter, property)))
794 return x;
795 /* Failing that, look for the property in each category of the class. */
796 category = inter;
797 while ((category = CLASS_CATEGORY_LIST (category)))
799 if ((x = lookup_property_in_list (category, property)))
800 return x;
802 /* When checking a category, also check the protocols
803 attached with the category itself. */
804 if (CLASS_PROTOCOL_LIST (category)
805 && (x = lookup_property_in_protocol_list
806 (CLASS_PROTOCOL_LIST (category), property)))
807 return x;
810 /* Failing to find in categories, look for property in protocol list. */
811 if (CLASS_PROTOCOL_LIST (inter)
812 && (x = lookup_property_in_protocol_list
813 (CLASS_PROTOCOL_LIST (inter), property)))
814 return x;
816 /* Failing that, climb up the inheritance hierarchy. */
817 inter = lookup_interface (CLASS_SUPER_NAME (inter));
819 return inter;
822 /* This routine is called by the parser when a
823 @property... declaration is found. 'decl' is the declaration of
824 the property (type/identifier), and the other arguments represent
825 property attributes that may have been specified in the Objective-C
826 declaration. 'parsed_property_readonly' is 'true' if the attribute
827 'readonly' was specified, and 'false' if not; similarly for the
828 other bool parameters. 'parsed_property_getter_ident' is NULL_TREE
829 if the attribute 'getter' was not specified, and is the identifier
830 corresponding to the specified getter if it was; similarly for
831 'parsed_property_setter_ident'. */
832 void
833 objc_add_property_declaration (location_t location, tree decl,
834 bool parsed_property_readonly, bool parsed_property_readwrite,
835 bool parsed_property_assign, bool parsed_property_retain,
836 bool parsed_property_copy, bool parsed_property_nonatomic,
837 tree parsed_property_getter_ident, tree parsed_property_setter_ident)
839 tree property_decl;
840 tree x;
841 /* 'property_readonly' and 'property_assign_semantics' are the final
842 attributes of the property after all parsed attributes have been
843 considered (eg, if we parsed no 'readonly' and no 'readwrite', ie
844 parsed_property_readonly = false and parsed_property_readwrite =
845 false, then property_readonly will be false because the default
846 is readwrite). */
847 bool property_readonly = false;
848 objc_property_assign_semantics property_assign_semantics = OBJC_PROPERTY_ASSIGN;
849 bool property_extension_in_class_extension = false;
851 if (flag_objc1_only)
852 error_at (input_location, "%<@property%> is not available in Objective-C 1.0");
854 if (parsed_property_readonly && parsed_property_readwrite)
856 error_at (location, "%<readonly%> attribute conflicts with %<readwrite%> attribute");
857 /* In case of conflicting attributes (here and below), after
858 producing an error, we pick one of the attributes and keep
859 going. */
860 property_readonly = false;
862 else
864 if (parsed_property_readonly)
865 property_readonly = true;
867 if (parsed_property_readwrite)
868 property_readonly = false;
871 if (parsed_property_readonly && parsed_property_setter_ident)
873 error_at (location, "%<readonly%> attribute conflicts with %<setter%> attribute");
874 property_readonly = false;
877 if (parsed_property_assign && parsed_property_retain)
879 error_at (location, "%<assign%> attribute conflicts with %<retain%> attribute");
880 property_assign_semantics = OBJC_PROPERTY_RETAIN;
882 else if (parsed_property_assign && parsed_property_copy)
884 error_at (location, "%<assign%> attribute conflicts with %<copy%> attribute");
885 property_assign_semantics = OBJC_PROPERTY_COPY;
887 else if (parsed_property_retain && parsed_property_copy)
889 error_at (location, "%<retain%> attribute conflicts with %<copy%> attribute");
890 property_assign_semantics = OBJC_PROPERTY_COPY;
892 else
894 if (parsed_property_assign)
895 property_assign_semantics = OBJC_PROPERTY_ASSIGN;
897 if (parsed_property_retain)
898 property_assign_semantics = OBJC_PROPERTY_RETAIN;
900 if (parsed_property_copy)
901 property_assign_semantics = OBJC_PROPERTY_COPY;
904 if (!objc_interface_context)
906 error_at (location, "property declaration not in @interface or @protocol context");
907 return;
910 /* At this point we know that we are either in an interface, a
911 category, or a protocol. */
913 /* We expect a FIELD_DECL from the parser. Make sure we didn't get
914 something else, as that would confuse the checks below. */
915 if (TREE_CODE (decl) != FIELD_DECL)
917 error_at (location, "invalid property declaration");
918 return;
921 /* Do some spot-checks for the most obvious invalid types. */
923 if (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE)
925 error_at (location, "property can not be an array");
926 return;
929 /* The C++/ObjC++ parser seems to reject the ':' for a bitfield when
930 parsing, while the C/ObjC parser accepts it and gives us a
931 FIELD_DECL with a DECL_INITIAL set. So we use the DECL_INITIAL
932 to check for a bitfield when doing ObjC. */
933 #ifndef OBJCPLUS
934 if (DECL_INITIAL (decl))
936 /* A @property is not an actual variable, but it is a way to
937 describe a pair of accessor methods, so its type (which is
938 the type of the return value of the getter and the first
939 argument of the setter) can't be a bitfield (as return values
940 and arguments of functions can not be bitfields). The
941 underlying instance variable could be a bitfield, but that is
942 a different matter. */
943 error_at (location, "property can not be a bit-field");
944 return;
946 #endif
948 /* TODO: Check that the property type is an Objective-C object or a
949 "POD". */
951 /* Implement -Wproperty-assign-default (which is enabled by default). */
952 if (warn_property_assign_default
953 /* If garbage collection is not being used, then 'assign' is
954 valid for objects (and typically used for delegates) but it
955 is wrong in most cases (since most objects need to be
956 retained or copied in setters). Warn users when 'assign' is
957 used implicitly. */
958 && property_assign_semantics == OBJC_PROPERTY_ASSIGN
959 /* Read-only properties are never assigned, so the assignment
960 semantics do not matter in that case. */
961 && !property_readonly
962 && !flag_objc_gc)
964 /* Please note that it would make sense to default to 'assign'
965 for non-{Objective-C objects}, and to 'retain' for
966 Objective-C objects. But that would break compatibility with
967 other compilers. */
968 if (!parsed_property_assign && !parsed_property_retain && !parsed_property_copy)
970 /* Use 'false' so we do not warn for Class objects. */
971 if (objc_type_valid_for_messaging (TREE_TYPE (decl), false))
973 warning_at (location,
975 "object property %qD has no %<assign%>, %<retain%> or %<copy%> attribute; assuming %<assign%>",
976 decl);
977 inform (location,
978 "%<assign%> can be unsafe for Objective-C objects; please state explicitly if you need it");
983 if (property_assign_semantics == OBJC_PROPERTY_RETAIN
984 && !objc_type_valid_for_messaging (TREE_TYPE (decl), true))
985 error_at (location, "%<retain%> attribute is only valid for Objective-C objects");
987 if (property_assign_semantics == OBJC_PROPERTY_COPY
988 && !objc_type_valid_for_messaging (TREE_TYPE (decl), true))
989 error_at (location, "%<copy%> attribute is only valid for Objective-C objects");
991 /* Now determine the final property getter and setter names. They
992 will be stored in the PROPERTY_DECL, from which they'll always be
993 extracted and used. */
995 /* Adjust, or fill in, setter and getter names. We overwrite the
996 parsed_property_setter_ident and parsed_property_getter_ident
997 with the final setter and getter identifiers that will be
998 used. */
999 if (parsed_property_setter_ident)
1001 /* The setter should be terminated by ':', but the parser only
1002 gives us an identifier without ':'. So, we need to add ':'
1003 at the end. */
1004 const char *parsed_setter = IDENTIFIER_POINTER (parsed_property_setter_ident);
1005 size_t length = strlen (parsed_setter);
1006 char *final_setter = (char *)alloca (length + 2);
1008 sprintf (final_setter, "%s:", parsed_setter);
1009 parsed_property_setter_ident = get_identifier (final_setter);
1011 else
1013 if (!property_readonly)
1014 parsed_property_setter_ident = get_identifier (objc_build_property_setter_name
1015 (DECL_NAME (decl)));
1018 if (!parsed_property_getter_ident)
1019 parsed_property_getter_ident = DECL_NAME (decl);
1021 /* Check for duplicate property declarations. We first check the
1022 immediate context for a property with the same name. Any such
1023 declarations are an error, unless this is a class extension and
1024 we are extending a property from readonly to readwrite. */
1025 for (x = CLASS_PROPERTY_DECL (objc_interface_context); x; x = TREE_CHAIN (x))
1027 if (PROPERTY_NAME (x) == DECL_NAME (decl))
1029 if (objc_in_class_extension
1030 && property_readonly == 0
1031 && PROPERTY_READONLY (x) == 1)
1033 /* This is a class extension, and we are extending an
1034 existing readonly property to a readwrite one.
1035 That's fine. :-) */
1036 property_extension_in_class_extension = true;
1037 break;
1039 else
1041 location_t original_location = DECL_SOURCE_LOCATION (x);
1043 error_at (location, "redeclaration of property %qD", decl);
1045 if (original_location != UNKNOWN_LOCATION)
1046 inform (original_location, "originally specified here");
1047 return;
1052 /* If x is not NULL_TREE, we must be in a class extension and we're
1053 extending a readonly property. In that case, no point in
1054 searching for another declaration. */
1055 if (x == NULL_TREE)
1057 /* We now need to check for existing property declarations (in
1058 the superclass, other categories or protocols) and check that
1059 the new declaration is not in conflict with existing
1060 ones. */
1062 /* Search for a previous, existing declaration of a property
1063 with the same name in superclasses, protocols etc. If one is
1064 found, it will be in the 'x' variable. */
1066 /* Note that, for simplicity, the following may search again the
1067 local context. That's Ok as nothing will be found (else we'd
1068 have thrown an error above); it's only a little inefficient,
1069 but the code is simpler. */
1070 switch (TREE_CODE (objc_interface_context))
1072 case CLASS_INTERFACE_TYPE:
1073 /* Look up the property in the current @interface (which
1074 will find nothing), then its protocols and categories and
1075 superclasses. */
1076 x = lookup_property (objc_interface_context, DECL_NAME (decl));
1077 break;
1078 case CATEGORY_INTERFACE_TYPE:
1079 /* Look up the property in the main @interface, then
1080 protocols and categories (one of them is ours, and will
1081 find nothing) and superclasses. */
1082 x = lookup_property (lookup_interface (CLASS_NAME (objc_interface_context)),
1083 DECL_NAME (decl));
1084 break;
1085 case PROTOCOL_INTERFACE_TYPE:
1086 /* Looks up the property in any protocols attached to the
1087 current protocol. */
1088 if (PROTOCOL_LIST (objc_interface_context))
1090 x = lookup_property_in_protocol_list (PROTOCOL_LIST (objc_interface_context),
1091 DECL_NAME (decl));
1093 break;
1094 default:
1095 gcc_unreachable ();
1099 if (x != NULL_TREE)
1101 /* An existing property was found; check that it has the same
1102 types, or it is compatible. */
1103 location_t original_location = DECL_SOURCE_LOCATION (x);
1105 if (PROPERTY_NONATOMIC (x) != parsed_property_nonatomic)
1107 warning_at (location, 0,
1108 "'nonatomic' attribute of property %qD conflicts with previous declaration", decl);
1110 if (original_location != UNKNOWN_LOCATION)
1111 inform (original_location, "originally specified here");
1112 return;
1115 if (PROPERTY_GETTER_NAME (x) != parsed_property_getter_ident)
1117 warning_at (location, 0,
1118 "'getter' attribute of property %qD conflicts with previous declaration", decl);
1120 if (original_location != UNKNOWN_LOCATION)
1121 inform (original_location, "originally specified here");
1122 return;
1125 /* We can only compare the setter names if both the old and new property have a setter. */
1126 if (!property_readonly && !PROPERTY_READONLY(x))
1128 if (PROPERTY_SETTER_NAME (x) != parsed_property_setter_ident)
1130 warning_at (location, 0,
1131 "'setter' attribute of property %qD conflicts with previous declaration", decl);
1133 if (original_location != UNKNOWN_LOCATION)
1134 inform (original_location, "originally specified here");
1135 return;
1139 if (PROPERTY_ASSIGN_SEMANTICS (x) != property_assign_semantics)
1141 warning_at (location, 0,
1142 "assign semantics attributes of property %qD conflict with previous declaration", decl);
1144 if (original_location != UNKNOWN_LOCATION)
1145 inform (original_location, "originally specified here");
1146 return;
1149 /* It's ok to have a readonly property that becomes a readwrite, but not vice versa. */
1150 if (PROPERTY_READONLY (x) == 0 && property_readonly == 1)
1152 warning_at (location, 0,
1153 "'readonly' attribute of property %qD conflicts with previous declaration", decl);
1155 if (original_location != UNKNOWN_LOCATION)
1156 inform (original_location, "originally specified here");
1157 return;
1160 /* We now check that the new and old property declarations have
1161 the same types (or compatible one). In the Objective-C
1162 tradition of loose type checking, we do type-checking but
1163 only generate warnings (not errors) if they do not match.
1164 For non-readonly properties, the types must match exactly;
1165 for readonly properties, it is allowed to use a "more
1166 specialized" type in the new property declaration. Eg, the
1167 superclass has a getter returning (NSArray *) and the
1168 subclass a getter returning (NSMutableArray *). The object's
1169 getter returns an (NSMutableArray *); but if you cast the
1170 object to the superclass, which is allowed, you'd still
1171 expect the getter to return an (NSArray *), which works since
1172 an (NSMutableArray *) is an (NSArray *) too. So, the set of
1173 objects belonging to the type of the new @property should be
1174 a subset of the set of objects belonging to the type of the
1175 old @property. This is what "specialization" means. And the
1176 reason it only applies to readonly properties is that for a
1177 readwrite property the setter would have the opposite
1178 requirement - ie that the superclass type is more specialized
1179 then the subclass one; hence the only way to satisfy both
1180 constraints is that the types match. */
1182 /* If the types are not the same in the C sense, we warn ... */
1183 if (!comptypes (TREE_TYPE (x), TREE_TYPE (decl))
1184 /* ... unless the property is readonly, in which case we
1185 allow a new, more specialized, declaration. */
1186 && (!property_readonly
1187 || !objc_compare_types (TREE_TYPE (x),
1188 TREE_TYPE (decl), -5, NULL_TREE)))
1190 warning_at (location, 0,
1191 "type of property %qD conflicts with previous declaration", decl);
1192 if (original_location != UNKNOWN_LOCATION)
1193 inform (original_location, "originally specified here");
1194 return;
1197 /* If we are in a class extension and we're extending a readonly
1198 property in the main @interface, we'll just update the
1199 existing property with the readwrite flag and potentially the
1200 new setter name. */
1201 if (property_extension_in_class_extension)
1203 PROPERTY_READONLY (x) = 0;
1204 PROPERTY_SETTER_NAME (x) = parsed_property_setter_ident;
1205 return;
1209 /* Create a PROPERTY_DECL node. */
1210 property_decl = make_node (PROPERTY_DECL);
1212 /* Copy the basic information from the original decl. */
1213 TREE_TYPE (property_decl) = TREE_TYPE (decl);
1214 DECL_SOURCE_LOCATION (property_decl) = DECL_SOURCE_LOCATION (decl);
1215 TREE_DEPRECATED (property_decl) = TREE_DEPRECATED (decl);
1217 /* Add property-specific information. */
1218 PROPERTY_NAME (property_decl) = DECL_NAME (decl);
1219 PROPERTY_GETTER_NAME (property_decl) = parsed_property_getter_ident;
1220 PROPERTY_SETTER_NAME (property_decl) = parsed_property_setter_ident;
1221 PROPERTY_READONLY (property_decl) = property_readonly;
1222 PROPERTY_NONATOMIC (property_decl) = parsed_property_nonatomic;
1223 PROPERTY_ASSIGN_SEMANTICS (property_decl) = property_assign_semantics;
1224 PROPERTY_IVAR_NAME (property_decl) = NULL_TREE;
1225 PROPERTY_DYNAMIC (property_decl) = 0;
1227 /* Remember the fact that the property was found in the @optional
1228 section in a @protocol, or not. */
1229 if (objc_method_optional_flag)
1230 PROPERTY_OPTIONAL (property_decl) = 1;
1231 else
1232 PROPERTY_OPTIONAL (property_decl) = 0;
1234 /* Note that PROPERTY_GETTER_NAME is always set for all
1235 PROPERTY_DECLs, and PROPERTY_SETTER_NAME is always set for all
1236 PROPERTY_DECLs where PROPERTY_READONLY == 0. Any time we deal
1237 with a getter or setter, we should get the PROPERTY_DECL and use
1238 PROPERTY_GETTER_NAME and PROPERTY_SETTER_NAME to know the correct
1239 names. */
1241 /* Add the PROPERTY_DECL to the list of properties for the class. */
1242 TREE_CHAIN (property_decl) = CLASS_PROPERTY_DECL (objc_interface_context);
1243 CLASS_PROPERTY_DECL (objc_interface_context) = property_decl;
1246 /* This is a subroutine of objc_maybe_build_component_ref. Search the
1247 list of methods in the interface (and, failing that, the local list
1248 in the implementation, and failing that, the protocol list)
1249 provided for a 'setter' or 'getter' for 'component' with default
1250 names (ie, if 'component' is "name", then search for "name" and
1251 "setName:"). It is also possible to specify a different
1252 'getter_name' (this is used for @optional readonly properties). If
1253 any is found, then create an artificial property that uses them.
1254 Return NULL_TREE if 'getter' or 'setter' could not be found. */
1255 static tree
1256 maybe_make_artificial_property_decl (tree interface, tree implementation,
1257 tree protocol_list, tree component, bool is_class,
1258 tree getter_name)
1260 tree setter_name = get_identifier (objc_build_property_setter_name (component));
1261 tree getter = NULL_TREE;
1262 tree setter = NULL_TREE;
1264 if (getter_name == NULL_TREE)
1265 getter_name = component;
1267 /* First, check the @interface and all superclasses. */
1268 if (interface)
1270 int flags = 0;
1272 /* Using instance methods of the root class as accessors is most
1273 likely unwanted and can be extremely confusing (and, most
1274 importantly, other Objective-C 2.0 compilers do not do it).
1275 Turn it off. */
1276 if (is_class)
1277 flags = OBJC_LOOKUP_CLASS | OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS;
1279 getter = lookup_method_static (interface, getter_name, flags);
1280 setter = lookup_method_static (interface, setter_name, flags);
1283 /* Second, check the local @implementation context. */
1284 if (!getter && !setter)
1286 if (implementation)
1288 if (is_class)
1290 getter = lookup_method (CLASS_CLS_METHODS (implementation), getter_name);
1291 setter = lookup_method (CLASS_CLS_METHODS (implementation), setter_name);
1293 else
1295 getter = lookup_method (CLASS_NST_METHODS (implementation), getter_name);
1296 setter = lookup_method (CLASS_NST_METHODS (implementation), setter_name);
1301 /* Try the protocol_list if we didn't find anything in the
1302 @interface and in the @implementation. */
1303 if (!getter && !setter)
1305 getter = lookup_method_in_protocol_list (protocol_list, getter_name, is_class);
1306 setter = lookup_method_in_protocol_list (protocol_list, setter_name, is_class);
1309 /* There needs to be at least a getter or setter for this to be a
1310 valid 'object.component' syntax. */
1311 if (getter || setter)
1313 /* Yes ... determine the type of the expression. */
1314 tree property_decl;
1315 tree type;
1317 if (getter)
1318 type = TREE_VALUE (TREE_TYPE (getter));
1319 else
1320 type = TREE_VALUE (TREE_TYPE (METHOD_SEL_ARGS (setter)));
1322 /* Create an artificial property declaration with the
1323 information we collected on the type and getter/setter
1324 names. */
1325 property_decl = make_node (PROPERTY_DECL);
1327 TREE_TYPE (property_decl) = type;
1328 DECL_SOURCE_LOCATION (property_decl) = input_location;
1329 TREE_DEPRECATED (property_decl) = 0;
1330 DECL_ARTIFICIAL (property_decl) = 1;
1332 /* Add property-specific information. Note that one of
1333 PROPERTY_GETTER_NAME or PROPERTY_SETTER_NAME may refer to a
1334 non-existing method; this will generate an error when the
1335 expression is later compiled. At this stage we don't know if
1336 the getter or setter will be used, so we can't generate an
1337 error. */
1338 PROPERTY_NAME (property_decl) = component;
1339 PROPERTY_GETTER_NAME (property_decl) = getter_name;
1340 PROPERTY_SETTER_NAME (property_decl) = setter_name;
1341 PROPERTY_READONLY (property_decl) = 0;
1342 PROPERTY_NONATOMIC (property_decl) = 0;
1343 PROPERTY_ASSIGN_SEMANTICS (property_decl) = 0;
1344 PROPERTY_IVAR_NAME (property_decl) = NULL_TREE;
1345 PROPERTY_DYNAMIC (property_decl) = 0;
1346 PROPERTY_OPTIONAL (property_decl) = 0;
1348 if (!getter)
1349 PROPERTY_HAS_NO_GETTER (property_decl) = 1;
1351 /* The following is currently unused, but it's nice to have
1352 there. We may use it if we need in the future. */
1353 if (!setter)
1354 PROPERTY_HAS_NO_SETTER (property_decl) = 1;
1356 return property_decl;
1359 return NULL_TREE;
1362 /* This hook routine is invoked by the parser when an expression such
1363 as 'xxx.yyy' is parsed. We get a chance to process these
1364 expressions in a way that is specified to Objective-C (to implement
1365 the Objective-C 2.0 dot-syntax, properties, or non-fragile ivars).
1366 If the expression is not an Objective-C specified expression, we
1367 should return NULL_TREE; else we return the expression.
1369 At the moment this only implements dot-syntax and properties (not
1370 non-fragile ivars yet), ie 'object.property' or 'object.component'
1371 where 'component' is not a declared property, but a valid getter or
1372 setter for it could be found. */
1373 tree
1374 objc_maybe_build_component_ref (tree object, tree property_ident)
1376 tree x = NULL_TREE;
1377 tree rtype;
1379 /* If we are in Objective-C 1.0 mode, dot-syntax and properties are
1380 not available. */
1381 if (flag_objc1_only)
1382 return NULL_TREE;
1384 /* Try to determine if 'object' is an Objective-C object or not. If
1385 not, return. */
1386 if (object == NULL_TREE || object == error_mark_node
1387 || (rtype = TREE_TYPE (object)) == NULL_TREE)
1388 return NULL_TREE;
1390 if (property_ident == NULL_TREE || property_ident == error_mark_node
1391 || TREE_CODE (property_ident) != IDENTIFIER_NODE)
1392 return NULL_TREE;
1394 /* The following analysis of 'object' is similar to the one used for
1395 the 'receiver' of a method invocation. We need to determine what
1396 'object' is and find the appropriate property (either declared,
1397 or artificial) for it (in the same way as we need to find the
1398 appropriate method prototype for a method invocation). There are
1399 some simplifications here though: "object.property" is invalid if
1400 "object" has a type of "id" or "Class"; it must at least have a
1401 protocol attached to it, and "object" is never a class name as
1402 that is done by objc_build_class_component_ref. Finally, we
1403 don't know if this really is a dot-syntax expression, so we want
1404 to make a quick exit if it is not; for this reason, we try to
1405 postpone checks after determining that 'object' looks like an
1406 Objective-C object. */
1408 if (objc_is_id (rtype))
1410 /* This is the case that the 'object' is of type 'id' or
1411 'Class'. */
1413 /* Check if at least it is of type 'id <Protocol>' or 'Class
1414 <Protocol>'; if so, look the property up in the
1415 protocols. */
1416 if (TYPE_HAS_OBJC_INFO (TREE_TYPE (rtype)))
1418 tree rprotos = TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rtype));
1420 if (rprotos)
1422 /* No point looking up declared @properties if we are
1423 dealing with a class. Classes have no declared
1424 properties. */
1425 if (!IS_CLASS (rtype))
1426 x = lookup_property_in_protocol_list (rprotos, property_ident);
1428 if (x == NULL_TREE)
1430 /* Ok, no property. Maybe it was an
1431 object.component dot-syntax without a declared
1432 property (this is valid for classes too). Look
1433 for getter/setter methods and internally declare
1434 an artifical property based on them if found. */
1435 x = maybe_make_artificial_property_decl (NULL_TREE,
1436 NULL_TREE,
1437 rprotos,
1438 property_ident,
1439 IS_CLASS (rtype),
1440 NULL_TREE);
1442 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1444 /* This is a special, complicated case. If the
1445 property is optional, and is read-only, then the
1446 property is always used for reading, but an
1447 eventual existing non-property setter can be used
1448 for writing. We create an artificial property
1449 decl copying the getter from the optional
1450 property, and looking up the setter in the
1451 interface. */
1452 x = maybe_make_artificial_property_decl (NULL_TREE,
1453 NULL_TREE,
1454 rprotos,
1455 property_ident,
1456 false,
1457 PROPERTY_GETTER_NAME (x));
1461 else if (objc_method_context)
1463 /* Else, if we are inside a method it could be the case of
1464 'super' or 'self'. */
1465 tree interface_type = NULL_TREE;
1466 tree t = object;
1467 while (TREE_CODE (t) == COMPOUND_EXPR
1468 || TREE_CODE (t) == MODIFY_EXPR
1469 || CONVERT_EXPR_P (t)
1470 || TREE_CODE (t) == COMPONENT_REF)
1471 t = TREE_OPERAND (t, 0);
1473 if (t == UOBJC_SUPER_decl)
1474 interface_type = lookup_interface (CLASS_SUPER_NAME (implementation_template));
1475 else if (t == self_decl)
1476 interface_type = lookup_interface (CLASS_NAME (implementation_template));
1478 if (interface_type)
1480 if (TREE_CODE (objc_method_context) != CLASS_METHOD_DECL)
1481 x = lookup_property (interface_type, property_ident);
1483 if (x == NULL_TREE)
1485 /* Try the dot-syntax without a declared property.
1486 If this is an access to 'self', it is possible
1487 that they may refer to a setter/getter that is
1488 not declared in the interface, but exists locally
1489 in the implementation. In that case, get the
1490 implementation context and use it. */
1491 tree implementation = NULL_TREE;
1493 if (t == self_decl)
1494 implementation = objc_implementation_context;
1496 x = maybe_make_artificial_property_decl
1497 (interface_type, implementation, NULL_TREE,
1498 property_ident,
1499 (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL),
1500 NULL_TREE);
1502 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1504 tree implementation = NULL_TREE;
1506 if (t == self_decl)
1507 implementation = objc_implementation_context;
1509 x = maybe_make_artificial_property_decl (interface_type,
1510 implementation,
1511 NULL_TREE,
1512 property_ident,
1513 false,
1514 PROPERTY_GETTER_NAME (x));
1519 else
1521 /* This is the case where we have more information on 'rtype'. */
1522 tree basetype = TYPE_MAIN_VARIANT (rtype);
1524 /* Skip the pointer - if none, it's not an Objective-C object or
1525 class. */
1526 if (basetype != NULL_TREE && TREE_CODE (basetype) == POINTER_TYPE)
1527 basetype = TREE_TYPE (basetype);
1528 else
1529 return NULL_TREE;
1531 /* Traverse typedefs. */
1532 while (basetype != NULL_TREE
1533 && TREE_CODE (basetype) == RECORD_TYPE
1534 && OBJC_TYPE_NAME (basetype)
1535 && TREE_CODE (OBJC_TYPE_NAME (basetype)) == TYPE_DECL
1536 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (basetype)))
1537 basetype = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (basetype));
1539 if (basetype != NULL_TREE && TYPED_OBJECT (basetype))
1541 tree interface_type = TYPE_OBJC_INTERFACE (basetype);
1542 tree protocol_list = TYPE_OBJC_PROTOCOL_LIST (basetype);
1544 if (interface_type
1545 && (TREE_CODE (interface_type) == CLASS_INTERFACE_TYPE
1546 || TREE_CODE (interface_type) == CATEGORY_INTERFACE_TYPE
1547 || TREE_CODE (interface_type) == PROTOCOL_INTERFACE_TYPE))
1549 /* Not sure 'rtype' could ever be a class here! Just
1550 for safety we keep the checks. */
1551 if (!IS_CLASS (rtype))
1553 x = lookup_property (interface_type, property_ident);
1555 if (x == NULL_TREE)
1556 x = lookup_property_in_protocol_list (protocol_list,
1557 property_ident);
1560 if (x == NULL_TREE)
1562 /* Try the dot-syntax without a declared property.
1563 If we are inside a method implementation, it is
1564 possible that they may refer to a setter/getter
1565 that is not declared in the interface, but exists
1566 locally in the implementation. In that case, get
1567 the implementation context and use it. */
1568 tree implementation = NULL_TREE;
1570 if (objc_implementation_context
1571 && CLASS_NAME (objc_implementation_context)
1572 == OBJC_TYPE_NAME (interface_type))
1573 implementation = objc_implementation_context;
1575 x = maybe_make_artificial_property_decl (interface_type,
1576 implementation,
1577 protocol_list,
1578 property_ident,
1579 IS_CLASS (rtype),
1580 NULL_TREE);
1582 else if (PROPERTY_OPTIONAL (x) && PROPERTY_READONLY (x))
1584 tree implementation = NULL_TREE;
1586 if (objc_implementation_context
1587 && CLASS_NAME (objc_implementation_context)
1588 == OBJC_TYPE_NAME (interface_type))
1589 implementation = objc_implementation_context;
1591 x = maybe_make_artificial_property_decl (interface_type,
1592 implementation,
1593 protocol_list,
1594 property_ident,
1595 false,
1596 PROPERTY_GETTER_NAME (x));
1602 if (x)
1604 tree expression;
1605 tree getter_call;
1606 tree deprecated_method_prototype = NULL_TREE;
1608 /* We have an additional nasty problem here; if this
1609 PROPERTY_REF needs to become a 'getter', then the conversion
1610 from PROPERTY_REF into a getter call happens in gimplify,
1611 after the selector table has already been generated and when
1612 it is too late to add another selector to it. To work around
1613 the problem, we always create the getter call at this stage,
1614 which puts the selector in the table. Note that if the
1615 PROPERTY_REF becomes a 'setter' instead of a 'getter', then
1616 we have added a selector too many to the selector table.
1617 This is a little inefficient.
1619 Also note that method calls to 'self' and 'super' require the
1620 context (self_decl, UOBJS_SUPER_decl,
1621 objc_implementation_context etc) to be built correctly; this
1622 is yet another reason why building the call at the gimplify
1623 stage (when this context has been lost) is not very
1624 practical. If we build it at this stage, we know it will
1625 always be built correctly.
1627 If the PROPERTY_HAS_NO_GETTER() (ie, it is an artificial
1628 property decl created to deal with a dotsyntax not really
1629 referring to an existing property) then do not try to build a
1630 call to the getter as there is no getter. */
1631 if (PROPERTY_HAS_NO_GETTER (x))
1632 getter_call = NULL_TREE;
1633 else
1634 getter_call = objc_finish_message_expr
1635 (object, PROPERTY_GETTER_NAME (x), NULL_TREE,
1636 /* Disable the immediate deprecation warning if the getter
1637 is deprecated, but record the fact that the getter is
1638 deprecated by setting PROPERTY_REF_DEPRECATED_GETTER to
1639 the method prototype. */
1640 &deprecated_method_prototype);
1642 expression = build4 (PROPERTY_REF, TREE_TYPE(x), object, x, getter_call,
1643 deprecated_method_prototype);
1644 SET_EXPR_LOCATION (expression, input_location);
1645 TREE_SIDE_EFFECTS (expression) = 1;
1647 return expression;
1650 return NULL_TREE;
1653 /* This hook routine is invoked by the parser when an expression such
1654 as 'xxx.yyy' is parsed, and 'xxx' is a class name. This is the
1655 Objective-C 2.0 dot-syntax applied to classes, so we need to
1656 convert it into a setter/getter call on the class. */
1657 tree
1658 objc_build_class_component_ref (tree class_name, tree property_ident)
1660 tree x = NULL_TREE;
1661 tree object, rtype;
1663 if (flag_objc1_only)
1664 error_at (input_location, "the dot syntax is not available in Objective-C 1.0");
1666 if (class_name == NULL_TREE || class_name == error_mark_node
1667 || TREE_CODE (class_name) != IDENTIFIER_NODE)
1668 return error_mark_node;
1670 if (property_ident == NULL_TREE || property_ident == error_mark_node
1671 || TREE_CODE (property_ident) != IDENTIFIER_NODE)
1672 return NULL_TREE;
1674 object = objc_get_class_reference (class_name);
1675 if (!object)
1677 /* We know that 'class_name' is an Objective-C class name as the
1678 parser won't call this function if it is not. This is only a
1679 double-check for safety. */
1680 error_at (input_location, "could not find class %qE", class_name);
1681 return error_mark_node;
1684 rtype = lookup_interface (class_name);
1685 if (!rtype)
1687 /* Again, this should never happen, but we do check. */
1688 error_at (input_location, "could not find interface for class %qE", class_name);
1689 return error_mark_node;
1691 else
1693 if (TREE_DEPRECATED (rtype))
1694 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated", class_name);
1697 x = maybe_make_artificial_property_decl (rtype, NULL_TREE, NULL_TREE,
1698 property_ident,
1699 true, NULL_TREE);
1701 if (x)
1703 tree expression;
1704 tree getter_call;
1705 tree deprecated_method_prototype = NULL_TREE;
1707 if (PROPERTY_HAS_NO_GETTER (x))
1708 getter_call = NULL_TREE;
1709 else
1710 getter_call = objc_finish_message_expr
1711 (object, PROPERTY_GETTER_NAME (x), NULL_TREE,
1712 &deprecated_method_prototype);
1714 expression = build4 (PROPERTY_REF, TREE_TYPE(x), object, x, getter_call,
1715 deprecated_method_prototype);
1716 SET_EXPR_LOCATION (expression, input_location);
1717 TREE_SIDE_EFFECTS (expression) = 1;
1719 return expression;
1721 else
1723 error_at (input_location, "could not find setter/getter for %qE in class %qE",
1724 property_ident, class_name);
1725 return error_mark_node;
1728 return NULL_TREE;
1733 /* This is used because we don't want to expose PROPERTY_REF to the
1734 C/C++ frontends. Maybe we should! */
1735 bool
1736 objc_is_property_ref (tree node)
1738 if (node && TREE_CODE (node) == PROPERTY_REF)
1739 return true;
1740 else
1741 return false;
1744 /* This function builds a setter call for a PROPERTY_REF (real, for a
1745 declared property, or artificial, for a dot-syntax accessor which
1746 is not corresponding to a property). 'lhs' must be a PROPERTY_REF
1747 (the caller must check this beforehand). 'rhs' is the value to
1748 assign to the property. A plain setter call is returned, or
1749 error_mark_node if the property is readonly. */
1751 static tree
1752 objc_build_setter_call (tree lhs, tree rhs)
1754 tree object_expr = PROPERTY_REF_OBJECT (lhs);
1755 tree property_decl = PROPERTY_REF_PROPERTY_DECL (lhs);
1757 if (PROPERTY_READONLY (property_decl))
1759 error ("readonly property can not be set");
1760 return error_mark_node;
1762 else
1764 tree setter_argument = build_tree_list (NULL_TREE, rhs);
1765 tree setter;
1767 /* TODO: Check that the setter return type is 'void'. */
1769 /* TODO: Decay arguments in C. */
1770 setter = objc_finish_message_expr (object_expr,
1771 PROPERTY_SETTER_NAME (property_decl),
1772 setter_argument, NULL);
1773 return setter;
1776 /* Unreachable, but the compiler may not realize. */
1777 return error_mark_node;
1780 /* This hook routine is called when a MODIFY_EXPR is being built. We
1781 check what is being modified; if it is a PROPERTY_REF, we need to
1782 generate a 'setter' function call for the property. If this is not
1783 a PROPERTY_REF, we return NULL_TREE and the C/C++ frontend will go
1784 on creating their MODIFY_EXPR.
1786 This is used for example if you write
1788 object.count = 1;
1790 where 'count' is a property. The left-hand side creates a
1791 PROPERTY_REF, and then the compiler tries to generate a MODIFY_EXPR
1792 to assign something to it. We intercept that here, and generate a
1793 call to the 'setter' method instead. */
1794 tree
1795 objc_maybe_build_modify_expr (tree lhs, tree rhs)
1797 if (lhs && TREE_CODE (lhs) == PROPERTY_REF)
1799 /* Building a simple call to the setter method would work for cases such as
1801 object.count = 1;
1803 but wouldn't work for cases such as
1805 count = object2.count = 1;
1807 to get these to work with very little effort, we build a
1808 compound statement which does the setter call (to set the
1809 property to 'rhs'), but which can also be evaluated returning
1810 the 'rhs'. If the 'rhs' has no side effects, we can simply
1811 evaluate it twice, building
1813 ([object setProperty: rhs]; rhs)
1815 If it has side effects, we put it in a temporary variable first,
1816 so we create the following:
1818 (temp = rhs; [object setProperty: temp]; temp)
1820 setter_argument is rhs in the first case, and temp in the second
1821 case.
1823 tree setter_argument;
1825 /* s1, s2 and s3 are the tree statements that we need in the
1826 compound expression. */
1827 tree s1, s2, s3, compound_expr;
1829 if (TREE_SIDE_EFFECTS (rhs))
1831 tree bind;
1833 /* Declare __objc_property_temp in a local bind. */
1834 setter_argument = objc_create_temporary_var (TREE_TYPE (rhs), "__objc_property_temp");
1835 DECL_SOURCE_LOCATION (setter_argument) = input_location;
1836 bind = build3 (BIND_EXPR, void_type_node, setter_argument, NULL, NULL);
1837 SET_EXPR_LOCATION (bind, input_location);
1838 TREE_SIDE_EFFECTS (bind) = 1;
1839 add_stmt (bind);
1841 /* s1: x = rhs */
1842 s1 = build_modify_expr (input_location, setter_argument, NULL_TREE,
1843 NOP_EXPR,
1844 input_location, rhs, NULL_TREE);
1845 SET_EXPR_LOCATION (s1, input_location);
1847 else
1849 /* No s1. */
1850 setter_argument = rhs;
1851 s1 = NULL_TREE;
1854 /* Now build the compound statement. */
1856 /* s2: [object setProperty: x] */
1857 s2 = objc_build_setter_call (lhs, setter_argument);
1859 /* This happens if building the setter failed because the
1860 property is readonly. */
1861 if (s2 == error_mark_node)
1862 return error_mark_node;
1864 SET_EXPR_LOCATION (s2, input_location);
1866 /* s3: x */
1867 s3 = convert (TREE_TYPE (lhs), setter_argument);
1869 /* Now build the compound statement (s1, s2, s3) or (s2, s3) as
1870 appropriate. */
1871 if (s1)
1872 compound_expr = build_compound_expr (input_location, build_compound_expr (input_location, s1, s2), s3);
1873 else
1874 compound_expr = build_compound_expr (input_location, s2, s3);
1876 /* Without this, with -Wall you get a 'valued computed is not
1877 used' every time there is a "object.property = x" where the
1878 value of the resulting MODIFY_EXPR is not used. That is
1879 correct (maybe a more sophisticated implementation could
1880 avoid generating the compound expression if not needed), but
1881 we need to turn it off. */
1882 TREE_NO_WARNING (compound_expr) = 1;
1883 return compound_expr;
1885 else
1886 return NULL_TREE;
1889 /* This hook is called by the frontend when one of the four unary
1890 expressions PREINCREMENT_EXPR, POSTINCREMENT_EXPR,
1891 PREDECREMENT_EXPR and POSTDECREMENT_EXPR is being built with an
1892 argument which is a PROPERTY_REF. For example, this happens if you have
1894 object.count++;
1896 where 'count' is a property. We need to use the 'getter' and
1897 'setter' for the property in an appropriate way to build the
1898 appropriate expression. 'code' is the code for the expression (one
1899 of the four mentioned above); 'argument' is the PROPERTY_REF, and
1900 'increment' is how much we need to add or subtract. */
1901 tree
1902 objc_build_incr_expr_for_property_ref (location_t location,
1903 enum tree_code code,
1904 tree argument, tree increment)
1906 /* Here are the expressions that we want to build:
1908 For PREINCREMENT_EXPR / PREDECREMENT_EXPR:
1909 (temp = [object property] +/- increment, [object setProperty: temp], temp)
1911 For POSTINCREMENT_EXPR / POSTECREMENT_EXPR:
1912 (temp = [object property], [object setProperty: temp +/- increment], temp) */
1914 tree temp_variable_decl, bind;
1915 /* s1, s2 and s3 are the tree statements that we need in the
1916 compound expression. */
1917 tree s1, s2, s3, compound_expr;
1919 /* Safety check. */
1920 if (!argument || TREE_CODE (argument) != PROPERTY_REF)
1921 return error_mark_node;
1923 /* Declare __objc_property_temp in a local bind. */
1924 temp_variable_decl = objc_create_temporary_var (TREE_TYPE (argument), "__objc_property_temp");
1925 DECL_SOURCE_LOCATION (temp_variable_decl) = location;
1926 bind = build3 (BIND_EXPR, void_type_node, temp_variable_decl, NULL, NULL);
1927 SET_EXPR_LOCATION (bind, location);
1928 TREE_SIDE_EFFECTS (bind) = 1;
1929 add_stmt (bind);
1931 /* Now build the compound statement. */
1933 /* Note that the 'getter' is generated at gimplify time; at this
1934 time, we can simply put the property_ref (ie, argument) wherever
1935 we want the getter ultimately to be. */
1937 /* s1: __objc_property_temp = [object property] <+/- increment> */
1938 switch (code)
1940 case PREINCREMENT_EXPR:
1941 /* __objc_property_temp = [object property] + increment */
1942 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1943 NOP_EXPR,
1944 location, build2 (PLUS_EXPR, TREE_TYPE (argument),
1945 argument, increment), NULL_TREE);
1946 break;
1947 case PREDECREMENT_EXPR:
1948 /* __objc_property_temp = [object property] - increment */
1949 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1950 NOP_EXPR,
1951 location, build2 (MINUS_EXPR, TREE_TYPE (argument),
1952 argument, increment), NULL_TREE);
1953 break;
1954 case POSTINCREMENT_EXPR:
1955 case POSTDECREMENT_EXPR:
1956 /* __objc_property_temp = [object property] */
1957 s1 = build_modify_expr (location, temp_variable_decl, NULL_TREE,
1958 NOP_EXPR,
1959 location, argument, NULL_TREE);
1960 break;
1961 default:
1962 gcc_unreachable ();
1965 /* s2: [object setProperty: __objc_property_temp <+/- increment>] */
1966 switch (code)
1968 case PREINCREMENT_EXPR:
1969 case PREDECREMENT_EXPR:
1970 /* [object setProperty: __objc_property_temp] */
1971 s2 = objc_build_setter_call (argument, temp_variable_decl);
1972 break;
1973 case POSTINCREMENT_EXPR:
1974 /* [object setProperty: __objc_property_temp + increment] */
1975 s2 = objc_build_setter_call (argument,
1976 build2 (PLUS_EXPR, TREE_TYPE (argument),
1977 temp_variable_decl, increment));
1978 break;
1979 case POSTDECREMENT_EXPR:
1980 /* [object setProperty: __objc_property_temp - increment] */
1981 s2 = objc_build_setter_call (argument,
1982 build2 (MINUS_EXPR, TREE_TYPE (argument),
1983 temp_variable_decl, increment));
1984 break;
1985 default:
1986 gcc_unreachable ();
1989 /* This happens if building the setter failed because the property
1990 is readonly. */
1991 if (s2 == error_mark_node)
1992 return error_mark_node;
1994 SET_EXPR_LOCATION (s2, location);
1996 /* s3: __objc_property_temp */
1997 s3 = convert (TREE_TYPE (argument), temp_variable_decl);
1999 /* Now build the compound statement (s1, s2, s3) */
2000 compound_expr = build_compound_expr (location, build_compound_expr (location, s1, s2), s3);
2002 /* Prevent C++ from warning with -Wall that "right operand of comma
2003 operator has no effect". */
2004 TREE_NO_WARNING (compound_expr) = 1;
2005 return compound_expr;
2008 tree
2009 objc_build_method_signature (bool is_class_method, tree rettype, tree selector,
2010 tree optparms, bool ellipsis)
2012 if (is_class_method)
2013 return build_method_decl (CLASS_METHOD_DECL, rettype, selector,
2014 optparms, ellipsis);
2015 else
2016 return build_method_decl (INSTANCE_METHOD_DECL, rettype, selector,
2017 optparms, ellipsis);
2020 void
2021 objc_add_method_declaration (bool is_class_method, tree decl, tree attributes)
2023 if (!objc_interface_context)
2025 /* PS: At the moment, due to how the parser works, it should be
2026 impossible to get here. But it's good to have the check in
2027 case the parser changes.
2029 fatal_error ("method declaration not in @interface context");
2032 if (flag_objc1_only && attributes)
2033 error_at (input_location, "method attributes are not available in Objective-C 1.0");
2035 objc_decl_method_attributes (&decl, attributes, 0);
2036 objc_add_method (objc_interface_context,
2037 decl,
2038 is_class_method,
2039 objc_method_optional_flag);
2042 /* Return 'true' if the method definition could be started, and
2043 'false' if not (because we are outside an @implementation context).
2045 bool
2046 objc_start_method_definition (bool is_class_method, tree decl, tree attributes)
2048 if (!objc_implementation_context)
2050 error ("method definition not in @implementation context");
2051 return false;
2054 if (decl != NULL_TREE && METHOD_SEL_NAME (decl) == error_mark_node)
2055 return false;
2057 #ifndef OBJCPLUS
2058 /* Indicate no valid break/continue context by setting these variables
2059 to some non-null, non-label value. We'll notice and emit the proper
2060 error message in c_finish_bc_stmt. */
2061 c_break_label = c_cont_label = size_zero_node;
2062 #endif
2064 if (attributes)
2065 warning_at (input_location, 0, "method attributes can not be specified in @implementation context");
2066 else
2067 objc_decl_method_attributes (&decl, attributes, 0);
2069 objc_add_method (objc_implementation_context,
2070 decl,
2071 is_class_method,
2072 /* is optional */ false);
2073 start_method_def (decl);
2074 return true;
2077 void
2078 objc_add_instance_variable (tree decl)
2080 (void) add_instance_variable (objc_ivar_context,
2081 objc_ivar_visibility,
2082 decl);
2085 /* Construct a C struct with same name as KLASS, a base struct with tag
2086 SUPER_NAME (if any), and FIELDS indicated. */
2088 static tree
2089 objc_build_struct (tree klass, tree fields, tree super_name)
2091 tree name = CLASS_NAME (klass);
2092 tree s = objc_start_struct (name);
2093 tree super = (super_name ? xref_tag (RECORD_TYPE, super_name) : NULL_TREE);
2094 tree t;
2095 VEC(tree,heap) *objc_info = NULL;
2096 int i;
2098 if (super)
2100 /* Prepend a packed variant of the base class into the layout. This
2101 is necessary to preserve ObjC ABI compatibility. */
2102 tree base = build_decl (input_location,
2103 FIELD_DECL, NULL_TREE, super);
2104 tree field = TYPE_FIELDS (super);
2106 while (field && DECL_CHAIN (field)
2107 && TREE_CODE (DECL_CHAIN (field)) == FIELD_DECL)
2108 field = DECL_CHAIN (field);
2110 /* For ObjC ABI purposes, the "packed" size of a base class is
2111 the sum of the offset and the size (in bits) of the last field
2112 in the class. */
2113 DECL_SIZE (base)
2114 = (field && TREE_CODE (field) == FIELD_DECL
2115 ? size_binop (PLUS_EXPR,
2116 size_binop (PLUS_EXPR,
2117 size_binop
2118 (MULT_EXPR,
2119 convert (bitsizetype,
2120 DECL_FIELD_OFFSET (field)),
2121 bitsize_int (BITS_PER_UNIT)),
2122 DECL_FIELD_BIT_OFFSET (field)),
2123 DECL_SIZE (field))
2124 : bitsize_zero_node);
2125 DECL_SIZE_UNIT (base)
2126 = size_binop (FLOOR_DIV_EXPR, convert (sizetype, DECL_SIZE (base)),
2127 size_int (BITS_PER_UNIT));
2128 DECL_ARTIFICIAL (base) = 1;
2129 DECL_ALIGN (base) = 1;
2130 DECL_FIELD_CONTEXT (base) = s;
2131 #ifdef OBJCPLUS
2132 DECL_FIELD_IS_BASE (base) = 1;
2134 if (fields)
2135 TREE_NO_WARNING (fields) = 1; /* Suppress C++ ABI warnings -- we */
2136 #endif /* are following the ObjC ABI here. */
2137 DECL_CHAIN (base) = fields;
2138 fields = base;
2141 /* NB: Calling finish_struct() may cause type TYPE_OBJC_INFO
2142 information in all variants of this RECORD_TYPE to be destroyed
2143 (this is because the C frontend manipulates TYPE_LANG_SPECIFIC
2144 for something else and then will change all variants to use the
2145 same resulting TYPE_LANG_SPECIFIC, ignoring the fact that we use
2146 it for ObjC protocols and that such propagation will make all
2147 variants use the same objc_info), but it is therein that we store
2148 protocol conformance info (e.g., 'NSObject <MyProtocol>').
2149 Hence, we must save the ObjC-specific information before calling
2150 finish_struct(), and then reinstate it afterwards. */
2152 for (t = TYPE_MAIN_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t))
2154 INIT_TYPE_OBJC_INFO (t);
2155 VEC_safe_push (tree, heap, objc_info, TYPE_OBJC_INFO (t));
2158 s = objc_finish_struct (s, fields);
2160 for (i = 0, t = TYPE_MAIN_VARIANT (s); t; t = TYPE_NEXT_VARIANT (t), i++)
2162 /* We now want to restore the different TYPE_OBJC_INFO, but we
2163 have the additional problem that the C frontend doesn't just
2164 copy TYPE_LANG_SPECIFIC from one variant to the other; it
2165 actually makes all of them the *same* TYPE_LANG_SPECIFIC. As
2166 we need a different TYPE_OBJC_INFO for each (and
2167 TYPE_OBJC_INFO is a field in TYPE_LANG_SPECIFIC), we need to
2168 make a copy of each TYPE_LANG_SPECIFIC before we modify
2169 TYPE_OBJC_INFO. */
2170 if (TYPE_LANG_SPECIFIC (t))
2172 /* Create a copy of TYPE_LANG_SPECIFIC. */
2173 struct lang_type *old_lang_type = TYPE_LANG_SPECIFIC (t);
2174 ALLOC_OBJC_TYPE_LANG_SPECIFIC (t);
2175 memcpy (TYPE_LANG_SPECIFIC (t), old_lang_type,
2176 SIZEOF_OBJC_TYPE_LANG_SPECIFIC);
2178 else
2180 /* Just create a new one. */
2181 ALLOC_OBJC_TYPE_LANG_SPECIFIC (t);
2183 /* Replace TYPE_OBJC_INFO with the saved one. This restores any
2184 protocol information that may have been associated with the
2185 type. */
2186 TYPE_OBJC_INFO (t) = VEC_index (tree, objc_info, i);
2187 /* Replace the IDENTIFIER_NODE with an actual @interface now
2188 that we have it. */
2189 TYPE_OBJC_INTERFACE (t) = klass;
2191 VEC_free (tree, heap, objc_info);
2193 /* Use TYPE_BINFO structures to point at the super class, if any. */
2194 objc_xref_basetypes (s, super);
2196 /* Mark this struct as a class template. */
2197 CLASS_STATIC_TEMPLATE (klass) = s;
2199 return s;
2202 /* Mark DECL as being 'volatile' for purposes of Darwin
2203 _setjmp()/_longjmp() exception handling. Called from
2204 objc_mark_locals_volatile(). */
2205 void
2206 objc_volatilize_decl (tree decl)
2208 /* Do not mess with variables that are 'static' or (already)
2209 'volatile'. */
2210 if (!TREE_THIS_VOLATILE (decl) && !TREE_STATIC (decl)
2211 && (TREE_CODE (decl) == VAR_DECL
2212 || TREE_CODE (decl) == PARM_DECL))
2214 if (local_variables_to_volatilize == NULL)
2215 local_variables_to_volatilize = VEC_alloc (tree, gc, 8);
2217 VEC_safe_push (tree, gc, local_variables_to_volatilize, decl);
2221 /* Called when parsing of a function completes; if any local variables
2222 in the function were marked as variables to volatilize, change them
2223 to volatile. We do this at the end of the function when the
2224 warnings about discarding 'volatile' have already been produced.
2225 We are making the variables as volatile just to force the compiler
2226 to preserve them between setjmp/longjmp, but we don't want warnings
2227 for them as they aren't really volatile. */
2228 void
2229 objc_finish_function (void)
2231 /* If there are any local variables to volatilize, volatilize them. */
2232 if (local_variables_to_volatilize)
2234 int i;
2235 tree decl;
2236 FOR_EACH_VEC_ELT (tree, local_variables_to_volatilize, i, decl)
2238 tree t = TREE_TYPE (decl);
2240 t = build_qualified_type (t, TYPE_QUALS (t) | TYPE_QUAL_VOLATILE);
2241 TREE_TYPE (decl) = t;
2242 TREE_THIS_VOLATILE (decl) = 1;
2243 TREE_SIDE_EFFECTS (decl) = 1;
2244 DECL_REGISTER (decl) = 0;
2245 #ifndef OBJCPLUS
2246 C_DECL_REGISTER (decl) = 0;
2247 #endif
2250 /* Now we delete the vector. This sets it to NULL as well. */
2251 VEC_free (tree, gc, local_variables_to_volatilize);
2255 /* Check if protocol PROTO is adopted (directly or indirectly) by class CLS
2256 (including its categories and superclasses) or by object type TYP.
2257 Issue a warning if PROTO is not adopted anywhere and WARN is set. */
2259 static bool
2260 objc_lookup_protocol (tree proto, tree cls, tree typ, bool warn)
2262 bool class_type = (cls != NULL_TREE);
2264 while (cls)
2266 tree c;
2268 /* Check protocols adopted by the class and its categories. */
2269 for (c = cls; c; c = CLASS_CATEGORY_LIST (c))
2271 if (lookup_protocol_in_reflist (CLASS_PROTOCOL_LIST (c), proto))
2272 return true;
2275 /* Repeat for superclasses. */
2276 cls = lookup_interface (CLASS_SUPER_NAME (cls));
2279 /* Check for any protocols attached directly to the object type. */
2280 if (TYPE_HAS_OBJC_INFO (typ))
2282 if (lookup_protocol_in_reflist (TYPE_OBJC_PROTOCOL_LIST (typ), proto))
2283 return true;
2286 if (warn)
2288 *errbuf = 0;
2289 gen_type_name_0 (class_type ? typ : TYPE_POINTER_TO (typ));
2290 /* NB: Types 'id' and 'Class' cannot reasonably be described as
2291 "implementing" a given protocol, since they do not have an
2292 implementation. */
2293 if (class_type)
2294 warning (0, "class %qs does not implement the %qE protocol",
2295 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
2296 else
2297 warning (0, "type %qs does not conform to the %qE protocol",
2298 identifier_to_locale (errbuf), PROTOCOL_NAME (proto));
2301 return false;
2304 /* Check if class RCLS and instance struct type RTYP conform to at least the
2305 same protocols that LCLS and LTYP conform to. */
2307 static bool
2308 objc_compare_protocols (tree lcls, tree ltyp, tree rcls, tree rtyp, bool warn)
2310 tree p;
2311 bool have_lproto = false;
2313 while (lcls)
2315 /* NB: We do _not_ look at categories defined for LCLS; these may or
2316 may not get loaded in, and therefore it is unreasonable to require
2317 that RCLS/RTYP must implement any of their protocols. */
2318 for (p = CLASS_PROTOCOL_LIST (lcls); p; p = TREE_CHAIN (p))
2320 have_lproto = true;
2322 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
2323 return warn;
2326 /* Repeat for superclasses. */
2327 lcls = lookup_interface (CLASS_SUPER_NAME (lcls));
2330 /* Check for any protocols attached directly to the object type. */
2331 if (TYPE_HAS_OBJC_INFO (ltyp))
2333 for (p = TYPE_OBJC_PROTOCOL_LIST (ltyp); p; p = TREE_CHAIN (p))
2335 have_lproto = true;
2337 if (!objc_lookup_protocol (TREE_VALUE (p), rcls, rtyp, warn))
2338 return warn;
2342 /* NB: If LTYP and LCLS have no protocols to search for, return 'true'
2343 vacuously, _unless_ RTYP is a protocol-qualified 'id'. We can get
2344 away with simply checking for 'id' or 'Class' (!RCLS), since this
2345 routine will not get called in other cases. */
2346 return have_lproto || (rcls != NULL_TREE);
2349 /* Given two types TYPE1 and TYPE2, return their least common ancestor.
2350 Both TYPE1 and TYPE2 must be pointers, and already determined to be
2351 compatible by objc_compare_types() below. */
2353 tree
2354 objc_common_type (tree type1, tree type2)
2356 tree inner1 = TREE_TYPE (type1), inner2 = TREE_TYPE (type2);
2358 while (POINTER_TYPE_P (inner1))
2360 inner1 = TREE_TYPE (inner1);
2361 inner2 = TREE_TYPE (inner2);
2364 /* If one type is derived from another, return the base type. */
2365 if (DERIVED_FROM_P (inner1, inner2))
2366 return type1;
2367 else if (DERIVED_FROM_P (inner2, inner1))
2368 return type2;
2370 /* If both types are 'Class', return 'Class'. */
2371 if (objc_is_class_id (inner1) && objc_is_class_id (inner2))
2372 return objc_class_type;
2374 /* Otherwise, return 'id'. */
2375 return objc_object_type;
2378 /* Determine if it is permissible to assign (if ARGNO is greater than -3)
2379 an instance of RTYP to an instance of LTYP or to compare the two
2380 (if ARGNO is equal to -3), per ObjC type system rules. Before
2381 returning 'true', this routine may issue warnings related to, e.g.,
2382 protocol conformance. When returning 'false', the routine must
2383 produce absolutely no warnings; the C or C++ front-end will do so
2384 instead, if needed. If either LTYP or RTYP is not an Objective-C
2385 type, the routine must return 'false'.
2387 The ARGNO parameter is encoded as follows:
2388 >= 1 Parameter number (CALLEE contains function being called);
2389 0 Return value;
2390 -1 Assignment;
2391 -2 Initialization;
2392 -3 Comparison (LTYP and RTYP may match in either direction);
2393 -4 Silent comparison (for C++ overload resolution);
2394 -5 Silent "specialization" comparison for RTYP to be a "specialization"
2395 of LTYP (a specialization means that RTYP is LTYP plus some constraints,
2396 so that each object of type RTYP is also of type LTYP). This is used
2397 when comparing property types. */
2399 bool
2400 objc_compare_types (tree ltyp, tree rtyp, int argno, tree callee)
2402 tree lcls, rcls, lproto, rproto;
2403 bool pointers_compatible;
2405 /* We must be dealing with pointer types */
2406 if (!POINTER_TYPE_P (ltyp) || !POINTER_TYPE_P (rtyp))
2407 return false;
2411 ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
2412 rtyp = TREE_TYPE (rtyp);
2414 while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
2416 /* We must also handle function pointers, since ObjC is a bit more
2417 lenient than C or C++ on this. */
2418 if (TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE)
2420 /* Return types must be covariant. */
2421 if (!comptypes (TREE_TYPE (ltyp), TREE_TYPE (rtyp))
2422 && !objc_compare_types (TREE_TYPE (ltyp), TREE_TYPE (rtyp),
2423 argno, callee))
2424 return false;
2426 /* Argument types must be contravariant. */
2427 for (ltyp = TYPE_ARG_TYPES (ltyp), rtyp = TYPE_ARG_TYPES (rtyp);
2428 ltyp && rtyp; ltyp = TREE_CHAIN (ltyp), rtyp = TREE_CHAIN (rtyp))
2430 if (!comptypes (TREE_VALUE (rtyp), TREE_VALUE (ltyp))
2431 && !objc_compare_types (TREE_VALUE (rtyp), TREE_VALUE (ltyp),
2432 argno, callee))
2433 return false;
2436 return (ltyp == rtyp);
2439 /* Past this point, we are only interested in ObjC class instances,
2440 or 'id' or 'Class'. */
2441 if (TREE_CODE (ltyp) != RECORD_TYPE || TREE_CODE (rtyp) != RECORD_TYPE)
2442 return false;
2444 if (!objc_is_object_id (ltyp) && !objc_is_class_id (ltyp)
2445 && !TYPE_HAS_OBJC_INFO (ltyp))
2446 return false;
2448 if (!objc_is_object_id (rtyp) && !objc_is_class_id (rtyp)
2449 && !TYPE_HAS_OBJC_INFO (rtyp))
2450 return false;
2452 /* Past this point, we are committed to returning 'true' to the caller
2453 (unless performing a silent comparison; see below). However, we can
2454 still warn about type and/or protocol mismatches. */
2456 if (TYPE_HAS_OBJC_INFO (ltyp))
2458 lcls = TYPE_OBJC_INTERFACE (ltyp);
2459 lproto = TYPE_OBJC_PROTOCOL_LIST (ltyp);
2461 else
2462 lcls = lproto = NULL_TREE;
2464 if (TYPE_HAS_OBJC_INFO (rtyp))
2466 rcls = TYPE_OBJC_INTERFACE (rtyp);
2467 rproto = TYPE_OBJC_PROTOCOL_LIST (rtyp);
2469 else
2470 rcls = rproto = NULL_TREE;
2472 /* If we could not find an @interface declaration, we must have
2473 only seen a @class declaration; for purposes of type comparison,
2474 treat it as a stand-alone (root) class. */
2476 if (lcls && TREE_CODE (lcls) == IDENTIFIER_NODE)
2477 lcls = NULL_TREE;
2479 if (rcls && TREE_CODE (rcls) == IDENTIFIER_NODE)
2480 rcls = NULL_TREE;
2482 /* If either type is an unqualified 'id', we're done. This is because
2483 an 'id' can be assigned to or from any type with no warnings. */
2484 if (argno != -5)
2486 if ((!lproto && objc_is_object_id (ltyp))
2487 || (!rproto && objc_is_object_id (rtyp)))
2488 return true;
2490 else
2492 /* For property checks, though, an 'id' is considered the most
2493 general type of object, hence if you try to specialize an
2494 'NSArray *' (ltyp) property with an 'id' (rtyp) one, we need
2495 to warn. */
2496 if (!lproto && objc_is_object_id (ltyp))
2497 return true;
2500 pointers_compatible = (TYPE_MAIN_VARIANT (ltyp) == TYPE_MAIN_VARIANT (rtyp));
2502 /* If the underlying types are the same, and at most one of them has
2503 a protocol list, we do not need to issue any diagnostics. */
2504 if (pointers_compatible && (!lproto || !rproto))
2505 return true;
2507 /* If exactly one of the types is 'Class', issue a diagnostic; any
2508 exceptions of this rule have already been handled. */
2509 if (objc_is_class_id (ltyp) ^ objc_is_class_id (rtyp))
2510 pointers_compatible = false;
2511 /* Otherwise, check for inheritance relations. */
2512 else
2514 if (!pointers_compatible)
2516 /* Again, if any of the two is an 'id', we're satisfied,
2517 unless we're comparing properties, in which case only an
2518 'id' on the left-hand side (old property) is good
2519 enough. */
2520 if (argno != -5)
2521 pointers_compatible
2522 = (objc_is_object_id (ltyp) || objc_is_object_id (rtyp));
2523 else
2524 pointers_compatible = objc_is_object_id (ltyp);
2527 if (!pointers_compatible)
2528 pointers_compatible = DERIVED_FROM_P (ltyp, rtyp);
2530 if (!pointers_compatible && (argno == -3 || argno == -4))
2531 pointers_compatible = DERIVED_FROM_P (rtyp, ltyp);
2534 /* If the pointers match modulo protocols, check for protocol conformance
2535 mismatches. */
2536 if (pointers_compatible)
2538 pointers_compatible = objc_compare_protocols (lcls, ltyp, rcls, rtyp,
2539 argno != -3);
2541 if (!pointers_compatible && argno == -3)
2542 pointers_compatible = objc_compare_protocols (rcls, rtyp, lcls, ltyp,
2543 argno != -3);
2546 if (!pointers_compatible)
2548 /* The two pointers are not exactly compatible. Issue a warning, unless
2549 we are performing a silent comparison, in which case return 'false'
2550 instead. */
2551 /* NB: For the time being, we shall make our warnings look like their
2552 C counterparts. In the future, we may wish to make them more
2553 ObjC-specific. */
2554 switch (argno)
2556 case -5:
2557 case -4:
2558 return false;
2560 case -3:
2561 warning (0, "comparison of distinct Objective-C types lacks a cast");
2562 break;
2564 case -2:
2565 warning (0, "initialization from distinct Objective-C type");
2566 break;
2568 case -1:
2569 warning (0, "assignment from distinct Objective-C type");
2570 break;
2572 case 0:
2573 warning (0, "distinct Objective-C type in return");
2574 break;
2576 default:
2577 warning (0, "passing argument %d of %qE from distinct "
2578 "Objective-C type", argno, callee);
2579 break;
2583 return true;
2586 /* This routine is similar to objc_compare_types except that function-pointers are
2587 excluded. This is because, caller assumes that common types are of (id, Object*)
2588 variety and calls objc_common_type to obtain a common type. There is no commonolty
2589 between two function-pointers in this regard. */
2591 bool
2592 objc_have_common_type (tree ltyp, tree rtyp, int argno, tree callee)
2594 if (objc_compare_types (ltyp, rtyp, argno, callee))
2596 /* exclude function-pointer types. */
2599 ltyp = TREE_TYPE (ltyp); /* Remove indirections. */
2600 rtyp = TREE_TYPE (rtyp);
2602 while (POINTER_TYPE_P (ltyp) && POINTER_TYPE_P (rtyp));
2603 return !(TREE_CODE (ltyp) == FUNCTION_TYPE && TREE_CODE (rtyp) == FUNCTION_TYPE);
2605 return false;
2608 #ifndef OBJCPLUS
2609 /* Determine if CHILD is derived from PARENT. The routine assumes that
2610 both parameters are RECORD_TYPEs, and is non-reflexive. */
2612 static bool
2613 objc_derived_from_p (tree parent, tree child)
2615 parent = TYPE_MAIN_VARIANT (parent);
2617 for (child = TYPE_MAIN_VARIANT (child);
2618 TYPE_BINFO (child) && BINFO_N_BASE_BINFOS (TYPE_BINFO (child));)
2620 child = TYPE_MAIN_VARIANT (BINFO_TYPE (BINFO_BASE_BINFO
2621 (TYPE_BINFO (child),
2622 0)));
2624 if (child == parent)
2625 return true;
2628 return false;
2630 #endif
2632 tree
2633 objc_build_component_ref (tree datum, tree component)
2635 /* If COMPONENT is NULL, the caller is referring to the anonymous
2636 base class field. */
2637 if (!component)
2639 tree base = TYPE_FIELDS (TREE_TYPE (datum));
2641 return build3 (COMPONENT_REF, TREE_TYPE (base), datum, base, NULL_TREE);
2644 /* The 'build_component_ref' routine has been removed from the C++
2645 front-end, but 'finish_class_member_access_expr' seems to be
2646 a worthy substitute. */
2647 #ifdef OBJCPLUS
2648 return finish_class_member_access_expr (datum, component, false,
2649 tf_warning_or_error);
2650 #else
2651 return build_component_ref (input_location, datum, component);
2652 #endif
2655 /* Recursively copy inheritance information rooted at BINFO. To do this,
2656 we emulate the song and dance performed by cp/tree.c:copy_binfo(). */
2658 static tree
2659 objc_copy_binfo (tree binfo)
2661 tree btype = BINFO_TYPE (binfo);
2662 tree binfo2 = make_tree_binfo (BINFO_N_BASE_BINFOS (binfo));
2663 tree base_binfo;
2664 int ix;
2666 BINFO_TYPE (binfo2) = btype;
2667 BINFO_OFFSET (binfo2) = BINFO_OFFSET (binfo);
2668 BINFO_BASE_ACCESSES (binfo2) = BINFO_BASE_ACCESSES (binfo);
2670 /* Recursively copy base binfos of BINFO. */
2671 for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
2673 tree base_binfo2 = objc_copy_binfo (base_binfo);
2675 BINFO_INHERITANCE_CHAIN (base_binfo2) = binfo2;
2676 BINFO_BASE_APPEND (binfo2, base_binfo2);
2679 return binfo2;
2682 /* Record superclass information provided in BASETYPE for ObjC class REF.
2683 This is loosely based on cp/decl.c:xref_basetypes(). */
2685 static void
2686 objc_xref_basetypes (tree ref, tree basetype)
2688 tree binfo = make_tree_binfo (basetype ? 1 : 0);
2690 TYPE_BINFO (ref) = binfo;
2691 BINFO_OFFSET (binfo) = size_zero_node;
2692 BINFO_TYPE (binfo) = ref;
2694 if (basetype)
2696 tree base_binfo = objc_copy_binfo (TYPE_BINFO (basetype));
2698 BINFO_INHERITANCE_CHAIN (base_binfo) = binfo;
2699 BINFO_BASE_ACCESSES (binfo) = VEC_alloc (tree, gc, 1);
2700 BINFO_BASE_APPEND (binfo, base_binfo);
2701 BINFO_BASE_ACCESS_APPEND (binfo, access_public_node);
2705 /* Called from finish_decl. */
2707 void
2708 objc_check_decl (tree decl)
2710 tree type = TREE_TYPE (decl);
2712 if (TREE_CODE (type) != RECORD_TYPE)
2713 return;
2714 if (OBJC_TYPE_NAME (type) && (type = objc_is_class_name (OBJC_TYPE_NAME (type))))
2715 error ("statically allocated instance of Objective-C class %qE",
2716 type);
2719 void
2720 objc_check_global_decl (tree decl)
2722 tree id = DECL_NAME (decl);
2723 if (objc_is_class_name (id) && global_bindings_p())
2724 error ("redeclaration of Objective-C class %qs", IDENTIFIER_POINTER (id));
2727 /* Construct a PROTOCOLS-qualified variant of INTERFACE, where
2728 INTERFACE may either name an Objective-C class, or refer to the
2729 special 'id' or 'Class' types. If INTERFACE is not a valid ObjC
2730 type, just return it unchanged. This function is often called when
2731 PROTOCOLS is NULL_TREE, in which case we simply look up the
2732 appropriate INTERFACE. */
2734 tree
2735 objc_get_protocol_qualified_type (tree interface, tree protocols)
2737 /* If INTERFACE is not provided, default to 'id'. */
2738 tree type = (interface ? objc_is_id (interface) : objc_object_type);
2739 bool is_ptr = (type != NULL_TREE);
2741 if (!is_ptr)
2743 type = objc_is_class_name (interface);
2745 if (type)
2747 /* If looking at a typedef, retrieve the precise type it
2748 describes. */
2749 if (TREE_CODE (interface) == IDENTIFIER_NODE)
2750 interface = identifier_global_value (interface);
2752 type = ((interface && TREE_CODE (interface) == TYPE_DECL
2753 && DECL_ORIGINAL_TYPE (interface))
2754 ? DECL_ORIGINAL_TYPE (interface)
2755 : xref_tag (RECORD_TYPE, type));
2757 else
2759 /* This case happens when we are given an 'interface' which
2760 is not a valid class name. For example if a typedef was
2761 used, and 'interface' really is the identifier of the
2762 typedef, but when you resolve it you don't get an
2763 Objective-C class, but something else, such as 'int'.
2764 This is an error; protocols make no sense unless you use
2765 them with Objective-C objects. */
2766 error_at (input_location, "only Objective-C object types can be qualified with a protocol");
2768 /* Try to recover. Ignore the invalid class name, and treat
2769 the object as an 'id' to silence further warnings about
2770 the class. */
2771 type = objc_object_type;
2772 is_ptr = true;
2776 if (protocols)
2778 type = build_variant_type_copy (type);
2780 /* For pointers (i.e., 'id' or 'Class'), attach the protocol(s)
2781 to the pointee. */
2782 if (is_ptr)
2784 tree orig_pointee_type = TREE_TYPE (type);
2785 TREE_TYPE (type) = build_variant_type_copy (orig_pointee_type);
2787 /* Set up the canonical type information. */
2788 TYPE_CANONICAL (type)
2789 = TYPE_CANONICAL (TYPE_POINTER_TO (orig_pointee_type));
2791 TYPE_POINTER_TO (TREE_TYPE (type)) = type;
2792 type = TREE_TYPE (type);
2795 /* Look up protocols and install in lang specific list. */
2796 DUP_TYPE_OBJC_INFO (type, TYPE_MAIN_VARIANT (type));
2797 TYPE_OBJC_PROTOCOL_LIST (type) = lookup_and_install_protocols
2798 (protocols, /* definition_required */ false);
2800 /* For RECORD_TYPEs, point to the @interface; for 'id' and 'Class',
2801 return the pointer to the new pointee variant. */
2802 if (is_ptr)
2803 type = TYPE_POINTER_TO (type);
2804 else
2805 TYPE_OBJC_INTERFACE (type)
2806 = TYPE_OBJC_INTERFACE (TYPE_MAIN_VARIANT (type));
2809 return type;
2812 /* Check for circular dependencies in protocols. The arguments are
2813 PROTO, the protocol to check, and LIST, a list of protocol it
2814 conforms to. */
2816 static void
2817 check_protocol_recursively (tree proto, tree list)
2819 tree p;
2821 for (p = list; p; p = TREE_CHAIN (p))
2823 tree pp = TREE_VALUE (p);
2825 if (TREE_CODE (pp) == IDENTIFIER_NODE)
2826 pp = lookup_protocol (pp, /* warn if deprecated */ false,
2827 /* definition_required */ false);
2829 if (pp == proto)
2830 fatal_error ("protocol %qE has circular dependency",
2831 PROTOCOL_NAME (pp));
2832 if (pp)
2833 check_protocol_recursively (proto, PROTOCOL_LIST (pp));
2837 /* Look up PROTOCOLS, and return a list of those that are found. If
2838 none are found, return NULL. Note that this function will emit a
2839 warning if a protocol is found and is deprecated. If
2840 'definition_required', then warn if the protocol is found but is
2841 not defined (ie, if we only saw a forward-declaration of the
2842 protocol (as in "@protocol NSObject;") not a real definition with
2843 the list of methods). */
2844 static tree
2845 lookup_and_install_protocols (tree protocols, bool definition_required)
2847 tree proto;
2848 tree return_value = NULL_TREE;
2850 if (protocols == error_mark_node)
2851 return NULL;
2853 for (proto = protocols; proto; proto = TREE_CHAIN (proto))
2855 tree ident = TREE_VALUE (proto);
2856 tree p = lookup_protocol (ident, /* warn_if_deprecated */ true,
2857 definition_required);
2859 if (p)
2860 return_value = chainon (return_value,
2861 build_tree_list (NULL_TREE, p));
2862 else if (ident != error_mark_node)
2863 error ("cannot find protocol declaration for %qE",
2864 ident);
2867 return return_value;
2870 static void
2871 build_common_objc_exception_stuff (void)
2873 tree noreturn_list, nothrow_list, temp_type;
2875 noreturn_list = tree_cons (get_identifier ("noreturn"), NULL, NULL);
2876 nothrow_list = tree_cons (get_identifier ("nothrow"), NULL, NULL);
2878 /* void objc_exception_throw(id) __attribute__((noreturn)); */
2879 /* void objc_sync_enter(id); */
2880 /* void objc_sync_exit(id); */
2881 temp_type = build_function_type_list (void_type_node,
2882 objc_object_type,
2883 NULL_TREE);
2884 objc_exception_throw_decl
2885 = add_builtin_function (TAG_EXCEPTIONTHROW, temp_type, 0, NOT_BUILT_IN, NULL,
2886 noreturn_list);
2887 /* Make sure that objc_exception_throw (id) claims that it may throw an
2888 exception. */
2889 TREE_NOTHROW (objc_exception_throw_decl) = 0;
2891 objc_sync_enter_decl
2892 = add_builtin_function (TAG_SYNCENTER, temp_type, 0, NOT_BUILT_IN,
2893 NULL, nothrow_list);
2895 objc_sync_exit_decl
2896 = add_builtin_function (TAG_SYNCEXIT, temp_type, 0, NOT_BUILT_IN,
2897 NULL, nothrow_list);
2900 /* Purpose: "play" parser, creating/installing representations
2901 of the declarations that are required by Objective-C.
2903 Model:
2905 type_spec--------->sc_spec
2906 (tree_list) (tree_list)
2909 identifier_node identifier_node */
2911 static void
2912 synth_module_prologue (void)
2914 tree type;
2915 enum debug_info_type save_write_symbols = write_symbols;
2916 const struct gcc_debug_hooks *const save_hooks = debug_hooks;
2918 /* Suppress outputting debug symbols, because
2919 dbxout_init hasn't been called yet. */
2920 write_symbols = NO_DEBUG;
2921 debug_hooks = &do_nothing_debug_hooks;
2923 #ifdef OBJCPLUS
2924 push_lang_context (lang_name_c); /* extern "C" */
2925 #endif
2927 /* The following are also defined in <objc/objc.h> and friends. */
2929 objc_object_id = get_identifier (TAG_OBJECT);
2930 objc_class_id = get_identifier (TAG_CLASS);
2932 objc_object_reference = xref_tag (RECORD_TYPE, objc_object_id);
2933 objc_class_reference = xref_tag (RECORD_TYPE, objc_class_id);
2935 objc_object_type = build_pointer_type (objc_object_reference);
2936 objc_class_type = build_pointer_type (objc_class_reference);
2938 objc_object_name = get_identifier (OBJECT_TYPEDEF_NAME);
2939 objc_class_name = get_identifier (CLASS_TYPEDEF_NAME);
2941 /* Declare the 'id' and 'Class' typedefs. */
2942 type = lang_hooks.decls.pushdecl (build_decl (input_location,
2943 TYPE_DECL,
2944 objc_object_name,
2945 objc_object_type));
2946 TREE_NO_WARNING (type) = 1;
2948 type = lang_hooks.decls.pushdecl (build_decl (input_location,
2949 TYPE_DECL,
2950 objc_class_name,
2951 objc_class_type));
2952 TREE_NO_WARNING (type) = 1;
2954 /* Forward-declare '@interface Protocol'. */
2955 type = get_identifier (PROTOCOL_OBJECT_CLASS_NAME);
2956 objc_declare_class (type);
2957 objc_protocol_type = build_pointer_type (xref_tag (RECORD_TYPE, type));
2959 /* Declare receiver type used for dispatching messages to 'super'. */
2960 /* `struct objc_super *' */
2961 objc_super_type = build_pointer_type (xref_tag (RECORD_TYPE,
2962 get_identifier (TAG_SUPER)));
2964 /* Declare pointers to method and ivar lists. */
2965 objc_method_list_ptr = build_pointer_type
2966 (xref_tag (RECORD_TYPE,
2967 get_identifier (UTAG_METHOD_LIST)));
2968 objc_method_proto_list_ptr
2969 = build_pointer_type (xref_tag (RECORD_TYPE,
2970 get_identifier (UTAG_METHOD_PROTOTYPE_LIST)));
2971 objc_ivar_list_ptr = build_pointer_type
2972 (xref_tag (RECORD_TYPE,
2973 get_identifier (UTAG_IVAR_LIST)));
2975 build_common_objc_exception_stuff ();
2977 /* Set-up runtime-specific templates, message and exception stuff. */
2978 (*runtime.initialize) ();
2980 /* Declare objc_getProperty, object_setProperty and other property
2981 accessor helpers. */
2982 build_common_objc_property_accessor_helpers ();
2984 /* Forward declare constant_string_id and constant_string_type. */
2985 if (!constant_string_class_name)
2986 constant_string_class_name = runtime.default_constant_string_class_name;
2987 constant_string_id = get_identifier (constant_string_class_name);
2988 objc_declare_class (constant_string_id);
2990 /* Pre-build the following entities - for speed/convenience. */
2991 self_id = get_identifier ("self");
2992 ucmd_id = get_identifier ("_cmd");
2994 /* Declare struct _objc_fast_enumeration_state { ... }; */
2995 build_fast_enumeration_state_template ();
2997 /* void objc_enumeration_mutation (id) */
2998 type = build_function_type (void_type_node,
2999 tree_cons (NULL_TREE, objc_object_type, NULL_TREE));
3000 objc_enumeration_mutation_decl
3001 = add_builtin_function (TAG_ENUMERATION_MUTATION, type, 0, NOT_BUILT_IN,
3002 NULL, NULL_TREE);
3003 TREE_NOTHROW (objc_enumeration_mutation_decl) = 0;
3005 #ifdef OBJCPLUS
3006 pop_lang_context ();
3007 #endif
3009 write_symbols = save_write_symbols;
3010 debug_hooks = save_hooks;
3013 /* --- const strings --- */
3015 /* Ensure that the ivar list for NSConstantString/NXConstantString
3016 (or whatever was specified via `-fconstant-string-class')
3017 contains fields at least as large as the following three, so that
3018 the runtime can stomp on them with confidence:
3020 struct STRING_OBJECT_CLASS_NAME
3022 Object isa;
3023 char *cString;
3024 unsigned int length;
3025 }; */
3027 static int
3028 check_string_class_template (void)
3030 tree field_decl = objc_get_class_ivars (constant_string_id);
3032 #define AT_LEAST_AS_LARGE_AS(F, T) \
3033 (F && TREE_CODE (F) == FIELD_DECL \
3034 && (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (F))) \
3035 >= TREE_INT_CST_LOW (TYPE_SIZE (T))))
3037 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
3038 return 0;
3040 field_decl = DECL_CHAIN (field_decl);
3041 if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
3042 return 0;
3044 field_decl = DECL_CHAIN (field_decl);
3045 return AT_LEAST_AS_LARGE_AS (field_decl, unsigned_type_node);
3047 #undef AT_LEAST_AS_LARGE_AS
3050 /* Avoid calling `check_string_class_template ()' more than once. */
3051 static GTY(()) int string_layout_checked;
3053 /* Construct an internal string layout to be used as a template for
3054 creating NSConstantString/NXConstantString instances. */
3056 static tree
3057 objc_build_internal_const_str_type (void)
3059 tree type = (*lang_hooks.types.make_type) (RECORD_TYPE);
3060 tree fields = build_decl (input_location,
3061 FIELD_DECL, NULL_TREE, ptr_type_node);
3062 tree field = build_decl (input_location,
3063 FIELD_DECL, NULL_TREE, ptr_type_node);
3065 DECL_CHAIN (field) = fields; fields = field;
3066 field = build_decl (input_location,
3067 FIELD_DECL, NULL_TREE, unsigned_type_node);
3068 DECL_CHAIN (field) = fields; fields = field;
3069 /* NB: The finish_builtin_struct() routine expects FIELD_DECLs in
3070 reverse order! */
3071 finish_builtin_struct (type, "__builtin_ObjCString",
3072 fields, NULL_TREE);
3074 return type;
3077 /* Custom build_string which sets TREE_TYPE! */
3079 tree
3080 my_build_string (int len, const char *str)
3082 return fix_string_type (build_string (len, str));
3085 /* Build a string with contents STR and length LEN and convert it to a
3086 pointer. */
3088 tree
3089 my_build_string_pointer (int len, const char *str)
3091 tree string = my_build_string (len, str);
3092 tree ptrtype = build_pointer_type (TREE_TYPE (TREE_TYPE (string)));
3093 return build1 (ADDR_EXPR, ptrtype, string);
3096 static hashval_t
3097 string_hash (const void *ptr)
3099 const_tree const str = ((const struct string_descriptor *)ptr)->literal;
3100 const unsigned char *p = (const unsigned char *) TREE_STRING_POINTER (str);
3101 int i, len = TREE_STRING_LENGTH (str);
3102 hashval_t h = len;
3104 for (i = 0; i < len; i++)
3105 h = ((h * 613) + p[i]);
3107 return h;
3110 static int
3111 string_eq (const void *ptr1, const void *ptr2)
3113 const_tree const str1 = ((const struct string_descriptor *)ptr1)->literal;
3114 const_tree const str2 = ((const struct string_descriptor *)ptr2)->literal;
3115 int len1 = TREE_STRING_LENGTH (str1);
3117 return (len1 == TREE_STRING_LENGTH (str2)
3118 && !memcmp (TREE_STRING_POINTER (str1), TREE_STRING_POINTER (str2),
3119 len1));
3122 /* Given a chain of STRING_CST's, build a static instance of
3123 NXConstantString which points at the concatenation of those
3124 strings. We place the string object in the __string_objects
3125 section of the __OBJC segment. The Objective-C runtime will
3126 initialize the isa pointers of the string objects to point at the
3127 NXConstantString class object. */
3129 tree
3130 objc_build_string_object (tree string)
3132 tree constant_string_class;
3133 int length;
3134 tree addr;
3135 struct string_descriptor *desc, key;
3136 void **loc;
3138 /* Prep the string argument. */
3139 string = fix_string_type (string);
3140 TREE_SET_CODE (string, STRING_CST);
3141 length = TREE_STRING_LENGTH (string) - 1;
3143 /* The target may have different ideas on how to construct an ObjC string
3144 literal. On Darwin (Mac OS X), for example, we may wish to obtain a
3145 constant CFString reference instead.
3146 At present, this is only supported for the NeXT runtime. */
3147 if (flag_next_runtime
3148 && targetcm.objc_construct_string_object)
3150 tree constructor = (*targetcm.objc_construct_string_object) (string);
3151 if (constructor)
3152 return build1 (NOP_EXPR, objc_object_type, constructor);
3155 /* Check whether the string class being used actually exists and has the
3156 correct ivar layout. */
3157 if (!string_layout_checked)
3159 string_layout_checked = -1;
3160 constant_string_class = lookup_interface (constant_string_id);
3161 internal_const_str_type = objc_build_internal_const_str_type ();
3163 if (!constant_string_class
3164 || !(constant_string_type
3165 = CLASS_STATIC_TEMPLATE (constant_string_class)))
3166 error ("cannot find interface declaration for %qE",
3167 constant_string_id);
3168 /* The NSConstantString/NXConstantString ivar layout is now known. */
3169 else if (!check_string_class_template ())
3170 error ("interface %qE does not have valid constant string layout",
3171 constant_string_id);
3172 /* If the runtime can generate a literal reference to the string class,
3173 don't need to run a constructor. */
3174 else if (!(*runtime.setup_const_string_class_decl)())
3175 error ("cannot find reference tag for class %qE", constant_string_id);
3176 else
3178 string_layout_checked = 1; /* Success! */
3179 add_class_reference (constant_string_id);
3183 if (string_layout_checked == -1)
3184 return error_mark_node;
3186 /* Perhaps we already constructed a constant string just like this one? */
3187 key.literal = string;
3188 loc = htab_find_slot (string_htab, &key, INSERT);
3189 desc = (struct string_descriptor *) *loc;
3191 if (!desc)
3193 *loc = desc = ggc_alloc_string_descriptor ();
3194 desc->literal = string;
3195 desc->constructor =
3196 (*runtime.build_const_string_constructor) (input_location, string, length);
3199 addr = convert (build_pointer_type (constant_string_type),
3200 build_unary_op (input_location,
3201 ADDR_EXPR, desc->constructor, 1));
3203 return addr;
3206 /* Build a static constant CONSTRUCTOR
3207 with type TYPE and elements ELTS. */
3209 tree
3210 objc_build_constructor (tree type, VEC(constructor_elt,gc) *elts)
3212 tree constructor = build_constructor (type, elts);
3214 TREE_CONSTANT (constructor) = 1;
3215 TREE_STATIC (constructor) = 1;
3216 TREE_READONLY (constructor) = 1;
3218 #ifdef OBJCPLUS
3219 /* Adjust for impedance mismatch. We should figure out how to build
3220 CONSTRUCTORs that consistently please both the C and C++ gods. */
3221 if (!VEC_index (constructor_elt, elts, 0)->index)
3222 TREE_TYPE (constructor) = init_list_type_node;
3223 #endif
3225 return constructor;
3228 /* Return the DECL of the string IDENT in the SECTION. */
3230 tree
3231 get_objc_string_decl (tree ident, enum string_section section)
3233 tree chain;
3235 switch (section)
3237 case class_names:
3238 chain = class_names_chain;
3239 break;
3240 case meth_var_names:
3241 chain = meth_var_names_chain;
3242 break;
3243 case meth_var_types:
3244 chain = meth_var_types_chain;
3245 break;
3246 case prop_names_attr:
3247 chain = prop_names_attr_chain;
3248 break;
3249 default:
3250 gcc_unreachable ();
3253 for (; chain != 0; chain = TREE_CHAIN (chain))
3254 if (TREE_VALUE (chain) == ident)
3255 return (TREE_PURPOSE (chain));
3257 /* We didn't find the entry. */
3258 return NULL_TREE;
3261 /* Create a class reference, but don't create a variable to reference
3262 it. */
3264 void
3265 add_class_reference (tree ident)
3267 tree chain;
3269 if ((chain = cls_ref_chain))
3271 tree tail;
3274 if (ident == TREE_VALUE (chain))
3275 return;
3277 tail = chain;
3278 chain = TREE_CHAIN (chain);
3280 while (chain);
3282 /* Append to the end of the list */
3283 TREE_CHAIN (tail) = tree_cons (NULL_TREE, ident, NULL_TREE);
3285 else
3286 cls_ref_chain = tree_cons (NULL_TREE, ident, NULL_TREE);
3289 /* Get a class reference, creating it if necessary. Also create the
3290 reference variable. */
3291 tree
3292 objc_get_class_reference (tree ident)
3294 tree orig_ident = (DECL_P (ident)
3295 ? DECL_NAME (ident)
3296 : TYPE_P (ident)
3297 ? OBJC_TYPE_NAME (ident)
3298 : ident);
3299 bool local_scope = false;
3301 #ifdef OBJCPLUS
3302 if (processing_template_decl)
3303 /* Must wait until template instantiation time. */
3304 return build_min_nt (CLASS_REFERENCE_EXPR, ident);
3305 #endif
3307 if (TREE_CODE (ident) == TYPE_DECL)
3308 ident = (DECL_ORIGINAL_TYPE (ident)
3309 ? DECL_ORIGINAL_TYPE (ident)
3310 : TREE_TYPE (ident));
3312 #ifdef OBJCPLUS
3313 if (TYPE_P (ident)
3314 && CP_TYPE_CONTEXT (ident) != global_namespace)
3315 local_scope = true;
3316 #endif
3318 if (local_scope || !(ident = objc_is_class_name (ident)))
3320 error ("%qE is not an Objective-C class name or alias",
3321 orig_ident);
3322 return error_mark_node;
3325 return (*runtime.get_class_reference) (ident);
3328 void
3329 objc_declare_alias (tree alias_ident, tree class_ident)
3331 tree underlying_class;
3333 #ifdef OBJCPLUS
3334 if (current_namespace != global_namespace) {
3335 error ("Objective-C declarations may only appear in global scope");
3337 #endif /* OBJCPLUS */
3339 if (!(underlying_class = objc_is_class_name (class_ident)))
3340 warning (0, "cannot find class %qE", class_ident);
3341 else if (objc_is_class_name (alias_ident))
3342 warning (0, "class %qE already exists", alias_ident);
3343 else
3345 /* Implement @compatibility_alias as a typedef. */
3346 #ifdef OBJCPLUS
3347 push_lang_context (lang_name_c); /* extern "C" */
3348 #endif
3349 lang_hooks.decls.pushdecl (build_decl
3350 (input_location,
3351 TYPE_DECL,
3352 alias_ident,
3353 xref_tag (RECORD_TYPE, underlying_class)));
3354 #ifdef OBJCPLUS
3355 pop_lang_context ();
3356 #endif
3357 hash_class_name_enter (als_name_hash_list, alias_ident,
3358 underlying_class);
3362 void
3363 objc_declare_class (tree identifier)
3365 #ifdef OBJCPLUS
3366 if (current_namespace != global_namespace) {
3367 error ("Objective-C declarations may only appear in global scope");
3369 #endif /* OBJCPLUS */
3371 if (! objc_is_class_name (identifier))
3373 tree record = lookup_name (identifier), type = record;
3375 if (record)
3377 if (TREE_CODE (record) == TYPE_DECL)
3378 type = DECL_ORIGINAL_TYPE (record)
3379 ? DECL_ORIGINAL_TYPE (record)
3380 : TREE_TYPE (record);
3382 if (!TYPE_HAS_OBJC_INFO (type)
3383 || !TYPE_OBJC_INTERFACE (type))
3385 error ("%qE redeclared as different kind of symbol",
3386 identifier);
3387 error ("previous declaration of %q+D",
3388 record);
3392 record = xref_tag (RECORD_TYPE, identifier);
3393 INIT_TYPE_OBJC_INFO (record);
3394 /* In the case of a @class declaration, we store the ident in
3395 the TYPE_OBJC_INTERFACE. If later an @interface is found,
3396 we'll replace the ident with the interface. */
3397 TYPE_OBJC_INTERFACE (record) = identifier;
3398 hash_class_name_enter (cls_name_hash_list, identifier, NULL_TREE);
3402 tree
3403 objc_is_class_name (tree ident)
3405 hash target;
3407 if (ident && TREE_CODE (ident) == IDENTIFIER_NODE)
3409 tree t = identifier_global_value (ident);
3410 if (t)
3411 ident = t;
3414 while (ident && TREE_CODE (ident) == TYPE_DECL && DECL_ORIGINAL_TYPE (ident))
3415 ident = OBJC_TYPE_NAME (DECL_ORIGINAL_TYPE (ident));
3417 if (ident && TREE_CODE (ident) == RECORD_TYPE)
3418 ident = OBJC_TYPE_NAME (ident);
3419 #ifdef OBJCPLUS
3420 if (ident && TREE_CODE (ident) == TYPE_DECL)
3422 tree type = TREE_TYPE (ident);
3423 if (type && TREE_CODE (type) == TEMPLATE_TYPE_PARM)
3424 return NULL_TREE;
3425 ident = DECL_NAME (ident);
3427 #endif
3428 if (!ident || TREE_CODE (ident) != IDENTIFIER_NODE)
3429 return NULL_TREE;
3431 if (lookup_interface (ident))
3432 return ident;
3434 target = hash_class_name_lookup (cls_name_hash_list, ident);
3435 if (target)
3436 return target->key;
3438 target = hash_class_name_lookup (als_name_hash_list, ident);
3439 if (target)
3441 gcc_assert (target->list && target->list->value);
3442 return target->list->value;
3445 return 0;
3448 /* Check whether TYPE is either 'id' or 'Class'. */
3450 tree
3451 objc_is_id (tree type)
3453 if (type && TREE_CODE (type) == IDENTIFIER_NODE)
3455 tree t = identifier_global_value (type);
3456 if (t)
3457 type = t;
3460 if (type && TREE_CODE (type) == TYPE_DECL)
3461 type = TREE_TYPE (type);
3463 /* NB: This function may be called before the ObjC front-end has
3464 been initialized, in which case OBJC_OBJECT_TYPE will (still) be NULL. */
3465 return (objc_object_type && type
3466 && (IS_ID (type) || IS_CLASS (type) || IS_SUPER (type))
3467 ? type
3468 : NULL_TREE);
3471 /* Check whether TYPE is either 'id', 'Class', or a pointer to an ObjC
3472 class instance. This is needed by other parts of the compiler to
3473 handle ObjC types gracefully. */
3475 tree
3476 objc_is_object_ptr (tree type)
3478 tree ret;
3480 type = TYPE_MAIN_VARIANT (type);
3481 if (!POINTER_TYPE_P (type))
3482 return 0;
3484 ret = objc_is_id (type);
3485 if (!ret)
3486 ret = objc_is_class_name (TREE_TYPE (type));
3488 return ret;
3491 static int
3492 objc_is_gcable_type (tree type, int or_strong_p)
3494 tree name;
3496 if (!TYPE_P (type))
3497 return 0;
3498 if (objc_is_id (TYPE_MAIN_VARIANT (type)))
3499 return 1;
3500 if (or_strong_p && lookup_attribute ("objc_gc", TYPE_ATTRIBUTES (type)))
3501 return 1;
3502 if (TREE_CODE (type) != POINTER_TYPE && TREE_CODE (type) != INDIRECT_REF)
3503 return 0;
3504 type = TREE_TYPE (type);
3505 if (TREE_CODE (type) != RECORD_TYPE)
3506 return 0;
3507 name = TYPE_NAME (type);
3508 return (objc_is_class_name (name) != NULL_TREE);
3511 static tree
3512 objc_substitute_decl (tree expr, tree oldexpr, tree newexpr)
3514 if (expr == oldexpr)
3515 return newexpr;
3517 switch (TREE_CODE (expr))
3519 case COMPONENT_REF:
3520 return objc_build_component_ref
3521 (objc_substitute_decl (TREE_OPERAND (expr, 0),
3522 oldexpr,
3523 newexpr),
3524 DECL_NAME (TREE_OPERAND (expr, 1)));
3525 case ARRAY_REF:
3526 return build_array_ref (input_location,
3527 objc_substitute_decl (TREE_OPERAND (expr, 0),
3528 oldexpr,
3529 newexpr),
3530 TREE_OPERAND (expr, 1));
3531 case INDIRECT_REF:
3532 return build_indirect_ref (input_location,
3533 objc_substitute_decl (TREE_OPERAND (expr, 0),
3534 oldexpr,
3535 newexpr), RO_ARROW);
3536 default:
3537 return expr;
3541 static tree
3542 objc_build_ivar_assignment (tree outervar, tree lhs, tree rhs)
3544 tree func_params;
3545 /* The LHS parameter contains the expression 'outervar->memberspec';
3546 we need to transform it into '&((typeof(outervar) *) 0)->memberspec',
3547 where memberspec may be arbitrarily complex (e.g., 'g->f.d[2].g[3]').
3549 tree offs
3550 = objc_substitute_decl
3551 (lhs, outervar, convert (TREE_TYPE (outervar), integer_zero_node));
3552 tree func
3553 = (flag_objc_direct_dispatch
3554 ? objc_assign_ivar_fast_decl
3555 : objc_assign_ivar_decl);
3557 offs = convert (integer_type_node, build_unary_op (input_location,
3558 ADDR_EXPR, offs, 0));
3559 offs = fold (offs);
3560 func_params = tree_cons (NULL_TREE,
3561 convert (objc_object_type, rhs),
3562 tree_cons (NULL_TREE, convert (objc_object_type, outervar),
3563 tree_cons (NULL_TREE, offs,
3564 NULL_TREE)));
3566 assemble_external (func);
3567 return build_function_call (input_location, func, func_params);
3570 static tree
3571 objc_build_global_assignment (tree lhs, tree rhs)
3573 tree func_params = tree_cons (NULL_TREE,
3574 convert (objc_object_type, rhs),
3575 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3576 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3577 NULL_TREE));
3579 assemble_external (objc_assign_global_decl);
3580 return build_function_call (input_location,
3581 objc_assign_global_decl, func_params);
3584 static tree
3585 objc_build_strong_cast_assignment (tree lhs, tree rhs)
3587 tree func_params = tree_cons (NULL_TREE,
3588 convert (objc_object_type, rhs),
3589 tree_cons (NULL_TREE, convert (build_pointer_type (objc_object_type),
3590 build_unary_op (input_location, ADDR_EXPR, lhs, 0)),
3591 NULL_TREE));
3593 assemble_external (objc_assign_strong_cast_decl);
3594 return build_function_call (input_location,
3595 objc_assign_strong_cast_decl, func_params);
3598 static int
3599 objc_is_gcable_p (tree expr)
3601 return (TREE_CODE (expr) == COMPONENT_REF
3602 ? objc_is_gcable_p (TREE_OPERAND (expr, 1))
3603 : TREE_CODE (expr) == ARRAY_REF
3604 ? (objc_is_gcable_p (TREE_TYPE (expr))
3605 || objc_is_gcable_p (TREE_OPERAND (expr, 0)))
3606 : TREE_CODE (expr) == ARRAY_TYPE
3607 ? objc_is_gcable_p (TREE_TYPE (expr))
3608 : TYPE_P (expr)
3609 ? objc_is_gcable_type (expr, 1)
3610 : (objc_is_gcable_p (TREE_TYPE (expr))
3611 || (DECL_P (expr)
3612 && lookup_attribute ("objc_gc", DECL_ATTRIBUTES (expr)))));
3615 static int
3616 objc_is_ivar_reference_p (tree expr)
3618 return (TREE_CODE (expr) == ARRAY_REF
3619 ? objc_is_ivar_reference_p (TREE_OPERAND (expr, 0))
3620 : TREE_CODE (expr) == COMPONENT_REF
3621 ? TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL
3622 : 0);
3625 static int
3626 objc_is_global_reference_p (tree expr)
3628 return (TREE_CODE (expr) == INDIRECT_REF || TREE_CODE (expr) == PLUS_EXPR
3629 ? objc_is_global_reference_p (TREE_OPERAND (expr, 0))
3630 : DECL_P (expr)
3631 ? (DECL_FILE_SCOPE_P (expr) || TREE_STATIC (expr))
3632 : 0);
3635 tree
3636 objc_generate_write_barrier (tree lhs, enum tree_code modifycode, tree rhs)
3638 tree result = NULL_TREE, outer;
3639 int strong_cast_p = 0, outer_gc_p = 0, indirect_p = 0;
3641 /* This function is currently only used with the next runtime with
3642 garbage collection enabled (-fobjc-gc). */
3643 gcc_assert (flag_next_runtime);
3645 /* See if we have any lhs casts, and strip them out. NB: The lvalue casts
3646 will have been transformed to the form '*(type *)&expr'. */
3647 if (TREE_CODE (lhs) == INDIRECT_REF)
3649 outer = TREE_OPERAND (lhs, 0);
3651 while (!strong_cast_p
3652 && (CONVERT_EXPR_P (outer)
3653 || TREE_CODE (outer) == NON_LVALUE_EXPR))
3655 tree lhstype = TREE_TYPE (outer);
3657 /* Descend down the cast chain, and record the first objc_gc
3658 attribute found. */
3659 if (POINTER_TYPE_P (lhstype))
3661 tree attr
3662 = lookup_attribute ("objc_gc",
3663 TYPE_ATTRIBUTES (TREE_TYPE (lhstype)));
3665 if (attr)
3666 strong_cast_p = 1;
3669 outer = TREE_OPERAND (outer, 0);
3673 /* If we have a __strong cast, it trumps all else. */
3674 if (strong_cast_p)
3676 if (modifycode != NOP_EXPR)
3677 goto invalid_pointer_arithmetic;
3679 if (warn_assign_intercept)
3680 warning (0, "strong-cast assignment has been intercepted");
3682 result = objc_build_strong_cast_assignment (lhs, rhs);
3684 goto exit_point;
3687 /* the lhs must be of a suitable type, regardless of its underlying
3688 structure. */
3689 if (!objc_is_gcable_p (lhs))
3690 goto exit_point;
3692 outer = lhs;
3694 while (outer
3695 && (TREE_CODE (outer) == COMPONENT_REF
3696 || TREE_CODE (outer) == ARRAY_REF))
3697 outer = TREE_OPERAND (outer, 0);
3699 if (TREE_CODE (outer) == INDIRECT_REF)
3701 outer = TREE_OPERAND (outer, 0);
3702 indirect_p = 1;
3705 outer_gc_p = objc_is_gcable_p (outer);
3707 /* Handle ivar assignments. */
3708 if (objc_is_ivar_reference_p (lhs))
3710 /* if the struct to the left of the ivar is not an Objective-C object (__strong
3711 doesn't cut it here), the best we can do here is suggest a cast. */
3712 if (!objc_is_gcable_type (TREE_TYPE (outer), 0))
3714 /* We may still be able to use the global write barrier... */
3715 if (!indirect_p && objc_is_global_reference_p (outer))
3716 goto global_reference;
3718 suggest_cast:
3719 if (modifycode == NOP_EXPR)
3721 if (warn_assign_intercept)
3722 warning (0, "strong-cast may possibly be needed");
3725 goto exit_point;
3728 if (modifycode != NOP_EXPR)
3729 goto invalid_pointer_arithmetic;
3731 if (warn_assign_intercept)
3732 warning (0, "instance variable assignment has been intercepted");
3734 result = objc_build_ivar_assignment (outer, lhs, rhs);
3736 goto exit_point;
3739 /* Likewise, intercept assignment to global/static variables if their type is
3740 GC-marked. */
3741 if (objc_is_global_reference_p (outer))
3743 if (indirect_p)
3744 goto suggest_cast;
3746 global_reference:
3747 if (modifycode != NOP_EXPR)
3749 invalid_pointer_arithmetic:
3750 if (outer_gc_p)
3751 warning (0, "pointer arithmetic for garbage-collected objects not allowed");
3753 goto exit_point;
3756 if (warn_assign_intercept)
3757 warning (0, "global/static variable assignment has been intercepted");
3759 result = objc_build_global_assignment (lhs, rhs);
3762 /* In all other cases, fall back to the normal mechanism. */
3763 exit_point:
3764 return result;
3767 struct GTY(()) interface_tuple {
3768 tree id;
3769 tree class_name;
3772 static GTY ((param_is (struct interface_tuple))) htab_t interface_htab;
3774 static hashval_t
3775 hash_interface (const void *p)
3777 const struct interface_tuple *d = (const struct interface_tuple *) p;
3778 return IDENTIFIER_HASH_VALUE (d->id);
3781 static int
3782 eq_interface (const void *p1, const void *p2)
3784 const struct interface_tuple *d = (const struct interface_tuple *) p1;
3785 return d->id == p2;
3788 tree
3789 lookup_interface (tree ident)
3791 #ifdef OBJCPLUS
3792 if (ident && TREE_CODE (ident) == TYPE_DECL)
3793 ident = DECL_NAME (ident);
3794 #endif
3796 if (ident == NULL_TREE || TREE_CODE (ident) != IDENTIFIER_NODE)
3797 return NULL_TREE;
3800 struct interface_tuple **slot;
3801 tree i = NULL_TREE;
3803 if (interface_htab)
3805 slot = (struct interface_tuple **)
3806 htab_find_slot_with_hash (interface_htab, ident,
3807 IDENTIFIER_HASH_VALUE (ident),
3808 NO_INSERT);
3809 if (slot && *slot)
3810 i = (*slot)->class_name;
3812 return i;
3816 /* Implement @defs (<classname>) within struct bodies. */
3818 tree
3819 objc_get_class_ivars (tree class_name)
3821 tree interface = lookup_interface (class_name);
3823 if (interface)
3824 return get_class_ivars (interface, true);
3826 error ("cannot find interface declaration for %qE",
3827 class_name);
3829 return error_mark_node;
3832 /* Called when checking the variables in a struct. If we are not
3833 doing the ivars list inside an @interface context, then returns
3834 fieldlist unchanged. Else, returns the list of class ivars.
3836 tree
3837 objc_get_interface_ivars (tree fieldlist)
3839 if (!objc_collecting_ivars || !objc_interface_context
3840 || TREE_CODE (objc_interface_context) != CLASS_INTERFACE_TYPE
3841 || CLASS_SUPER_NAME (objc_interface_context) == NULL_TREE)
3842 return fieldlist;
3844 return get_class_ivars (objc_interface_context, true);
3847 /* Used by: build_private_template, continue_class,
3848 and for @defs constructs. */
3850 static tree
3851 get_class_ivars (tree interface, bool inherited)
3853 tree ivar_chain = copy_list (CLASS_RAW_IVARS (interface));
3855 /* Both CLASS_RAW_IVARS and CLASS_IVARS contain a list of ivars declared
3856 by the current class (i.e., they do not include super-class ivars).
3857 However, the CLASS_IVARS list will be side-effected by a call to
3858 finish_struct(), which will fill in field offsets. */
3859 if (!CLASS_IVARS (interface))
3860 CLASS_IVARS (interface) = ivar_chain;
3862 if (!inherited)
3863 return ivar_chain;
3865 while (CLASS_SUPER_NAME (interface))
3867 /* Prepend super-class ivars. */
3868 interface = lookup_interface (CLASS_SUPER_NAME (interface));
3869 ivar_chain = chainon (copy_list (CLASS_RAW_IVARS (interface)),
3870 ivar_chain);
3873 return ivar_chain;
3876 void
3877 objc_maybe_warn_exceptions (location_t loc)
3879 /* -fobjc-exceptions is required to enable Objective-C exceptions.
3880 For example, on Darwin, ObjC exceptions require a sufficiently
3881 recent version of the runtime, so the user must ask for them
3882 explicitly. On other platforms, at the moment -fobjc-exceptions
3883 triggers -fexceptions which again is required for exceptions to
3884 work. */
3885 if (!flag_objc_exceptions)
3887 /* Warn only once per compilation unit. */
3888 static bool warned = false;
3890 if (!warned)
3892 error_at (loc, "%<-fobjc-exceptions%> is required to enable Objective-C exception syntax");
3893 warned = true;
3898 static struct objc_try_context *cur_try_context;
3900 /* Called just after parsing the @try and its associated BODY. We now
3901 must prepare for the tricky bits -- handling the catches and finally. */
3903 void
3904 objc_begin_try_stmt (location_t try_locus, tree body)
3906 struct objc_try_context *c = XCNEW (struct objc_try_context);
3907 c->outer = cur_try_context;
3908 c->try_body = body;
3909 c->try_locus = try_locus;
3910 c->end_try_locus = input_location;
3911 cur_try_context = c;
3913 /* Collect the list of local variables. We'll mark them as volatile
3914 at the end of compilation of this function to prevent them being
3915 clobbered by setjmp/longjmp. */
3916 if (flag_objc_sjlj_exceptions)
3917 objc_mark_locals_volatile (NULL);
3920 /* Called just after parsing "@catch (parm)". Open a binding level,
3921 enter DECL into the binding level, and initialize it. Leave the
3922 binding level open while the body of the compound statement is
3923 parsed. If DECL is NULL_TREE, then we are compiling "@catch(...)"
3924 which we compile as "@catch(id tmp_variable)". */
3926 void
3927 objc_begin_catch_clause (tree decl)
3929 tree compound, type, t;
3930 bool ellipsis = false;
3932 /* Begin a new scope that the entire catch clause will live in. */
3933 compound = c_begin_compound_stmt (true);
3935 /* Create the appropriate declaration for the argument. */
3936 if (decl == error_mark_node)
3937 type = error_mark_node;
3938 else
3940 if (decl == NULL_TREE)
3942 /* If @catch(...) was specified, create a temporary variable of
3943 type 'id' and use it. */
3944 decl = objc_create_temporary_var (objc_object_type, "__objc_generic_catch_var");
3945 DECL_SOURCE_LOCATION (decl) = input_location;
3946 /* ... but allow the runtime to differentiate between ellipsis and the
3947 case of @catch (id xyz). */
3948 ellipsis = true;
3950 else
3952 /* The parser passed in a PARM_DECL, but what we really want is a VAR_DECL. */
3953 decl = build_decl (input_location,
3954 VAR_DECL, DECL_NAME (decl), TREE_TYPE (decl));
3956 lang_hooks.decls.pushdecl (decl);
3958 /* Mark the declaration as used so you never any warnings whether
3959 you use the exception argument or not. TODO: Implement a
3960 -Wunused-exception-parameter flag, which would cause warnings
3961 if exception parameter is not used. */
3962 TREE_USED (decl) = 1;
3963 DECL_READ_P (decl) = 1;
3965 type = TREE_TYPE (decl);
3968 /* Verify that the type of the catch is valid. It must be a pointer
3969 to an Objective-C class, or "id" (which is catch-all). */
3970 if (type == error_mark_node)
3972 ;/* Just keep going. */
3974 else if (!objc_type_valid_for_messaging (type, false))
3976 error ("@catch parameter is not a known Objective-C class type");
3977 type = error_mark_node;
3979 else if (TYPE_HAS_OBJC_INFO (TREE_TYPE (type))
3980 && TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (type)))
3982 error ("@catch parameter can not be protocol-qualified");
3983 type = error_mark_node;
3985 else if (POINTER_TYPE_P (type) && objc_is_object_id (TREE_TYPE (type)))
3986 /* @catch (id xyz) or @catch (...) but we note this for runtimes that
3987 identify 'id'. */
3989 else
3991 /* If 'type' was built using typedefs, we need to get rid of
3992 them and get a simple pointer to the class. */
3993 bool is_typedef = false;
3994 tree x = TYPE_MAIN_VARIANT (type);
3996 /* Skip from the pointer to the pointee. */
3997 if (TREE_CODE (x) == POINTER_TYPE)
3998 x = TREE_TYPE (x);
4000 /* Traverse typedef aliases */
4001 while (TREE_CODE (x) == RECORD_TYPE && OBJC_TYPE_NAME (x)
4002 && TREE_CODE (OBJC_TYPE_NAME (x)) == TYPE_DECL
4003 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (x)))
4005 is_typedef = true;
4006 x = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (x));
4009 /* If it was a typedef, build a pointer to the final, original
4010 class. */
4011 if (is_typedef)
4012 type = build_pointer_type (x);
4014 if (cur_try_context->catch_list)
4016 /* Examine previous @catch clauses and see if we've already
4017 caught the type in question. */
4018 tree_stmt_iterator i = tsi_start (cur_try_context->catch_list);
4019 for (; !tsi_end_p (i); tsi_next (&i))
4021 tree stmt = tsi_stmt (i);
4022 t = CATCH_TYPES (stmt);
4023 if (t == error_mark_node)
4024 continue;
4025 if (!t || DERIVED_FROM_P (TREE_TYPE (t), TREE_TYPE (type)))
4027 warning (0, "exception of type %<%T%> will be caught",
4028 TREE_TYPE (type));
4029 warning_at (EXPR_LOCATION (stmt), 0, " by earlier handler for %<%T%>",
4030 TREE_TYPE (t ? t : objc_object_type));
4031 break;
4037 t = (*runtime.begin_catch) (&cur_try_context, type, decl, compound, ellipsis);
4038 add_stmt (t);
4041 /* Called just after parsing the closing brace of a @catch clause. Close
4042 the open binding level, and record a CATCH_EXPR for it. */
4044 void
4045 objc_finish_catch_clause (void)
4047 tree c = cur_try_context->current_catch;
4048 cur_try_context->current_catch = NULL;
4049 cur_try_context->end_catch_locus = input_location;
4051 CATCH_BODY (c) = c_end_compound_stmt (input_location, CATCH_BODY (c), 1);
4053 (*runtime.finish_catch) (&cur_try_context, c);
4056 /* Called after parsing a @finally clause and its associated BODY.
4057 Record the body for later placement. */
4059 void
4060 objc_build_finally_clause (location_t finally_locus, tree body)
4062 cur_try_context->finally_body = body;
4063 cur_try_context->finally_locus = finally_locus;
4064 cur_try_context->end_finally_locus = input_location;
4067 /* Called to finalize a @try construct. */
4069 tree
4070 objc_finish_try_stmt (void)
4072 struct objc_try_context *c = cur_try_context;
4073 tree stmt;
4075 if (c->catch_list == NULL && c->finally_body == NULL)
4076 error ("%<@try%> without %<@catch%> or %<@finally%>");
4078 stmt = (*runtime.finish_try_stmt) (&cur_try_context);
4079 add_stmt (stmt);
4081 cur_try_context = c->outer;
4082 free (c);
4083 return stmt;
4086 tree
4087 objc_build_throw_stmt (location_t loc, tree throw_expr)
4089 bool rethrown = false;
4091 objc_maybe_warn_exceptions (loc);
4093 /* Don't waste time trying to build something if we're already dead. */
4094 if (throw_expr == error_mark_node)
4095 return error_mark_node;
4097 if (throw_expr == NULL)
4099 /* If we're not inside a @catch block, there is no "current
4100 exception" to be rethrown. */
4101 if (cur_try_context == NULL
4102 || cur_try_context->current_catch == NULL)
4104 error_at (loc, "%<@throw%> (rethrow) used outside of a @catch block");
4105 return error_mark_node;
4108 /* Otherwise the object is still sitting in the EXC_PTR_EXPR
4109 value that we get from the runtime. */
4110 throw_expr = (*runtime.build_exc_ptr) (&cur_try_context);
4111 rethrown = true;
4113 else
4115 if (!objc_type_valid_for_messaging (TREE_TYPE (throw_expr), true))
4117 error_at (loc, "%<@throw%> argument is not an object");
4118 return error_mark_node;
4122 return (*runtime.build_throw_stmt) (loc, throw_expr, rethrown);
4125 tree
4126 objc_build_synchronized (location_t start_locus, tree object_expr, tree body)
4128 /* object_expr should never be NULL; but in case it is, convert it to
4129 error_mark_node. */
4130 if (object_expr == NULL)
4131 object_expr = error_mark_node;
4133 /* Validate object_expr. If not valid, set it to error_mark_node. */
4134 if (object_expr != error_mark_node)
4136 if (!objc_type_valid_for_messaging (TREE_TYPE (object_expr), true))
4138 error_at (start_locus, "%<@synchronized%> argument is not an object");
4139 object_expr = error_mark_node;
4143 if (object_expr == error_mark_node)
4145 /* If we found an error, we simply ignore the '@synchronized'.
4146 Compile the body so we can keep going with minimal
4147 casualties. */
4148 return add_stmt (body);
4150 else
4152 tree call;
4153 tree args;
4155 /* objc_sync_enter (object_expr); */
4156 object_expr = save_expr (object_expr);
4157 args = tree_cons (NULL, object_expr, NULL);
4158 call = build_function_call (input_location,
4159 objc_sync_enter_decl, args);
4160 SET_EXPR_LOCATION (call, start_locus);
4161 add_stmt (call);
4163 /* Build "objc_sync_exit (object_expr);" but do not add it yet;
4164 it goes inside the @finalize() clause. */
4165 args = tree_cons (NULL, object_expr, NULL);
4166 call = build_function_call (input_location,
4167 objc_sync_exit_decl, args);
4168 SET_EXPR_LOCATION (call, input_location);
4170 /* @try { body; } */
4171 objc_begin_try_stmt (start_locus, body);
4173 /* @finally { objc_sync_exit (object_expr); } */
4174 objc_build_finally_clause (input_location, call);
4176 /* End of try statement. */
4177 return objc_finish_try_stmt ();
4181 /* Construct a C struct corresponding to ObjC class CLASS, with the same
4182 name as the class:
4184 struct <classname> {
4185 struct _objc_class *isa;
4187 }; */
4189 static void
4190 build_private_template (tree klass)
4192 if (!CLASS_STATIC_TEMPLATE (klass))
4194 tree record = objc_build_struct (klass,
4195 get_class_ivars (klass, false),
4196 CLASS_SUPER_NAME (klass));
4198 /* Set the TREE_USED bit for this struct, so that stab generator
4199 can emit stabs for this struct type. */
4200 if (flag_debug_only_used_symbols && TYPE_STUB_DECL (record))
4201 TREE_USED (TYPE_STUB_DECL (record)) = 1;
4203 /* Copy the attributes from the class to the type. */
4204 if (TREE_DEPRECATED (klass))
4205 TREE_DEPRECATED (record) = 1;
4209 /* Begin code generation for protocols... */
4211 static tree
4212 objc_method_parm_type (tree type)
4214 type = TREE_VALUE (TREE_TYPE (type));
4215 if (TREE_CODE (type) == TYPE_DECL)
4216 type = TREE_TYPE (type);
4217 return type;
4220 static int
4221 objc_encoded_type_size (tree type)
4223 int sz = int_size_in_bytes (type);
4225 /* Make all integer and enum types at least as large
4226 as an int. */
4227 if (sz > 0 && INTEGRAL_TYPE_P (type))
4228 sz = MAX (sz, int_size_in_bytes (integer_type_node));
4229 /* Treat arrays as pointers, since that's how they're
4230 passed in. */
4231 else if (TREE_CODE (type) == ARRAY_TYPE)
4232 sz = int_size_in_bytes (ptr_type_node);
4233 return sz;
4236 /* Encode a method prototype.
4238 The format is described in gcc/doc/objc.texi, section 'Method
4239 signatures'.
4242 tree
4243 encode_method_prototype (tree method_decl)
4245 tree parms;
4246 int parm_offset, i;
4247 char buf[40];
4248 tree result;
4250 /* ONEWAY and BYCOPY, for remote object are the only method qualifiers. */
4251 encode_type_qualifiers (TREE_PURPOSE (TREE_TYPE (method_decl)));
4253 /* Encode return type. */
4254 encode_type (objc_method_parm_type (method_decl),
4255 obstack_object_size (&util_obstack),
4256 OBJC_ENCODE_INLINE_DEFS);
4258 /* Stack size. */
4259 /* The first two arguments (self and _cmd) are pointers; account for
4260 their size. */
4261 i = int_size_in_bytes (ptr_type_node);
4262 parm_offset = 2 * i;
4263 for (parms = METHOD_SEL_ARGS (method_decl); parms;
4264 parms = DECL_CHAIN (parms))
4266 tree type = objc_method_parm_type (parms);
4267 int sz = objc_encoded_type_size (type);
4269 /* If a type size is not known, bail out. */
4270 if (sz < 0)
4272 error_at (DECL_SOURCE_LOCATION (method_decl),
4273 "type %qT does not have a known size",
4274 type);
4275 /* Pretend that the encoding succeeded; the compilation will
4276 fail nevertheless. */
4277 goto finish_encoding;
4279 parm_offset += sz;
4282 sprintf (buf, "%d@0:%d", parm_offset, i);
4283 obstack_grow (&util_obstack, buf, strlen (buf));
4285 /* Argument types. */
4286 parm_offset = 2 * i;
4287 for (parms = METHOD_SEL_ARGS (method_decl); parms;
4288 parms = DECL_CHAIN (parms))
4290 tree type = objc_method_parm_type (parms);
4292 /* Process argument qualifiers for user supplied arguments. */
4293 encode_type_qualifiers (TREE_PURPOSE (TREE_TYPE (parms)));
4295 /* Type. */
4296 encode_type (type, obstack_object_size (&util_obstack),
4297 OBJC_ENCODE_INLINE_DEFS);
4299 /* Compute offset. */
4300 sprintf (buf, "%d", parm_offset);
4301 parm_offset += objc_encoded_type_size (type);
4303 obstack_grow (&util_obstack, buf, strlen (buf));
4306 finish_encoding:
4307 obstack_1grow (&util_obstack, '\0');
4308 result = get_identifier (XOBFINISH (&util_obstack, char *));
4309 obstack_free (&util_obstack, util_firstobj);
4310 return result;
4313 /* Generate either '- .cxx_construct' or '- .cxx_destruct' for the
4314 current class. */
4315 #ifdef OBJCPLUS
4316 static void
4317 objc_generate_cxx_ctor_or_dtor (bool dtor)
4319 tree fn, body, compound_stmt, ivar;
4321 /* - (id) .cxx_construct { ... return self; } */
4322 /* - (void) .cxx_construct { ... } */
4324 objc_start_method_definition
4325 (false /* is_class_method */,
4326 objc_build_method_signature (false /* is_class_method */,
4327 build_tree_list (NULL_TREE,
4328 dtor
4329 ? void_type_node
4330 : objc_object_type),
4331 get_identifier (dtor
4332 ? TAG_CXX_DESTRUCT
4333 : TAG_CXX_CONSTRUCT),
4334 make_node (TREE_LIST),
4335 false), NULL);
4336 body = begin_function_body ();
4337 compound_stmt = begin_compound_stmt (0);
4339 ivar = CLASS_IVARS (implementation_template);
4340 /* Destroy ivars in reverse order. */
4341 if (dtor)
4342 ivar = nreverse (copy_list (ivar));
4344 for (; ivar; ivar = TREE_CHAIN (ivar))
4346 if (TREE_CODE (ivar) == FIELD_DECL)
4348 tree type = TREE_TYPE (ivar);
4350 /* Call the ivar's default constructor or destructor. Do not
4351 call the destructor unless a corresponding constructor call
4352 has also been made (or is not needed). */
4353 if (MAYBE_CLASS_TYPE_P (type)
4354 && (dtor
4355 ? (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4356 && (!TYPE_NEEDS_CONSTRUCTING (type)
4357 || TYPE_HAS_DEFAULT_CONSTRUCTOR (type)))
4358 : (TYPE_NEEDS_CONSTRUCTING (type)
4359 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))))
4360 finish_expr_stmt
4361 (build_special_member_call
4362 (build_ivar_reference (DECL_NAME (ivar)),
4363 dtor ? complete_dtor_identifier : complete_ctor_identifier,
4364 NULL, type, LOOKUP_NORMAL, tf_warning_or_error));
4368 /* The constructor returns 'self'. */
4369 if (!dtor)
4370 finish_return_stmt (self_decl);
4372 finish_compound_stmt (compound_stmt);
4373 finish_function_body (body);
4374 fn = current_function_decl;
4375 finish_function ();
4376 objc_finish_method_definition (fn);
4379 /* The following routine will examine the current @interface for any
4380 non-POD C++ ivars requiring non-trivial construction and/or
4381 destruction, and then synthesize special '- .cxx_construct' and/or
4382 '- .cxx_destruct' methods which will run the appropriate
4383 construction or destruction code. Note that ivars inherited from
4384 super-classes are _not_ considered. */
4385 static void
4386 objc_generate_cxx_cdtors (void)
4388 bool need_ctor = false, need_dtor = false;
4389 tree ivar;
4391 /* Error case, due to possibly an extra @end. */
4392 if (!objc_implementation_context)
4393 return;
4395 /* We do not want to do this for categories, since they do not have
4396 their own ivars. */
4398 if (TREE_CODE (objc_implementation_context) != CLASS_IMPLEMENTATION_TYPE)
4399 return;
4401 /* First, determine if we even need a constructor and/or destructor. */
4403 for (ivar = CLASS_IVARS (implementation_template); ivar;
4404 ivar = TREE_CHAIN (ivar))
4406 if (TREE_CODE (ivar) == FIELD_DECL)
4408 tree type = TREE_TYPE (ivar);
4410 if (MAYBE_CLASS_TYPE_P (type))
4412 if (TYPE_NEEDS_CONSTRUCTING (type)
4413 && TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
4414 /* NB: If a default constructor is not available, we will not
4415 be able to initialize this ivar; the add_instance_variable()
4416 routine will already have warned about this. */
4417 need_ctor = true;
4419 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
4420 && (!TYPE_NEEDS_CONSTRUCTING (type)
4421 || TYPE_HAS_DEFAULT_CONSTRUCTOR (type)))
4422 /* NB: If a default constructor is not available, we will not
4423 call the destructor either, for symmetry. */
4424 need_dtor = true;
4429 /* Generate '- .cxx_construct' if needed. */
4431 if (need_ctor)
4432 objc_generate_cxx_ctor_or_dtor (false);
4434 /* Generate '- .cxx_destruct' if needed. */
4436 if (need_dtor)
4437 objc_generate_cxx_ctor_or_dtor (true);
4439 /* The 'imp_list' variable points at an imp_entry record for the current
4440 @implementation. Record the existence of '- .cxx_construct' and/or
4441 '- .cxx_destruct' methods therein; it will be included in the
4442 metadata for the class if the runtime needs it. */
4443 imp_list->has_cxx_cdtors = (need_ctor || need_dtor);
4445 #endif
4447 static void
4448 error_with_ivar (const char *message, tree decl)
4450 error_at (DECL_SOURCE_LOCATION (decl), "%s %qs",
4451 message, identifier_to_locale (gen_declaration (decl)));
4455 static void
4456 check_ivars (tree inter, tree imp)
4458 tree intdecls = CLASS_RAW_IVARS (inter);
4459 tree impdecls = CLASS_RAW_IVARS (imp);
4461 while (1)
4463 tree t1, t2;
4465 #ifdef OBJCPLUS
4466 if (intdecls && TREE_CODE (intdecls) == TYPE_DECL)
4467 intdecls = TREE_CHAIN (intdecls);
4468 #endif
4469 if (intdecls == 0 && impdecls == 0)
4470 break;
4471 if (intdecls == 0 || impdecls == 0)
4473 error ("inconsistent instance variable specification");
4474 break;
4477 t1 = TREE_TYPE (intdecls); t2 = TREE_TYPE (impdecls);
4479 if (!comptypes (t1, t2)
4480 || !tree_int_cst_equal (DECL_INITIAL (intdecls),
4481 DECL_INITIAL (impdecls)))
4483 if (DECL_NAME (intdecls) == DECL_NAME (impdecls))
4485 error_with_ivar ("conflicting instance variable type",
4486 impdecls);
4487 error_with_ivar ("previous declaration of",
4488 intdecls);
4490 else /* both the type and the name don't match */
4492 error ("inconsistent instance variable specification");
4493 break;
4497 else if (DECL_NAME (intdecls) != DECL_NAME (impdecls))
4499 error_with_ivar ("conflicting instance variable name",
4500 impdecls);
4501 error_with_ivar ("previous declaration of",
4502 intdecls);
4505 intdecls = DECL_CHAIN (intdecls);
4506 impdecls = DECL_CHAIN (impdecls);
4511 static void
4512 mark_referenced_methods (void)
4514 struct imp_entry *impent;
4515 tree chain;
4517 for (impent = imp_list; impent; impent = impent->next)
4519 chain = CLASS_CLS_METHODS (impent->imp_context);
4520 while (chain)
4522 cgraph_mark_needed_node (
4523 cgraph_get_create_node (METHOD_DEFINITION (chain)));
4524 chain = DECL_CHAIN (chain);
4527 chain = CLASS_NST_METHODS (impent->imp_context);
4528 while (chain)
4530 cgraph_mark_needed_node (
4531 cgraph_get_create_node (METHOD_DEFINITION (chain)));
4532 chain = DECL_CHAIN (chain);
4537 /* If type is empty or only type qualifiers are present, add default
4538 type of id (otherwise grokdeclarator will default to int). */
4539 static inline tree
4540 adjust_type_for_id_default (tree type)
4542 if (!type)
4543 type = make_node (TREE_LIST);
4545 if (!TREE_VALUE (type))
4546 TREE_VALUE (type) = objc_object_type;
4547 else if (TREE_CODE (TREE_VALUE (type)) == RECORD_TYPE
4548 && TYPED_OBJECT (TREE_VALUE (type)))
4549 error ("can not use an object as parameter to a method");
4551 return type;
4554 /* Return a KEYWORD_DECL built using the specified key_name, arg_type,
4555 arg_name and attributes. (TODO: Rename KEYWORD_DECL to
4556 OBJC_METHOD_PARM_DECL ?)
4558 A KEYWORD_DECL is a tree representing the declaration of a
4559 parameter of an Objective-C method. It is produced when parsing a
4560 fragment of Objective-C method declaration of the form
4562 keyworddecl:
4563 selector ':' '(' typename ')' identifier
4565 For example, take the Objective-C method
4567 -(NSString *)pathForResource:(NSString *)resource ofType:(NSString *)type;
4569 the two fragments "pathForResource:(NSString *)resource" and
4570 "ofType:(NSString *)type" will generate a KEYWORD_DECL each. The
4571 KEYWORD_DECL stores the 'key_name' (eg, identifier for
4572 "pathForResource"), the 'arg_type' (eg, tree representing a
4573 NSString *), the 'arg_name' (eg identifier for "resource") and
4574 potentially some attributes (for example, a tree representing
4575 __attribute__ ((unused)) if such an attribute was attached to a
4576 certain parameter). You can access this information using the
4577 TREE_TYPE (for arg_type), KEYWORD_ARG_NAME (for arg_name),
4578 KEYWORD_KEY_NAME (for key_name), DECL_ATTRIBUTES (for attributes).
4580 'key_name' is an identifier node (and is optional as you can omit
4581 it in Objective-C methods).
4582 'arg_type' is a tree list (and is optional too if no parameter type
4583 was specified).
4584 'arg_name' is an identifier node and is required.
4585 'attributes' is an optional tree containing parameter attributes. */
4586 tree
4587 objc_build_keyword_decl (tree key_name, tree arg_type,
4588 tree arg_name, tree attributes)
4590 tree keyword_decl;
4592 if (flag_objc1_only && attributes)
4593 error_at (input_location, "method argument attributes are not available in Objective-C 1.0");
4595 /* If no type is specified, default to "id". */
4596 arg_type = adjust_type_for_id_default (arg_type);
4598 keyword_decl = make_node (KEYWORD_DECL);
4600 TREE_TYPE (keyword_decl) = arg_type;
4601 KEYWORD_ARG_NAME (keyword_decl) = arg_name;
4602 KEYWORD_KEY_NAME (keyword_decl) = key_name;
4603 DECL_ATTRIBUTES (keyword_decl) = attributes;
4605 return keyword_decl;
4608 /* Given a chain of keyword_decl's, synthesize the full keyword selector. */
4609 static tree
4610 build_keyword_selector (tree selector)
4612 int len = 0;
4613 tree key_chain, key_name;
4614 char *buf;
4616 /* Scan the selector to see how much space we'll need. */
4617 for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain))
4619 switch (TREE_CODE (selector))
4621 case KEYWORD_DECL:
4622 key_name = KEYWORD_KEY_NAME (key_chain);
4623 break;
4624 case TREE_LIST:
4625 key_name = TREE_PURPOSE (key_chain);
4626 break;
4627 default:
4628 gcc_unreachable ();
4631 if (key_name)
4632 len += IDENTIFIER_LENGTH (key_name) + 1;
4633 else
4634 /* Just a ':' arg. */
4635 len++;
4638 buf = (char *) alloca (len + 1);
4639 /* Start the buffer out as an empty string. */
4640 buf[0] = '\0';
4642 for (key_chain = selector; key_chain; key_chain = TREE_CHAIN (key_chain))
4644 switch (TREE_CODE (selector))
4646 case KEYWORD_DECL:
4647 key_name = KEYWORD_KEY_NAME (key_chain);
4648 break;
4649 case TREE_LIST:
4650 key_name = TREE_PURPOSE (key_chain);
4651 /* The keyword decl chain will later be used as a function
4652 argument chain. Unhook the selector itself so as to not
4653 confuse other parts of the compiler. */
4654 TREE_PURPOSE (key_chain) = NULL_TREE;
4655 break;
4656 default:
4657 gcc_unreachable ();
4660 if (key_name)
4661 strcat (buf, IDENTIFIER_POINTER (key_name));
4662 strcat (buf, ":");
4665 return get_identifier_with_length (buf, len);
4668 /* Used for declarations and definitions. */
4670 static tree
4671 build_method_decl (enum tree_code code, tree ret_type, tree selector,
4672 tree add_args, bool ellipsis)
4674 tree method_decl;
4676 /* If no type is specified, default to "id". */
4677 ret_type = adjust_type_for_id_default (ret_type);
4679 /* Note how a method_decl has a TREE_TYPE which is not the function
4680 type of the function implementing the method, but only the return
4681 type of the method. We may want to change this, and store the
4682 entire function type in there (eg, it may be used to simplify
4683 dealing with attributes below). */
4684 method_decl = make_node (code);
4685 TREE_TYPE (method_decl) = ret_type;
4687 /* If we have a keyword selector, create an identifier_node that
4688 represents the full selector name (`:' included)... */
4689 if (TREE_CODE (selector) == KEYWORD_DECL)
4691 METHOD_SEL_NAME (method_decl) = build_keyword_selector (selector);
4692 METHOD_SEL_ARGS (method_decl) = selector;
4693 METHOD_ADD_ARGS (method_decl) = add_args;
4694 METHOD_ADD_ARGS_ELLIPSIS_P (method_decl) = ellipsis;
4696 else
4698 METHOD_SEL_NAME (method_decl) = selector;
4699 METHOD_SEL_ARGS (method_decl) = NULL_TREE;
4700 METHOD_ADD_ARGS (method_decl) = NULL_TREE;
4703 return method_decl;
4706 /* This routine processes objective-c method attributes. */
4708 static void
4709 objc_decl_method_attributes (tree *node, tree attributes, int flags)
4711 /* TODO: Replace the hackery below. An idea would be to store the
4712 full function type in the method declaration (for example in
4713 TREE_TYPE) and then expose ObjC method declarations to c-family
4714 and they could deal with them by simply treating them as
4715 functions. */
4717 /* Because of the dangers in the hackery below, we filter out any
4718 attribute that we do not know about. For the ones we know about,
4719 we know that they work with the hackery. For the other ones,
4720 there is no guarantee, so we have to filter them out. */
4721 tree filtered_attributes = NULL_TREE;
4723 if (attributes)
4725 tree attribute;
4726 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
4728 tree name = TREE_PURPOSE (attribute);
4730 if (is_attribute_p ("deprecated", name)
4731 || is_attribute_p ("sentinel", name)
4732 || is_attribute_p ("noreturn", name))
4734 /* An attribute that we support; add it to the filtered
4735 attributes. */
4736 filtered_attributes = chainon (filtered_attributes,
4737 copy_node (attribute));
4739 else if (is_attribute_p ("format", name))
4741 /* "format" is special because before adding it to the
4742 filtered attributes we need to adjust the specified
4743 format by adding the hidden function parameters for
4744 an Objective-C method (self, _cmd). */
4745 tree new_attribute = copy_node (attribute);
4747 /* Check the arguments specified with the attribute, and
4748 modify them adding 2 for the two hidden arguments.
4749 Note how this differs from C++; according to the
4750 specs, C++ does not do it so you have to add the +1
4751 yourself. For Objective-C, instead, the compiler
4752 adds the +2 for you. */
4754 /* The attribute arguments have not been checked yet, so
4755 we need to be careful as they could be missing or
4756 invalid. If anything looks wrong, we skip the
4757 process and the compiler will complain about it later
4758 when it validates the attribute. */
4759 /* Check that we have at least three arguments. */
4760 if (TREE_VALUE (new_attribute)
4761 && TREE_CHAIN (TREE_VALUE (new_attribute))
4762 && TREE_CHAIN (TREE_CHAIN (TREE_VALUE (new_attribute))))
4764 tree second_argument = TREE_CHAIN (TREE_VALUE (new_attribute));
4765 tree third_argument = TREE_CHAIN (second_argument);
4766 tree number;
4768 /* This is the second argument, the "string-index",
4769 which specifies the index of the format string
4770 argument. Add 2. */
4771 number = TREE_VALUE (second_argument);
4772 if (number
4773 && TREE_CODE (number) == INTEGER_CST
4774 && TREE_INT_CST_HIGH (number) == 0)
4776 TREE_VALUE (second_argument)
4777 = build_int_cst (integer_type_node,
4778 TREE_INT_CST_LOW (number) + 2);
4781 /* This is the third argument, the "first-to-check",
4782 which specifies the index of the first argument to
4783 check. This could be 0, meaning it is not available,
4784 in which case we don't need to add 2. Add 2 if not
4785 0. */
4786 number = TREE_VALUE (third_argument);
4787 if (number
4788 && TREE_CODE (number) == INTEGER_CST
4789 && TREE_INT_CST_HIGH (number) == 0
4790 && TREE_INT_CST_LOW (number) != 0)
4792 TREE_VALUE (third_argument)
4793 = build_int_cst (integer_type_node,
4794 TREE_INT_CST_LOW (number) + 2);
4797 filtered_attributes = chainon (filtered_attributes,
4798 new_attribute);
4800 else
4801 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
4805 if (filtered_attributes)
4807 /* This hackery changes the TREE_TYPE of the ObjC method
4808 declaration to be a function type, so that decl_attributes
4809 will treat the ObjC method as if it was a function. Some
4810 attributes (sentinel, format) will be applied to the function
4811 type, changing it in place; so after calling decl_attributes,
4812 we extract the function type attributes and store them in
4813 METHOD_TYPE_ATTRIBUTES. Some other attributes (noreturn,
4814 deprecated) are applied directly to the method declaration
4815 (by setting TREE_DEPRECATED and TREE_THIS_VOLATILE) so there
4816 is nothing to do. */
4817 tree saved_type = TREE_TYPE (*node);
4818 TREE_TYPE (*node) = build_function_type
4819 (TREE_VALUE (saved_type), get_arg_type_list (*node, METHOD_REF, 0));
4820 decl_attributes (node, filtered_attributes, flags);
4821 METHOD_TYPE_ATTRIBUTES (*node) = TYPE_ATTRIBUTES (TREE_TYPE (*node));
4822 TREE_TYPE (*node) = saved_type;
4826 bool
4827 objc_method_decl (enum tree_code opcode)
4829 return opcode == INSTANCE_METHOD_DECL || opcode == CLASS_METHOD_DECL;
4832 /* Used by `build_objc_method_call'. Return an argument list for
4833 method METH. CONTEXT is either METHOD_DEF or METHOD_REF, saying
4834 whether we are trying to define a method or call one. SUPERFLAG
4835 says this is for a send to super; this makes a difference for the
4836 NeXT calling sequence in which the lookup and the method call are
4837 done together. If METH is null, user-defined arguments (i.e.,
4838 beyond self and _cmd) shall be represented by `...'. */
4840 tree
4841 get_arg_type_list (tree meth, int context, int superflag)
4843 tree arglist, akey;
4845 /* Receiver & _cmd types are runtime-dependent. */
4846 arglist = (*runtime.get_arg_type_list_base) (meth, context, superflag);
4848 /* No actual method prototype given -- assume that remaining arguments
4849 are `...'. */
4850 if (!meth)
4851 return arglist;
4853 /* Build a list of argument types. */
4854 for (akey = METHOD_SEL_ARGS (meth); akey; akey = DECL_CHAIN (akey))
4856 tree arg_type = TREE_VALUE (TREE_TYPE (akey));
4858 /* Decay argument types for the underlying C function as appropriate. */
4859 arg_type = objc_decay_parm_type (arg_type);
4861 chainon (arglist, build_tree_list (NULL_TREE, arg_type));
4864 if (METHOD_ADD_ARGS (meth))
4866 for (akey = TREE_CHAIN (METHOD_ADD_ARGS (meth));
4867 akey; akey = TREE_CHAIN (akey))
4869 tree arg_type = TREE_TYPE (TREE_VALUE (akey));
4871 arg_type = objc_decay_parm_type (arg_type);
4873 chainon (arglist, build_tree_list (NULL_TREE, arg_type));
4876 if (!METHOD_ADD_ARGS_ELLIPSIS_P (meth))
4877 goto lack_of_ellipsis;
4879 else
4881 lack_of_ellipsis:
4882 chainon (arglist, OBJC_VOID_AT_END);
4885 return arglist;
4888 static tree
4889 check_duplicates (hash hsh, int methods, int is_class)
4891 tree meth = NULL_TREE;
4893 if (hsh)
4895 meth = hsh->key;
4897 if (hsh->list)
4899 /* We have two or more methods with the same name but
4900 different types. */
4901 attr loop;
4903 /* But just how different are those types? If
4904 -Wno-strict-selector-match is specified, we shall not
4905 complain if the differences are solely among types with
4906 identical size and alignment. */
4907 if (!warn_strict_selector_match)
4909 for (loop = hsh->list; loop; loop = loop->next)
4910 if (!comp_proto_with_proto (meth, loop->value, 0))
4911 goto issue_warning;
4913 return meth;
4916 issue_warning:
4917 if (methods)
4919 bool type = TREE_CODE (meth) == INSTANCE_METHOD_DECL;
4921 warning_at (input_location, 0,
4922 "multiple methods named %<%c%E%> found",
4923 (is_class ? '+' : '-'),
4924 METHOD_SEL_NAME (meth));
4925 inform (DECL_SOURCE_LOCATION (meth), "using %<%c%s%>",
4926 (type ? '-' : '+'),
4927 identifier_to_locale (gen_method_decl (meth)));
4929 else
4931 bool type = TREE_CODE (meth) == INSTANCE_METHOD_DECL;
4933 warning_at (input_location, 0,
4934 "multiple selectors named %<%c%E%> found",
4935 (is_class ? '+' : '-'),
4936 METHOD_SEL_NAME (meth));
4937 inform (DECL_SOURCE_LOCATION (meth), "found %<%c%s%>",
4938 (type ? '-' : '+'),
4939 identifier_to_locale (gen_method_decl (meth)));
4942 for (loop = hsh->list; loop; loop = loop->next)
4944 bool type = TREE_CODE (loop->value) == INSTANCE_METHOD_DECL;
4946 inform (DECL_SOURCE_LOCATION (loop->value), "also found %<%c%s%>",
4947 (type ? '-' : '+'),
4948 identifier_to_locale (gen_method_decl (loop->value)));
4952 return meth;
4955 /* If RECEIVER is a class reference, return the identifier node for
4956 the referenced class. RECEIVER is created by objc_get_class_reference,
4957 so we check the exact form created depending on which runtimes are
4958 used. */
4960 static tree
4961 receiver_is_class_object (tree receiver, int self, int super)
4963 tree exp, arg;
4965 /* The receiver is 'self' or 'super' in the context of a class method. */
4966 if (objc_method_context
4967 && TREE_CODE (objc_method_context) == CLASS_METHOD_DECL
4968 && (self || super))
4969 return (super
4970 ? CLASS_SUPER_NAME (implementation_template)
4971 : CLASS_NAME (implementation_template));
4973 /* The runtime might encapsulate things its own way. */
4974 exp = (*runtime.receiver_is_class_object) (receiver);
4975 if (exp)
4976 return exp;
4978 /* The receiver is a function call that returns an id. Check if
4979 it is a call to objc_getClass, if so, pick up the class name. */
4980 if (TREE_CODE (receiver) == CALL_EXPR
4981 && (exp = CALL_EXPR_FN (receiver))
4982 && TREE_CODE (exp) == ADDR_EXPR
4983 && (exp = TREE_OPERAND (exp, 0))
4984 && TREE_CODE (exp) == FUNCTION_DECL
4985 /* For some reason, we sometimes wind up with multiple FUNCTION_DECL
4986 prototypes for objc_get_class(). Thankfully, they seem to share the
4987 same function type. */
4988 && TREE_TYPE (exp) == TREE_TYPE (objc_get_class_decl)
4989 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (exp)), runtime.tag_getclass)
4990 /* We have a call to objc_get_class/objc_getClass! */
4991 && (arg = CALL_EXPR_ARG (receiver, 0)))
4993 STRIP_NOPS (arg);
4994 if (TREE_CODE (arg) == ADDR_EXPR
4995 && (arg = TREE_OPERAND (arg, 0))
4996 && TREE_CODE (arg) == STRING_CST)
4997 /* Finally, we have the class name. */
4998 return get_identifier (TREE_STRING_POINTER (arg));
5000 return 0;
5003 /* If we are currently building a message expr, this holds
5004 the identifier of the selector of the message. This is
5005 used when printing warnings about argument mismatches. */
5007 static tree current_objc_message_selector = 0;
5009 tree
5010 objc_message_selector (void)
5012 return current_objc_message_selector;
5015 /* Construct an expression for sending a message.
5016 MESS has the object to send to in TREE_PURPOSE
5017 and the argument list (including selector) in TREE_VALUE.
5019 (*(<abstract_decl>(*)())_msg)(receiver, selTransTbl[n], ...);
5020 (*(<abstract_decl>(*)())_msgSuper)(receiver, selTransTbl[n], ...); */
5022 tree
5023 objc_build_message_expr (tree receiver, tree message_args)
5025 tree sel_name;
5026 #ifdef OBJCPLUS
5027 tree args = TREE_PURPOSE (message_args);
5028 #else
5029 tree args = message_args;
5030 #endif
5031 tree method_params = NULL_TREE;
5033 if (TREE_CODE (receiver) == ERROR_MARK || TREE_CODE (args) == ERROR_MARK)
5034 return error_mark_node;
5036 /* Obtain the full selector name. */
5037 switch (TREE_CODE (args))
5039 case IDENTIFIER_NODE:
5040 /* A unary selector. */
5041 sel_name = args;
5042 break;
5043 case TREE_LIST:
5044 sel_name = build_keyword_selector (args);
5045 break;
5046 default:
5047 gcc_unreachable ();
5050 /* Build the parameter list to give to the method. */
5051 if (TREE_CODE (args) == TREE_LIST)
5052 #ifdef OBJCPLUS
5053 method_params = chainon (args, TREE_VALUE (message_args));
5054 #else
5056 tree chain = args, prev = NULL_TREE;
5058 /* We have a keyword selector--check for comma expressions. */
5059 while (chain)
5061 tree element = TREE_VALUE (chain);
5063 /* We have a comma expression, must collapse... */
5064 if (TREE_CODE (element) == TREE_LIST)
5066 if (prev)
5067 TREE_CHAIN (prev) = element;
5068 else
5069 args = element;
5071 prev = chain;
5072 chain = TREE_CHAIN (chain);
5074 method_params = args;
5076 #endif
5078 #ifdef OBJCPLUS
5079 if (processing_template_decl)
5080 /* Must wait until template instantiation time. */
5081 return build_min_nt (MESSAGE_SEND_EXPR, receiver, sel_name,
5082 method_params);
5083 #endif
5085 return objc_finish_message_expr (receiver, sel_name, method_params, NULL);
5088 /* Look up method SEL_NAME that would be suitable for receiver
5089 of type 'id' (if IS_CLASS is zero) or 'Class' (if IS_CLASS is
5090 nonzero), and report on any duplicates. */
5092 static tree
5093 lookup_method_in_hash_lists (tree sel_name, int is_class)
5095 hash method_prototype = NULL;
5097 if (!is_class)
5098 method_prototype = hash_lookup (nst_method_hash_list,
5099 sel_name);
5101 if (!method_prototype)
5103 method_prototype = hash_lookup (cls_method_hash_list,
5104 sel_name);
5105 is_class = 1;
5108 return check_duplicates (method_prototype, 1, is_class);
5111 /* The 'objc_finish_message_expr' routine is called from within
5112 'objc_build_message_expr' for non-template functions. In the case of
5113 C++ template functions, it is called from 'build_expr_from_tree'
5114 (in decl2.c) after RECEIVER and METHOD_PARAMS have been expanded.
5116 If the DEPRECATED_METHOD_PROTOTYPE argument is NULL, then we warn
5117 if the method being used is deprecated. If it is not NULL, instead
5118 of deprecating, we set *DEPRECATED_METHOD_PROTOTYPE to the method
5119 prototype that was used and is deprecated. This is useful for
5120 getter calls that are always generated when compiling dot-syntax
5121 expressions, even if they may not be used. In that case, we don't
5122 want the warning immediately; we produce it (if needed) at gimplify
5123 stage when we are sure that the deprecated getter is being
5124 used. */
5125 tree
5126 objc_finish_message_expr (tree receiver, tree sel_name, tree method_params,
5127 tree *deprecated_method_prototype)
5129 tree method_prototype = NULL_TREE, rprotos = NULL_TREE, rtype;
5130 tree retval, class_tree;
5131 int self, super, have_cast;
5133 /* We have used the receiver, so mark it as read. */
5134 mark_exp_read (receiver);
5136 /* Extract the receiver of the message, as well as its type
5137 (where the latter may take the form of a cast or be inferred
5138 from the implementation context). */
5139 rtype = receiver;
5140 while (TREE_CODE (rtype) == COMPOUND_EXPR
5141 || TREE_CODE (rtype) == MODIFY_EXPR
5142 || CONVERT_EXPR_P (rtype)
5143 || TREE_CODE (rtype) == COMPONENT_REF)
5144 rtype = TREE_OPERAND (rtype, 0);
5146 self = (rtype == self_decl);
5147 super = (rtype == UOBJC_SUPER_decl);
5148 rtype = TREE_TYPE (receiver);
5150 have_cast = (TREE_CODE (receiver) == NOP_EXPR
5151 || (TREE_CODE (receiver) == COMPOUND_EXPR
5152 && !IS_SUPER (rtype)));
5154 /* If we are calling [super dealloc], reset our warning flag. */
5155 if (super && !strcmp ("dealloc", IDENTIFIER_POINTER (sel_name)))
5156 should_call_super_dealloc = 0;
5158 /* If the receiver is a class object, retrieve the corresponding
5159 @interface, if one exists. */
5160 class_tree = receiver_is_class_object (receiver, self, super);
5162 /* Now determine the receiver type (if an explicit cast has not been
5163 provided). */
5164 if (!have_cast)
5166 if (class_tree)
5167 rtype = lookup_interface (class_tree);
5168 /* Handle `self' and `super'. */
5169 else if (super)
5171 if (!CLASS_SUPER_NAME (implementation_template))
5173 error ("no super class declared in @interface for %qE",
5174 CLASS_NAME (implementation_template));
5175 return error_mark_node;
5177 rtype = lookup_interface (CLASS_SUPER_NAME (implementation_template));
5179 else if (self)
5180 rtype = lookup_interface (CLASS_NAME (implementation_template));
5183 /* If receiver is of type `id' or `Class' (or if the @interface for a
5184 class is not visible), we shall be satisfied with the existence of
5185 any instance or class method. */
5186 if (objc_is_id (rtype))
5188 class_tree = (IS_CLASS (rtype) ? objc_class_name : NULL_TREE);
5189 rprotos = (TYPE_HAS_OBJC_INFO (TREE_TYPE (rtype))
5190 ? TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (rtype))
5191 : NULL_TREE);
5192 rtype = NULL_TREE;
5194 if (rprotos)
5196 /* If messaging 'id <Protos>' or 'Class <Proto>', first search
5197 in protocols themselves for the method prototype. */
5198 method_prototype
5199 = lookup_method_in_protocol_list (rprotos, sel_name,
5200 class_tree != NULL_TREE);
5202 /* If messaging 'Class <Proto>' but did not find a class method
5203 prototype, search for an instance method instead, and warn
5204 about having done so. */
5205 if (!method_prototype && !rtype && class_tree != NULL_TREE)
5207 method_prototype
5208 = lookup_method_in_protocol_list (rprotos, sel_name, 0);
5210 if (method_prototype)
5211 warning (0, "found %<-%E%> instead of %<+%E%> in protocol(s)",
5212 sel_name, sel_name);
5216 else if (rtype)
5218 tree orig_rtype = rtype;
5220 if (TREE_CODE (rtype) == POINTER_TYPE)
5221 rtype = TREE_TYPE (rtype);
5222 /* Traverse typedef aliases */
5223 while (TREE_CODE (rtype) == RECORD_TYPE && OBJC_TYPE_NAME (rtype)
5224 && TREE_CODE (OBJC_TYPE_NAME (rtype)) == TYPE_DECL
5225 && DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (rtype)))
5226 rtype = DECL_ORIGINAL_TYPE (OBJC_TYPE_NAME (rtype));
5227 if (TYPED_OBJECT (rtype))
5229 rprotos = TYPE_OBJC_PROTOCOL_LIST (rtype);
5230 rtype = TYPE_OBJC_INTERFACE (rtype);
5232 /* If we could not find an @interface declaration, we must have
5233 only seen a @class declaration; so, we cannot say anything
5234 more intelligent about which methods the receiver will
5235 understand. */
5236 if (!rtype || TREE_CODE (rtype) == IDENTIFIER_NODE)
5238 rtype = NULL_TREE;
5239 /* We could not find an @interface declaration, yet Message maybe in a
5240 @class's protocol. */
5241 if (!method_prototype && rprotos)
5242 method_prototype
5243 = lookup_method_in_protocol_list (rprotos, sel_name, 0);
5245 else if (TREE_CODE (rtype) == CLASS_INTERFACE_TYPE
5246 || TREE_CODE (rtype) == CLASS_IMPLEMENTATION_TYPE)
5248 /* We have a valid ObjC class name. Look up the method name
5249 in the published @interface for the class (and its
5250 superclasses). */
5251 method_prototype
5252 = lookup_method_static (rtype, sel_name, class_tree != NULL_TREE);
5254 /* If the method was not found in the @interface, it may still
5255 exist locally as part of the @implementation. */
5256 if (!method_prototype && objc_implementation_context
5257 && CLASS_NAME (objc_implementation_context)
5258 == OBJC_TYPE_NAME (rtype))
5259 method_prototype
5260 = lookup_method
5261 ((class_tree
5262 ? CLASS_CLS_METHODS (objc_implementation_context)
5263 : CLASS_NST_METHODS (objc_implementation_context)),
5264 sel_name);
5266 /* If we haven't found a candidate method by now, try looking for
5267 it in the protocol list. */
5268 if (!method_prototype && rprotos)
5269 method_prototype
5270 = lookup_method_in_protocol_list (rprotos, sel_name,
5271 class_tree != NULL_TREE);
5273 else
5275 warning (0, "invalid receiver type %qs",
5276 identifier_to_locale (gen_type_name (orig_rtype)));
5277 /* After issuing the "invalid receiver" warning, perform method
5278 lookup as if we were messaging 'id'. */
5279 rtype = rprotos = NULL_TREE;
5284 /* For 'id' or 'Class' receivers, search in the global hash table
5285 as a last resort. For all receivers, warn if protocol searches
5286 have failed. */
5287 if (!method_prototype)
5289 if (rprotos)
5290 warning (0, "%<%c%E%> not found in protocol(s)",
5291 (class_tree ? '+' : '-'),
5292 sel_name);
5294 if (!rtype)
5295 method_prototype
5296 = lookup_method_in_hash_lists (sel_name, class_tree != NULL_TREE);
5299 if (!method_prototype)
5301 static bool warn_missing_methods = false;
5303 if (rtype)
5304 warning (0, "%qE may not respond to %<%c%E%>",
5305 OBJC_TYPE_NAME (rtype),
5306 (class_tree ? '+' : '-'),
5307 sel_name);
5308 /* If we are messaging an 'id' or 'Class' object and made it here,
5309 then we have failed to find _any_ instance or class method,
5310 respectively. */
5311 else
5312 warning (0, "no %<%c%E%> method found",
5313 (class_tree ? '+' : '-'),
5314 sel_name);
5316 if (!warn_missing_methods)
5318 warning_at (input_location,
5319 0, "(Messages without a matching method signature");
5320 warning_at (input_location,
5321 0, "will be assumed to return %<id%> and accept");
5322 warning_at (input_location,
5323 0, "%<...%> as arguments.)");
5324 warn_missing_methods = true;
5327 else
5329 /* Warn if the method is deprecated, but not if the receiver is
5330 a generic 'id'. 'id' is used to cast an object to a generic
5331 object of an unspecified class; in that case, we'll use
5332 whatever method prototype we can find to get the method
5333 argument and return types, but it is not appropriate to
5334 produce deprecation warnings since we don't know the class
5335 that the object will be of at runtime. The @interface(s) for
5336 that class may not even be available to the compiler right
5337 now, and it is perfectly possible that the method is marked
5338 as non-deprecated in such @interface(s).
5340 In practice this makes sense since casting an object to 'id'
5341 is often used precisely to turn off warnings associated with
5342 the object being of a particular class. */
5343 if (TREE_DEPRECATED (method_prototype) && rtype != NULL_TREE)
5345 if (deprecated_method_prototype)
5346 *deprecated_method_prototype = method_prototype;
5347 else
5348 warn_deprecated_use (method_prototype, NULL_TREE);
5352 /* Save the selector name for printing error messages. */
5353 current_objc_message_selector = sel_name;
5355 /* Build the method call.
5356 TODO: Get the location from somewhere that will work for delayed
5357 expansion. */
5359 retval = (*runtime.build_objc_method_call) (input_location, method_prototype,
5360 receiver, rtype, sel_name,
5361 method_params, super);
5363 current_objc_message_selector = 0;
5365 return retval;
5369 /* This routine creates a static variable used to implement @protocol(MyProtocol)
5370 expression. This variable will be initialized to global protocol_t meta-data
5371 pointer. */
5373 /* This function is called by the parser when (and only when) a
5374 @protocol() expression is found, in order to compile it. */
5375 tree
5376 objc_build_protocol_expr (tree protoname)
5378 tree p = lookup_protocol (protoname, /* warn if deprecated */ true,
5379 /* definition_required */ false);
5381 if (!p)
5383 error ("cannot find protocol declaration for %qE", protoname);
5384 return error_mark_node;
5387 return (*runtime.get_protocol_reference) (input_location, p);
5390 /* This function is called by the parser when a @selector() expression
5391 is found, in order to compile it. It is only called by the parser
5392 and only to compile a @selector(). LOC is the location of the
5393 @selector. */
5394 tree
5395 objc_build_selector_expr (location_t loc, tree selnamelist)
5397 tree selname;
5399 /* Obtain the full selector name. */
5400 switch (TREE_CODE (selnamelist))
5402 case IDENTIFIER_NODE:
5403 /* A unary selector. */
5404 selname = selnamelist;
5405 break;
5406 case TREE_LIST:
5407 selname = build_keyword_selector (selnamelist);
5408 break;
5409 default:
5410 gcc_unreachable ();
5413 /* If we are required to check @selector() expressions as they
5414 are found, check that the selector has been declared. */
5415 if (warn_undeclared_selector)
5417 /* Look the selector up in the list of all known class and
5418 instance methods (up to this line) to check that the selector
5419 exists. */
5420 hash hsh;
5422 /* First try with instance methods. */
5423 hsh = hash_lookup (nst_method_hash_list, selname);
5425 /* If not found, try with class methods. */
5426 if (!hsh)
5428 hsh = hash_lookup (cls_method_hash_list, selname);
5431 /* If still not found, print out a warning. */
5432 if (!hsh)
5434 warning (0, "undeclared selector %qE", selname);
5438 /* The runtimes do this differently, most particularly, GNU has typed
5439 selectors, whilst NeXT does not. */
5440 return (*runtime.build_selector_reference) (loc, selname, NULL_TREE);
5443 /* This is used to implement @encode(). See gcc/doc/objc.texi,
5444 section '@encode'. */
5445 tree
5446 objc_build_encode_expr (tree type)
5448 tree result;
5449 const char *string;
5451 encode_type (type, obstack_object_size (&util_obstack),
5452 OBJC_ENCODE_INLINE_DEFS);
5453 obstack_1grow (&util_obstack, 0); /* null terminate string */
5454 string = XOBFINISH (&util_obstack, const char *);
5456 /* Synthesize a string that represents the encoded struct/union. */
5457 result = my_build_string (strlen (string) + 1, string);
5458 obstack_free (&util_obstack, util_firstobj);
5459 return result;
5462 static tree
5463 build_ivar_reference (tree id)
5465 tree base;
5466 if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL)
5468 /* Historically, a class method that produced objects (factory
5469 method) would assign `self' to the instance that it
5470 allocated. This would effectively turn the class method into
5471 an instance method. Following this assignment, the instance
5472 variables could be accessed. That practice, while safe,
5473 violates the simple rule that a class method should not refer
5474 to an instance variable. It's better to catch the cases
5475 where this is done unknowingly than to support the above
5476 paradigm. */
5477 warning (0, "instance variable %qE accessed in class method",
5478 id);
5479 self_decl = convert (objc_instance_type, self_decl); /* cast */
5482 base = build_indirect_ref (input_location, self_decl, RO_ARROW);
5483 return (*runtime.build_ivar_reference) (input_location, base, id);
5486 /* Compute a hash value for a given method SEL_NAME. */
5488 static size_t
5489 hash_func (tree sel_name)
5491 const unsigned char *s
5492 = (const unsigned char *)IDENTIFIER_POINTER (sel_name);
5493 size_t h = 0;
5495 while (*s)
5496 h = h * 67 + *s++ - 113;
5497 return h;
5500 static void
5501 hash_init (void)
5503 nst_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
5504 cls_method_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
5506 cls_name_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
5507 als_name_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
5509 ivar_offset_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE);
5511 /* Initialize the hash table used to hold the constant string objects. */
5512 string_htab = htab_create_ggc (31, string_hash,
5513 string_eq, NULL);
5516 /* This routine adds sel_name to the hash list. sel_name is a class or alias
5517 name for the class. If alias name, then value is its underlying class.
5518 If class, the value is NULL_TREE. */
5520 static void
5521 hash_class_name_enter (hash *hashlist, tree sel_name, tree value)
5523 hash obj;
5524 int slot = hash_func (sel_name) % SIZEHASHTABLE;
5526 obj = ggc_alloc_hashed_entry ();
5527 if (value != NULL_TREE)
5529 /* Save the underlying class for the 'alias' in the hash table */
5530 attr obj_attr = ggc_alloc_hashed_attribute ();
5531 obj_attr->value = value;
5532 obj->list = obj_attr;
5534 else
5535 obj->list = 0;
5536 obj->next = hashlist[slot];
5537 obj->key = sel_name;
5539 hashlist[slot] = obj; /* append to front */
5544 Searches in the hash table looking for a match for class or alias name.
5547 static hash
5548 hash_class_name_lookup (hash *hashlist, tree sel_name)
5550 hash target;
5552 target = hashlist[hash_func (sel_name) % SIZEHASHTABLE];
5554 while (target)
5556 if (sel_name == target->key)
5557 return target;
5559 target = target->next;
5561 return 0;
5564 /* WARNING!!!! hash_enter is called with a method, and will peek
5565 inside to find its selector! But hash_lookup is given a selector
5566 directly, and looks for the selector that's inside the found
5567 entry's key (method) for comparison. */
5569 static void
5570 hash_enter (hash *hashlist, tree method)
5572 hash obj;
5573 int slot = hash_func (METHOD_SEL_NAME (method)) % SIZEHASHTABLE;
5575 obj = ggc_alloc_hashed_entry ();
5576 obj->list = 0;
5577 obj->next = hashlist[slot];
5578 obj->key = method;
5580 hashlist[slot] = obj; /* append to front */
5583 static hash
5584 hash_lookup (hash *hashlist, tree sel_name)
5586 hash target;
5588 target = hashlist[hash_func (sel_name) % SIZEHASHTABLE];
5590 while (target)
5592 if (sel_name == METHOD_SEL_NAME (target->key))
5593 return target;
5595 target = target->next;
5597 return 0;
5600 static void
5601 hash_add_attr (hash entry, tree value)
5603 attr obj;
5605 obj = ggc_alloc_hashed_attribute ();
5606 obj->next = entry->list;
5607 obj->value = value;
5609 entry->list = obj; /* append to front */
5612 static tree
5613 lookup_method (tree mchain, tree method)
5615 tree key;
5617 if (TREE_CODE (method) == IDENTIFIER_NODE)
5618 key = method;
5619 else
5620 key = METHOD_SEL_NAME (method);
5622 while (mchain)
5624 if (METHOD_SEL_NAME (mchain) == key)
5625 return mchain;
5627 mchain = DECL_CHAIN (mchain);
5629 return NULL_TREE;
5632 /* Look up a class (if OBJC_LOOKUP_CLASS is set in FLAGS) or instance
5633 method in INTERFACE, along with any categories and protocols
5634 attached thereto. If method is not found, and the
5635 OBJC_LOOKUP_NO_SUPER is _not_ set in FLAGS, recursively examine the
5636 INTERFACE's superclass. If OBJC_LOOKUP_CLASS is set,
5637 OBJC_LOOKUP_NO_SUPER is clear, and no suitable class method could
5638 be found in INTERFACE or any of its superclasses, look for an
5639 _instance_ method of the same name in the root class as a last
5640 resort. This behaviour can be turned off by using
5641 OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS.
5643 If a suitable method cannot be found, return NULL_TREE. */
5645 static tree
5646 lookup_method_static (tree interface, tree ident, int flags)
5648 tree meth = NULL_TREE, root_inter = NULL_TREE;
5649 tree inter = interface;
5650 int is_class = (flags & OBJC_LOOKUP_CLASS);
5651 int no_superclasses = (flags & OBJC_LOOKUP_NO_SUPER);
5652 int no_instance_methods_of_root_class = (flags & OBJC_LOOKUP_NO_INSTANCE_METHODS_OF_ROOT_CLASS);
5654 while (inter)
5656 tree chain = is_class ? CLASS_CLS_METHODS (inter) : CLASS_NST_METHODS (inter);
5657 tree category = inter;
5659 /* First, look up the method in the class itself. */
5660 if ((meth = lookup_method (chain, ident)))
5661 return meth;
5663 /* Failing that, look for the method in each category of the class. */
5664 while ((category = CLASS_CATEGORY_LIST (category)))
5666 chain = is_class ? CLASS_CLS_METHODS (category) : CLASS_NST_METHODS (category);
5668 /* Check directly in each category. */
5669 if ((meth = lookup_method (chain, ident)))
5670 return meth;
5672 /* Failing that, check in each category's protocols. */
5673 if (CLASS_PROTOCOL_LIST (category))
5675 if ((meth = (lookup_method_in_protocol_list
5676 (CLASS_PROTOCOL_LIST (category), ident, is_class))))
5677 return meth;
5681 /* If not found in categories, check in protocols of the main class. */
5682 if (CLASS_PROTOCOL_LIST (inter))
5684 if ((meth = (lookup_method_in_protocol_list
5685 (CLASS_PROTOCOL_LIST (inter), ident, is_class))))
5686 return meth;
5689 /* If we were instructed not to look in superclasses, don't. */
5690 if (no_superclasses)
5691 return NULL_TREE;
5693 /* Failing that, climb up the inheritance hierarchy. */
5694 root_inter = inter;
5695 inter = lookup_interface (CLASS_SUPER_NAME (inter));
5697 while (inter);
5699 if (is_class && !no_instance_methods_of_root_class)
5701 /* If no class (factory) method was found, check if an _instance_
5702 method of the same name exists in the root class. This is what
5703 the Objective-C runtime will do. */
5704 return lookup_method_static (root_inter, ident, 0);
5706 else
5708 /* If an instance method was not found, return 0. */
5709 return NULL_TREE;
5713 /* Add the method to the hash list if it doesn't contain an identical
5714 method already. */
5716 static void
5717 add_method_to_hash_list (hash *hash_list, tree method)
5719 hash hsh;
5721 if (!(hsh = hash_lookup (hash_list, METHOD_SEL_NAME (method))))
5723 /* Install on a global chain. */
5724 hash_enter (hash_list, method);
5726 else
5728 /* Check types against those; if different, add to a list. */
5729 attr loop;
5730 int already_there = comp_proto_with_proto (method, hsh->key, 1);
5731 for (loop = hsh->list; !already_there && loop; loop = loop->next)
5732 already_there |= comp_proto_with_proto (method, loop->value, 1);
5733 if (!already_there)
5734 hash_add_attr (hsh, method);
5738 static tree
5739 objc_add_method (tree klass, tree method, int is_class, bool is_optional)
5741 tree existing_method = NULL_TREE;
5743 /* The first thing we do is look up the method in the list of
5744 methods already defined in the interface (or implementation). */
5745 if (is_class)
5746 existing_method = lookup_method (CLASS_CLS_METHODS (klass), method);
5747 else
5748 existing_method = lookup_method (CLASS_NST_METHODS (klass), method);
5750 /* In the case of protocols, we have a second list of methods to
5751 consider, the list of optional ones. */
5752 if (TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE)
5754 /* @required methods are added to the protocol's normal list.
5755 @optional methods are added to the protocol's OPTIONAL lists.
5756 Note that adding the methods to the optional lists disables
5757 checking that the methods are implemented by classes
5758 implementing the protocol, since these checks only use the
5759 CLASS_CLS_METHODS and CLASS_NST_METHODS. */
5761 /* First of all, if the method to add is @optional, and we found
5762 it already existing as @required, emit an error. */
5763 if (is_optional && existing_method)
5765 error ("method %<%c%E%> declared %<@optional%> and %<@required%> at the same time",
5766 (is_class ? '+' : '-'),
5767 METHOD_SEL_NAME (existing_method));
5768 inform (DECL_SOURCE_LOCATION (existing_method),
5769 "previous declaration of %<%c%E%> as %<@required%>",
5770 (is_class ? '+' : '-'),
5771 METHOD_SEL_NAME (existing_method));
5774 /* Now check the list of @optional methods if we didn't find the
5775 method in the @required list. */
5776 if (!existing_method)
5778 if (is_class)
5779 existing_method = lookup_method (PROTOCOL_OPTIONAL_CLS_METHODS (klass), method);
5780 else
5781 existing_method = lookup_method (PROTOCOL_OPTIONAL_NST_METHODS (klass), method);
5783 if (!is_optional && existing_method)
5785 error ("method %<%c%E%> declared %<@optional%> and %<@required%> at the same time",
5786 (is_class ? '+' : '-'),
5787 METHOD_SEL_NAME (existing_method));
5788 inform (DECL_SOURCE_LOCATION (existing_method),
5789 "previous declaration of %<%c%E%> as %<@optional%>",
5790 (is_class ? '+' : '-'),
5791 METHOD_SEL_NAME (existing_method));
5796 /* If the method didn't exist already, add it. */
5797 if (!existing_method)
5799 if (is_optional)
5801 if (is_class)
5803 /* Put the method on the list in reverse order. */
5804 TREE_CHAIN (method) = PROTOCOL_OPTIONAL_CLS_METHODS (klass);
5805 PROTOCOL_OPTIONAL_CLS_METHODS (klass) = method;
5807 else
5809 TREE_CHAIN (method) = PROTOCOL_OPTIONAL_NST_METHODS (klass);
5810 PROTOCOL_OPTIONAL_NST_METHODS (klass) = method;
5813 else
5815 if (is_class)
5817 DECL_CHAIN (method) = CLASS_CLS_METHODS (klass);
5818 CLASS_CLS_METHODS (klass) = method;
5820 else
5822 DECL_CHAIN (method) = CLASS_NST_METHODS (klass);
5823 CLASS_NST_METHODS (klass) = method;
5827 else
5829 /* The method was already defined. Check that the types match
5830 for an @interface for a class or category, or for a
5831 @protocol. Give hard errors on methods with identical
5832 selectors but differing argument and/or return types. We do
5833 not do this for @implementations, because C/C++ will do it
5834 for us (i.e., there will be duplicate function definition
5835 errors). */
5836 if ((TREE_CODE (klass) == CLASS_INTERFACE_TYPE
5837 || TREE_CODE (klass) == CATEGORY_INTERFACE_TYPE
5838 /* Starting with GCC 4.6, we emit the same error for
5839 protocols too. The situation is identical to
5840 @interfaces as there is no possible meaningful reason
5841 for defining the same method with different signatures
5842 in the very same @protocol. If that was allowed,
5843 whenever the protocol is used (both at compile and run
5844 time) there wouldn't be any meaningful way to decide
5845 which of the two method signatures should be used. */
5846 || TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE)
5847 && !comp_proto_with_proto (method, existing_method, 1))
5849 error ("duplicate declaration of method %<%c%E%> with conflicting types",
5850 (is_class ? '+' : '-'),
5851 METHOD_SEL_NAME (existing_method));
5852 inform (DECL_SOURCE_LOCATION (existing_method),
5853 "previous declaration of %<%c%E%>",
5854 (is_class ? '+' : '-'),
5855 METHOD_SEL_NAME (existing_method));
5859 if (is_class)
5860 add_method_to_hash_list (cls_method_hash_list, method);
5861 else
5863 add_method_to_hash_list (nst_method_hash_list, method);
5865 /* Instance methods in root classes (and categories thereof)
5866 may act as class methods as a last resort. We also add
5867 instance methods listed in @protocol declarations to
5868 the class hash table, on the assumption that @protocols
5869 may be adopted by root classes or categories. */
5870 if (TREE_CODE (klass) == CATEGORY_INTERFACE_TYPE
5871 || TREE_CODE (klass) == CATEGORY_IMPLEMENTATION_TYPE)
5872 klass = lookup_interface (CLASS_NAME (klass));
5874 if (TREE_CODE (klass) == PROTOCOL_INTERFACE_TYPE
5875 || !CLASS_SUPER_NAME (klass))
5876 add_method_to_hash_list (cls_method_hash_list, method);
5879 return method;
5882 static tree
5883 add_class (tree class_name, tree name)
5885 struct interface_tuple **slot;
5887 /* Put interfaces on list in reverse order. */
5888 TREE_CHAIN (class_name) = interface_chain;
5889 interface_chain = class_name;
5891 if (interface_htab == NULL)
5892 interface_htab = htab_create_ggc (31, hash_interface, eq_interface, NULL);
5893 slot = (struct interface_tuple **)
5894 htab_find_slot_with_hash (interface_htab, name,
5895 IDENTIFIER_HASH_VALUE (name),
5896 INSERT);
5897 if (!*slot)
5899 *slot = ggc_alloc_cleared_interface_tuple ();
5900 (*slot)->id = name;
5902 (*slot)->class_name = class_name;
5904 return interface_chain;
5907 static void
5908 add_category (tree klass, tree category)
5910 /* Put categories on list in reverse order. */
5911 tree cat = lookup_category (klass, CLASS_SUPER_NAME (category));
5913 if (cat)
5915 warning (0, "duplicate interface declaration for category %<%E(%E)%>",
5916 CLASS_NAME (klass),
5917 CLASS_SUPER_NAME (category));
5919 else
5921 CLASS_CATEGORY_LIST (category) = CLASS_CATEGORY_LIST (klass);
5922 CLASS_CATEGORY_LIST (klass) = category;
5926 #ifndef OBJCPLUS
5927 /* A flexible array member is a C99 extension where you can use
5928 "type[]" at the end of a struct to mean a variable-length array.
5930 In Objective-C, instance variables are fundamentally members of a
5931 struct, but the struct can always be extended by subclassing; hence
5932 we need to detect and forbid all instance variables declared using
5933 flexible array members.
5935 No check for this is needed in Objective-C++, since C++ does not
5936 have flexible array members. */
5938 /* Determine whether TYPE is a structure with a flexible array member,
5939 a union containing such a structure (possibly recursively) or an
5940 array of such structures or unions. These are all invalid as
5941 instance variable. */
5942 static bool
5943 flexible_array_type_p (tree type)
5945 tree x;
5946 switch (TREE_CODE (type))
5948 case RECORD_TYPE:
5949 x = TYPE_FIELDS (type);
5950 if (x == NULL_TREE)
5951 return false;
5952 while (DECL_CHAIN (x) != NULL_TREE)
5953 x = DECL_CHAIN (x);
5954 if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
5955 && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
5956 && TYPE_DOMAIN (TREE_TYPE (x)) != NULL_TREE
5957 && TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (x))) == NULL_TREE)
5958 return true;
5959 return false;
5960 case UNION_TYPE:
5961 for (x = TYPE_FIELDS (type); x != NULL_TREE; x = DECL_CHAIN (x))
5963 if (flexible_array_type_p (TREE_TYPE (x)))
5964 return true;
5966 return false;
5967 /* Note that we also check for arrays of something that uses a flexible array member. */
5968 case ARRAY_TYPE:
5969 if (flexible_array_type_p (TREE_TYPE (type)))
5970 return true;
5971 return false;
5972 default:
5973 return false;
5976 #endif
5978 /* Produce a printable version of an ivar name. This is only used
5979 inside add_instance_variable. */
5980 static const char *
5981 printable_ivar_name (tree field_decl)
5983 if (DECL_NAME (field_decl))
5984 return identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl)));
5985 else
5986 return _("<unnamed>");
5989 /* Called after parsing each instance variable declaration. Necessary to
5990 preserve typedefs and implement public/private...
5992 VISIBILITY is 1 for public, 0 for protected, and 2 for private. */
5994 static tree
5995 add_instance_variable (tree klass, objc_ivar_visibility_kind visibility,
5996 tree field_decl)
5998 tree field_type = TREE_TYPE (field_decl);
6000 #ifdef OBJCPLUS
6001 if (TREE_CODE (field_type) == REFERENCE_TYPE)
6003 error ("illegal reference type specified for instance variable %qs",
6004 printable_ivar_name (field_decl));
6005 /* Return class as is without adding this ivar. */
6006 return klass;
6008 #endif
6010 if (field_type == error_mark_node || !TYPE_SIZE (field_type)
6011 || TYPE_SIZE (field_type) == error_mark_node)
6012 /* 'type[0]' is allowed, but 'type[]' is not! */
6014 error ("instance variable %qs has unknown size",
6015 printable_ivar_name (field_decl));
6016 /* Return class as is without adding this ivar. */
6017 return klass;
6020 #ifndef OBJCPLUS
6021 /* Also, in C reject a struct with a flexible array member. Ie,
6023 struct A { int x; int[] y; };
6025 @interface X
6027 struct A instance_variable;
6029 @end
6031 is not valid because if the class is subclassed, we wouldn't be able
6032 to calculate the offset of the next instance variable. */
6033 if (flexible_array_type_p (field_type))
6035 error ("instance variable %qs uses flexible array member",
6036 printable_ivar_name (field_decl));
6037 /* Return class as is without adding this ivar. */
6038 return klass;
6040 #endif
6042 #ifdef OBJCPLUS
6043 /* Check if the ivar being added has a non-POD C++ type. If so, we will
6044 need to either (1) warn the user about it or (2) generate suitable
6045 constructor/destructor call from '- .cxx_construct' or '- .cxx_destruct'
6046 methods (if '-fobjc-call-cxx-cdtors' was specified). */
6047 if (MAYBE_CLASS_TYPE_P (field_type)
6048 && (TYPE_NEEDS_CONSTRUCTING (field_type)
6049 || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type)
6050 || TYPE_POLYMORPHIC_P (field_type)))
6052 tree type_name = OBJC_TYPE_NAME (field_type);
6054 if (flag_objc_call_cxx_cdtors)
6056 /* Since the ObjC runtime will be calling the constructors and
6057 destructors for us, the only thing we can't handle is the lack
6058 of a default constructor. */
6059 if (TYPE_NEEDS_CONSTRUCTING (field_type)
6060 && !TYPE_HAS_DEFAULT_CONSTRUCTOR (field_type))
6062 warning (0, "type %qE has no default constructor to call",
6063 type_name);
6065 /* If we cannot call a constructor, we should also avoid
6066 calling the destructor, for symmetry. */
6067 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type))
6068 warning (0, "destructor for %qE shall not be run either",
6069 type_name);
6072 else
6074 static bool warn_cxx_ivars = false;
6076 if (TYPE_POLYMORPHIC_P (field_type))
6078 /* Vtable pointers are Real Bad(tm), since Obj-C cannot
6079 initialize them. */
6080 error ("type %qE has virtual member functions", type_name);
6081 error ("illegal aggregate type %qE specified "
6082 "for instance variable %qs",
6083 type_name, printable_ivar_name (field_decl));
6084 /* Return class as is without adding this ivar. */
6085 return klass;
6088 /* User-defined constructors and destructors are not known to Obj-C
6089 and hence will not be called. This may or may not be a problem. */
6090 if (TYPE_NEEDS_CONSTRUCTING (field_type))
6091 warning (0, "type %qE has a user-defined constructor", type_name);
6092 if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (field_type))
6093 warning (0, "type %qE has a user-defined destructor", type_name);
6095 if (!warn_cxx_ivars)
6097 warning (0, "C++ constructors and destructors will not "
6098 "be invoked for Objective-C fields");
6099 warn_cxx_ivars = true;
6103 #endif
6105 /* Overload the public attribute, it is not used for FIELD_DECLs. */
6106 switch (visibility)
6108 case OBJC_IVAR_VIS_PROTECTED:
6109 TREE_PUBLIC (field_decl) = 0;
6110 TREE_PRIVATE (field_decl) = 0;
6111 TREE_PROTECTED (field_decl) = 1;
6112 break;
6114 case OBJC_IVAR_VIS_PACKAGE:
6115 /* TODO: Implement the package variant. */
6116 case OBJC_IVAR_VIS_PUBLIC:
6117 TREE_PUBLIC (field_decl) = 1;
6118 TREE_PRIVATE (field_decl) = 0;
6119 TREE_PROTECTED (field_decl) = 0;
6120 break;
6122 case OBJC_IVAR_VIS_PRIVATE:
6123 TREE_PUBLIC (field_decl) = 0;
6124 TREE_PRIVATE (field_decl) = 1;
6125 TREE_PROTECTED (field_decl) = 0;
6126 break;
6130 CLASS_RAW_IVARS (klass) = chainon (CLASS_RAW_IVARS (klass), field_decl);
6132 return klass;
6135 /* True if the ivar is private and we are not in its implementation. */
6137 static int
6138 is_private (tree decl)
6140 return (TREE_PRIVATE (decl)
6141 && ! is_ivar (CLASS_IVARS (implementation_template),
6142 DECL_NAME (decl)));
6145 /* We have an instance variable reference;, check to see if it is public. */
6148 objc_is_public (tree expr, tree identifier)
6150 tree basetype, decl;
6152 #ifdef OBJCPLUS
6153 if (processing_template_decl)
6154 return 1;
6155 #endif
6157 if (TREE_TYPE (expr) == error_mark_node)
6158 return 1;
6160 basetype = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
6162 if (basetype && TREE_CODE (basetype) == RECORD_TYPE)
6164 if (TYPE_HAS_OBJC_INFO (basetype) && TYPE_OBJC_INTERFACE (basetype))
6166 tree klass = lookup_interface (OBJC_TYPE_NAME (basetype));
6168 if (!klass)
6170 error ("cannot find interface declaration for %qE",
6171 OBJC_TYPE_NAME (basetype));
6172 return 0;
6175 if ((decl = is_ivar (get_class_ivars (klass, true), identifier)))
6177 if (TREE_PUBLIC (decl))
6178 return 1;
6180 /* Important difference between the Stepstone translator:
6181 all instance variables should be public within the context
6182 of the implementation. */
6183 if (objc_implementation_context
6184 && ((TREE_CODE (objc_implementation_context)
6185 == CLASS_IMPLEMENTATION_TYPE)
6186 || (TREE_CODE (objc_implementation_context)
6187 == CATEGORY_IMPLEMENTATION_TYPE)))
6189 tree curtype = TYPE_MAIN_VARIANT
6190 (CLASS_STATIC_TEMPLATE
6191 (implementation_template));
6193 if (basetype == curtype
6194 || DERIVED_FROM_P (basetype, curtype))
6196 int priv = is_private (decl);
6198 if (priv)
6199 error ("instance variable %qE is declared private",
6200 DECL_NAME (decl));
6202 return !priv;
6206 /* The 2.95.2 compiler sometimes allowed C functions to access
6207 non-@public ivars. We will let this slide for now... */
6208 if (!objc_method_context)
6210 warning (0, "instance variable %qE is %s; "
6211 "this will be a hard error in the future",
6212 identifier,
6213 TREE_PRIVATE (decl) ? "@private" : "@protected");
6214 return 1;
6217 error ("instance variable %qE is declared %s",
6218 identifier,
6219 TREE_PRIVATE (decl) ? "private" : "protected");
6220 return 0;
6225 return 1;
6228 /* Make sure all methods in CHAIN (a list of method declarations from
6229 an @interface or a @protocol) are in IMPLEMENTATION (the
6230 implementation context). This is used to check for example that
6231 all methods declared in an @interface were implemented in an
6232 @implementation.
6234 Some special methods (property setters/getters) are special and if
6235 they are not found in IMPLEMENTATION, we look them up in its
6236 superclasses. */
6238 static int
6239 check_methods (tree chain, tree implementation, int mtype)
6241 int first = 1;
6242 tree list;
6244 if (mtype == (int)'+')
6245 list = CLASS_CLS_METHODS (implementation);
6246 else
6247 list = CLASS_NST_METHODS (implementation);
6249 while (chain)
6251 /* If the method is associated with a dynamic property, then it
6252 is Ok not to have the method implementation, as it will be
6253 generated dynamically at runtime. To decide if the method is
6254 associated with a @dynamic property, we search the list of
6255 @synthesize and @dynamic for this implementation, and look
6256 for any @dynamic property with the same setter or getter name
6257 as this method. */
6258 tree x;
6259 for (x = IMPL_PROPERTY_DECL (implementation); x; x = TREE_CHAIN (x))
6260 if (PROPERTY_DYNAMIC (x)
6261 && (PROPERTY_GETTER_NAME (x) == METHOD_SEL_NAME (chain)
6262 || PROPERTY_SETTER_NAME (x) == METHOD_SEL_NAME (chain)))
6263 break;
6265 if (x != NULL_TREE)
6267 chain = TREE_CHAIN (chain); /* next method... */
6268 continue;
6271 if (!lookup_method (list, chain))
6273 /* If the method is a property setter/getter, we'll still
6274 allow it to be missing if it is implemented by
6275 'interface' or any of its superclasses. */
6276 tree property = METHOD_PROPERTY_CONTEXT (chain);
6277 if (property)
6279 /* Note that since this is a property getter/setter, it
6280 is obviously an instance method. */
6281 tree interface = NULL_TREE;
6283 /* For a category, first check the main class
6284 @interface. */
6285 if (TREE_CODE (implementation) == CATEGORY_IMPLEMENTATION_TYPE)
6287 interface = lookup_interface (CLASS_NAME (implementation));
6289 /* If the method is found in the main class, it's Ok. */
6290 if (lookup_method (CLASS_NST_METHODS (interface), chain))
6292 chain = DECL_CHAIN (chain);
6293 continue;
6296 /* Else, get the superclass. */
6297 if (CLASS_SUPER_NAME (interface))
6298 interface = lookup_interface (CLASS_SUPER_NAME (interface));
6299 else
6300 interface = NULL_TREE;
6303 /* Get the superclass for classes. */
6304 if (TREE_CODE (implementation) == CLASS_IMPLEMENTATION_TYPE)
6306 if (CLASS_SUPER_NAME (implementation))
6307 interface = lookup_interface (CLASS_SUPER_NAME (implementation));
6308 else
6309 interface = NULL_TREE;
6312 /* Now, interface is the superclass, if any; go check it. */
6313 if (interface)
6315 if (lookup_method_static (interface, chain, 0))
6317 chain = DECL_CHAIN (chain);
6318 continue;
6321 /* Else, fall through - warn. */
6323 if (first)
6325 switch (TREE_CODE (implementation))
6327 case CLASS_IMPLEMENTATION_TYPE:
6328 warning (0, "incomplete implementation of class %qE",
6329 CLASS_NAME (implementation));
6330 break;
6331 case CATEGORY_IMPLEMENTATION_TYPE:
6332 warning (0, "incomplete implementation of category %qE",
6333 CLASS_SUPER_NAME (implementation));
6334 break;
6335 default:
6336 gcc_unreachable ();
6338 first = 0;
6341 warning (0, "method definition for %<%c%E%> not found",
6342 mtype, METHOD_SEL_NAME (chain));
6345 chain = DECL_CHAIN (chain);
6348 return first;
6351 /* Check if KLASS, or its superclasses, explicitly conforms to PROTOCOL. */
6353 static int
6354 conforms_to_protocol (tree klass, tree protocol)
6356 if (TREE_CODE (protocol) == PROTOCOL_INTERFACE_TYPE)
6358 tree p = CLASS_PROTOCOL_LIST (klass);
6359 while (p && TREE_VALUE (p) != protocol)
6360 p = TREE_CHAIN (p);
6362 if (!p)
6364 tree super = (CLASS_SUPER_NAME (klass)
6365 ? lookup_interface (CLASS_SUPER_NAME (klass))
6366 : NULL_TREE);
6367 int tmp = super ? conforms_to_protocol (super, protocol) : 0;
6368 if (!tmp)
6369 return 0;
6373 return 1;
6376 /* Make sure all methods in CHAIN are accessible as MTYPE methods in
6377 CONTEXT. This is one of two mechanisms to check protocol integrity. */
6379 static int
6380 check_methods_accessible (tree chain, tree context, int mtype)
6382 int first = 1;
6383 tree list;
6384 tree base_context = context;
6386 while (chain)
6388 /* If the method is associated with a dynamic property, then it
6389 is Ok not to have the method implementation, as it will be
6390 generated dynamically at runtime. Search for any @dynamic
6391 property with the same setter or getter name as this
6392 method. TODO: Use a hashtable lookup. */
6393 tree x;
6394 for (x = IMPL_PROPERTY_DECL (base_context); x; x = TREE_CHAIN (x))
6395 if (PROPERTY_DYNAMIC (x)
6396 && (PROPERTY_GETTER_NAME (x) == METHOD_SEL_NAME (chain)
6397 || PROPERTY_SETTER_NAME (x) == METHOD_SEL_NAME (chain)))
6398 break;
6400 if (x != NULL_TREE)
6402 chain = TREE_CHAIN (chain); /* next method... */
6403 continue;
6406 context = base_context;
6407 while (context)
6409 if (mtype == '+')
6410 list = CLASS_CLS_METHODS (context);
6411 else
6412 list = CLASS_NST_METHODS (context);
6414 if (lookup_method (list, chain))
6415 break;
6417 switch (TREE_CODE (context))
6419 case CLASS_IMPLEMENTATION_TYPE:
6420 case CLASS_INTERFACE_TYPE:
6421 context = (CLASS_SUPER_NAME (context)
6422 ? lookup_interface (CLASS_SUPER_NAME (context))
6423 : NULL_TREE);
6424 break;
6425 case CATEGORY_IMPLEMENTATION_TYPE:
6426 case CATEGORY_INTERFACE_TYPE:
6427 context = (CLASS_NAME (context)
6428 ? lookup_interface (CLASS_NAME (context))
6429 : NULL_TREE);
6430 break;
6431 default:
6432 gcc_unreachable ();
6436 if (context == NULL_TREE)
6438 if (first)
6440 switch (TREE_CODE (objc_implementation_context))
6442 case CLASS_IMPLEMENTATION_TYPE:
6443 warning (0, "incomplete implementation of class %qE",
6444 CLASS_NAME (objc_implementation_context));
6445 break;
6446 case CATEGORY_IMPLEMENTATION_TYPE:
6447 warning (0, "incomplete implementation of category %qE",
6448 CLASS_SUPER_NAME (objc_implementation_context));
6449 break;
6450 default:
6451 gcc_unreachable ();
6453 first = 0;
6455 warning (0, "method definition for %<%c%E%> not found",
6456 mtype, METHOD_SEL_NAME (chain));
6459 chain = TREE_CHAIN (chain); /* next method... */
6461 return first;
6464 /* Check whether the current interface (accessible via
6465 'objc_implementation_context') actually implements protocol P, along
6466 with any protocols that P inherits. */
6468 static void
6469 check_protocol (tree p, const char *type, tree name)
6471 if (TREE_CODE (p) == PROTOCOL_INTERFACE_TYPE)
6473 int f1, f2;
6475 /* Ensure that all protocols have bodies! */
6476 if (warn_protocol)
6478 f1 = check_methods (PROTOCOL_CLS_METHODS (p),
6479 objc_implementation_context,
6480 '+');
6481 f2 = check_methods (PROTOCOL_NST_METHODS (p),
6482 objc_implementation_context,
6483 '-');
6485 else
6487 f1 = check_methods_accessible (PROTOCOL_CLS_METHODS (p),
6488 objc_implementation_context,
6489 '+');
6490 f2 = check_methods_accessible (PROTOCOL_NST_METHODS (p),
6491 objc_implementation_context,
6492 '-');
6495 if (!f1 || !f2)
6496 warning (0, "%s %qE does not fully implement the %qE protocol",
6497 type, name, PROTOCOL_NAME (p));
6500 /* Check protocols recursively. */
6501 if (PROTOCOL_LIST (p))
6503 tree subs = PROTOCOL_LIST (p);
6504 tree super_class =
6505 lookup_interface (CLASS_SUPER_NAME (implementation_template));
6507 while (subs)
6509 tree sub = TREE_VALUE (subs);
6511 /* If the superclass does not conform to the protocols
6512 inherited by P, then we must! */
6513 if (!super_class || !conforms_to_protocol (super_class, sub))
6514 check_protocol (sub, type, name);
6515 subs = TREE_CHAIN (subs);
6520 /* Check whether the current interface (accessible via
6521 'objc_implementation_context') actually implements the protocols listed
6522 in PROTO_LIST. */
6524 static void
6525 check_protocols (tree proto_list, const char *type, tree name)
6527 for ( ; proto_list; proto_list = TREE_CHAIN (proto_list))
6529 tree p = TREE_VALUE (proto_list);
6531 check_protocol (p, type, name);
6535 /* Make sure that the class CLASS_NAME is defined CODE says which kind
6536 of thing CLASS_NAME ought to be. It can be CLASS_INTERFACE_TYPE,
6537 CLASS_IMPLEMENTATION_TYPE, CATEGORY_INTERFACE_TYPE, or
6538 CATEGORY_IMPLEMENTATION_TYPE. For a CATEGORY_INTERFACE_TYPE,
6539 SUPER_NAME is the name of the category. For a class extension,
6540 CODE is CATEGORY_INTERFACE_TYPE and SUPER_NAME is NULL_TREE. */
6541 static tree
6542 start_class (enum tree_code code, tree class_name, tree super_name,
6543 tree protocol_list, tree attributes)
6545 tree klass = NULL_TREE;
6546 tree decl;
6548 #ifdef OBJCPLUS
6549 if (current_namespace != global_namespace)
6551 error ("Objective-C declarations may only appear in global scope");
6553 #endif /* OBJCPLUS */
6555 if (objc_implementation_context)
6557 warning (0, "%<@end%> missing in implementation context");
6558 finish_class (objc_implementation_context);
6559 objc_ivar_chain = NULL_TREE;
6560 objc_implementation_context = NULL_TREE;
6563 /* If this is a class extension, we'll be "reopening" the existing
6564 CLASS_INTERFACE_TYPE, so in that case there is no need to create
6565 a new node. */
6566 if (code != CATEGORY_INTERFACE_TYPE || super_name != NULL_TREE)
6568 klass = make_node (code);
6569 TYPE_LANG_SLOT_1 (klass) = make_tree_vec (CLASS_LANG_SLOT_ELTS);
6572 /* Check for existence of the super class, if one was specified. Note
6573 that we must have seen an @interface, not just a @class. If we
6574 are looking at a @compatibility_alias, traverse it first. */
6575 if ((code == CLASS_INTERFACE_TYPE || code == CLASS_IMPLEMENTATION_TYPE)
6576 && super_name)
6578 tree super = objc_is_class_name (super_name);
6579 tree super_interface = NULL_TREE;
6581 if (super)
6582 super_interface = lookup_interface (super);
6584 if (!super_interface)
6586 error ("cannot find interface declaration for %qE, superclass of %qE",
6587 super ? super : super_name,
6588 class_name);
6589 super_name = NULL_TREE;
6591 else
6593 if (TREE_DEPRECATED (super_interface))
6594 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
6595 super);
6596 super_name = super;
6600 if (code != CATEGORY_INTERFACE_TYPE || super_name != NULL_TREE)
6602 CLASS_NAME (klass) = class_name;
6603 CLASS_SUPER_NAME (klass) = super_name;
6604 CLASS_CLS_METHODS (klass) = NULL_TREE;
6607 if (! objc_is_class_name (class_name)
6608 && (decl = lookup_name (class_name)))
6610 error ("%qE redeclared as different kind of symbol",
6611 class_name);
6612 error ("previous declaration of %q+D",
6613 decl);
6616 switch (code)
6618 case CLASS_IMPLEMENTATION_TYPE:
6620 tree chain;
6622 for (chain = implemented_classes; chain; chain = TREE_CHAIN (chain))
6623 if (TREE_VALUE (chain) == class_name)
6625 error ("reimplementation of class %qE",
6626 class_name);
6627 /* TODO: error message saying where it was previously
6628 implemented. */
6629 break;
6631 if (chain == NULL_TREE)
6632 implemented_classes = tree_cons (NULL_TREE, class_name,
6633 implemented_classes);
6636 /* Reset for multiple classes per file. */
6637 method_slot = 0;
6639 objc_implementation_context = klass;
6641 /* Lookup the interface for this implementation. */
6643 if (!(implementation_template = lookup_interface (class_name)))
6645 warning (0, "cannot find interface declaration for %qE",
6646 class_name);
6647 add_class (implementation_template = objc_implementation_context,
6648 class_name);
6651 /* If a super class has been specified in the implementation,
6652 insure it conforms to the one specified in the interface. */
6654 if (super_name
6655 && (super_name != CLASS_SUPER_NAME (implementation_template)))
6657 tree previous_name = CLASS_SUPER_NAME (implementation_template);
6658 error ("conflicting super class name %qE",
6659 super_name);
6660 if (previous_name)
6661 error ("previous declaration of %qE", previous_name);
6662 else
6663 error ("previous declaration");
6666 else if (! super_name)
6668 CLASS_SUPER_NAME (objc_implementation_context)
6669 = CLASS_SUPER_NAME (implementation_template);
6671 break;
6673 case CLASS_INTERFACE_TYPE:
6674 if (lookup_interface (class_name))
6675 #ifdef OBJCPLUS
6676 error ("duplicate interface declaration for class %qE", class_name);
6677 #else
6678 warning (0, "duplicate interface declaration for class %qE", class_name);
6679 #endif
6680 else
6681 add_class (klass, class_name);
6683 if (protocol_list)
6684 CLASS_PROTOCOL_LIST (klass)
6685 = lookup_and_install_protocols (protocol_list, /* definition_required */ true);
6687 if (attributes)
6689 tree attribute;
6690 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
6692 tree name = TREE_PURPOSE (attribute);
6694 /* TODO: Document what the objc_exception attribute is/does. */
6695 /* We handle the 'deprecated' and (undocumented) 'objc_exception'
6696 attributes. */
6697 if (is_attribute_p ("deprecated", name))
6698 TREE_DEPRECATED (klass) = 1;
6699 else if (is_attribute_p ("objc_exception", name))
6700 CLASS_HAS_EXCEPTION_ATTR (klass) = 1;
6701 else
6702 /* Warn about and ignore all others for now, but store them. */
6703 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
6705 TYPE_ATTRIBUTES (klass) = attributes;
6707 break;
6709 case CATEGORY_INTERFACE_TYPE:
6711 tree class_category_is_assoc_with;
6713 /* For a category, class_name is really the name of the class that
6714 the following set of methods will be associated with. We must
6715 find the interface so that can derive the objects template. */
6716 if (!(class_category_is_assoc_with = lookup_interface (class_name)))
6718 error ("cannot find interface declaration for %qE",
6719 class_name);
6720 exit (FATAL_EXIT_CODE);
6722 else
6724 if (TREE_DEPRECATED (class_category_is_assoc_with))
6725 warning (OPT_Wdeprecated_declarations, "class %qE is deprecated",
6726 class_name);
6728 if (super_name == NULL_TREE)
6730 /* This is a class extension. Get the original
6731 interface, and continue working on it. */
6732 objc_in_class_extension = true;
6733 klass = class_category_is_assoc_with;
6735 if (protocol_list)
6737 /* Append protocols to the original protocol
6738 list. */
6739 CLASS_PROTOCOL_LIST (klass)
6740 = chainon (CLASS_PROTOCOL_LIST (klass),
6741 lookup_and_install_protocols
6742 (protocol_list,
6743 /* definition_required */ true));
6746 else
6748 add_category (class_category_is_assoc_with, klass);
6750 if (protocol_list)
6751 CLASS_PROTOCOL_LIST (klass)
6752 = lookup_and_install_protocols
6753 (protocol_list, /* definition_required */ true);
6757 break;
6759 case CATEGORY_IMPLEMENTATION_TYPE:
6760 /* Reset for multiple classes per file. */
6761 method_slot = 0;
6763 objc_implementation_context = klass;
6765 /* For a category, class_name is really the name of the class that
6766 the following set of methods will be associated with. We must
6767 find the interface so that can derive the objects template. */
6769 if (!(implementation_template = lookup_interface (class_name)))
6771 error ("cannot find interface declaration for %qE",
6772 class_name);
6773 exit (FATAL_EXIT_CODE);
6775 break;
6776 default:
6777 gcc_unreachable ();
6779 return klass;
6782 static tree
6783 continue_class (tree klass)
6785 switch (TREE_CODE (klass))
6787 case CLASS_IMPLEMENTATION_TYPE:
6788 case CATEGORY_IMPLEMENTATION_TYPE:
6790 struct imp_entry *imp_entry;
6792 /* Check consistency of the instance variables. */
6794 if (CLASS_RAW_IVARS (klass))
6795 check_ivars (implementation_template, klass);
6797 /* code generation */
6798 #ifdef OBJCPLUS
6799 push_lang_context (lang_name_c);
6800 #endif
6801 build_private_template (implementation_template);
6802 uprivate_record = CLASS_STATIC_TEMPLATE (implementation_template);
6803 objc_instance_type = build_pointer_type (uprivate_record);
6805 imp_entry = ggc_alloc_imp_entry ();
6807 imp_entry->next = imp_list;
6808 imp_entry->imp_context = klass;
6809 imp_entry->imp_template = implementation_template;
6810 ucls_super_ref = uucls_super_ref = NULL;
6811 if (TREE_CODE (klass) == CLASS_IMPLEMENTATION_TYPE)
6813 imp_entry->class_decl = (*runtime.class_decl) (klass);
6814 imp_entry->meta_decl = (*runtime.metaclass_decl) (klass);
6816 else
6818 imp_entry->class_decl = (*runtime.category_decl) (klass);
6819 imp_entry->meta_decl = NULL;
6821 imp_entry->has_cxx_cdtors = 0;
6823 /* Append to front and increment count. */
6824 imp_list = imp_entry;
6825 if (TREE_CODE (klass) == CLASS_IMPLEMENTATION_TYPE)
6826 imp_count++;
6827 else
6828 cat_count++;
6829 #ifdef OBJCPLUS
6830 pop_lang_context ();
6831 #endif /* OBJCPLUS */
6833 return get_class_ivars (implementation_template, true);
6834 break;
6836 case CLASS_INTERFACE_TYPE:
6838 if (objc_in_class_extension)
6839 return NULL_TREE;
6840 #ifdef OBJCPLUS
6841 push_lang_context (lang_name_c);
6842 #endif /* OBJCPLUS */
6843 objc_collecting_ivars = 1;
6844 build_private_template (klass);
6845 objc_collecting_ivars = 0;
6846 #ifdef OBJCPLUS
6847 pop_lang_context ();
6848 #endif /* OBJCPLUS */
6849 return NULL_TREE;
6850 break;
6852 default:
6853 return error_mark_node;
6857 /* This routine builds name of the setter synthesized function. */
6858 static char *
6859 objc_build_property_setter_name (tree ident)
6861 /* TODO: Use alloca to allocate buffer of appropriate size. */
6862 static char string[BUFSIZE];
6863 sprintf (string, "set%s:", IDENTIFIER_POINTER (ident));
6864 string[3] = TOUPPER (string[3]);
6865 return string;
6868 /* This routine prepares the declarations of the property accessor
6869 helper functions (objc_getProperty(), etc) that are used when
6870 @synthesize is used.
6872 runtime-specific routines are built in the respective runtime
6873 initialize functions. */
6874 static void
6875 build_common_objc_property_accessor_helpers (void)
6877 tree type;
6879 /* Declare the following function:
6881 objc_getProperty (id self, SEL _cmd,
6882 ptrdiff_t offset, BOOL is_atomic); */
6883 type = build_function_type_list (objc_object_type,
6884 objc_object_type,
6885 objc_selector_type,
6886 ptrdiff_type_node,
6887 boolean_type_node,
6888 NULL_TREE);
6889 objc_getProperty_decl = add_builtin_function ("objc_getProperty",
6890 type, 0, NOT_BUILT_IN,
6891 NULL, NULL_TREE);
6892 TREE_NOTHROW (objc_getProperty_decl) = 0;
6894 /* Declare the following function:
6895 void
6896 objc_setProperty (id self, SEL _cmd,
6897 ptrdiff_t offset, id new_value,
6898 BOOL is_atomic, BOOL should_copy); */
6899 type = build_function_type_list (void_type_node,
6900 objc_object_type,
6901 objc_selector_type,
6902 ptrdiff_type_node,
6903 objc_object_type,
6904 boolean_type_node,
6905 boolean_type_node,
6906 NULL_TREE);
6907 objc_setProperty_decl = add_builtin_function ("objc_setProperty",
6908 type, 0, NOT_BUILT_IN,
6909 NULL, NULL_TREE);
6910 TREE_NOTHROW (objc_setProperty_decl) = 0;
6913 /* This looks up an ivar in a class (including superclasses). */
6914 static tree
6915 lookup_ivar (tree interface, tree instance_variable_name)
6917 while (interface)
6919 tree decl_chain;
6921 for (decl_chain = CLASS_IVARS (interface); decl_chain; decl_chain = DECL_CHAIN (decl_chain))
6922 if (DECL_NAME (decl_chain) == instance_variable_name)
6923 return decl_chain;
6925 /* Not found. Search superclass if any. */
6926 if (CLASS_SUPER_NAME (interface))
6927 interface = lookup_interface (CLASS_SUPER_NAME (interface));
6930 return NULL_TREE;
6933 /* This routine synthesizes a 'getter' method. This is only called
6934 for @synthesize properties. */
6935 static void
6936 objc_synthesize_getter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree property)
6938 location_t location = DECL_SOURCE_LOCATION (property);
6939 tree fn, decl;
6940 tree body;
6941 tree ret_val;
6943 /* If user has implemented a getter with same name then do nothing. */
6944 if (lookup_method (CLASS_NST_METHODS (objc_implementation_context),
6945 PROPERTY_GETTER_NAME (property)))
6946 return;
6948 /* Find declaration of the property getter in the interface (or
6949 superclass, or protocol). There must be one. */
6950 decl = lookup_method_static (klass, PROPERTY_GETTER_NAME (property), 0);
6952 /* If one not declared in the interface, this condition has already
6953 been reported as user error (because property was not declared in
6954 the interface). */
6955 if (!decl)
6956 return;
6958 /* Adapt the 'decl'. Use the source location of the @synthesize
6959 statement for error messages. */
6960 decl = copy_node (decl);
6961 DECL_SOURCE_LOCATION (decl) = location;
6963 objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE);
6964 body = c_begin_compound_stmt (true);
6966 /* Now we need to decide how we build the getter. There are three
6967 cases:
6969 for 'copy' or 'retain' properties we need to use the
6970 objc_getProperty() accessor helper which knows about retain and
6971 copy. It supports both 'nonatomic' and 'atomic' access.
6973 for 'nonatomic, assign' properties we can access the instance
6974 variable directly. 'nonatomic' means we don't have to use locks,
6975 and 'assign' means we don't have to worry about retain or copy.
6976 If you combine the two, it means we can just access the instance
6977 variable directly.
6979 for 'atomic, assign' properties we use objc_copyStruct() (for the
6980 next runtime) or objc_getPropertyStruct() (for the GNU runtime). */
6981 switch (PROPERTY_ASSIGN_SEMANTICS (property))
6983 case OBJC_PROPERTY_RETAIN:
6984 case OBJC_PROPERTY_COPY:
6986 /* We build "return objc_getProperty (self, _cmd, offset, is_atomic);" */
6987 tree cmd, ivar, offset, is_atomic;
6988 cmd = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
6990 /* Find the ivar to compute the offset. */
6991 ivar = lookup_ivar (klass, PROPERTY_IVAR_NAME (property));
6992 if (!ivar || is_private (ivar))
6994 /* This should never happen. */
6995 error_at (location,
6996 "can not find instance variable associated with property");
6997 ret_val = error_mark_node;
6998 break;
7000 offset = byte_position (ivar);
7002 if (PROPERTY_NONATOMIC (property))
7003 is_atomic = boolean_false_node;
7004 else
7005 is_atomic = boolean_true_node;
7007 ret_val = build_function_call
7008 (location,
7009 /* Function prototype. */
7010 objc_getProperty_decl,
7011 /* Parameters. */
7012 tree_cons /* self */
7013 (NULL_TREE, self_decl,
7014 tree_cons /* _cmd */
7015 (NULL_TREE, cmd,
7016 tree_cons /* offset */
7017 (NULL_TREE, offset,
7018 tree_cons /* is_atomic */
7019 (NULL_TREE, is_atomic, NULL_TREE)))));
7021 break;
7022 case OBJC_PROPERTY_ASSIGN:
7023 if (PROPERTY_NONATOMIC (property))
7025 /* We build "return self->PROPERTY_IVAR_NAME;" */
7026 ret_val = objc_lookup_ivar (NULL_TREE, PROPERTY_IVAR_NAME (property));
7027 break;
7029 else
7031 /* We build
7032 <property type> __objc_property_temp;
7033 objc_getPropertyStruct (&__objc_property_temp,
7034 &(self->PROPERTY_IVAR_NAME),
7035 sizeof (type of self->PROPERTY_IVAR_NAME),
7036 is_atomic,
7037 false)
7038 return __objc_property_temp;
7040 For the NeXT runtime, we need to use objc_copyStruct
7041 instead of objc_getPropertyStruct. */
7042 tree objc_property_temp_decl, function_decl, function_call;
7043 tree size_of, is_atomic;
7045 objc_property_temp_decl = objc_create_temporary_var (TREE_TYPE (property), "__objc_property_temp");
7046 DECL_SOURCE_LOCATION (objc_property_temp_decl) = location;
7047 objc_property_temp_decl = lang_hooks.decls.pushdecl (objc_property_temp_decl);
7049 /* sizeof (ivar type). Since the ivar and the property have
7050 the same type, there is no need to lookup the ivar. */
7051 size_of = c_sizeof_or_alignof_type (location, TREE_TYPE (property),
7052 true /* is_sizeof */,
7053 false /* complain */);
7055 if (PROPERTY_NONATOMIC (property))
7056 is_atomic = boolean_false_node;
7057 else
7058 is_atomic = boolean_true_node;
7060 if (objc_copyStruct_decl)
7061 function_decl = objc_copyStruct_decl;
7062 else
7063 function_decl = objc_getPropertyStruct_decl;
7065 function_call = build_function_call
7066 (location,
7067 /* Function prototype. */
7068 function_decl,
7069 /* Parameters. */
7070 tree_cons /* &__objc_property_temp_decl */
7071 /* Warning: note that using build_fold_addr_expr_loc()
7072 here causes invalid code to be generated. */
7073 (NULL_TREE, build_unary_op (location, ADDR_EXPR, objc_property_temp_decl, 0),
7074 tree_cons /* &(self->PROPERTY_IVAR_NAME); */
7075 (NULL_TREE, build_fold_addr_expr_loc (location,
7076 objc_lookup_ivar
7077 (NULL_TREE, PROPERTY_IVAR_NAME (property))),
7078 tree_cons /* sizeof (PROPERTY_IVAR) */
7079 (NULL_TREE, size_of,
7080 tree_cons /* is_atomic */
7081 (NULL_TREE, is_atomic,
7082 /* TODO: This is currently ignored by the GNU
7083 runtime, but what about the next one ? */
7084 tree_cons /* has_strong */
7085 (NULL_TREE, boolean_true_node, NULL_TREE))))));
7087 add_stmt (function_call);
7089 ret_val = objc_property_temp_decl;
7091 break;
7092 default:
7093 gcc_unreachable ();
7096 gcc_assert (ret_val);
7098 #ifdef OBJCPLUS
7099 finish_return_stmt (ret_val);
7100 #else
7101 c_finish_return (location, ret_val, NULL_TREE);
7102 #endif
7104 add_stmt (c_end_compound_stmt (location, body, true));
7105 fn = current_function_decl;
7106 #ifdef OBJCPLUS
7107 finish_function ();
7108 #endif
7109 objc_finish_method_definition (fn);
7112 /* This routine synthesizes a 'setter' method. */
7114 static void
7115 objc_synthesize_setter (tree klass, tree class_methods ATTRIBUTE_UNUSED, tree property)
7117 location_t location = DECL_SOURCE_LOCATION (property);
7118 tree fn, decl;
7119 tree body;
7120 tree new_value, statement;
7122 /* If user has implemented a setter with same name then do nothing. */
7123 if (lookup_method (CLASS_NST_METHODS (objc_implementation_context),
7124 PROPERTY_SETTER_NAME (property)))
7125 return;
7127 /* Find declaration of the property setter in the interface (or
7128 superclass, or protocol). There must be one. */
7129 decl = lookup_method_static (klass, PROPERTY_SETTER_NAME (property), 0);
7131 /* If one not declared in the interface, this condition has already
7132 been reported as user error (because property was not declared in
7133 the interface). */
7134 if (!decl)
7135 return;
7137 /* Adapt the 'decl'. Use the source location of the @synthesize
7138 statement for error messages. */
7139 decl = copy_node (decl);
7140 DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (property);
7142 objc_start_method_definition (false /* is_class_method */, decl, NULL_TREE);
7144 body = c_begin_compound_stmt (true);
7146 /* The 'new_value' is the only argument to the method, which is the
7147 3rd argument of the function, after self and _cmd. We use twice
7148 TREE_CHAIN to move forward two arguments. */
7149 new_value = TREE_CHAIN (TREE_CHAIN (DECL_ARGUMENTS (current_function_decl)));
7151 /* This would presumably happen if the user has specified a
7152 prototype for the setter that does not have an argument! */
7153 if (new_value == NULL_TREE)
7155 /* TODO: This should be caught much earlier than this. */
7156 error_at (DECL_SOURCE_LOCATION (decl), "invalid setter, it must have one argument");
7157 /* Try to recover somehow. */
7158 new_value = error_mark_node;
7161 /* Now we need to decide how we build the setter. There are three
7162 cases:
7164 for 'copy' or 'retain' properties we need to use the
7165 objc_setProperty() accessor helper which knows about retain and
7166 copy. It supports both 'nonatomic' and 'atomic' access.
7168 for 'nonatomic, assign' properties we can access the instance
7169 variable directly. 'nonatomic' means we don't have to use locks,
7170 and 'assign' means we don't have to worry about retain or copy.
7171 If you combine the two, it means we can just access the instance
7172 variable directly.
7174 for 'atomic, assign' properties we use objc_copyStruct() (for the
7175 next runtime) or objc_setPropertyStruct() (for the GNU runtime). */
7176 switch (PROPERTY_ASSIGN_SEMANTICS (property))
7178 case OBJC_PROPERTY_RETAIN:
7179 case OBJC_PROPERTY_COPY:
7181 /* We build "objc_setProperty (self, _cmd, new_value, offset, is_atomic, should_copy);" */
7182 tree cmd, ivar, offset, is_atomic, should_copy;
7183 cmd = TREE_CHAIN (DECL_ARGUMENTS (current_function_decl));
7185 /* Find the ivar to compute the offset. */
7186 ivar = lookup_ivar (klass, PROPERTY_IVAR_NAME (property));
7187 if (!ivar || is_private (ivar))
7189 error_at (location,
7190 "can not find instance variable associated with property");
7191 statement = error_mark_node;
7192 break;
7194 offset = byte_position (ivar);
7196 if (PROPERTY_NONATOMIC (property))
7197 is_atomic = boolean_false_node;
7198 else
7199 is_atomic = boolean_true_node;
7201 if (PROPERTY_ASSIGN_SEMANTICS (property) == OBJC_PROPERTY_COPY)
7202 should_copy = boolean_true_node;
7203 else
7204 should_copy = boolean_false_node;
7206 statement = build_function_call
7207 (location,
7208 /* Function prototype. */
7209 objc_setProperty_decl,
7210 /* Parameters. */
7211 tree_cons /* self */
7212 (NULL_TREE, self_decl,
7213 tree_cons /* _cmd */
7214 (NULL_TREE, cmd,
7215 tree_cons /* offset */
7216 (NULL_TREE, offset,
7217 tree_cons /* new_value */
7218 (NULL_TREE, new_value,
7219 tree_cons /* is_atomic */
7220 (NULL_TREE, is_atomic,
7221 tree_cons /* should_copy */
7222 (NULL_TREE, should_copy, NULL_TREE)))))));
7224 break;
7225 case OBJC_PROPERTY_ASSIGN:
7226 if (PROPERTY_NONATOMIC (property))
7228 /* We build "self->PROPERTY_IVAR_NAME = new_value;" */
7229 statement = build_modify_expr
7230 (location,
7231 objc_lookup_ivar (NULL_TREE, PROPERTY_IVAR_NAME (property)),
7232 NULL_TREE, NOP_EXPR,
7233 location, new_value, NULL_TREE);
7234 break;
7236 else
7238 /* We build
7239 objc_setPropertyStruct (&(self->PROPERTY_IVAR_NAME),
7240 &new_value,
7241 sizeof (type of self->PROPERTY_IVAR_NAME),
7242 is_atomic,
7243 false)
7245 For the NeXT runtime, we need to use objc_copyStruct
7246 instead of objc_getPropertyStruct. */
7247 tree function_decl, size_of, is_atomic;
7249 /* sizeof (ivar type). Since the ivar and the property have
7250 the same type, there is no need to lookup the ivar. */
7251 size_of = c_sizeof_or_alignof_type (location, TREE_TYPE (property),
7252 true /* is_sizeof */,
7253 false /* complain */);
7255 if (PROPERTY_NONATOMIC (property))
7256 is_atomic = boolean_false_node;
7257 else
7258 is_atomic = boolean_true_node;
7260 if (objc_copyStruct_decl)
7261 function_decl = objc_copyStruct_decl;
7262 else
7263 function_decl = objc_setPropertyStruct_decl;
7265 statement = build_function_call
7266 (location,
7267 /* Function prototype. */
7268 function_decl,
7269 /* Parameters. */
7270 tree_cons /* &(self->PROPERTY_IVAR_NAME); */
7271 (NULL_TREE, build_fold_addr_expr_loc (location,
7272 objc_lookup_ivar
7273 (NULL_TREE, PROPERTY_IVAR_NAME (property))),
7274 tree_cons /* &new_value */
7275 (NULL_TREE, build_fold_addr_expr_loc (location, new_value),
7276 tree_cons /* sizeof (PROPERTY_IVAR) */
7277 (NULL_TREE, size_of,
7278 tree_cons /* is_atomic */
7279 (NULL_TREE, is_atomic,
7280 /* TODO: This is currently ignored by the GNU
7281 runtime, but what about the next one ? */
7282 tree_cons /* has_strong */
7283 (NULL_TREE, boolean_true_node, NULL_TREE))))));
7285 break;
7286 default:
7287 gcc_unreachable ();
7289 gcc_assert (statement);
7291 add_stmt (statement);
7292 add_stmt (c_end_compound_stmt (location, body, true));
7293 fn = current_function_decl;
7294 #ifdef OBJCPLUS
7295 finish_function ();
7296 #endif
7297 objc_finish_method_definition (fn);
7300 /* This function is a sub-routine of objc_add_synthesize_declaration.
7301 It is called for each property to synthesize once we have
7302 determined that the context is Ok. */
7303 static void
7304 objc_add_synthesize_declaration_for_property (location_t location, tree interface,
7305 tree property_name, tree ivar_name)
7307 /* Find the @property declaration. */
7308 tree property;
7309 tree x;
7311 /* Check that synthesize or dynamic has not already been used for
7312 the same property. */
7313 for (property = IMPL_PROPERTY_DECL (objc_implementation_context); property; property = TREE_CHAIN (property))
7314 if (PROPERTY_NAME (property) == property_name)
7316 location_t original_location = DECL_SOURCE_LOCATION (property);
7318 if (PROPERTY_DYNAMIC (property))
7319 error_at (location, "property %qs already specified in %<@dynamic%>",
7320 IDENTIFIER_POINTER (property_name));
7321 else
7322 error_at (location, "property %qs already specified in %<@synthesize%>",
7323 IDENTIFIER_POINTER (property_name));
7325 if (original_location != UNKNOWN_LOCATION)
7326 inform (original_location, "originally specified here");
7327 return;
7330 /* Check that the property is declared in the interface. It could
7331 also be declared in a superclass or protocol. */
7332 property = lookup_property (interface, property_name);
7334 if (!property)
7336 error_at (location, "no declaration of property %qs found in the interface",
7337 IDENTIFIER_POINTER (property_name));
7338 return;
7340 else
7342 /* We have to copy the property, because we want to chain it to
7343 the implementation context, and we want to store the source
7344 location of the @synthesize, not of the original
7345 @property. */
7346 property = copy_node (property);
7347 DECL_SOURCE_LOCATION (property) = location;
7350 /* Determine PROPERTY_IVAR_NAME. */
7351 if (ivar_name == NULL_TREE)
7352 ivar_name = property_name;
7354 /* Check that the instance variable exists. You can only use an
7355 instance variable from the same class, not one from the
7356 superclass (this makes sense as it allows us to check that an
7357 instance variable is only used in one synthesized property). */
7359 tree ivar = is_ivar (CLASS_IVARS (interface), ivar_name);
7360 tree type_of_ivar;
7361 if (!ivar)
7363 error_at (location, "ivar %qs used by %<@synthesize%> declaration must be an existing ivar",
7364 IDENTIFIER_POINTER (property_name));
7365 return;
7368 if (DECL_BIT_FIELD_TYPE (ivar))
7369 type_of_ivar = DECL_BIT_FIELD_TYPE (ivar);
7370 else
7371 type_of_ivar = TREE_TYPE (ivar);
7373 /* If the instance variable has a different C type, we throw an error ... */
7374 if (!comptypes (TREE_TYPE (property), type_of_ivar)
7375 /* ... unless the property is readonly, in which case we allow
7376 the instance variable to be more specialized (this means we
7377 can generate the getter all right and it works). */
7378 && (!PROPERTY_READONLY (property)
7379 || !objc_compare_types (TREE_TYPE (property),
7380 type_of_ivar, -5, NULL_TREE)))
7382 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7384 error_at (location, "property %qs is using instance variable %qs of incompatible type",
7385 IDENTIFIER_POINTER (property_name),
7386 IDENTIFIER_POINTER (ivar_name));
7388 if (original_location != UNKNOWN_LOCATION)
7389 inform (original_location, "originally specified here");
7392 /* If the instance variable is a bitfield, the property must be
7393 'assign', 'nonatomic' because the runtime getter/setter helper
7394 do not work with bitfield instance variables. */
7395 if (DECL_BIT_FIELD_TYPE (ivar))
7397 /* If there is an error, we return and not generate any
7398 getter/setter because trying to set up the runtime
7399 getter/setter helper calls with bitfields is at high risk
7400 of ICE. */
7402 if (PROPERTY_ASSIGN_SEMANTICS (property) != OBJC_PROPERTY_ASSIGN)
7404 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7406 error_at (location, "'assign' property %qs is using bit-field instance variable %qs",
7407 IDENTIFIER_POINTER (property_name),
7408 IDENTIFIER_POINTER (ivar_name));
7410 if (original_location != UNKNOWN_LOCATION)
7411 inform (original_location, "originally specified here");
7412 return;
7415 if (!PROPERTY_NONATOMIC (property))
7417 location_t original_location = DECL_SOURCE_LOCATION (ivar);
7419 error_at (location, "'atomic' property %qs is using bit-field instance variable %qs",
7420 IDENTIFIER_POINTER (property_name),
7421 IDENTIFIER_POINTER (ivar_name));
7423 if (original_location != UNKNOWN_LOCATION)
7424 inform (original_location, "originally specified here");
7425 return;
7430 /* Check that no other property is using the same instance
7431 variable. */
7432 for (x = IMPL_PROPERTY_DECL (objc_implementation_context); x; x = TREE_CHAIN (x))
7433 if (PROPERTY_IVAR_NAME (x) == ivar_name)
7435 location_t original_location = DECL_SOURCE_LOCATION (x);
7437 error_at (location, "property %qs is using the same instance variable as property %qs",
7438 IDENTIFIER_POINTER (property_name),
7439 IDENTIFIER_POINTER (PROPERTY_NAME (x)));
7441 if (original_location != UNKNOWN_LOCATION)
7442 inform (original_location, "originally specified here");
7444 /* We keep going on. This won't cause the compiler to fail;
7445 the failure would most likely be at runtime. */
7448 /* Note that a @synthesize (and only a @synthesize) always sets
7449 PROPERTY_IVAR_NAME to a non-NULL_TREE. You can recognize a
7450 @synthesize by that. */
7451 PROPERTY_IVAR_NAME (property) = ivar_name;
7453 /* PROPERTY_SETTER_NAME and PROPERTY_GETTER_NAME are copied from the
7454 original declaration; they are always set (with the exception of
7455 PROPERTY_SETTER_NAME not being set if PROPERTY_READONLY == 1). */
7457 /* Add the property to the list of properties for current implementation. */
7458 TREE_CHAIN (property) = IMPL_PROPERTY_DECL (objc_implementation_context);
7459 IMPL_PROPERTY_DECL (objc_implementation_context) = property;
7461 /* Note how we don't actually synthesize the getter/setter here; it
7462 would be very natural, but we may miss the fact that the user has
7463 implemented his own getter/setter later on in the @implementation
7464 (in which case we shouldn't generate getter/setter). We wait
7465 until we have parsed it all before generating the code. */
7468 /* This function is called by the parser after a @synthesize
7469 expression is parsed. 'location' is the location of the
7470 @synthesize expression, and 'property_and_ivar_list' is a chained
7471 list of the property and ivar names. */
7472 void
7473 objc_add_synthesize_declaration (location_t location, tree property_and_ivar_list)
7475 tree interface, chain;
7477 if (flag_objc1_only)
7478 error_at (input_location, "%<@synthesize%> is not available in Objective-C 1.0");
7480 if (property_and_ivar_list == error_mark_node)
7481 return;
7483 if (!objc_implementation_context)
7485 /* We can get here only in Objective-C; the Objective-C++ parser
7486 detects the problem while parsing, outputs the error
7487 "misplaced '@synthesize' Objective-C++ construct" and skips
7488 the declaration. */
7489 error_at (location, "%<@synthesize%> not in @implementation context");
7490 return;
7493 if (TREE_CODE (objc_implementation_context) == CATEGORY_IMPLEMENTATION_TYPE)
7495 error_at (location, "%<@synthesize%> can not be used in categories");
7496 return;
7499 interface = lookup_interface (CLASS_NAME (objc_implementation_context));
7500 if (!interface)
7502 /* I can't see how this could happen, but it is good as a safety check. */
7503 error_at (location,
7504 "%<@synthesize%> requires the @interface of the class to be available");
7505 return;
7508 /* Now, iterate over the properties and do each of them. */
7509 for (chain = property_and_ivar_list; chain; chain = TREE_CHAIN (chain))
7511 objc_add_synthesize_declaration_for_property (location, interface, TREE_VALUE (chain),
7512 TREE_PURPOSE (chain));
7516 /* This function is a sub-routine of objc_add_dynamic_declaration. It
7517 is called for each property to mark as dynamic once we have
7518 determined that the context is Ok. */
7519 static void
7520 objc_add_dynamic_declaration_for_property (location_t location, tree interface,
7521 tree property_name)
7523 /* Find the @property declaration. */
7524 tree property;
7526 /* Check that synthesize or dynamic has not already been used for
7527 the same property. */
7528 for (property = IMPL_PROPERTY_DECL (objc_implementation_context); property; property = TREE_CHAIN (property))
7529 if (PROPERTY_NAME (property) == property_name)
7531 location_t original_location = DECL_SOURCE_LOCATION (property);
7533 if (PROPERTY_DYNAMIC (property))
7534 error_at (location, "property %qs already specified in %<@dynamic%>",
7535 IDENTIFIER_POINTER (property_name));
7536 else
7537 error_at (location, "property %qs already specified in %<@synthesize%>",
7538 IDENTIFIER_POINTER (property_name));
7540 if (original_location != UNKNOWN_LOCATION)
7541 inform (original_location, "originally specified here");
7542 return;
7545 /* Check that the property is declared in the interface. It could
7546 also be declared in a superclass or protocol. */
7547 property = lookup_property (interface, property_name);
7549 if (!property)
7551 error_at (location, "no declaration of property %qs found in the interface",
7552 IDENTIFIER_POINTER (property_name));
7553 return;
7555 else
7557 /* We have to copy the property, because we want to chain it to
7558 the implementation context, and we want to store the source
7559 location of the @synthesize, not of the original
7560 @property. */
7561 property = copy_node (property);
7562 DECL_SOURCE_LOCATION (property) = location;
7565 /* Note that a @dynamic (and only a @dynamic) always sets
7566 PROPERTY_DYNAMIC to 1. You can recognize a @dynamic by that.
7567 (actually, as explained above, PROPERTY_DECL generated by
7568 @property and associated with a @dynamic property are also marked
7569 as PROPERTY_DYNAMIC). */
7570 PROPERTY_DYNAMIC (property) = 1;
7572 /* Add the property to the list of properties for current implementation. */
7573 TREE_CHAIN (property) = IMPL_PROPERTY_DECL (objc_implementation_context);
7574 IMPL_PROPERTY_DECL (objc_implementation_context) = property;
7577 /* This function is called by the parser after a @dynamic expression
7578 is parsed. 'location' is the location of the @dynamic expression,
7579 and 'property_list' is a chained list of all the property
7580 names. */
7581 void
7582 objc_add_dynamic_declaration (location_t location, tree property_list)
7584 tree interface, chain;
7586 if (flag_objc1_only)
7587 error_at (input_location, "%<@dynamic%> is not available in Objective-C 1.0");
7589 if (property_list == error_mark_node)
7590 return;
7592 if (!objc_implementation_context)
7594 /* We can get here only in Objective-C; the Objective-C++ parser
7595 detects the problem while parsing, outputs the error
7596 "misplaced '@dynamic' Objective-C++ construct" and skips the
7597 declaration. */
7598 error_at (location, "%<@dynamic%> not in @implementation context");
7599 return;
7602 /* @dynamic is allowed in categories. */
7603 switch (TREE_CODE (objc_implementation_context))
7605 case CLASS_IMPLEMENTATION_TYPE:
7606 interface = lookup_interface (CLASS_NAME (objc_implementation_context));
7607 break;
7608 case CATEGORY_IMPLEMENTATION_TYPE:
7609 interface = lookup_category (implementation_template,
7610 CLASS_SUPER_NAME (objc_implementation_context));
7611 break;
7612 default:
7613 gcc_unreachable ();
7616 if (!interface)
7618 /* I can't see how this could happen, but it is good as a safety check. */
7619 error_at (location,
7620 "%<@dynamic%> requires the @interface of the class to be available");
7621 return;
7624 /* Now, iterate over the properties and do each of them. */
7625 for (chain = property_list; chain; chain = TREE_CHAIN (chain))
7627 objc_add_dynamic_declaration_for_property (location, interface, TREE_VALUE (chain));
7631 /* Main routine to generate code/data for all the property information for
7632 current implementation (class or category). CLASS is the interface where
7633 ivars are declared. CLASS_METHODS is where methods are found which
7634 could be a class or a category depending on whether we are implementing
7635 property of a class or a category. */
7637 static void
7638 objc_gen_property_data (tree klass, tree class_methods)
7640 tree x;
7642 for (x = IMPL_PROPERTY_DECL (objc_implementation_context); x; x = TREE_CHAIN (x))
7644 /* @dynamic property - nothing to check or synthesize. */
7645 if (PROPERTY_DYNAMIC (x))
7646 continue;
7648 /* @synthesize property - need to synthesize the accessors. */
7649 if (PROPERTY_IVAR_NAME (x))
7651 objc_synthesize_getter (klass, class_methods, x);
7653 if (PROPERTY_READONLY (x) == 0)
7654 objc_synthesize_setter (klass, class_methods, x);
7656 continue;
7659 gcc_unreachable ();
7663 /* This is called once we see the "@end" in an interface/implementation. */
7665 static void
7666 finish_class (tree klass)
7668 switch (TREE_CODE (klass))
7670 case CLASS_IMPLEMENTATION_TYPE:
7672 /* All metadata generation is done in runtime.generate_metadata(). */
7674 /* Generate what needed for property; setters, getters, etc. */
7675 objc_gen_property_data (implementation_template, implementation_template);
7677 if (implementation_template != objc_implementation_context)
7679 /* Ensure that all method listed in the interface contain bodies. */
7680 check_methods (CLASS_CLS_METHODS (implementation_template),
7681 objc_implementation_context, '+');
7682 check_methods (CLASS_NST_METHODS (implementation_template),
7683 objc_implementation_context, '-');
7685 if (CLASS_PROTOCOL_LIST (implementation_template))
7686 check_protocols (CLASS_PROTOCOL_LIST (implementation_template),
7687 "class",
7688 CLASS_NAME (objc_implementation_context));
7690 break;
7692 case CATEGORY_IMPLEMENTATION_TYPE:
7694 tree category = lookup_category (implementation_template, CLASS_SUPER_NAME (klass));
7696 if (category)
7698 /* Generate what needed for property; setters, getters, etc. */
7699 objc_gen_property_data (implementation_template, category);
7701 /* Ensure all method listed in the interface contain bodies. */
7702 check_methods (CLASS_CLS_METHODS (category),
7703 objc_implementation_context, '+');
7704 check_methods (CLASS_NST_METHODS (category),
7705 objc_implementation_context, '-');
7707 if (CLASS_PROTOCOL_LIST (category))
7708 check_protocols (CLASS_PROTOCOL_LIST (category),
7709 "category",
7710 CLASS_SUPER_NAME (objc_implementation_context));
7712 break;
7714 case CLASS_INTERFACE_TYPE:
7715 case CATEGORY_INTERFACE_TYPE:
7716 case PROTOCOL_INTERFACE_TYPE:
7718 /* Process properties of the class. */
7719 tree x;
7720 for (x = CLASS_PROPERTY_DECL (objc_interface_context); x; x = TREE_CHAIN (x))
7722 /* Now we check that the appropriate getter is declared,
7723 and if not, we declare one ourselves. */
7724 tree getter_decl = lookup_method (CLASS_NST_METHODS (klass),
7725 PROPERTY_GETTER_NAME (x));
7727 if (getter_decl)
7729 /* TODO: Check that the declaration is consistent with the property. */
7732 else
7734 /* Generate an instance method declaration for the
7735 getter; for example "- (id) name;". In general it
7736 will be of the form
7737 -(type)property_getter_name; */
7738 tree rettype = build_tree_list (NULL_TREE, TREE_TYPE (x));
7739 getter_decl = build_method_decl (INSTANCE_METHOD_DECL,
7740 rettype, PROPERTY_GETTER_NAME (x),
7741 NULL_TREE, false);
7742 if (PROPERTY_OPTIONAL (x))
7743 objc_add_method (objc_interface_context, getter_decl, false, true);
7744 else
7745 objc_add_method (objc_interface_context, getter_decl, false, false);
7746 TREE_DEPRECATED (getter_decl) = TREE_DEPRECATED (x);
7747 METHOD_PROPERTY_CONTEXT (getter_decl) = x;
7750 if (PROPERTY_READONLY (x) == 0)
7752 /* Now we check that the appropriate setter is declared,
7753 and if not, we declare on ourselves. */
7754 tree setter_decl = lookup_method (CLASS_NST_METHODS (klass),
7755 PROPERTY_SETTER_NAME (x));
7757 if (setter_decl)
7759 /* TODO: Check that the declaration is consistent with the property. */
7762 else
7764 /* The setter name is something like 'setName:'.
7765 We need the substring 'setName' to build the
7766 method declaration due to how the declaration
7767 works. TODO: build_method_decl() will then
7768 generate back 'setName:' from 'setName'; it
7769 would be more efficient to hook into there. */
7770 const char *full_setter_name = IDENTIFIER_POINTER (PROPERTY_SETTER_NAME (x));
7771 size_t length = strlen (full_setter_name);
7772 char *setter_name = (char *) alloca (length);
7773 tree ret_type, selector, arg_type, arg_name;
7775 strcpy (setter_name, full_setter_name);
7776 setter_name[length - 1] = '\0';
7777 ret_type = build_tree_list (NULL_TREE, void_type_node);
7778 arg_type = build_tree_list (NULL_TREE, TREE_TYPE (x));
7779 arg_name = get_identifier ("_value");
7780 selector = objc_build_keyword_decl (get_identifier (setter_name),
7781 arg_type, arg_name, NULL);
7782 setter_decl = build_method_decl (INSTANCE_METHOD_DECL,
7783 ret_type, selector,
7784 build_tree_list (NULL_TREE, NULL_TREE),
7785 false);
7786 if (PROPERTY_OPTIONAL (x))
7787 objc_add_method (objc_interface_context, setter_decl, false, true);
7788 else
7789 objc_add_method (objc_interface_context, setter_decl, false, false);
7790 TREE_DEPRECATED (setter_decl) = TREE_DEPRECATED (x);
7791 METHOD_PROPERTY_CONTEXT (setter_decl) = x;
7795 break;
7797 default:
7798 gcc_unreachable ();
7799 break;
7803 static tree
7804 add_protocol (tree protocol)
7806 /* Put protocol on list in reverse order. */
7807 TREE_CHAIN (protocol) = protocol_chain;
7808 protocol_chain = protocol;
7809 return protocol_chain;
7812 /* Check that a protocol is defined, and, recursively, that all
7813 protocols that this protocol conforms to are defined too. */
7814 static void
7815 check_that_protocol_is_defined (tree protocol)
7817 if (!PROTOCOL_DEFINED (protocol))
7818 warning (0, "definition of protocol %qE not found",
7819 PROTOCOL_NAME (protocol));
7821 /* If the protocol itself conforms to other protocols, check them
7822 too, recursively. */
7823 if (PROTOCOL_LIST (protocol))
7825 tree p;
7827 for (p = PROTOCOL_LIST (protocol); p; p = TREE_CHAIN (p))
7828 check_that_protocol_is_defined (TREE_VALUE (p));
7832 /* Looks up a protocol. If 'warn_if_deprecated' is true, a warning is
7833 emitted if the protocol is deprecated. If 'definition_required' is
7834 true, a warning is emitted if a full @protocol definition has not
7835 been seen. */
7836 static tree
7837 lookup_protocol (tree ident, bool warn_if_deprecated, bool definition_required)
7839 tree chain;
7841 for (chain = protocol_chain; chain; chain = TREE_CHAIN (chain))
7842 if (ident == PROTOCOL_NAME (chain))
7844 if (warn_if_deprecated && TREE_DEPRECATED (chain))
7846 /* It would be nice to use warn_deprecated_use() here, but
7847 we are using TREE_CHAIN (which is supposed to be the
7848 TYPE_STUB_DECL for a TYPE) for something different. */
7849 warning (OPT_Wdeprecated_declarations, "protocol %qE is deprecated",
7850 PROTOCOL_NAME (chain));
7853 if (definition_required)
7854 check_that_protocol_is_defined (chain);
7856 return chain;
7859 return NULL_TREE;
7862 /* This function forward declares the protocols named by NAMES. If
7863 they are already declared or defined, the function has no effect. */
7865 void
7866 objc_declare_protocol (tree name, tree attributes)
7868 bool deprecated = false;
7870 #ifdef OBJCPLUS
7871 if (current_namespace != global_namespace) {
7872 error ("Objective-C declarations may only appear in global scope");
7874 #endif /* OBJCPLUS */
7876 /* Determine if 'deprecated', the only attribute we recognize for
7877 protocols, was used. Ignore all other attributes. */
7878 if (attributes)
7880 tree attribute;
7881 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
7883 tree name = TREE_PURPOSE (attribute);
7885 if (is_attribute_p ("deprecated", name))
7886 deprecated = true;
7887 else
7888 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
7892 if (lookup_protocol (name, /* warn if deprecated */ false,
7893 /* definition_required */ false) == NULL_TREE)
7895 tree protocol = make_node (PROTOCOL_INTERFACE_TYPE);
7897 TYPE_LANG_SLOT_1 (protocol)
7898 = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS);
7899 PROTOCOL_NAME (protocol) = name;
7900 PROTOCOL_LIST (protocol) = NULL_TREE;
7901 add_protocol (protocol);
7902 PROTOCOL_DEFINED (protocol) = 0;
7903 PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE;
7905 if (attributes)
7907 /* TODO: Do we need to store the attributes here ? */
7908 TYPE_ATTRIBUTES (protocol) = attributes;
7909 if (deprecated)
7910 TREE_DEPRECATED (protocol) = 1;
7915 static tree
7916 start_protocol (enum tree_code code, tree name, tree list, tree attributes)
7918 tree protocol;
7919 bool deprecated = false;
7921 #ifdef OBJCPLUS
7922 if (current_namespace != global_namespace) {
7923 error ("Objective-C declarations may only appear in global scope");
7925 #endif /* OBJCPLUS */
7927 /* Determine if 'deprecated', the only attribute we recognize for
7928 protocols, was used. Ignore all other attributes. */
7929 if (attributes)
7931 tree attribute;
7932 for (attribute = attributes; attribute; attribute = TREE_CHAIN (attribute))
7934 tree name = TREE_PURPOSE (attribute);
7936 if (is_attribute_p ("deprecated", name))
7937 deprecated = true;
7938 else
7939 warning (OPT_Wattributes, "%qE attribute directive ignored", name);
7943 protocol = lookup_protocol (name, /* warn_if_deprecated */ false,
7944 /* definition_required */ false);
7946 if (!protocol)
7948 protocol = make_node (code);
7949 TYPE_LANG_SLOT_1 (protocol) = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS);
7951 PROTOCOL_NAME (protocol) = name;
7952 PROTOCOL_LIST (protocol) = lookup_and_install_protocols (list, /* definition_required */ false);
7953 add_protocol (protocol);
7954 PROTOCOL_DEFINED (protocol) = 1;
7955 PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE;
7957 check_protocol_recursively (protocol, list);
7959 else if (! PROTOCOL_DEFINED (protocol))
7961 PROTOCOL_DEFINED (protocol) = 1;
7962 PROTOCOL_LIST (protocol) = lookup_and_install_protocols (list, /* definition_required */ false);
7964 check_protocol_recursively (protocol, list);
7966 else
7968 warning (0, "duplicate declaration for protocol %qE",
7969 name);
7972 if (attributes)
7974 TYPE_ATTRIBUTES (protocol) = attributes;
7975 if (deprecated)
7976 TREE_DEPRECATED (protocol) = 1;
7979 return protocol;
7982 /* Decay array and function parameters into pointers. */
7984 static tree
7985 objc_decay_parm_type (tree type)
7987 if (TREE_CODE (type) == ARRAY_TYPE || TREE_CODE (type) == FUNCTION_TYPE)
7988 type = build_pointer_type (TREE_CODE (type) == ARRAY_TYPE
7989 ? TREE_TYPE (type)
7990 : type);
7992 return type;
7995 static GTY(()) tree objc_parmlist = NULL_TREE;
7997 /* Append PARM to a list of formal parameters of a method, making a necessary
7998 array-to-pointer adjustment along the way. */
8000 void
8001 objc_push_parm (tree parm)
8003 tree type;
8005 if (TREE_TYPE (parm) == error_mark_node)
8007 objc_parmlist = chainon (objc_parmlist, parm);
8008 return;
8011 /* Decay arrays and functions into pointers. */
8012 type = objc_decay_parm_type (TREE_TYPE (parm));
8014 /* If the parameter type has been decayed, a new PARM_DECL needs to be
8015 built as well. */
8016 if (type != TREE_TYPE (parm))
8017 parm = build_decl (input_location, PARM_DECL, DECL_NAME (parm), type);
8019 DECL_ARG_TYPE (parm)
8020 = lang_hooks.types.type_promotes_to (TREE_TYPE (parm));
8022 /* Record constancy and volatility. */
8023 c_apply_type_quals_to_decl
8024 ((TYPE_READONLY (TREE_TYPE (parm)) ? TYPE_QUAL_CONST : 0)
8025 | (TYPE_RESTRICT (TREE_TYPE (parm)) ? TYPE_QUAL_RESTRICT : 0)
8026 | (TYPE_VOLATILE (TREE_TYPE (parm)) ? TYPE_QUAL_VOLATILE : 0), parm);
8028 objc_parmlist = chainon (objc_parmlist, parm);
8031 /* Retrieve the formal parameter list constructed via preceding calls to
8032 objc_push_parm(). */
8034 #ifdef OBJCPLUS
8035 tree
8036 objc_get_parm_info (int have_ellipsis ATTRIBUTE_UNUSED)
8038 tree parm_info = objc_parmlist;
8039 objc_parmlist = NULL_TREE;
8041 return parm_info;
8043 #else
8044 struct c_arg_info *
8045 objc_get_parm_info (int have_ellipsis)
8047 tree parm_info = objc_parmlist;
8048 struct c_arg_info *arg_info;
8049 /* The C front-end requires an elaborate song and dance at
8050 this point. */
8051 push_scope ();
8052 declare_parm_level ();
8053 while (parm_info)
8055 tree next = DECL_CHAIN (parm_info);
8057 DECL_CHAIN (parm_info) = NULL_TREE;
8058 parm_info = pushdecl (parm_info);
8059 finish_decl (parm_info, input_location, NULL_TREE, NULL_TREE, NULL_TREE);
8060 parm_info = next;
8062 arg_info = get_parm_info (have_ellipsis);
8063 pop_scope ();
8064 objc_parmlist = NULL_TREE;
8065 return arg_info;
8067 #endif
8069 /* Synthesize the formal parameters 'id self' and 'SEL _cmd' needed for ObjC
8070 method definitions. In the case of instance methods, we can be more
8071 specific as to the type of 'self'. */
8073 static void
8074 synth_self_and_ucmd_args (void)
8076 tree self_type;
8078 if (objc_method_context
8079 && TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL)
8080 self_type = objc_instance_type;
8081 else
8082 /* Really a `struct objc_class *'. However, we allow people to
8083 assign to self, which changes its type midstream. */
8084 self_type = objc_object_type;
8086 /* id self; */
8087 objc_push_parm (build_decl (input_location,
8088 PARM_DECL, self_id, self_type));
8090 /* SEL _cmd; */
8091 objc_push_parm (build_decl (input_location,
8092 PARM_DECL, ucmd_id, objc_selector_type));
8095 /* Transform an Objective-C method definition into a static C function
8096 definition, synthesizing the first two arguments, "self" and "_cmd",
8097 in the process. */
8099 static void
8100 start_method_def (tree method)
8102 tree parmlist;
8103 #ifdef OBJCPLUS
8104 tree parm_info;
8105 #else
8106 struct c_arg_info *parm_info;
8107 #endif
8108 int have_ellipsis = 0;
8110 /* If we are defining a "dealloc" method in a non-root class, we
8111 will need to check if a [super dealloc] is missing, and warn if
8112 it is. */
8113 if(CLASS_SUPER_NAME (objc_implementation_context)
8114 && !strcmp ("dealloc", IDENTIFIER_POINTER (METHOD_SEL_NAME (method))))
8115 should_call_super_dealloc = 1;
8116 else
8117 should_call_super_dealloc = 0;
8119 /* Required to implement _msgSuper. */
8120 objc_method_context = method;
8121 UOBJC_SUPER_decl = NULL_TREE;
8123 /* Generate prototype declarations for arguments..."new-style". */
8124 synth_self_and_ucmd_args ();
8126 /* Generate argument declarations if a keyword_decl. */
8127 parmlist = METHOD_SEL_ARGS (method);
8128 while (parmlist)
8130 /* parmlist is a KEYWORD_DECL. */
8131 tree type = TREE_VALUE (TREE_TYPE (parmlist));
8132 tree parm;
8134 parm = build_decl (input_location,
8135 PARM_DECL, KEYWORD_ARG_NAME (parmlist), type);
8136 decl_attributes (&parm, DECL_ATTRIBUTES (parmlist), 0);
8137 objc_push_parm (parm);
8138 parmlist = DECL_CHAIN (parmlist);
8141 if (METHOD_ADD_ARGS (method))
8143 tree akey;
8145 for (akey = TREE_CHAIN (METHOD_ADD_ARGS (method));
8146 akey; akey = TREE_CHAIN (akey))
8148 objc_push_parm (TREE_VALUE (akey));
8151 if (METHOD_ADD_ARGS_ELLIPSIS_P (method))
8152 have_ellipsis = 1;
8155 parm_info = objc_get_parm_info (have_ellipsis);
8157 really_start_method (objc_method_context, parm_info);
8160 /* Return 1 if TYPE1 is equivalent to TYPE2 for purposes of method
8161 overloading. */
8162 static int
8163 objc_types_are_equivalent (tree type1, tree type2)
8165 if (type1 == type2)
8166 return 1;
8168 /* Strip away indirections. */
8169 while ((TREE_CODE (type1) == ARRAY_TYPE || TREE_CODE (type1) == POINTER_TYPE)
8170 && (TREE_CODE (type1) == TREE_CODE (type2)))
8171 type1 = TREE_TYPE (type1), type2 = TREE_TYPE (type2);
8172 if (TYPE_MAIN_VARIANT (type1) != TYPE_MAIN_VARIANT (type2))
8173 return 0;
8175 /* Compare the protocol lists. */
8176 type1 = (TYPE_HAS_OBJC_INFO (type1)
8177 ? TYPE_OBJC_PROTOCOL_LIST (type1)
8178 : NULL_TREE);
8179 type2 = (TYPE_HAS_OBJC_INFO (type2)
8180 ? TYPE_OBJC_PROTOCOL_LIST (type2)
8181 : NULL_TREE);
8183 /* If there are no protocols (most common case), the types are
8184 identical. */
8185 if (type1 == NULL_TREE && type2 == NULL_TREE)
8186 return 1;
8188 /* If one has protocols, and the other one hasn't, they are not
8189 identical. */
8190 if ((type1 == NULL_TREE && type2 != NULL_TREE)
8191 || (type1 != NULL_TREE && type2 == NULL_TREE))
8192 return 0;
8193 else
8195 /* Else, both have protocols, and we need to do the full
8196 comparison. It is possible that either type1 or type2
8197 contain some duplicate protocols in the list, so we can't
8198 even just compare list_length as a first check. */
8199 tree t;
8201 for (t = type2; t; t = TREE_CHAIN (t))
8202 if (!lookup_protocol_in_reflist (type1, TREE_VALUE (t)))
8203 return 0;
8205 for (t = type1; t; t = TREE_CHAIN (t))
8206 if (!lookup_protocol_in_reflist (type2, TREE_VALUE (t)))
8207 return 0;
8209 return 1;
8213 /* Return 1 if TYPE1 has the same size and alignment as TYPE2. */
8215 static int
8216 objc_types_share_size_and_alignment (tree type1, tree type2)
8218 return (simple_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2))
8219 && TYPE_ALIGN (type1) == TYPE_ALIGN (type2));
8222 /* Return 1 if PROTO1 is equivalent to PROTO2
8223 for purposes of method overloading. Ordinarily, the type signatures
8224 should match up exactly, unless STRICT is zero, in which case we
8225 shall allow differences in which the size and alignment of a type
8226 is the same. */
8228 static int
8229 comp_proto_with_proto (tree proto1, tree proto2, int strict)
8231 tree type1, type2;
8233 /* The following test is needed in case there are hashing
8234 collisions. */
8235 if (METHOD_SEL_NAME (proto1) != METHOD_SEL_NAME (proto2))
8236 return 0;
8238 /* Compare return types. */
8239 type1 = TREE_VALUE (TREE_TYPE (proto1));
8240 type2 = TREE_VALUE (TREE_TYPE (proto2));
8242 if (!objc_types_are_equivalent (type1, type2)
8243 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8244 return 0;
8246 /* Compare argument types. */
8248 /* The first argument (objc_object_type) is always the same, no need
8249 to compare. */
8251 /* The second argument (objc_selector_type) is always the same, no
8252 need to compare. */
8254 /* Compare the other arguments. */
8256 tree arg1, arg2;
8258 /* Compare METHOD_SEL_ARGS. */
8259 for (arg1 = METHOD_SEL_ARGS (proto1), arg2 = METHOD_SEL_ARGS (proto2);
8260 arg1 && arg2;
8261 arg1 = DECL_CHAIN (arg1), arg2 = DECL_CHAIN (arg2))
8263 type1 = TREE_VALUE (TREE_TYPE (arg1));
8264 type2 = TREE_VALUE (TREE_TYPE (arg2));
8266 /* FIXME: Do we need to decay argument types to compare them ? */
8267 type1 = objc_decay_parm_type (type1);
8268 type2 = objc_decay_parm_type (type2);
8270 if (!objc_types_are_equivalent (type1, type2)
8271 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8272 return 0;
8275 /* The loop ends when arg1 or arg2 are NULL. Make sure they are
8276 both NULL. */
8277 if (arg1 != arg2)
8278 return 0;
8280 /* Compare METHOD_ADD_ARGS. */
8281 if ((METHOD_ADD_ARGS (proto1) && !METHOD_ADD_ARGS (proto2))
8282 || (METHOD_ADD_ARGS (proto2) && !METHOD_ADD_ARGS (proto1)))
8283 return 0;
8285 if (METHOD_ADD_ARGS (proto1))
8287 for (arg1 = TREE_CHAIN (METHOD_ADD_ARGS (proto1)), arg2 = TREE_CHAIN (METHOD_ADD_ARGS (proto2));
8288 arg1 && arg2;
8289 arg1 = TREE_CHAIN (arg1), arg2 = TREE_CHAIN (arg2))
8291 type1 = TREE_TYPE (TREE_VALUE (arg1));
8292 type2 = TREE_TYPE (TREE_VALUE (arg2));
8294 /* FIXME: Do we need to decay argument types to compare them ? */
8295 type1 = objc_decay_parm_type (type1);
8296 type2 = objc_decay_parm_type (type2);
8298 if (!objc_types_are_equivalent (type1, type2)
8299 && (strict || !objc_types_share_size_and_alignment (type1, type2)))
8300 return 0;
8304 /* The loop ends when arg1 or arg2 are NULL. Make sure they are
8305 both NULL. */
8306 if (arg1 != arg2)
8307 return 0;
8309 /* Compare METHOD_ADD_ARGS_ELLIPSIS_P. */
8310 if (METHOD_ADD_ARGS_ELLIPSIS_P (proto1) != METHOD_ADD_ARGS_ELLIPSIS_P (proto2))
8311 return 0;
8314 /* Success. */
8315 return 1;
8318 /* This routine returns true if TYPE is a valid objc object type,
8319 suitable for messaging; false otherwise. If 'accept_class' is
8320 'true', then a Class object is considered valid for messaging and
8321 'true' is returned if 'type' refers to a Class. If 'accept_class'
8322 is 'false', then a Class object is not considered valid for
8323 messaging and 'false' is returned in that case. */
8325 static bool
8326 objc_type_valid_for_messaging (tree type, bool accept_classes)
8328 if (!POINTER_TYPE_P (type))
8329 return false;
8331 /* Remove the pointer indirection; don't remove more than one
8332 otherwise we'd consider "NSObject **" a valid type for messaging,
8333 which it isn't. */
8334 type = TREE_TYPE (type);
8336 if (TREE_CODE (type) != RECORD_TYPE)
8337 return false;
8339 if (objc_is_object_id (type))
8340 return true;
8342 if (objc_is_class_id (type))
8343 return accept_classes;
8345 if (TYPE_HAS_OBJC_INFO (type))
8346 return true;
8348 return false;
8351 /* Fold an OBJ_TYPE_REF expression for ObjC method dispatches, where
8352 this occurs. ObjC method dispatches are _not_ like C++ virtual
8353 member function dispatches, and we account for the difference here. */
8354 tree
8355 #ifdef OBJCPLUS
8356 objc_fold_obj_type_ref (tree ref, tree known_type)
8357 #else
8358 objc_fold_obj_type_ref (tree ref ATTRIBUTE_UNUSED,
8359 tree known_type ATTRIBUTE_UNUSED)
8360 #endif
8362 #ifdef OBJCPLUS
8363 tree v = BINFO_VIRTUALS (TYPE_BINFO (known_type));
8365 /* If the receiver does not have virtual member functions, there
8366 is nothing we can (or need to) do here. */
8367 if (!v)
8368 return NULL_TREE;
8370 /* Let C++ handle C++ virtual functions. */
8371 return cp_fold_obj_type_ref (ref, known_type);
8372 #else
8373 /* For plain ObjC, we currently do not need to do anything. */
8374 return NULL_TREE;
8375 #endif
8378 void
8379 objc_start_function (tree name, tree type, tree attrs,
8380 #ifdef OBJCPLUS
8381 tree params
8382 #else
8383 struct c_arg_info *params
8384 #endif
8387 tree fndecl = build_decl (input_location,
8388 FUNCTION_DECL, name, type);
8390 #ifdef OBJCPLUS
8391 DECL_ARGUMENTS (fndecl) = params;
8392 DECL_INITIAL (fndecl) = error_mark_node;
8393 DECL_EXTERNAL (fndecl) = 0;
8394 TREE_STATIC (fndecl) = 1;
8395 retrofit_lang_decl (fndecl);
8396 cplus_decl_attributes (&fndecl, attrs, 0);
8397 start_preparsed_function (fndecl, attrs, /*flags=*/SF_DEFAULT);
8398 #else
8399 current_function_returns_value = 0; /* Assume, until we see it does. */
8400 current_function_returns_null = 0;
8401 decl_attributes (&fndecl, attrs, 0);
8402 announce_function (fndecl);
8403 DECL_INITIAL (fndecl) = error_mark_node;
8404 DECL_EXTERNAL (fndecl) = 0;
8405 TREE_STATIC (fndecl) = 1;
8406 current_function_decl = pushdecl (fndecl);
8407 push_scope ();
8408 declare_parm_level ();
8409 DECL_RESULT (current_function_decl)
8410 = build_decl (input_location,
8411 RESULT_DECL, NULL_TREE,
8412 TREE_TYPE (TREE_TYPE (current_function_decl)));
8413 DECL_ARTIFICIAL (DECL_RESULT (current_function_decl)) = 1;
8414 DECL_IGNORED_P (DECL_RESULT (current_function_decl)) = 1;
8415 start_fname_decls ();
8416 store_parm_decls_from (params);
8417 #endif
8419 TREE_USED (current_function_decl) = 1;
8422 /* - Generate an identifier for the function. the format is "_n_cls",
8423 where 1 <= n <= nMethods, and cls is the name the implementation we
8424 are processing.
8425 - Install the return type from the method declaration.
8426 - If we have a prototype, check for type consistency. */
8428 static void
8429 really_start_method (tree method,
8430 #ifdef OBJCPLUS
8431 tree parmlist
8432 #else
8433 struct c_arg_info *parmlist
8434 #endif
8437 tree ret_type, meth_type;
8438 tree method_id;
8439 const char *sel_name, *class_name, *cat_name;
8440 char *buf;
8442 /* Synth the storage class & assemble the return type. */
8443 ret_type = TREE_VALUE (TREE_TYPE (method));
8445 sel_name = IDENTIFIER_POINTER (METHOD_SEL_NAME (method));
8446 class_name = IDENTIFIER_POINTER (CLASS_NAME (objc_implementation_context));
8447 cat_name = ((TREE_CODE (objc_implementation_context)
8448 == CLASS_IMPLEMENTATION_TYPE)
8449 ? NULL
8450 : IDENTIFIER_POINTER (CLASS_SUPER_NAME (objc_implementation_context)));
8451 method_slot++;
8453 /* Make sure this is big enough for any plausible method label. */
8454 buf = (char *) alloca (50 + strlen (sel_name) + strlen (class_name)
8455 + (cat_name ? strlen (cat_name) : 0));
8457 OBJC_GEN_METHOD_LABEL (buf, TREE_CODE (method) == INSTANCE_METHOD_DECL,
8458 class_name, cat_name, sel_name, method_slot);
8460 method_id = get_identifier (buf);
8462 #ifdef OBJCPLUS
8463 /* Objective-C methods cannot be overloaded, so we don't need
8464 the type encoding appended. It looks bad anyway... */
8465 push_lang_context (lang_name_c);
8466 #endif
8468 meth_type
8469 = build_function_type (ret_type,
8470 get_arg_type_list (method, METHOD_DEF, 0));
8471 objc_start_function (method_id, meth_type, NULL_TREE, parmlist);
8473 /* Set self_decl from the first argument. */
8474 self_decl = DECL_ARGUMENTS (current_function_decl);
8476 /* Suppress unused warnings. */
8477 TREE_USED (self_decl) = 1;
8478 DECL_READ_P (self_decl) = 1;
8479 TREE_USED (DECL_CHAIN (self_decl)) = 1;
8480 DECL_READ_P (DECL_CHAIN (self_decl)) = 1;
8481 #ifdef OBJCPLUS
8482 pop_lang_context ();
8483 #endif
8485 METHOD_DEFINITION (method) = current_function_decl;
8487 /* Check consistency...start_function, pushdecl, duplicate_decls. */
8489 if (implementation_template != objc_implementation_context)
8491 tree proto
8492 = lookup_method_static (implementation_template,
8493 METHOD_SEL_NAME (method),
8494 ((TREE_CODE (method) == CLASS_METHOD_DECL)
8495 | OBJC_LOOKUP_NO_SUPER));
8497 if (proto)
8499 if (!comp_proto_with_proto (method, proto, 1))
8501 bool type = TREE_CODE (method) == INSTANCE_METHOD_DECL;
8503 warning_at (DECL_SOURCE_LOCATION (method), 0,
8504 "conflicting types for %<%c%s%>",
8505 (type ? '-' : '+'),
8506 identifier_to_locale (gen_method_decl (method)));
8507 inform (DECL_SOURCE_LOCATION (proto),
8508 "previous declaration of %<%c%s%>",
8509 (type ? '-' : '+'),
8510 identifier_to_locale (gen_method_decl (proto)));
8512 else
8514 /* If the method in the @interface was deprecated, mark
8515 the implemented method as deprecated too. It should
8516 never be used for messaging (when the deprecation
8517 warnings are produced), but just in case. */
8518 if (TREE_DEPRECATED (proto))
8519 TREE_DEPRECATED (method) = 1;
8521 /* If the method in the @interface was marked as
8522 'noreturn', mark the function implementing the method
8523 as 'noreturn' too. */
8524 TREE_THIS_VOLATILE (current_function_decl) = TREE_THIS_VOLATILE (proto);
8527 else
8529 /* We have a method @implementation even though we did not
8530 see a corresponding @interface declaration (which is allowed
8531 by Objective-C rules). Go ahead and place the method in
8532 the @interface anyway, so that message dispatch lookups
8533 will see it. */
8534 tree interface = implementation_template;
8536 if (TREE_CODE (objc_implementation_context)
8537 == CATEGORY_IMPLEMENTATION_TYPE)
8538 interface = lookup_category
8539 (interface,
8540 CLASS_SUPER_NAME (objc_implementation_context));
8542 if (interface)
8543 objc_add_method (interface, copy_node (method),
8544 TREE_CODE (method) == CLASS_METHOD_DECL,
8545 /* is_optional= */ false);
8550 static void *UOBJC_SUPER_scope = 0;
8552 /* _n_Method (id self, SEL sel, ...)
8554 struct objc_super _S;
8555 _msgSuper ((_S.self = self, _S.class = _cls, &_S), ...);
8556 } */
8558 static tree
8559 get_super_receiver (void)
8561 if (objc_method_context)
8563 tree super_expr, super_expr_list, class_expr;
8564 bool inst_meth;
8565 if (!UOBJC_SUPER_decl)
8567 UOBJC_SUPER_decl = build_decl (input_location,
8568 VAR_DECL, get_identifier (TAG_SUPER),
8569 objc_super_template);
8570 /* This prevents `unused variable' warnings when compiling with -Wall. */
8571 TREE_USED (UOBJC_SUPER_decl) = 1;
8572 DECL_READ_P (UOBJC_SUPER_decl) = 1;
8573 lang_hooks.decls.pushdecl (UOBJC_SUPER_decl);
8574 finish_decl (UOBJC_SUPER_decl, input_location, NULL_TREE, NULL_TREE,
8575 NULL_TREE);
8576 UOBJC_SUPER_scope = objc_get_current_scope ();
8579 /* Set receiver to self. */
8580 super_expr = objc_build_component_ref (UOBJC_SUPER_decl, self_id);
8581 super_expr = build_modify_expr (input_location, super_expr, NULL_TREE,
8582 NOP_EXPR, input_location, self_decl,
8583 NULL_TREE);
8584 super_expr_list = super_expr;
8586 /* Set class to begin searching. */
8587 /* Get the ident for the superclass class field & build a ref to it.
8588 ??? maybe we should just name the field the same for all runtimes. */
8589 super_expr = (*runtime.super_superclassfield_ident) ();
8590 super_expr = objc_build_component_ref (UOBJC_SUPER_decl, super_expr);
8592 gcc_assert (imp_list->imp_context == objc_implementation_context
8593 && imp_list->imp_template == implementation_template);
8594 inst_meth = (TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL);
8596 if (TREE_CODE (objc_implementation_context) == CLASS_IMPLEMENTATION_TYPE)
8597 class_expr = (*runtime.get_class_super_ref) (input_location,
8598 imp_list, inst_meth);
8599 else
8600 /* We have a category. */
8602 tree super_name = CLASS_SUPER_NAME (imp_list->imp_template);
8603 tree super_class;
8605 /* Barf if super used in a category of a root object. */
8606 if (!super_name)
8608 error ("no super class declared in interface for %qE",
8609 CLASS_NAME (imp_list->imp_template));
8610 return error_mark_node;
8613 super_class = (*runtime.get_category_super_ref) (input_location,
8614 imp_list, inst_meth);
8615 class_expr = build_c_cast (input_location,
8616 TREE_TYPE (super_expr), super_class);
8619 super_expr = build_modify_expr (input_location, super_expr, NULL_TREE,
8620 NOP_EXPR,
8621 input_location, class_expr, NULL_TREE);
8623 super_expr_list = build_compound_expr (input_location,
8624 super_expr_list, super_expr);
8626 super_expr = build_unary_op (input_location,
8627 ADDR_EXPR, UOBJC_SUPER_decl, 0);
8628 super_expr_list = build_compound_expr (input_location,
8629 super_expr_list, super_expr);
8631 return super_expr_list;
8633 else
8635 error ("[super ...] must appear in a method context");
8636 return error_mark_node;
8640 /* When exiting a scope, sever links to a 'super' declaration (if any)
8641 therein contained. */
8643 void
8644 objc_clear_super_receiver (void)
8646 if (objc_method_context
8647 && UOBJC_SUPER_scope == objc_get_current_scope ())
8649 UOBJC_SUPER_decl = 0;
8650 UOBJC_SUPER_scope = 0;
8654 void
8655 objc_finish_method_definition (tree fndecl)
8657 /* We cannot validly inline ObjC methods, at least not without a language
8658 extension to declare that a method need not be dynamically
8659 dispatched, so suppress all thoughts of doing so. */
8660 DECL_UNINLINABLE (fndecl) = 1;
8662 #ifndef OBJCPLUS
8663 /* The C++ front-end will have called finish_function() for us. */
8664 finish_function ();
8665 #endif
8667 METHOD_ENCODING (objc_method_context)
8668 = encode_method_prototype (objc_method_context);
8670 /* Required to implement _msgSuper. This must be done AFTER finish_function,
8671 since the optimizer may find "may be used before set" errors. */
8672 objc_method_context = NULL_TREE;
8674 if (should_call_super_dealloc)
8675 warning (0, "method possibly missing a [super dealloc] call");
8678 /* Given a tree DECL node, produce a printable description of it in the given
8679 buffer, overwriting the buffer. */
8681 static char *
8682 gen_declaration (tree decl)
8684 errbuf[0] = '\0';
8686 if (DECL_P (decl))
8688 gen_type_name_0 (TREE_TYPE (decl));
8690 if (DECL_NAME (decl))
8692 if (!POINTER_TYPE_P (TREE_TYPE (decl)))
8693 strcat (errbuf, " ");
8695 strcat (errbuf, IDENTIFIER_POINTER (DECL_NAME (decl)));
8698 if (DECL_INITIAL (decl)
8699 && TREE_CODE (DECL_INITIAL (decl)) == INTEGER_CST)
8700 sprintf (errbuf + strlen (errbuf), ": " HOST_WIDE_INT_PRINT_DEC,
8701 TREE_INT_CST_LOW (DECL_INITIAL (decl)));
8704 return errbuf;
8707 /* Given a tree TYPE node, produce a printable description of it in the given
8708 buffer, overwriting the buffer. */
8710 static char *
8711 gen_type_name_0 (tree type)
8713 tree orig = type, proto;
8715 if (TYPE_P (type) && TYPE_NAME (type))
8716 type = TYPE_NAME (type);
8717 else if (POINTER_TYPE_P (type) || TREE_CODE (type) == ARRAY_TYPE)
8719 tree inner = TREE_TYPE (type);
8721 while (TREE_CODE (inner) == ARRAY_TYPE)
8722 inner = TREE_TYPE (inner);
8724 gen_type_name_0 (inner);
8726 if (!POINTER_TYPE_P (inner))
8727 strcat (errbuf, " ");
8729 if (POINTER_TYPE_P (type))
8730 strcat (errbuf, "*");
8731 else
8732 while (type != inner)
8734 strcat (errbuf, "[");
8736 if (TYPE_DOMAIN (type))
8738 char sz[20];
8740 sprintf (sz, HOST_WIDE_INT_PRINT_DEC,
8741 (TREE_INT_CST_LOW
8742 (TYPE_MAX_VALUE (TYPE_DOMAIN (type))) + 1));
8743 strcat (errbuf, sz);
8746 strcat (errbuf, "]");
8747 type = TREE_TYPE (type);
8750 goto exit_function;
8753 if (TREE_CODE (type) == TYPE_DECL && DECL_NAME (type))
8754 type = DECL_NAME (type);
8756 strcat (errbuf, TREE_CODE (type) == IDENTIFIER_NODE
8757 ? IDENTIFIER_POINTER (type)
8758 : "");
8760 /* For 'id' and 'Class', adopted protocols are stored in the pointee. */
8761 if (objc_is_id (orig))
8762 orig = TREE_TYPE (orig);
8764 proto = TYPE_HAS_OBJC_INFO (orig) ? TYPE_OBJC_PROTOCOL_LIST (orig) : NULL_TREE;
8766 if (proto)
8768 strcat (errbuf, " <");
8770 while (proto) {
8771 strcat (errbuf,
8772 IDENTIFIER_POINTER (PROTOCOL_NAME (TREE_VALUE (proto))));
8773 proto = TREE_CHAIN (proto);
8774 strcat (errbuf, proto ? ", " : ">");
8778 exit_function:
8779 return errbuf;
8782 static char *
8783 gen_type_name (tree type)
8785 errbuf[0] = '\0';
8787 return gen_type_name_0 (type);
8790 /* Given a method tree, put a printable description into the given
8791 buffer (overwriting) and return a pointer to the buffer. */
8793 static char *
8794 gen_method_decl (tree method)
8796 tree chain;
8798 strcpy (errbuf, "("); /* NB: Do _not_ call strcat() here. */
8799 gen_type_name_0 (TREE_VALUE (TREE_TYPE (method)));
8800 strcat (errbuf, ")");
8801 chain = METHOD_SEL_ARGS (method);
8803 if (chain)
8805 /* We have a chain of keyword_decls. */
8808 if (KEYWORD_KEY_NAME (chain))
8809 strcat (errbuf, IDENTIFIER_POINTER (KEYWORD_KEY_NAME (chain)));
8811 strcat (errbuf, ":(");
8812 gen_type_name_0 (TREE_VALUE (TREE_TYPE (chain)));
8813 strcat (errbuf, ")");
8815 strcat (errbuf, IDENTIFIER_POINTER (KEYWORD_ARG_NAME (chain)));
8816 if ((chain = DECL_CHAIN (chain)))
8817 strcat (errbuf, " ");
8819 while (chain);
8821 if (METHOD_ADD_ARGS (method))
8823 chain = TREE_CHAIN (METHOD_ADD_ARGS (method));
8825 /* Know we have a chain of parm_decls. */
8826 while (chain)
8828 strcat (errbuf, ", ");
8829 gen_type_name_0 (TREE_TYPE (TREE_VALUE (chain)));
8830 chain = TREE_CHAIN (chain);
8833 if (METHOD_ADD_ARGS_ELLIPSIS_P (method))
8834 strcat (errbuf, ", ...");
8838 else
8839 /* We have a unary selector. */
8840 strcat (errbuf, IDENTIFIER_POINTER (METHOD_SEL_NAME (method)));
8842 return errbuf;
8845 /* Debug info. */
8848 /* Dump an @interface declaration of the supplied class CHAIN to the
8849 supplied file FP. Used to implement the -gen-decls option (which
8850 prints out an @interface declaration of all classes compiled in
8851 this run); potentially useful for debugging the compiler too. */
8852 void
8853 dump_interface (FILE *fp, tree chain)
8855 /* FIXME: A heap overflow here whenever a method (or ivar)
8856 declaration is so long that it doesn't fit in the buffer. The
8857 code and all the related functions should be rewritten to avoid
8858 using fixed size buffers. */
8859 const char *my_name = IDENTIFIER_POINTER (CLASS_NAME (chain));
8860 tree ivar_decls = CLASS_RAW_IVARS (chain);
8861 tree nst_methods = CLASS_NST_METHODS (chain);
8862 tree cls_methods = CLASS_CLS_METHODS (chain);
8864 fprintf (fp, "\n@interface %s", my_name);
8866 /* CLASS_SUPER_NAME is used to store the superclass name for
8867 classes, and the category name for categories. */
8868 if (CLASS_SUPER_NAME (chain))
8870 const char *name = IDENTIFIER_POINTER (CLASS_SUPER_NAME (chain));
8872 switch (TREE_CODE (chain))
8874 case CATEGORY_IMPLEMENTATION_TYPE:
8875 case CATEGORY_INTERFACE_TYPE:
8876 fprintf (fp, " (%s)\n", name);
8877 break;
8878 default:
8879 fprintf (fp, " : %s\n", name);
8880 break;
8883 else
8884 fprintf (fp, "\n");
8886 /* FIXME - the following doesn't seem to work at the moment. */
8887 if (ivar_decls)
8889 fprintf (fp, "{\n");
8892 fprintf (fp, "\t%s;\n", gen_declaration (ivar_decls));
8893 ivar_decls = TREE_CHAIN (ivar_decls);
8895 while (ivar_decls);
8896 fprintf (fp, "}\n");
8899 while (nst_methods)
8901 fprintf (fp, "- %s;\n", gen_method_decl (nst_methods));
8902 nst_methods = TREE_CHAIN (nst_methods);
8905 while (cls_methods)
8907 fprintf (fp, "+ %s;\n", gen_method_decl (cls_methods));
8908 cls_methods = TREE_CHAIN (cls_methods);
8911 fprintf (fp, "@end\n");
8914 #if 0
8915 /* Produce the pretty printing for an Objective-C method. This is
8916 currently unused, but could be handy while reorganizing the pretty
8917 printing to be more robust. */
8918 static const char *
8919 objc_pretty_print_method (bool is_class_method,
8920 const char *class_name,
8921 const char *category_name,
8922 const char *selector)
8924 if (category_name)
8926 char *result = XNEWVEC (char, strlen (class_name) + strlen (category_name)
8927 + strlen (selector) + 7);
8929 if (is_class_method)
8930 sprintf (result, "+[%s(%s) %s]", class_name, category_name, selector);
8931 else
8932 sprintf (result, "-[%s(%s) %s]", class_name, category_name, selector);
8934 return result;
8936 else
8938 char *result = XNEWVEC (char, strlen (class_name)
8939 + strlen (selector) + 5);
8941 if (is_class_method)
8942 sprintf (result, "+[%s %s]", class_name, selector);
8943 else
8944 sprintf (result, "-[%s %s]", class_name, selector);
8946 return result;
8949 #endif
8951 /* Demangle function for Objective-C. Attempt to demangle the
8952 function name associated with a method (eg, going from
8953 "_i_NSObject__class" to "-[NSObject class]"); usually for the
8954 purpose of pretty printing or error messages. Return the demangled
8955 name, or NULL if the string is not an Objective-C mangled method
8956 name.
8958 Because of how the mangling is done, any method that has a '_' in
8959 its original name is at risk of being demangled incorrectly. In
8960 some cases there are multiple valid ways to demangle a method name
8961 and there is no way we can decide.
8963 TODO: objc_demangle() can't always get it right; the right way to
8964 get this correct for all method names would be to store the
8965 Objective-C method name somewhere in the function decl. Then,
8966 there is no demangling to do; we'd just pull the method name out of
8967 the decl. As an additional bonus, when printing error messages we
8968 could check for such a method name, and if we find it, we know the
8969 function is actually an Objective-C method and we could print error
8970 messages saying "In method '+[NSObject class]" instead of "In
8971 function '+[NSObject class]" as we do now. */
8972 static const char *
8973 objc_demangle (const char *mangled)
8975 char *demangled, *cp;
8977 /* First of all, if the name is too short it can't be an Objective-C
8978 mangled method name. */
8979 if (mangled[0] == '\0' || mangled[1] == '\0' || mangled[2] == '\0')
8980 return NULL;
8982 /* If the name looks like an already demangled one, return it
8983 unchanged. This should only happen on Darwin, where method names
8984 are mangled differently into a pretty-print form (such as
8985 '+[NSObject class]', see darwin.h). In that case, demangling is
8986 a no-op, but we need to return the demangled name if it was an
8987 ObjC one, and return NULL if not. We should be safe as no C/C++
8988 function can start with "-[" or "+[". */
8989 if ((mangled[0] == '-' || mangled[0] == '+')
8990 && (mangled[1] == '['))
8991 return mangled;
8993 if (mangled[0] == '_' &&
8994 (mangled[1] == 'i' || mangled[1] == 'c') &&
8995 mangled[2] == '_')
8997 cp = demangled = XNEWVEC (char, strlen(mangled) + 2);
8998 if (mangled[1] == 'i')
8999 *cp++ = '-'; /* for instance method */
9000 else
9001 *cp++ = '+'; /* for class method */
9002 *cp++ = '['; /* opening left brace */
9003 strcpy(cp, mangled+3); /* tack on the rest of the mangled name */
9004 while (*cp && *cp == '_')
9005 cp++; /* skip any initial underbars in class name */
9006 cp = strchr(cp, '_'); /* find first non-initial underbar */
9007 if (cp == NULL)
9009 free(demangled); /* not mangled name */
9010 return NULL;
9012 if (cp[1] == '_') /* easy case: no category name */
9014 *cp++ = ' '; /* replace two '_' with one ' ' */
9015 strcpy(cp, mangled + (cp - demangled) + 2);
9017 else
9019 *cp++ = '('; /* less easy case: category name */
9020 cp = strchr(cp, '_');
9021 if (cp == 0)
9023 free(demangled); /* not mangled name */
9024 return NULL;
9026 *cp++ = ')';
9027 *cp++ = ' '; /* overwriting 1st char of method name... */
9028 strcpy(cp, mangled + (cp - demangled)); /* get it back */
9030 /* Now we have the method name. We need to generally replace
9031 '_' with ':' but trying to preserve '_' if it could only have
9032 been in the mangled string because it was already in the
9033 original name. In cases where it's ambiguous, we assume that
9034 any '_' originated from a ':'. */
9036 /* Initial '_'s in method name can't have been generating by
9037 converting ':'s. Skip them. */
9038 while (*cp && *cp == '_')
9039 cp++;
9041 /* If the method name does not end with '_', then it has no
9042 arguments and there was no replacement of ':'s with '_'s
9043 during mangling. Check for that case, and skip any
9044 replacement if so. This at least guarantees that methods
9045 with no arguments are always demangled correctly (unless the
9046 original name ends with '_'). */
9047 if (*(mangled + strlen (mangled) - 1) != '_')
9049 /* Skip to the end. */
9050 for (; *cp; cp++)
9053 else
9055 /* Replace remaining '_' with ':'. This may get it wrong if
9056 there were '_'s in the original name. In most cases it
9057 is impossible to disambiguate. */
9058 for (; *cp; cp++)
9059 if (*cp == '_')
9060 *cp = ':';
9062 *cp++ = ']'; /* closing right brace */
9063 *cp++ = 0; /* string terminator */
9064 return demangled;
9066 else
9067 return NULL; /* not an objc mangled name */
9070 /* Try to pretty-print a decl. If the 'decl' is an Objective-C
9071 specific decl, return the printable name for it. If not, return
9072 NULL. */
9073 const char *
9074 objc_maybe_printable_name (tree decl, int v ATTRIBUTE_UNUSED)
9076 switch (TREE_CODE (decl))
9078 case FUNCTION_DECL:
9079 return objc_demangle (IDENTIFIER_POINTER (DECL_NAME (decl)));
9080 break;
9082 /* The following happens when we are printing a deprecation
9083 warning for a method. The warn_deprecation() will end up
9084 trying to print the decl for INSTANCE_METHOD_DECL or
9085 CLASS_METHOD_DECL. It would be nice to be able to print
9086 "-[NSObject autorelease] is deprecated", but to do that, we'd
9087 need to store the class and method name in the method decl,
9088 which we currently don't do. For now, just return the name
9089 of the method. We don't return NULL, because that may
9090 trigger further attempts to pretty-print the decl in C/C++,
9091 but they wouldn't know how to pretty-print it. */
9092 case INSTANCE_METHOD_DECL:
9093 case CLASS_METHOD_DECL:
9094 return IDENTIFIER_POINTER (DECL_NAME (decl));
9095 break;
9096 /* This happens when printing a deprecation warning for a
9097 property. We may want to consider some sort of pretty
9098 printing (eg, include the class name where it was declared
9099 ?). */
9100 case PROPERTY_DECL:
9101 return IDENTIFIER_POINTER (PROPERTY_NAME (decl));
9102 break;
9103 default:
9104 return NULL;
9105 break;
9109 /* Return a printable name for 'decl'. This first tries
9110 objc_maybe_printable_name(), and if that fails, it returns the name
9111 in the decl. This is used as LANG_HOOKS_DECL_PRINTABLE_NAME for
9112 Objective-C; in Objective-C++, setting the hook is not enough
9113 because lots of C++ Front-End code calls cxx_printable_name,
9114 dump_decl and other C++ functions directly. So instead we have
9115 modified dump_decl to call objc_maybe_printable_name directly. */
9116 const char *
9117 objc_printable_name (tree decl, int v)
9119 const char *demangled_name = objc_maybe_printable_name (decl, v);
9121 if (demangled_name != NULL)
9122 return demangled_name;
9123 else
9124 return IDENTIFIER_POINTER (DECL_NAME (decl));
9127 /* Routine is called to issue diagnostic when reference to a private
9128 ivar is made and no other variable with same name is found in
9129 current scope. */
9130 bool
9131 objc_diagnose_private_ivar (tree id)
9133 tree ivar;
9134 if (!objc_method_context)
9135 return false;
9136 ivar = is_ivar (objc_ivar_chain, id);
9137 if (ivar && is_private (ivar))
9139 error ("instance variable %qs is declared private",
9140 IDENTIFIER_POINTER (id));
9141 return true;
9143 return false;
9146 /* Look up ID as an instance variable. OTHER contains the result of
9147 the C or C++ lookup, which we may want to use instead. */
9148 /* To use properties inside an instance method, use self.property. */
9149 tree
9150 objc_lookup_ivar (tree other, tree id)
9152 tree ivar;
9154 /* If we are not inside of an ObjC method, ivar lookup makes no sense. */
9155 if (!objc_method_context)
9156 return other;
9158 if (!strcmp (IDENTIFIER_POINTER (id), "super"))
9159 /* We have a message to super. */
9160 return get_super_receiver ();
9162 /* In a class method, look up an instance variable only as a last
9163 resort. */
9164 if (TREE_CODE (objc_method_context) == CLASS_METHOD_DECL
9165 && other && other != error_mark_node)
9166 return other;
9168 /* Look up the ivar, but do not use it if it is not accessible. */
9169 ivar = is_ivar (objc_ivar_chain, id);
9171 if (!ivar || is_private (ivar))
9172 return other;
9174 /* In an instance method, a local variable (or parameter) may hide the
9175 instance variable. */
9176 if (TREE_CODE (objc_method_context) == INSTANCE_METHOD_DECL
9177 && other && other != error_mark_node
9178 #ifdef OBJCPLUS
9179 && CP_DECL_CONTEXT (other) != global_namespace)
9180 #else
9181 && !DECL_FILE_SCOPE_P (other))
9182 #endif
9184 warning (0, "local declaration of %qE hides instance variable", id);
9186 return other;
9189 /* At this point, we are either in an instance method with no obscuring
9190 local definitions, or in a class method with no alternate definitions
9191 at all. */
9192 return build_ivar_reference (id);
9195 /* Possibly rewrite a function CALL into an OBJ_TYPE_REF expression. This
9196 needs to be done if we are calling a function through a cast. */
9198 tree
9199 objc_rewrite_function_call (tree function, tree first_param)
9201 if (TREE_CODE (function) == NOP_EXPR
9202 && TREE_CODE (TREE_OPERAND (function, 0)) == ADDR_EXPR
9203 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (function, 0), 0))
9204 == FUNCTION_DECL)
9206 function = build3 (OBJ_TYPE_REF, TREE_TYPE (function),
9207 TREE_OPERAND (function, 0),
9208 first_param, size_zero_node);
9211 return function;
9214 /* This is called to "gimplify" a PROPERTY_REF node. It builds the
9215 corresponding 'getter' function call. Note that we assume the
9216 PROPERTY_REF to be valid since we generated it while parsing. */
9217 static void
9218 objc_gimplify_property_ref (tree *expr_p)
9220 tree getter = PROPERTY_REF_GETTER_CALL (*expr_p);
9221 tree call_exp;
9223 if (getter == NULL_TREE)
9225 tree property_decl = PROPERTY_REF_PROPERTY_DECL (*expr_p);
9226 /* This can happen if DECL_ARTIFICIAL (*expr_p), but
9227 should be impossible for real properties, which always
9228 have a getter. */
9229 error_at (EXPR_LOCATION (*expr_p), "no %qs getter found",
9230 IDENTIFIER_POINTER (PROPERTY_NAME (property_decl)));
9231 /* Try to recover from the error to prevent an ICE. We take
9232 zero and cast it to the type of the property. */
9233 *expr_p = convert (TREE_TYPE (property_decl),
9234 integer_zero_node);
9235 return;
9238 if (PROPERTY_REF_DEPRECATED_GETTER (*expr_p))
9240 /* PROPERTY_REF_DEPRECATED_GETTER contains the method prototype
9241 that is deprecated. */
9242 warn_deprecated_use (PROPERTY_REF_DEPRECATED_GETTER (*expr_p),
9243 NULL_TREE);
9246 call_exp = getter;
9247 #ifdef OBJCPLUS
9248 /* In C++, a getter which returns an aggregate value results in a
9249 target_expr which initializes a temporary to the call
9250 expression. */
9251 if (TREE_CODE (getter) == TARGET_EXPR)
9253 gcc_assert (MAYBE_CLASS_TYPE_P (TREE_TYPE (getter)));
9254 gcc_assert (TREE_CODE (TREE_OPERAND (getter, 0)) == VAR_DECL);
9255 call_exp = TREE_OPERAND (getter, 1);
9257 #endif
9258 gcc_assert (TREE_CODE (call_exp) == CALL_EXPR);
9260 *expr_p = call_exp;
9263 /* This is called when "gimplifying" the trees. We need to gimplify
9264 the Objective-C/Objective-C++ specific trees, then hand over the
9265 process to C/C++. */
9267 objc_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
9269 enum tree_code code = TREE_CODE (*expr_p);
9270 switch (code)
9272 /* Look for the special case of OBJC_TYPE_REF with the address
9273 of a function in OBJ_TYPE_REF_EXPR (presumably objc_msgSend
9274 or one of its cousins). */
9275 case OBJ_TYPE_REF:
9276 if (TREE_CODE (OBJ_TYPE_REF_EXPR (*expr_p)) == ADDR_EXPR
9277 && TREE_CODE (TREE_OPERAND (OBJ_TYPE_REF_EXPR (*expr_p), 0))
9278 == FUNCTION_DECL)
9280 enum gimplify_status r0, r1;
9282 /* Postincrements in OBJ_TYPE_REF_OBJECT don't affect the
9283 value of the OBJ_TYPE_REF, so force them to be emitted
9284 during subexpression evaluation rather than after the
9285 OBJ_TYPE_REF. This permits objc_msgSend calls in
9286 Objective C to use direct rather than indirect calls when
9287 the object expression has a postincrement. */
9288 r0 = gimplify_expr (&OBJ_TYPE_REF_OBJECT (*expr_p), pre_p, NULL,
9289 is_gimple_val, fb_rvalue);
9290 r1 = gimplify_expr (&OBJ_TYPE_REF_EXPR (*expr_p), pre_p, post_p,
9291 is_gimple_val, fb_rvalue);
9293 return MIN (r0, r1);
9295 break;
9296 case PROPERTY_REF:
9297 objc_gimplify_property_ref (expr_p);
9298 /* Do not return yet; let C/C++ gimplify the resulting expression. */
9299 break;
9300 default:
9301 break;
9304 #ifdef OBJCPLUS
9305 return (enum gimplify_status) cp_gimplify_expr (expr_p, pre_p, post_p);
9306 #else
9307 return (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p);
9308 #endif
9311 /* --- FAST ENUMERATION --- */
9312 /* Begin code generation for fast enumeration (foreach) ... */
9314 /* Defines
9316 struct __objcFastEnumerationState
9318 unsigned long state;
9319 id *itemsPtr;
9320 unsigned long *mutationsPtr;
9321 unsigned long extra[5];
9324 Confusingly enough, NSFastEnumeration is then defined by libraries
9325 to be the same structure.
9328 static void
9329 build_fast_enumeration_state_template (void)
9331 tree decls, *chain = NULL;
9333 /* { */
9334 objc_fast_enumeration_state_template = objc_start_struct (get_identifier
9335 (TAG_FAST_ENUMERATION_STATE));
9337 /* unsigned long state; */
9338 decls = add_field_decl (long_unsigned_type_node, "state", &chain);
9340 /* id *itemsPtr; */
9341 add_field_decl (build_pointer_type (objc_object_type),
9342 "itemsPtr", &chain);
9344 /* unsigned long *mutationsPtr; */
9345 add_field_decl (build_pointer_type (long_unsigned_type_node),
9346 "mutationsPtr", &chain);
9348 /* unsigned long extra[5]; */
9349 add_field_decl (build_sized_array_type (long_unsigned_type_node, 5),
9350 "extra", &chain);
9352 /* } */
9353 objc_finish_struct (objc_fast_enumeration_state_template, decls);
9357 'objc_finish_foreach_loop()' generates the code for an Objective-C
9358 foreach loop. The 'location' argument is the location of the 'for'
9359 that starts the loop. The 'object_expression' is the expression of
9360 the 'object' that iterates; the 'collection_expression' is the
9361 expression of the collection that we iterate over (we need to make
9362 sure we evaluate this only once); the 'for_body' is the set of
9363 statements to be executed in each iteration; 'break_label' and
9364 'continue_label' are the break and continue labels which we need to
9365 emit since the <statements> may be jumping to 'break_label' (if they
9366 contain 'break') or to 'continue_label' (if they contain
9367 'continue').
9369 The syntax is
9371 for (<object expression> in <collection expression>)
9372 <statements>
9374 which is compiled into the following blurb:
9377 id __objc_foreach_collection;
9378 __objc_fast_enumeration_state __objc_foreach_enum_state;
9379 unsigned long __objc_foreach_batchsize;
9380 id __objc_foreach_items[16];
9381 __objc_foreach_collection = <collection expression>;
9382 __objc_foreach_enum_state = { 0 };
9383 __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16];
9385 if (__objc_foreach_batchsize == 0)
9386 <object expression> = nil;
9387 else
9389 unsigned long __objc_foreach_mutations_pointer = *__objc_foreach_enum_state.mutationsPtr;
9390 next_batch:
9392 unsigned long __objc_foreach_index;
9393 __objc_foreach_index = 0;
9395 next_object:
9396 if (__objc_foreach_mutation_pointer != *__objc_foreach_enum_state.mutationsPtr) objc_enumeration_mutation (<collection expression>);
9397 <object expression> = enumState.itemsPtr[__objc_foreach_index];
9398 <statements> [PS: inside <statments>, 'break' jumps to break_label and 'continue' jumps to continue_label]
9400 continue_label:
9401 __objc_foreach_index++;
9402 if (__objc_foreach_index < __objc_foreach_batchsize) goto next_object;
9403 __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16];
9405 if (__objc_foreach_batchsize != 0) goto next_batch;
9406 <object expression> = nil;
9407 break_label:
9411 'statements' may contain a 'continue' or 'break' instruction, which
9412 the user expects to 'continue' or 'break' the entire foreach loop.
9413 We are provided the labels that 'break' and 'continue' jump to, so
9414 we place them where we want them to jump to when they pick them.
9416 Optimization TODO: we could cache the IMP of
9417 countByEnumeratingWithState:objects:count:.
9420 /* If you need to debug objc_finish_foreach_loop(), uncomment the following line. */
9421 /* #define DEBUG_OBJC_FINISH_FOREACH_LOOP 1 */
9423 #ifdef DEBUG_OBJC_FINISH_FOREACH_LOOP
9424 #include "tree-pretty-print.h"
9425 #endif
9427 void
9428 objc_finish_foreach_loop (location_t location, tree object_expression, tree collection_expression, tree for_body,
9429 tree break_label, tree continue_label)
9431 /* A tree representing the __objcFastEnumerationState struct type,
9432 or NSFastEnumerationState struct, whatever we are using. */
9433 tree objc_fast_enumeration_state_type;
9435 /* The trees representing the declarations of each of the local variables. */
9436 tree objc_foreach_collection_decl;
9437 tree objc_foreach_enum_state_decl;
9438 tree objc_foreach_items_decl;
9439 tree objc_foreach_batchsize_decl;
9440 tree objc_foreach_mutations_pointer_decl;
9441 tree objc_foreach_index_decl;
9443 /* A tree representing the selector countByEnumeratingWithState:objects:count:. */
9444 tree selector_name;
9446 /* A tree representing the local bind. */
9447 tree bind;
9449 /* A tree representing the external 'if (__objc_foreach_batchsize)' */
9450 tree first_if;
9452 /* A tree representing the 'else' part of 'first_if' */
9453 tree first_else;
9455 /* A tree representing the 'next_batch' label. */
9456 tree next_batch_label_decl;
9458 /* A tree representing the binding after the 'next_batch' label. */
9459 tree next_batch_bind;
9461 /* A tree representing the 'next_object' label. */
9462 tree next_object_label_decl;
9464 /* Temporary variables. */
9465 tree t;
9466 int i;
9468 if (flag_objc1_only)
9469 error_at (location, "fast enumeration is not available in Objective-C 1.0");
9471 if (object_expression == error_mark_node)
9472 return;
9474 if (collection_expression == error_mark_node)
9475 return;
9477 if (!objc_type_valid_for_messaging (TREE_TYPE (object_expression), true))
9479 error_at (location, "iterating variable in fast enumeration is not an object");
9480 return;
9483 if (!objc_type_valid_for_messaging (TREE_TYPE (collection_expression), true))
9485 error_at (location, "collection in fast enumeration is not an object");
9486 return;
9489 /* TODO: Check that object_expression is either a variable
9490 declaration, or an lvalue. */
9492 /* This kludge is an idea from apple. We use the
9493 __objcFastEnumerationState struct implicitly defined by the
9494 compiler, unless a NSFastEnumerationState struct has been defined
9495 (by a Foundation library such as GNUstep Base) in which case, we
9496 use that one.
9498 objc_fast_enumeration_state_type = objc_fast_enumeration_state_template;
9500 tree objc_NSFastEnumeration_type = lookup_name (get_identifier ("NSFastEnumerationState"));
9502 if (objc_NSFastEnumeration_type)
9504 /* TODO: We really need to check that
9505 objc_NSFastEnumeration_type is the same as ours! */
9506 if (TREE_CODE (objc_NSFastEnumeration_type) == TYPE_DECL)
9508 /* If it's a typedef, use the original type. */
9509 if (DECL_ORIGINAL_TYPE (objc_NSFastEnumeration_type))
9510 objc_fast_enumeration_state_type = DECL_ORIGINAL_TYPE (objc_NSFastEnumeration_type);
9511 else
9512 objc_fast_enumeration_state_type = TREE_TYPE (objc_NSFastEnumeration_type);
9517 /* { */
9518 /* Done by c-parser.c. */
9520 /* type object; */
9521 /* Done by c-parser.c. */
9523 /* Disable warnings that 'object' is unused. For example the code
9525 for (id object in collection)
9526 i++;
9528 which can be used to count how many objects there are in the
9529 collection is fine and should generate no warnings even if
9530 'object' is technically unused. */
9531 TREE_USED (object_expression) = 1;
9532 if (DECL_P (object_expression))
9533 DECL_READ_P (object_expression) = 1;
9535 /* id __objc_foreach_collection */
9536 objc_foreach_collection_decl = objc_create_temporary_var (objc_object_type, "__objc_foreach_collection");
9538 /* __objcFastEnumerationState __objc_foreach_enum_state; */
9539 objc_foreach_enum_state_decl = objc_create_temporary_var (objc_fast_enumeration_state_type, "__objc_foreach_enum_state");
9540 TREE_CHAIN (objc_foreach_enum_state_decl) = objc_foreach_collection_decl;
9542 /* id __objc_foreach_items[16]; */
9543 objc_foreach_items_decl = objc_create_temporary_var (build_sized_array_type (objc_object_type, 16), "__objc_foreach_items");
9544 TREE_CHAIN (objc_foreach_items_decl) = objc_foreach_enum_state_decl;
9546 /* unsigned long __objc_foreach_batchsize; */
9547 objc_foreach_batchsize_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_batchsize");
9548 TREE_CHAIN (objc_foreach_batchsize_decl) = objc_foreach_items_decl;
9550 /* Generate the local variable binding. */
9551 bind = build3 (BIND_EXPR, void_type_node, objc_foreach_batchsize_decl, NULL, NULL);
9552 SET_EXPR_LOCATION (bind, location);
9553 TREE_SIDE_EFFECTS (bind) = 1;
9555 /* __objc_foreach_collection = <collection expression>; */
9556 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_collection_decl, collection_expression);
9557 SET_EXPR_LOCATION (t, location);
9558 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9559 /* We have used 'collection_expression'. */
9560 mark_exp_read (collection_expression);
9562 /* __objc_foreach_enum_state.state = 0; */
9563 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9564 get_identifier ("state")),
9565 build_int_cst (long_unsigned_type_node, 0));
9566 SET_EXPR_LOCATION (t, location);
9567 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9569 /* __objc_foreach_enum_state.itemsPtr = NULL; */
9570 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9571 get_identifier ("itemsPtr")),
9572 null_pointer_node);
9573 SET_EXPR_LOCATION (t, location);
9574 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9576 /* __objc_foreach_enum_state.mutationsPtr = NULL; */
9577 t = build2 (MODIFY_EXPR, void_type_node, objc_build_component_ref (objc_foreach_enum_state_decl,
9578 get_identifier ("mutationsPtr")),
9579 null_pointer_node);
9580 SET_EXPR_LOCATION (t, location);
9581 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9583 /* __objc_foreach_enum_state.extra[0] = 0; */
9584 /* __objc_foreach_enum_state.extra[1] = 0; */
9585 /* __objc_foreach_enum_state.extra[2] = 0; */
9586 /* __objc_foreach_enum_state.extra[3] = 0; */
9587 /* __objc_foreach_enum_state.extra[4] = 0; */
9588 for (i = 0; i < 5 ; i++)
9590 t = build2 (MODIFY_EXPR, void_type_node,
9591 build_array_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9592 get_identifier ("extra")),
9593 build_int_cst (NULL_TREE, i)),
9594 build_int_cst (long_unsigned_type_node, 0));
9595 SET_EXPR_LOCATION (t, location);
9596 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9599 /* __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16]; */
9600 selector_name = get_identifier ("countByEnumeratingWithState:objects:count:");
9601 #ifdef OBJCPLUS
9602 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9603 /* Parameters. */
9604 tree_cons /* &__objc_foreach_enum_state */
9605 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9606 tree_cons /* __objc_foreach_items */
9607 (NULL_TREE, objc_foreach_items_decl,
9608 tree_cons /* 16 */
9609 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9610 #else
9611 /* In C, we need to decay the __objc_foreach_items array that we are passing. */
9613 struct c_expr array;
9614 array.value = objc_foreach_items_decl;
9615 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9616 /* Parameters. */
9617 tree_cons /* &__objc_foreach_enum_state */
9618 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9619 tree_cons /* __objc_foreach_items */
9620 (NULL_TREE, default_function_array_conversion (location, array).value,
9621 tree_cons /* 16 */
9622 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9624 #endif
9625 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_batchsize_decl,
9626 convert (long_unsigned_type_node, t));
9627 SET_EXPR_LOCATION (t, location);
9628 append_to_statement_list (t, &BIND_EXPR_BODY (bind));
9630 /* if (__objc_foreach_batchsize == 0) */
9631 first_if = build3 (COND_EXPR, void_type_node,
9632 /* Condition. */
9633 c_fully_fold
9634 (c_common_truthvalue_conversion
9635 (location,
9636 build_binary_op (location,
9637 EQ_EXPR,
9638 objc_foreach_batchsize_decl,
9639 build_int_cst (long_unsigned_type_node, 0), 1)),
9640 false, NULL),
9641 /* Then block (we fill it in later). */
9642 NULL_TREE,
9643 /* Else block (we fill it in later). */
9644 NULL_TREE);
9645 SET_EXPR_LOCATION (first_if, location);
9646 append_to_statement_list (first_if, &BIND_EXPR_BODY (bind));
9648 /* then <object expression> = nil; */
9649 t = build2 (MODIFY_EXPR, void_type_node, object_expression, convert (objc_object_type, null_pointer_node));
9650 SET_EXPR_LOCATION (t, location);
9651 COND_EXPR_THEN (first_if) = t;
9653 /* Now we build the 'else' part of the if; once we finish building
9654 it, we attach it to first_if as the 'else' part. */
9656 /* else */
9657 /* { */
9659 /* unsigned long __objc_foreach_mutations_pointer; */
9660 objc_foreach_mutations_pointer_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_mutations_pointer");
9662 /* Generate the local variable binding. */
9663 first_else = build3 (BIND_EXPR, void_type_node, objc_foreach_mutations_pointer_decl, NULL, NULL);
9664 SET_EXPR_LOCATION (first_else, location);
9665 TREE_SIDE_EFFECTS (first_else) = 1;
9667 /* __objc_foreach_mutations_pointer = *__objc_foreach_enum_state.mutationsPtr; */
9668 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_mutations_pointer_decl,
9669 build_indirect_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9670 get_identifier ("mutationsPtr")),
9671 RO_UNARY_STAR));
9672 SET_EXPR_LOCATION (t, location);
9673 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9675 /* next_batch: */
9676 next_batch_label_decl = create_artificial_label (location);
9677 t = build1 (LABEL_EXPR, void_type_node, next_batch_label_decl);
9678 SET_EXPR_LOCATION (t, location);
9679 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9681 /* { */
9683 /* unsigned long __objc_foreach_index; */
9684 objc_foreach_index_decl = objc_create_temporary_var (long_unsigned_type_node, "__objc_foreach_index");
9686 /* Generate the local variable binding. */
9687 next_batch_bind = build3 (BIND_EXPR, void_type_node, objc_foreach_index_decl, NULL, NULL);
9688 SET_EXPR_LOCATION (next_batch_bind, location);
9689 TREE_SIDE_EFFECTS (next_batch_bind) = 1;
9690 append_to_statement_list (next_batch_bind, &BIND_EXPR_BODY (first_else));
9692 /* __objc_foreach_index = 0; */
9693 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_index_decl,
9694 build_int_cst (long_unsigned_type_node, 0));
9695 SET_EXPR_LOCATION (t, location);
9696 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9698 /* next_object: */
9699 next_object_label_decl = create_artificial_label (location);
9700 t = build1 (LABEL_EXPR, void_type_node, next_object_label_decl);
9701 SET_EXPR_LOCATION (t, location);
9702 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9704 /* if (__objc_foreach_mutation_pointer != *__objc_foreach_enum_state.mutationsPtr) objc_enumeration_mutation (<collection expression>); */
9705 t = build3 (COND_EXPR, void_type_node,
9706 /* Condition. */
9707 c_fully_fold
9708 (c_common_truthvalue_conversion
9709 (location,
9710 build_binary_op
9711 (location,
9712 NE_EXPR,
9713 objc_foreach_mutations_pointer_decl,
9714 build_indirect_ref (location,
9715 objc_build_component_ref (objc_foreach_enum_state_decl,
9716 get_identifier ("mutationsPtr")),
9717 RO_UNARY_STAR), 1)),
9718 false, NULL),
9719 /* Then block. */
9720 build_function_call (input_location,
9721 objc_enumeration_mutation_decl,
9722 tree_cons (NULL, collection_expression, NULL)),
9723 /* Else block. */
9724 NULL_TREE);
9725 SET_EXPR_LOCATION (t, location);
9726 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9728 /* <object expression> = enumState.itemsPtr[__objc_foreach_index]; */
9729 t = build2 (MODIFY_EXPR, void_type_node, object_expression,
9730 build_array_ref (location, objc_build_component_ref (objc_foreach_enum_state_decl,
9731 get_identifier ("itemsPtr")),
9732 objc_foreach_index_decl));
9733 SET_EXPR_LOCATION (t, location);
9734 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9736 /* <statements> [PS: in <statments>, 'break' jumps to break_label and 'continue' jumps to continue_label] */
9737 append_to_statement_list (for_body, &BIND_EXPR_BODY (next_batch_bind));
9739 /* continue_label: */
9740 if (continue_label)
9742 t = build1 (LABEL_EXPR, void_type_node, continue_label);
9743 SET_EXPR_LOCATION (t, location);
9744 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9747 /* __objc_foreach_index++; */
9748 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_index_decl,
9749 build_binary_op (location,
9750 PLUS_EXPR,
9751 objc_foreach_index_decl,
9752 build_int_cst (long_unsigned_type_node, 1), 1));
9753 SET_EXPR_LOCATION (t, location);
9754 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9756 /* if (__objc_foreach_index < __objc_foreach_batchsize) goto next_object; */
9757 t = build3 (COND_EXPR, void_type_node,
9758 /* Condition. */
9759 c_fully_fold
9760 (c_common_truthvalue_conversion
9761 (location,
9762 build_binary_op (location,
9763 LT_EXPR,
9764 objc_foreach_index_decl,
9765 objc_foreach_batchsize_decl, 1)),
9766 false, NULL),
9767 /* Then block. */
9768 build1 (GOTO_EXPR, void_type_node, next_object_label_decl),
9769 /* Else block. */
9770 NULL_TREE);
9771 SET_EXPR_LOCATION (t, location);
9772 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9774 /* __objc_foreach_batchsize = [__objc_foreach_collection countByEnumeratingWithState: &__objc_foreach_enum_state objects: __objc_foreach_items count: 16]; */
9775 #ifdef OBJCPLUS
9776 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9777 /* Parameters. */
9778 tree_cons /* &__objc_foreach_enum_state */
9779 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9780 tree_cons /* __objc_foreach_items */
9781 (NULL_TREE, objc_foreach_items_decl,
9782 tree_cons /* 16 */
9783 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9784 #else
9785 /* In C, we need to decay the __objc_foreach_items array that we are passing. */
9787 struct c_expr array;
9788 array.value = objc_foreach_items_decl;
9789 t = objc_finish_message_expr (objc_foreach_collection_decl, selector_name,
9790 /* Parameters. */
9791 tree_cons /* &__objc_foreach_enum_state */
9792 (NULL_TREE, build_fold_addr_expr_loc (location, objc_foreach_enum_state_decl),
9793 tree_cons /* __objc_foreach_items */
9794 (NULL_TREE, default_function_array_conversion (location, array).value,
9795 tree_cons /* 16 */
9796 (NULL_TREE, build_int_cst (NULL_TREE, 16), NULL_TREE))), NULL);
9798 #endif
9799 t = build2 (MODIFY_EXPR, void_type_node, objc_foreach_batchsize_decl,
9800 convert (long_unsigned_type_node, t));
9801 SET_EXPR_LOCATION (t, location);
9802 append_to_statement_list (t, &BIND_EXPR_BODY (next_batch_bind));
9804 /* } */
9806 /* if (__objc_foreach_batchsize != 0) goto next_batch; */
9807 t = build3 (COND_EXPR, void_type_node,
9808 /* Condition. */
9809 c_fully_fold
9810 (c_common_truthvalue_conversion
9811 (location,
9812 build_binary_op (location,
9813 NE_EXPR,
9814 objc_foreach_batchsize_decl,
9815 build_int_cst (long_unsigned_type_node, 0), 1)),
9816 false, NULL),
9817 /* Then block. */
9818 build1 (GOTO_EXPR, void_type_node, next_batch_label_decl),
9819 /* Else block. */
9820 NULL_TREE);
9821 SET_EXPR_LOCATION (t, location);
9822 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9824 /* <object expression> = nil; */
9825 t = build2 (MODIFY_EXPR, void_type_node, object_expression, convert (objc_object_type, null_pointer_node));
9826 SET_EXPR_LOCATION (t, location);
9827 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9829 /* break_label: */
9830 if (break_label)
9832 t = build1 (LABEL_EXPR, void_type_node, break_label);
9833 SET_EXPR_LOCATION (t, location);
9834 append_to_statement_list (t, &BIND_EXPR_BODY (first_else));
9837 /* } */
9838 COND_EXPR_ELSE (first_if) = first_else;
9840 /* Do the whole thing. */
9841 add_stmt (bind);
9843 #ifdef DEBUG_OBJC_FINISH_FOREACH_LOOP
9844 /* This will print to stderr the whole blurb generated by the
9845 compiler while compiling (assuming the compiler doesn't crash
9846 before getting here).
9848 debug_generic_stmt (bind);
9849 #endif
9851 /* } */
9852 /* Done by c-parser.c */
9855 /* --- SUPPORT FOR FORMAT ARG CHECKING --- */
9856 /* Return true if we have an NxString object pointer. */
9858 bool
9859 objc_string_ref_type_p (tree strp)
9861 tree tmv;
9862 if (!strp || TREE_CODE (strp) != POINTER_TYPE)
9863 return false;
9865 tmv = TYPE_MAIN_VARIANT (TREE_TYPE (strp));
9866 tmv = OBJC_TYPE_NAME (tmv);
9867 return (tmv
9868 && TREE_CODE (tmv) == IDENTIFIER_NODE
9869 && IDENTIFIER_POINTER (tmv)
9870 && !strncmp (IDENTIFIER_POINTER (tmv), "NSString", 8));
9873 /* At present the behavior of this is undefined and it does nothing. */
9874 void
9875 objc_check_format_arg (tree ARG_UNUSED (format_arg),
9876 tree ARG_UNUSED (args_list))
9880 /* --- Encode --- */
9881 /* "Encode" a data type into a string, which grows in util_obstack.
9883 The format is described in gcc/doc/objc.texi, section 'Type
9884 encoding'.
9886 Most of the encode_xxx functions have a 'type' argument, which is
9887 the type to encode, and an integer 'curtype' argument, which is the
9888 index in the encoding string of the beginning of the encoding of
9889 the current type, and allows you to find what characters have
9890 already been written for the current type (they are the ones in the
9891 current encoding string starting from 'curtype').
9893 For example, if we are encoding a method which returns 'int' and
9894 takes a 'char **' argument, then when we get to the point of
9895 encoding the 'char **' argument, the encoded string already
9896 contains 'i12@0:4' (assuming a pointer size of 4 bytes). So,
9897 'curtype' will be set to 7 when starting to encode 'char **'.
9898 During the whole of the encoding of 'char **', 'curtype' will be
9899 fixed at 7, so the routine encoding the second pointer can find out
9900 that it's actually encoding a pointer to a pointer by looking
9901 backwards at what has already been encoded for the current type,
9902 and seeing there is a "^" (meaning a pointer) in there.
9906 /* Encode type qualifiers encodes one of the "PQ" Objective-C
9907 keywords, ie 'in', 'out', 'inout', 'bycopy', 'byref', 'oneway'.
9908 'const', instead, is encoded directly as part of the type.
9911 static void
9912 encode_type_qualifiers (tree declspecs)
9914 tree spec;
9916 for (spec = declspecs; spec; spec = TREE_CHAIN (spec))
9918 /* FIXME: Shouldn't we use token->keyword here ? */
9919 if (ridpointers[(int) RID_IN] == TREE_VALUE (spec))
9920 obstack_1grow (&util_obstack, 'n');
9921 else if (ridpointers[(int) RID_INOUT] == TREE_VALUE (spec))
9922 obstack_1grow (&util_obstack, 'N');
9923 else if (ridpointers[(int) RID_OUT] == TREE_VALUE (spec))
9924 obstack_1grow (&util_obstack, 'o');
9925 else if (ridpointers[(int) RID_BYCOPY] == TREE_VALUE (spec))
9926 obstack_1grow (&util_obstack, 'O');
9927 else if (ridpointers[(int) RID_BYREF] == TREE_VALUE (spec))
9928 obstack_1grow (&util_obstack, 'R');
9929 else if (ridpointers[(int) RID_ONEWAY] == TREE_VALUE (spec))
9930 obstack_1grow (&util_obstack, 'V');
9931 else
9932 gcc_unreachable ();
9936 /* Determine if a pointee is marked read-only. Only used by the NeXT
9937 runtime to be compatible with gcc-3.3. */
9939 static bool
9940 pointee_is_readonly (tree pointee)
9942 while (POINTER_TYPE_P (pointee))
9943 pointee = TREE_TYPE (pointee);
9945 return TYPE_READONLY (pointee);
9948 /* Encode a pointer type. */
9950 static void
9951 encode_pointer (tree type, int curtype, int format)
9953 tree pointer_to = TREE_TYPE (type);
9955 if (flag_next_runtime)
9957 /* This code is used to be compatible with gcc-3.3. */
9958 /* For historical/compatibility reasons, the read-only qualifier
9959 of the pointee gets emitted _before_ the '^'. The read-only
9960 qualifier of the pointer itself gets ignored, _unless_ we are
9961 looking at a typedef! Also, do not emit the 'r' for anything
9962 but the outermost type! */
9963 if (!generating_instance_variables
9964 && (obstack_object_size (&util_obstack) - curtype <= 1)
9965 && (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
9966 ? TYPE_READONLY (type)
9967 : pointee_is_readonly (pointer_to)))
9968 obstack_1grow (&util_obstack, 'r');
9971 if (TREE_CODE (pointer_to) == RECORD_TYPE)
9973 if (OBJC_TYPE_NAME (pointer_to)
9974 && TREE_CODE (OBJC_TYPE_NAME (pointer_to)) == IDENTIFIER_NODE)
9976 const char *name = IDENTIFIER_POINTER (OBJC_TYPE_NAME (pointer_to));
9978 if (strcmp (name, TAG_OBJECT) == 0) /* '@' */
9980 obstack_1grow (&util_obstack, '@');
9981 return;
9983 else if (TYPE_HAS_OBJC_INFO (pointer_to)
9984 && TYPE_OBJC_INTERFACE (pointer_to))
9986 if (generating_instance_variables)
9988 obstack_1grow (&util_obstack, '@');
9989 obstack_1grow (&util_obstack, '"');
9990 obstack_grow (&util_obstack, name, strlen (name));
9991 obstack_1grow (&util_obstack, '"');
9992 return;
9994 else
9996 obstack_1grow (&util_obstack, '@');
9997 return;
10000 else if (strcmp (name, TAG_CLASS) == 0) /* '#' */
10002 obstack_1grow (&util_obstack, '#');
10003 return;
10005 else if (strcmp (name, TAG_SELECTOR) == 0) /* ':' */
10007 obstack_1grow (&util_obstack, ':');
10008 return;
10012 else if (TREE_CODE (pointer_to) == INTEGER_TYPE
10013 && TYPE_MODE (pointer_to) == QImode)
10015 tree pname = TREE_CODE (OBJC_TYPE_NAME (pointer_to)) == IDENTIFIER_NODE
10016 ? OBJC_TYPE_NAME (pointer_to)
10017 : DECL_NAME (OBJC_TYPE_NAME (pointer_to));
10019 /* (BOOL *) are an exception and are encoded as ^c, while all
10020 other pointers to char are encoded as *. */
10021 if (strcmp (IDENTIFIER_POINTER (pname), "BOOL"))
10023 if (!flag_next_runtime)
10025 /* The NeXT runtime adds the 'r' before getting here. */
10027 /* It appears that "r*" means "const char *" rather than
10028 "char *const". "char *const" is encoded as "*",
10029 which is identical to "char *", so the "const" is
10030 unfortunately lost. */
10031 if (TYPE_READONLY (pointer_to))
10032 obstack_1grow (&util_obstack, 'r');
10035 obstack_1grow (&util_obstack, '*');
10036 return;
10040 /* We have a normal pointer type that does not get special treatment. */
10041 obstack_1grow (&util_obstack, '^');
10042 encode_type (pointer_to, curtype, format);
10045 static void
10046 encode_array (tree type, int curtype, int format)
10048 tree an_int_cst = TYPE_SIZE (type);
10049 tree array_of = TREE_TYPE (type);
10050 char buffer[40];
10052 if (an_int_cst == NULL)
10054 /* We are trying to encode an incomplete array. An incomplete
10055 array is forbidden as part of an instance variable; but it
10056 may occur if the instance variable is a pointer to such an
10057 array. */
10059 /* So the only case in which an incomplete array could occur
10060 (without being pointed to) is if we are encoding the
10061 arguments or return value of a method. In that case, an
10062 incomplete array argument or return value (eg,
10063 -(void)display: (char[])string) is treated like a pointer
10064 because that is how the compiler does the function call. A
10065 special, more complicated case, is when the incomplete array
10066 is the last member of a struct (eg, if we are encoding
10067 "struct { unsigned long int a;double b[];}"), which is again
10068 part of a method argument/return value. In that case, we
10069 really need to communicate to the runtime that there is an
10070 incomplete array (not a pointer!) there. So, we detect that
10071 special case and encode it as a zero-length array.
10073 Try to detect that we are part of a struct. We do this by
10074 searching for '=' in the type encoding for the current type.
10075 NB: This hack assumes that you can't use '=' as part of a C
10076 identifier.
10079 char *enc = obstack_base (&util_obstack) + curtype;
10080 if (memchr (enc, '=',
10081 obstack_object_size (&util_obstack) - curtype) == NULL)
10083 /* We are not inside a struct. Encode the array as a
10084 pointer. */
10085 encode_pointer (type, curtype, format);
10086 return;
10090 /* Else, we are in a struct, and we encode it as a zero-length
10091 array. */
10092 sprintf (buffer, "[" HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)0);
10094 else if (TREE_INT_CST_LOW (TYPE_SIZE (array_of)) == 0)
10095 sprintf (buffer, "[" HOST_WIDE_INT_PRINT_DEC, (HOST_WIDE_INT)0);
10096 else
10097 sprintf (buffer, "[" HOST_WIDE_INT_PRINT_DEC,
10098 TREE_INT_CST_LOW (an_int_cst)
10099 / TREE_INT_CST_LOW (TYPE_SIZE (array_of)));
10101 obstack_grow (&util_obstack, buffer, strlen (buffer));
10102 encode_type (array_of, curtype, format);
10103 obstack_1grow (&util_obstack, ']');
10104 return;
10107 /* Encode a vector. The vector type is a GCC extension to C. */
10108 static void
10109 encode_vector (tree type, int curtype, int format)
10111 tree vector_of = TREE_TYPE (type);
10112 char buffer[40];
10114 /* Vectors are like simple fixed-size arrays. */
10116 /* Output ![xx,yy,<code>] where xx is the vector_size, yy is the
10117 alignment of the vector, and <code> is the base type. Eg, int
10118 __attribute__ ((vector_size (16))) gets encoded as ![16,32,i]
10119 assuming that the alignment is 32 bytes. We include size and
10120 alignment in bytes so that the runtime does not have to have any
10121 knowledge of the actual types.
10123 sprintf (buffer, "![" HOST_WIDE_INT_PRINT_DEC ",%d",
10124 /* We want to compute the equivalent of sizeof (<vector>).
10125 Code inspired by c_sizeof_or_alignof_type. */
10126 ((TREE_INT_CST_LOW (TYPE_SIZE_UNIT (type))
10127 / (TYPE_PRECISION (char_type_node) / BITS_PER_UNIT))),
10128 /* We want to compute the equivalent of __alignof__
10129 (<vector>). Code inspired by
10130 c_sizeof_or_alignof_type. */
10131 TYPE_ALIGN_UNIT (type));
10132 obstack_grow (&util_obstack, buffer, strlen (buffer));
10133 encode_type (vector_of, curtype, format);
10134 obstack_1grow (&util_obstack, ']');
10135 return;
10138 static void
10139 encode_aggregate_fields (tree type, bool pointed_to, int curtype, int format)
10141 tree field = TYPE_FIELDS (type);
10143 for (; field; field = DECL_CHAIN (field))
10145 #ifdef OBJCPLUS
10146 /* C++ static members, and things that are not field at all,
10147 should not appear in the encoding. */
10148 if (TREE_CODE (field) != FIELD_DECL || TREE_STATIC (field))
10149 continue;
10150 #endif
10152 /* Recursively encode fields of embedded base classes. */
10153 if (DECL_ARTIFICIAL (field) && !DECL_NAME (field)
10154 && TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
10156 encode_aggregate_fields (TREE_TYPE (field),
10157 pointed_to, curtype, format);
10158 continue;
10161 if (generating_instance_variables && !pointed_to)
10163 tree fname = DECL_NAME (field);
10165 obstack_1grow (&util_obstack, '"');
10167 if (fname && TREE_CODE (fname) == IDENTIFIER_NODE)
10168 obstack_grow (&util_obstack,
10169 IDENTIFIER_POINTER (fname),
10170 strlen (IDENTIFIER_POINTER (fname)));
10172 obstack_1grow (&util_obstack, '"');
10175 encode_field_decl (field, curtype, format);
10179 static void
10180 encode_aggregate_within (tree type, int curtype, int format, int left,
10181 int right)
10183 tree name;
10184 /* NB: aggregates that are pointed to have slightly different encoding
10185 rules in that you never encode the names of instance variables. */
10186 int ob_size = obstack_object_size (&util_obstack);
10187 bool inline_contents = false;
10188 bool pointed_to = false;
10190 if (flag_next_runtime)
10192 if (ob_size > 0 && *(obstack_next_free (&util_obstack) - 1) == '^')
10193 pointed_to = true;
10195 if ((format == OBJC_ENCODE_INLINE_DEFS || generating_instance_variables)
10196 && (!pointed_to || ob_size - curtype == 1
10197 || (ob_size - curtype == 2
10198 && *(obstack_next_free (&util_obstack) - 2) == 'r')))
10199 inline_contents = true;
10201 else
10203 /* c0 and c1 are the last two characters in the encoding of the
10204 current type; if the last two characters were '^' or '^r',
10205 then we are encoding an aggregate that is "pointed to". The
10206 comment above applies: in that case we should avoid encoding
10207 the names of instance variables.
10209 char c1 = ob_size > 1 ? *(obstack_next_free (&util_obstack) - 2) : 0;
10210 char c0 = ob_size > 0 ? *(obstack_next_free (&util_obstack) - 1) : 0;
10212 if (c0 == '^' || (c1 == '^' && c0 == 'r'))
10213 pointed_to = true;
10215 if (format == OBJC_ENCODE_INLINE_DEFS || generating_instance_variables)
10217 if (!pointed_to)
10218 inline_contents = true;
10219 else
10221 /* Note that the check (ob_size - curtype < 2) prevents
10222 infinite recursion when encoding a structure which is
10223 a linked list (eg, struct node { struct node *next;
10224 }). Each time we follow a pointer, we add one
10225 character to ob_size, and curtype is fixed, so after
10226 at most two pointers we stop inlining contents and
10227 break the loop.
10229 The other case where we don't inline is "^r", which
10230 is a pointer to a constant struct.
10232 if ((ob_size - curtype <= 2) && !(c0 == 'r'))
10233 inline_contents = true;
10238 /* Traverse struct aliases; it is important to get the
10239 original struct and its tag name (if any). */
10240 type = TYPE_MAIN_VARIANT (type);
10241 name = OBJC_TYPE_NAME (type);
10242 /* Open parenth/bracket. */
10243 obstack_1grow (&util_obstack, left);
10245 /* Encode the struct/union tag name, or '?' if a tag was
10246 not provided. Typedef aliases do not qualify. */
10247 #ifdef OBJCPLUS
10248 /* For compatibility with the NeXT runtime, ObjC++ encodes template
10249 args as a composite struct tag name. */
10250 if (name && TREE_CODE (name) == IDENTIFIER_NODE
10251 /* Did this struct have a tag? */
10252 && !TYPE_WAS_ANONYMOUS (type))
10253 obstack_grow (&util_obstack,
10254 decl_as_string (type, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME),
10255 strlen (decl_as_string (type, TFF_DECL_SPECIFIERS | TFF_UNQUALIFIED_NAME)));
10256 #else
10257 if (name && TREE_CODE (name) == IDENTIFIER_NODE)
10258 obstack_grow (&util_obstack,
10259 IDENTIFIER_POINTER (name),
10260 strlen (IDENTIFIER_POINTER (name)));
10261 #endif
10262 else
10263 obstack_1grow (&util_obstack, '?');
10265 /* Encode the types (and possibly names) of the inner fields,
10266 if required. */
10267 if (inline_contents)
10269 obstack_1grow (&util_obstack, '=');
10270 encode_aggregate_fields (type, pointed_to, curtype, format);
10272 /* Close parenth/bracket. */
10273 obstack_1grow (&util_obstack, right);
10276 /* Encode a bitfield NeXT-style (i.e., without a bit offset or the underlying
10277 field type. */
10279 static void
10280 encode_next_bitfield (int width)
10282 char buffer[40];
10283 sprintf (buffer, "b%d", width);
10284 obstack_grow (&util_obstack, buffer, strlen (buffer));
10287 /* Encodes 'type', ignoring type qualifiers (which you should encode
10288 beforehand if needed) with the exception of 'const', which is
10289 encoded by encode_type. See above for the explanation of
10290 'curtype'. 'format' can be OBJC_ENCODE_INLINE_DEFS or
10291 OBJC_ENCODE_DONT_INLINE_DEFS.
10293 static void
10294 encode_type (tree type, int curtype, int format)
10296 enum tree_code code = TREE_CODE (type);
10298 /* Ignore type qualifiers other than 'const' when encoding a
10299 type. */
10301 if (type == error_mark_node)
10302 return;
10304 if (!flag_next_runtime)
10306 if (TYPE_READONLY (type))
10307 obstack_1grow (&util_obstack, 'r');
10310 switch (code)
10312 case ENUMERAL_TYPE:
10313 if (flag_next_runtime)
10315 /* Kludge for backwards-compatibility with gcc-3.3: enums
10316 are always encoded as 'i' no matter what type they
10317 actually are (!). */
10318 obstack_1grow (&util_obstack, 'i');
10319 break;
10321 /* Else, they are encoded exactly like the integer type that is
10322 used by the compiler to store them. */
10323 case INTEGER_TYPE:
10325 char c;
10326 switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
10328 case 8: c = TYPE_UNSIGNED (type) ? 'C' : 'c'; break;
10329 case 16: c = TYPE_UNSIGNED (type) ? 'S' : 's'; break;
10330 case 32:
10332 tree int_type = type;
10333 if (flag_next_runtime)
10335 /* Another legacy kludge for compatiblity with
10336 gcc-3.3: 32-bit longs are encoded as 'l' or 'L',
10337 but not always. For typedefs, we need to use 'i'
10338 or 'I' instead if encoding a struct field, or a
10339 pointer! */
10340 int_type = ((!generating_instance_variables
10341 && (obstack_object_size (&util_obstack)
10342 == (unsigned) curtype))
10343 ? TYPE_MAIN_VARIANT (type)
10344 : type);
10346 if (int_type == long_unsigned_type_node
10347 || int_type == long_integer_type_node)
10348 c = TYPE_UNSIGNED (type) ? 'L' : 'l';
10349 else
10350 c = TYPE_UNSIGNED (type) ? 'I' : 'i';
10352 break;
10353 case 64: c = TYPE_UNSIGNED (type) ? 'Q' : 'q'; break;
10354 case 128: c = TYPE_UNSIGNED (type) ? 'T' : 't'; break;
10355 default: gcc_unreachable ();
10357 obstack_1grow (&util_obstack, c);
10358 break;
10360 case REAL_TYPE:
10362 char c;
10363 /* Floating point types. */
10364 switch (GET_MODE_BITSIZE (TYPE_MODE (type)))
10366 case 32: c = 'f'; break;
10367 case 64: c = 'd'; break;
10368 case 96:
10369 case 128: c = 'D'; break;
10370 default: gcc_unreachable ();
10372 obstack_1grow (&util_obstack, c);
10373 break;
10375 case VOID_TYPE:
10376 obstack_1grow (&util_obstack, 'v');
10377 break;
10379 case BOOLEAN_TYPE:
10380 obstack_1grow (&util_obstack, 'B');
10381 break;
10383 case ARRAY_TYPE:
10384 encode_array (type, curtype, format);
10385 break;
10387 case POINTER_TYPE:
10388 #ifdef OBJCPLUS
10389 case REFERENCE_TYPE:
10390 #endif
10391 encode_pointer (type, curtype, format);
10392 break;
10394 case RECORD_TYPE:
10395 encode_aggregate_within (type, curtype, format, '{', '}');
10396 break;
10398 case UNION_TYPE:
10399 encode_aggregate_within (type, curtype, format, '(', ')');
10400 break;
10402 case FUNCTION_TYPE: /* '?' means an unknown type. */
10403 obstack_1grow (&util_obstack, '?');
10404 break;
10406 case COMPLEX_TYPE:
10407 /* A complex is encoded as 'j' followed by the inner type (eg,
10408 "_Complex int" is encoded as 'ji'). */
10409 obstack_1grow (&util_obstack, 'j');
10410 encode_type (TREE_TYPE (type), curtype, format);
10411 break;
10413 case VECTOR_TYPE:
10414 encode_vector (type, curtype, format);
10415 break;
10417 default:
10418 warning (0, "unknown type %s found during Objective-C encoding",
10419 gen_type_name (type));
10420 obstack_1grow (&util_obstack, '?');
10421 break;
10424 if (flag_next_runtime)
10426 /* Super-kludge. Some ObjC qualifier and type combinations need
10427 to be rearranged for compatibility with gcc-3.3. */
10428 if (code == POINTER_TYPE && obstack_object_size (&util_obstack) >= 3)
10430 char *enc = obstack_base (&util_obstack) + curtype;
10432 /* Rewrite "in const" from "nr" to "rn". */
10433 if (curtype >= 1 && !strncmp (enc - 1, "nr", 2))
10434 strncpy (enc - 1, "rn", 2);
10439 static void
10440 encode_gnu_bitfield (int position, tree type, int size)
10442 enum tree_code code = TREE_CODE (type);
10443 char buffer[40];
10444 char charType = '?';
10446 /* This code is only executed for the GNU runtime, so we can ignore
10447 the NeXT runtime kludge of always encoding enums as 'i' no matter
10448 what integers they actually are. */
10449 if (code == INTEGER_TYPE || code == ENUMERAL_TYPE)
10451 if (integer_zerop (TYPE_MIN_VALUE (type)))
10452 /* Unsigned integer types. */
10454 switch (TYPE_MODE (type))
10456 case QImode:
10457 charType = 'C'; break;
10458 case HImode:
10459 charType = 'S'; break;
10460 case SImode:
10462 if (type == long_unsigned_type_node)
10463 charType = 'L';
10464 else
10465 charType = 'I';
10466 break;
10468 case DImode:
10469 charType = 'Q'; break;
10470 default:
10471 gcc_unreachable ();
10474 else
10475 /* Signed integer types. */
10477 switch (TYPE_MODE (type))
10479 case QImode:
10480 charType = 'c'; break;
10481 case HImode:
10482 charType = 's'; break;
10483 case SImode:
10485 if (type == long_integer_type_node)
10486 charType = 'l';
10487 else
10488 charType = 'i';
10489 break;
10491 case DImode:
10492 charType = 'q'; break;
10493 default:
10494 gcc_unreachable ();
10498 else
10500 /* Do not do any encoding, produce an error and keep going. */
10501 error ("trying to encode non-integer type as a bitfield");
10502 return;
10505 sprintf (buffer, "b%d%c%d", position, charType, size);
10506 obstack_grow (&util_obstack, buffer, strlen (buffer));
10509 void
10510 encode_field_decl (tree field_decl, int curtype, int format)
10512 #ifdef OBJCPLUS
10513 /* C++ static members, and things that are not fields at all,
10514 should not appear in the encoding. */
10515 if (TREE_CODE (field_decl) != FIELD_DECL || TREE_STATIC (field_decl))
10516 return;
10517 #endif
10519 /* Generate the bitfield typing information, if needed. Note the difference
10520 between GNU and NeXT runtimes. */
10521 if (DECL_BIT_FIELD_TYPE (field_decl))
10523 int size = tree_low_cst (DECL_SIZE (field_decl), 1);
10525 if (flag_next_runtime)
10526 encode_next_bitfield (size);
10527 else
10528 encode_gnu_bitfield (int_bit_position (field_decl),
10529 DECL_BIT_FIELD_TYPE (field_decl), size);
10531 else
10532 encode_type (TREE_TYPE (field_decl), curtype, format);
10535 /* This routine encodes the attribute of the input PROPERTY according
10536 to following formula:
10538 Property attributes are stored as a comma-delimited C string.
10539 Simple attributes such as readonly are encoded as single
10540 character. The parametrized attributes, getter=name and
10541 setter=name, are encoded as a single character followed by an
10542 identifier. Property types are also encoded as a parametrized
10543 attribute. The characters used to encode these attributes are
10544 defined by the following enumeration:
10546 enum PropertyAttributes {
10547 kPropertyReadOnly = 'R',
10548 kPropertyBycopy = 'C',
10549 kPropertyByref = '&',
10550 kPropertyDynamic = 'D',
10551 kPropertyGetter = 'G',
10552 kPropertySetter = 'S',
10553 kPropertyInstanceVariable = 'V',
10554 kPropertyType = 'T',
10555 kPropertyWeak = 'W',
10556 kPropertyStrong = 'P',
10557 kPropertyNonAtomic = 'N'
10558 }; */
10559 tree
10560 objc_v2_encode_prop_attr (tree property)
10562 const char *string;
10563 tree type = TREE_TYPE (property);
10565 obstack_1grow (&util_obstack, 'T');
10566 encode_type (type, obstack_object_size (&util_obstack),
10567 OBJC_ENCODE_INLINE_DEFS);
10569 if (PROPERTY_READONLY (property))
10570 obstack_grow (&util_obstack, ",R", 2);
10572 switch (PROPERTY_ASSIGN_SEMANTICS (property))
10574 case OBJC_PROPERTY_COPY:
10575 obstack_grow (&util_obstack, ",C", 2);
10576 break;
10577 case OBJC_PROPERTY_RETAIN:
10578 obstack_grow (&util_obstack, ",&", 2);
10579 break;
10580 case OBJC_PROPERTY_ASSIGN:
10581 default:
10582 break;
10585 if (PROPERTY_DYNAMIC (property))
10586 obstack_grow (&util_obstack, ",D", 2);
10588 if (PROPERTY_NONATOMIC (property))
10589 obstack_grow (&util_obstack, ",N", 2);
10591 /* Here we want to encode the getter name, but only if it's not the
10592 standard one. */
10593 if (PROPERTY_GETTER_NAME (property) != PROPERTY_NAME (property))
10595 obstack_grow (&util_obstack, ",G", 2);
10596 string = IDENTIFIER_POINTER (PROPERTY_GETTER_NAME (property));
10597 obstack_grow (&util_obstack, string, strlen (string));
10600 if (!PROPERTY_READONLY (property))
10602 /* Here we want to encode the setter name, but only if it's not
10603 the standard one. */
10604 tree standard_setter = get_identifier (objc_build_property_setter_name (PROPERTY_NAME (property)));
10605 if (PROPERTY_SETTER_NAME (property) != standard_setter)
10607 obstack_grow (&util_obstack, ",S", 2);
10608 string = IDENTIFIER_POINTER (PROPERTY_SETTER_NAME (property));
10609 obstack_grow (&util_obstack, string, strlen (string));
10613 /* TODO: Encode strong ('P'), weak ('W') for garbage collection. */
10615 if (!PROPERTY_DYNAMIC (property))
10617 obstack_grow (&util_obstack, ",V", 2);
10618 if (PROPERTY_IVAR_NAME (property))
10619 string = IDENTIFIER_POINTER (PROPERTY_IVAR_NAME (property));
10620 else
10621 string = IDENTIFIER_POINTER (PROPERTY_NAME (property));
10622 obstack_grow (&util_obstack, string, strlen (string));
10625 /* NULL-terminate string. */
10626 obstack_1grow (&util_obstack, 0);
10627 string = XOBFINISH (&util_obstack, char *);
10628 obstack_free (&util_obstack, util_firstobj);
10629 return get_identifier (string);
10632 void
10633 objc_common_init_ts (void)
10635 c_common_init_ts ();
10637 MARK_TS_DECL_NON_COMMON (CLASS_METHOD_DECL);
10638 MARK_TS_DECL_NON_COMMON (INSTANCE_METHOD_DECL);
10639 MARK_TS_DECL_NON_COMMON (KEYWORD_DECL);
10640 MARK_TS_DECL_NON_COMMON (PROPERTY_DECL);
10642 MARK_TS_COMMON (CLASS_INTERFACE_TYPE);
10643 MARK_TS_COMMON (PROTOCOL_INTERFACE_TYPE);
10644 MARK_TS_COMMON (CLASS_IMPLEMENTATION_TYPE);
10646 MARK_TS_TYPED (MESSAGE_SEND_EXPR);
10647 MARK_TS_TYPED (PROPERTY_REF);
10650 #include "gt-objc-objc-act.h"