gcc/upc/
[official-gcc.git] / gcc / java / class.c
blob40ff26dfe8938984ffbfae45ac8660554a047567
1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>.
21 Java and all Java-based marks are trademarks or registered trademarks
22 of Sun Microsystems, Inc. in the United States and other countries.
23 The Free Software Foundation is independent of Sun Microsystems, Inc. */
25 /* Written by Per Bothner <bothner@cygnus.com> */
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tree.h"
31 #include "flags.h"
32 #include "java-tree.h"
33 #include "jcf.h"
34 #include "obstack.h"
35 #include "diagnostic-core.h"
36 #include "toplev.h"
37 #include "output.h" /* for switch_to_section and get_section */
38 #include "parse.h"
39 #include "function.h"
40 #include "ggc.h"
41 #include "cgraph.h"
42 #include "tree-iterator.h"
43 #include "vecprim.h"
44 #include "target.h"
46 static tree make_method_value (tree);
47 static tree build_java_method_type (tree, tree, int);
48 static int32 hashUtf8String (const char *, int);
49 static tree make_field_value (tree);
50 static tree get_dispatch_vector (tree);
51 static tree get_dispatch_table (tree, tree);
52 static int supers_all_compiled (tree type);
53 static tree maybe_layout_super_class (tree, tree);
54 static void add_miranda_methods (tree, tree);
55 static int assume_compiled (const char *);
56 static tree build_symbol_entry (tree, tree);
57 static tree emit_assertion_table (tree);
58 static void register_class (void);
60 struct obstack temporary_obstack;
62 static const char *cyclic_inheritance_report;
64 /* The compiler generates different code depending on whether or not
65 it can assume certain classes have been compiled down to native
66 code or not. The compiler options -fassume-compiled= and
67 -fno-assume-compiled= are used to create a tree of
68 class_flag_node objects. This tree is queried to determine if
69 a class is assume to be compiled or not. Each node in the tree
70 represents either a package or a specific class. */
72 typedef struct class_flag_node_struct
74 /* The class or package name. */
75 const char *ident;
77 /* Nonzero if this represents an exclusion. */
78 int value;
80 /* Pointers to other nodes in the tree. */
81 struct class_flag_node_struct *parent;
82 struct class_flag_node_struct *sibling;
83 struct class_flag_node_struct *child;
84 } class_flag_node;
86 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
87 static void add_class_flag (class_flag_node **, const char *, int);
89 /* This is the root of the include/exclude tree. */
91 static class_flag_node *assume_compiled_tree;
93 static class_flag_node *enable_assert_tree;
95 static GTY(()) tree class_roots[4];
96 #define fields_ident class_roots[0] /* get_identifier ("fields") */
97 #define info_ident class_roots[1] /* get_identifier ("info") */
98 #define class_list class_roots[2]
99 #define class_dtable_decl class_roots[3]
101 static GTY(()) VEC(tree,gc) *registered_class;
103 /* A tree that returns the address of the class$ of the class
104 currently being compiled. */
105 static GTY(()) tree this_classdollar;
107 /* A list of static class fields. This is to emit proper debug
108 info for them. */
109 VEC(tree,gc) *pending_static_fields;
111 /* Return the node that most closely represents the class whose name
112 is IDENT. Start the search from NODE (followed by its siblings).
113 Return NULL if an appropriate node does not exist. */
115 static class_flag_node *
116 find_class_flag_node (class_flag_node *node, const char *ident)
118 while (node)
120 size_t node_ident_length = strlen (node->ident);
122 /* node_ident_length is zero at the root of the tree. If the
123 identifiers are the same length, then we have matching
124 classes. Otherwise check if we've matched an enclosing
125 package name. */
127 if (node_ident_length == 0
128 || (strncmp (ident, node->ident, node_ident_length) == 0
129 && (ident[node_ident_length] == '\0'
130 || ident[node_ident_length] == '.')))
132 /* We've found a match, however, there might be a more
133 specific match. */
135 class_flag_node *found = find_class_flag_node (node->child, ident);
136 if (found)
137 return found;
138 else
139 return node;
142 /* No match yet. Continue through the sibling list. */
143 node = node->sibling;
146 /* No match at all in this tree. */
147 return NULL;
150 void
151 add_class_flag (class_flag_node **rootp, const char *ident, int value)
153 class_flag_node *root = *rootp;
154 class_flag_node *parent, *node;
156 /* Create the root of the tree if it doesn't exist yet. */
158 if (NULL == root)
160 root = XNEW (class_flag_node);
161 root->ident = "";
162 root->value = 0;
163 root->sibling = NULL;
164 root->child = NULL;
165 root->parent = NULL;
166 *rootp = root;
169 /* Calling the function with the empty string means we're setting
170 value for the root of the hierarchy. */
172 if (0 == ident[0])
174 root->value = value;
175 return;
178 /* Find the parent node for this new node. PARENT will either be a
179 class or a package name. Adjust PARENT accordingly. */
181 parent = find_class_flag_node (root, ident);
182 if (strcmp (ident, parent->ident) == 0)
183 parent->value = value;
184 else
186 /* Insert new node into the tree. */
187 node = XNEW (class_flag_node);
189 node->ident = xstrdup (ident);
190 node->value = value;
191 node->child = NULL;
193 node->parent = parent;
194 node->sibling = parent->child;
195 parent->child = node;
199 /* Add a new IDENT to the include/exclude tree. It's an exclusion
200 if EXCLUDEP is nonzero. */
202 void
203 add_assume_compiled (const char *ident, int excludep)
205 add_class_flag (&assume_compiled_tree, ident, excludep);
208 /* The default value returned by enable_assertions. */
210 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
212 /* Enter IDENT (a class or package name) into the enable-assertions table.
213 VALUE is true to enable and false to disable. */
215 void
216 add_enable_assert (const char *ident, int value)
218 if (enable_assert_tree == NULL)
219 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
220 add_class_flag (&enable_assert_tree, ident, value);
223 /* Returns nonzero if IDENT is the name of a class that the compiler
224 should assume has been compiled to object code. */
226 static int
227 assume_compiled (const char *ident)
229 class_flag_node *i;
230 int result;
232 if (NULL == assume_compiled_tree)
233 return 1;
235 i = find_class_flag_node (assume_compiled_tree, ident);
237 result = ! i->value;
239 return (result);
242 /* Return true if we should generate code to check assertions within KLASS. */
244 bool
245 enable_assertions (tree klass)
247 /* Check if command-line specifies whether we should check assertions. */
249 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
251 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
252 class_flag_node *node
253 = find_class_flag_node (enable_assert_tree, ident);
254 return node->value;
257 /* The default is to enable assertions if generating class files,
258 or not optimizing. */
259 return DEFAULT_ENABLE_ASSERT;
262 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
263 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
264 Also, PREFIX is prepended, and SUFFIX is appended. */
266 tree
267 ident_subst (const char* old_name,
268 int old_length,
269 const char *prefix,
270 int old_char,
271 int new_char,
272 const char *suffix)
274 int prefix_len = strlen (prefix);
275 int suffix_len = strlen (suffix);
276 int i = prefix_len + old_length + suffix_len + 1;
277 char *buffer = (char *) alloca (i);
279 strcpy (buffer, prefix);
280 for (i = 0; i < old_length; i++)
282 char ch = old_name[i];
283 if (ch == old_char)
284 ch = new_char;
285 buffer[prefix_len + i] = ch;
287 strcpy (buffer + prefix_len + old_length, suffix);
288 return get_identifier (buffer);
291 /* Return an IDENTIFIER_NODE the same as OLD_ID,
292 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
293 Also, PREFIX is prepended, and SUFFIX is appended. */
295 tree
296 identifier_subst (const tree old_id,
297 const char *prefix,
298 int old_char,
299 int new_char,
300 const char *suffix)
302 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
303 prefix, old_char, new_char, suffix);
306 /* Generate a valid C identifier from the name of the class TYPE,
307 prefixed by PREFIX. */
309 tree
310 mangled_classname (const char *prefix, tree type)
312 tree result;
313 tree ident = TYPE_NAME (type);
314 if (TREE_CODE (ident) != IDENTIFIER_NODE)
315 ident = DECL_NAME (ident);
316 result = identifier_subst (ident, prefix, '.', '_', "");
318 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
319 "_0xXX". Class names containing such chracters are uncommon, but
320 they do sometimes occur in class files. Without this check,
321 these names cause assembly errors.
323 There is a possibility that a real class name could conflict with
324 the identifier we generate, but it is unlikely and will
325 immediately be detected as an assembler error. At some point we
326 should do something more elaborate (perhaps using the full
327 unicode mangling scheme) in order to prevent such a conflict. */
329 int i;
330 const int len = IDENTIFIER_LENGTH (result);
331 const char *p = IDENTIFIER_POINTER (result);
332 int illegal_chars = 0;
334 /* Make two passes over the identifier. The first pass is merely
335 to count illegal characters; we need to do this in order to
336 allocate a buffer. */
337 for (i = 0; i < len; i++)
339 char c = p[i];
340 illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
343 /* And the second pass, which is rarely executed, does the
344 rewriting. */
345 if (illegal_chars != 0)
347 char *buffer = (char *) alloca (illegal_chars * 4 + len + 1);
348 int j;
350 for (i = 0, j = 0; i < len; i++)
352 char c = p[i];
353 if (! ISALNUM (c) && c != '_' && c != '$')
355 buffer[j++] = '_';
356 sprintf (&buffer[j], "0x%02x", c);
357 j += 4;
359 else
360 buffer[j++] = c;
363 buffer[j] = 0;
364 result = get_identifier (buffer);
368 return result;
371 tree
372 make_class (void)
374 tree type;
375 type = make_node (RECORD_TYPE);
376 /* Unfortunately we must create the binfo here, so that class
377 loading works. */
378 TYPE_BINFO (type) = make_tree_binfo (0);
379 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
380 TYPE_CATCH_CLASSES (type) = NULL;
381 /* Push a dummy entry; we can't call make_catch_class_record here
382 because other infrastructure may not be set up yet. We'll come
383 back and fill it in later once said infrastructure is
384 initialized. */
385 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
387 return type;
390 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
391 and where each of the constituents is separated by '/',
392 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
394 tree
395 unmangle_classname (const char *name, int name_length)
397 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
398 /* It's not sufficient to compare to_return and get_identifier
399 (name) to determine whether to_return is qualified. There are
400 cases in signature analysis where name will be stripped of a
401 trailing ';'. */
402 name = IDENTIFIER_POINTER (to_return);
403 while (*name)
404 if (*name++ == '.')
406 QUALIFIED_P (to_return) = 1;
407 break;
410 return to_return;
413 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
414 do \
416 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
417 char *buf = (char *) alloca (strlen (type_name) \
418 + strlen (#NAME "_syms_") + 1); \
419 tree decl; \
421 sprintf (buf, #NAME "_%s", type_name); \
422 TYPE_## TABLE ##_DECL (type) = decl = \
423 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
424 DECL_EXTERNAL (decl) = 1; \
425 TREE_STATIC (decl) = 1; \
426 TREE_READONLY (decl) = 1; \
427 TREE_CONSTANT (decl) = 1; \
428 DECL_IGNORED_P (decl) = 1; \
429 /* Mark the table as belonging to this class. */ \
430 pushdecl (decl); \
431 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
432 DECL_OWNER (decl) = TYPE; \
433 sprintf (buf, #NAME "_syms_%s", type_name); \
434 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
435 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
436 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
437 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
438 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
440 while (0)
442 /* Given a class, create the DECLs for all its associated indirect
443 dispatch tables. */
444 void
445 gen_indirect_dispatch_tables (tree type)
447 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", type));
449 tree field = NULL;
450 char *buf = (char *) alloca (strlen (type_name)
451 + strlen ("_catch_classes_") + 1);
452 tree catch_class_type = make_node (RECORD_TYPE);
454 sprintf (buf, "_catch_classes_%s", type_name);
455 PUSH_FIELD (input_location,
456 catch_class_type, field, "address", utf8const_ptr_type);
457 PUSH_FIELD (input_location,
458 catch_class_type, field, "classname", ptr_type_node);
459 FINISH_RECORD (catch_class_type);
461 TYPE_CTABLE_DECL (type)
462 = build_decl (input_location, VAR_DECL, get_identifier (buf),
463 build_array_type (catch_class_type, 0));
464 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
465 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
466 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
467 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
468 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
469 pushdecl (TYPE_CTABLE_DECL (type));
472 if (flag_indirect_dispatch)
474 GEN_TABLE (ATABLE, _atable, atable_type, type);
475 GEN_TABLE (OTABLE, _otable, otable_type, type);
476 GEN_TABLE (ITABLE, _itable, itable_type, type);
480 #undef GEN_TABLE
482 tree
483 push_class (tree class_type, tree class_name)
485 tree decl, signature;
486 location_t saved_loc = input_location;
487 CLASS_P (class_type) = 1;
488 decl = build_decl (input_location, TYPE_DECL, class_name, class_type);
489 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
491 /* dbxout needs a DECL_SIZE if in gstabs mode */
492 DECL_SIZE (decl) = integer_zero_node;
494 input_location = saved_loc;
495 signature = identifier_subst (class_name, "L", '.', '/', ";");
496 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
498 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
499 both a typedef and in the struct name-space. We may want to re-visit
500 this later, but for now it reduces the changes needed for gdb. */
501 DECL_ARTIFICIAL (decl) = 1;
503 pushdecl_top_level (decl);
505 return decl;
508 /* Finds the (global) class named NAME. Creates the class if not found.
509 Also creates associated TYPE_DECL.
510 Does not check if the class actually exists, load the class,
511 fill in field or methods, or do layout_type. */
513 tree
514 lookup_class (tree name)
516 tree decl = IDENTIFIER_CLASS_VALUE (name);
517 if (decl == NULL_TREE)
518 decl = push_class (make_class (), name);
519 return TREE_TYPE (decl);
522 void
523 set_super_info (int access_flags, tree this_class,
524 tree super_class, int interfaces_count)
526 int total_supers = interfaces_count;
527 tree class_decl = TYPE_NAME (this_class);
529 if (super_class)
530 total_supers++;
532 if (total_supers)
533 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
534 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
535 if (super_class)
537 tree super_binfo = make_tree_binfo (0);
538 BINFO_TYPE (super_binfo) = super_class;
539 BINFO_OFFSET (super_binfo) = integer_zero_node;
540 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
541 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
544 set_class_decl_access_flags (access_flags, class_decl);
547 void
548 set_class_decl_access_flags (int access_flags, tree class_decl)
550 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
551 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
552 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
553 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
554 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
555 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
556 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
557 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
558 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
559 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
560 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
561 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
564 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
565 direct sub-classes of Object are 1, and so on. */
568 class_depth (tree clas)
570 int depth = 0;
571 if (! CLASS_LOADED_P (clas))
572 load_class (clas, 1);
573 if (TYPE_SIZE (clas) == error_mark_node)
574 return -1;
575 while (clas != object_type_node)
577 depth++;
578 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
580 return depth;
583 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
586 interface_of_p (tree type1, tree type2)
588 int i;
589 tree binfo, base_binfo;
591 if (! TYPE_BINFO (type2))
592 return 0;
594 for (binfo = TYPE_BINFO (type2), i = 0;
595 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
596 if (BINFO_TYPE (base_binfo) == type1)
597 return 1;
599 for (binfo = TYPE_BINFO (type2), i = 0;
600 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
601 if (BINFO_TYPE (base_binfo)
602 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
603 return 1;
605 return 0;
608 /* Return true iff TYPE1 inherits from TYPE2. */
611 inherits_from_p (tree type1, tree type2)
613 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
615 if (type1 == type2)
616 return 1;
618 if (! CLASS_LOADED_P (type1))
619 load_class (type1, 1);
621 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
623 return 0;
626 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
629 enclosing_context_p (tree type1, tree type2)
631 if (!INNER_CLASS_TYPE_P (type2))
632 return 0;
634 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
635 type2;
636 type2 = (INNER_CLASS_TYPE_P (type2) ?
637 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
639 if (type2 == type1)
640 return 1;
643 return 0;
647 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
648 nesting level. */
651 common_enclosing_context_p (tree type1, tree type2)
653 while (type1)
655 tree current;
656 for (current = type2; current;
657 current = (INNER_CLASS_TYPE_P (current) ?
658 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
659 NULL_TREE))
660 if (type1 == current)
661 return 1;
663 if (INNER_CLASS_TYPE_P (type1))
664 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
665 else
666 break;
668 return 0;
671 /* Return 1 iff there exists a common enclosing "this" between TYPE1
672 and TYPE2, without crossing any static context. */
675 common_enclosing_instance_p (tree type1, tree type2)
677 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
678 return 0;
680 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
681 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
682 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
684 tree current;
685 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
686 current = (PURE_INNER_CLASS_TYPE_P (current) ?
687 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
688 NULL_TREE))
689 if (type1 == current)
690 return 1;
692 return 0;
695 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
696 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
697 if attempt is made to add it twice. */
699 tree
700 maybe_add_interface (tree this_class, tree interface_class)
702 tree binfo, base_binfo;
703 int i;
705 for (binfo = TYPE_BINFO (this_class), i = 0;
706 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
707 if (BINFO_TYPE (base_binfo) == interface_class)
708 return interface_class;
709 add_interface (this_class, interface_class);
710 return NULL_TREE;
713 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
715 void
716 add_interface (tree this_class, tree interface_class)
718 tree interface_binfo = make_tree_binfo (0);
720 BINFO_TYPE (interface_binfo) = interface_class;
721 BINFO_OFFSET (interface_binfo) = integer_zero_node;
722 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
723 BINFO_VIRTUAL_P (interface_binfo) = 1;
725 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
728 static tree
729 build_java_method_type (tree fntype, tree this_class, int access_flags)
731 if (access_flags & ACC_STATIC)
732 return fntype;
733 fntype = build_method_type (this_class, fntype);
735 /* We know that arg 1 of every nonstatic method is non-null; tell
736 the back-end so. */
737 TYPE_ATTRIBUTES (fntype) = (tree_cons
738 (get_identifier ("nonnull"),
739 tree_cons (NULL_TREE,
740 build_int_cst (NULL_TREE, 1),
741 NULL_TREE),
742 TYPE_ATTRIBUTES (fntype)));
743 return fntype;
746 void
747 java_hide_decl (tree decl ATTRIBUTE_UNUSED)
749 #ifdef HAVE_GAS_HIDDEN
750 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
751 DECL_VISIBILITY_SPECIFIED (decl) = 1;
752 #endif
755 tree
756 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
758 tree method_type, fndecl;
760 method_type = build_java_method_type (function_type,
761 this_class, access_flags);
763 fndecl = build_decl (input_location, FUNCTION_DECL, name, method_type);
764 DECL_CONTEXT (fndecl) = this_class;
766 DECL_LANG_SPECIFIC (fndecl)
767 = ggc_alloc_cleared_lang_decl(sizeof (struct lang_decl));
768 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
770 /* Initialize the static initializer test table. */
772 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = java_treetreehash_create (10);
774 /* Initialize the initialized (static) class table. */
775 if (access_flags & ACC_STATIC)
776 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
777 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
779 DECL_CHAIN (fndecl) = TYPE_METHODS (this_class);
780 TYPE_METHODS (this_class) = fndecl;
782 /* If pointers to member functions use the least significant bit to
783 indicate whether a function is virtual, ensure a pointer
784 to this function will have that bit clear. */
785 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
786 && !(access_flags & ACC_STATIC)
787 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
788 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
790 /* Notice that this is a finalizer and update the class type
791 accordingly. This is used to optimize instance allocation. */
792 if (name == finalize_identifier_node
793 && TREE_TYPE (function_type) == void_type_node
794 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
795 HAS_FINALIZER_P (this_class) = 1;
797 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
798 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
799 if (access_flags & ACC_PRIVATE)
800 METHOD_PRIVATE (fndecl) = 1;
801 if (access_flags & ACC_NATIVE)
803 METHOD_NATIVE (fndecl) = 1;
804 DECL_EXTERNAL (fndecl) = 1;
806 else
807 /* FNDECL is external unless we are compiling it into this object
808 file. */
809 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
810 if (access_flags & ACC_STATIC)
811 METHOD_STATIC (fndecl) = 1;
812 if (access_flags & ACC_FINAL)
813 METHOD_FINAL (fndecl) = 1;
814 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
815 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
816 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
817 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
818 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
819 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
820 return fndecl;
823 /* Add a method to THIS_CLASS.
824 The method's name is NAME.
825 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
827 tree
828 add_method (tree this_class, int access_flags, tree name, tree method_sig)
830 tree function_type, fndecl;
831 const unsigned char *sig
832 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
834 if (sig[0] != '(')
835 fatal_error ("bad method signature");
837 function_type = get_type_from_signature (method_sig);
838 fndecl = add_method_1 (this_class, access_flags, name, function_type);
839 set_java_signature (TREE_TYPE (fndecl), method_sig);
840 return fndecl;
843 tree
844 add_field (tree klass, tree name, tree field_type, int flags)
846 int is_static = (flags & ACC_STATIC) != 0;
847 tree field;
848 field = build_decl (input_location,
849 is_static ? VAR_DECL : FIELD_DECL, name, field_type);
850 DECL_CHAIN (field) = TYPE_FIELDS (klass);
851 TYPE_FIELDS (klass) = field;
852 DECL_CONTEXT (field) = klass;
853 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
855 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
856 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
857 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
858 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
859 if (flags & ACC_VOLATILE)
861 FIELD_VOLATILE (field) = 1;
862 TREE_THIS_VOLATILE (field) = 1;
864 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
865 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
866 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
867 if (is_static)
869 FIELD_STATIC (field) = 1;
870 /* Always make field externally visible. This is required so
871 that native methods can always access the field. */
872 TREE_PUBLIC (field) = 1;
873 /* Hide everything that shouldn't be visible outside a DSO. */
874 if (flag_indirect_classes
875 || (FIELD_PRIVATE (field)))
876 java_hide_decl (field);
877 /* Considered external unless we are compiling it into this
878 object file. */
879 DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2);
880 if (!DECL_EXTERNAL (field))
881 VEC_safe_push (tree, gc, pending_static_fields, field);
884 return field;
887 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
889 void
890 set_constant_value (tree field, tree constant)
892 if (field == NULL_TREE)
893 warning (OPT_Wattributes,
894 "misplaced ConstantValue attribute (not in any field)");
895 else if (DECL_INITIAL (field) != NULL_TREE)
896 warning (OPT_Wattributes,
897 "duplicate ConstantValue attribute for field '%s'",
898 IDENTIFIER_POINTER (DECL_NAME (field)));
899 else
901 DECL_INITIAL (field) = constant;
902 if (TREE_TYPE (constant) != TREE_TYPE (field)
903 && ! (TREE_TYPE (constant) == int_type_node
904 && INTEGRAL_TYPE_P (TREE_TYPE (field))
905 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
906 && ! (TREE_TYPE (constant) == utf8const_ptr_type
907 && TREE_TYPE (field) == string_ptr_type_node))
908 error ("ConstantValue attribute of field '%s' has wrong type",
909 IDENTIFIER_POINTER (DECL_NAME (field)));
913 /* Calculate a hash value for a string encoded in Utf8 format.
914 * This returns the same hash value as specified for java.lang.String.hashCode.
917 static int32
918 hashUtf8String (const char *str, int len)
920 const unsigned char* ptr = (const unsigned char*) str;
921 const unsigned char *limit = ptr + len;
922 int32 hash = 0;
923 for (; ptr < limit;)
925 int ch = UTF8_GET (ptr, limit);
926 /* Updated specification from
927 http://www.javasoft.com/docs/books/jls/clarify.html. */
928 hash = (31 * hash) + ch;
930 return hash;
933 tree
934 build_utf8_ref (tree name)
936 const char * name_ptr = IDENTIFIER_POINTER (name);
937 int name_len = IDENTIFIER_LENGTH (name), name_pad;
938 char buf[60];
939 tree ctype, field = NULL_TREE, str_type, cinit, string;
940 static int utf8_count = 0;
941 int name_hash;
942 tree ref = IDENTIFIER_UTF8_REF (name);
943 tree decl;
944 VEC(constructor_elt,gc) *v = NULL;
945 if (ref != NULL_TREE)
946 return ref;
948 ctype = make_node (RECORD_TYPE);
949 /* '\0' byte plus padding to utf8const_type's alignment. */
950 name_pad = TYPE_ALIGN_UNIT (utf8const_type)
951 - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
952 str_type = build_prim_array_type (unsigned_byte_type_node,
953 name_len + name_pad);
954 PUSH_FIELD (input_location, ctype, field, "hash", unsigned_short_type_node);
955 PUSH_FIELD (input_location,
956 ctype, field, "length", unsigned_short_type_node);
957 PUSH_FIELD (input_location, ctype, field, "data", str_type);
958 FINISH_RECORD (ctype);
959 START_RECORD_CONSTRUCTOR (v, ctype);
960 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
961 PUSH_FIELD_VALUE (v, "hash", build_int_cst (NULL_TREE, name_hash));
962 PUSH_FIELD_VALUE (v, "length", build_int_cst (NULL_TREE, name_len));
963 string = build_string (name_len, name_ptr);
964 TREE_TYPE (string) = str_type;
965 PUSH_FIELD_VALUE (v, "data", string);
966 FINISH_RECORD_CONSTRUCTOR (cinit, v, ctype);
967 TREE_CONSTANT (cinit) = 1;
969 /* Generate a unique-enough identifier. */
970 sprintf(buf, "_Utf%d", ++utf8_count);
972 decl = build_decl (input_location,
973 VAR_DECL, get_identifier (buf), utf8const_type);
974 TREE_STATIC (decl) = 1;
975 DECL_ARTIFICIAL (decl) = 1;
976 DECL_IGNORED_P (decl) = 1;
977 TREE_READONLY (decl) = 1;
978 TREE_THIS_VOLATILE (decl) = 0;
979 DECL_INITIAL (decl) = cinit;
980 DECL_USER_ALIGN (decl) = 1;
982 if (HAVE_GAS_SHF_MERGE)
984 int decl_size;
985 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
986 decl_size = name_len + 4 + name_pad;
987 if (flag_merge_constants && decl_size < 256)
989 char buf[32];
990 int flags = (SECTION_OVERRIDE
991 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
992 sprintf (buf, ".rodata.jutf8.%d", decl_size);
993 switch_to_section (get_section (buf, flags, NULL));
994 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
998 layout_decl (decl, 0);
999 DECL_SIZE (decl) = TYPE_SIZE (ctype);
1000 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (ctype);
1001 pushdecl (decl);
1002 rest_of_decl_compilation (decl, global_bindings_p (), 0);
1003 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
1004 IDENTIFIER_UTF8_REF (name) = ref;
1005 return ref;
1008 /* Like build_class_ref, but instead of a direct reference generate a
1009 pointer into the constant pool. */
1011 static tree
1012 build_indirect_class_ref (tree type)
1014 int index;
1015 tree cl;
1016 index = alloc_class_constant (type);
1017 cl = build_ref_from_constant_pool (index);
1018 return convert (promote_type (class_ptr_type), cl);
1021 static tree
1022 build_static_class_ref (tree type)
1024 tree decl_name, decl, ref;
1026 if (TYPE_SIZE (type) == error_mark_node)
1027 return null_pointer_node;
1028 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1029 "", '/', '/', ".class$$");
1030 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1031 if (decl == NULL_TREE)
1033 decl = build_decl (input_location, VAR_DECL, decl_name, class_type_node);
1034 TREE_STATIC (decl) = 1;
1035 if (! flag_indirect_classes)
1037 TREE_PUBLIC (decl) = 1;
1038 if (CLASS_PRIVATE (TYPE_NAME (type)))
1039 java_hide_decl (decl);
1041 DECL_IGNORED_P (decl) = 1;
1042 DECL_ARTIFICIAL (decl) = 1;
1043 if (is_compiled_class (type) == 1)
1044 DECL_EXTERNAL (decl) = 1;
1045 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1046 DECL_CLASS_FIELD_P (decl) = 1;
1047 DECL_CONTEXT (decl) = type;
1049 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1050 that that means not calling pushdecl_top_level. */
1051 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1054 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1055 return ref;
1058 static tree
1059 build_classdollar_field (tree type)
1061 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1062 "", '/', '/', ".class$");
1063 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1065 if (decl == NULL_TREE)
1067 decl
1068 = build_decl (input_location,
1069 VAR_DECL, decl_name,
1070 (build_type_variant
1071 (build_pointer_type
1072 (build_type_variant (class_type_node,
1073 /* const */ 1, 0)),
1074 /* const */ 1, 0)));
1075 TREE_STATIC (decl) = 1;
1076 TREE_CONSTANT (decl) = 1;
1077 TREE_READONLY (decl) = 1;
1078 TREE_PUBLIC (decl) = 1;
1079 java_hide_decl (decl);
1080 DECL_IGNORED_P (decl) = 1;
1081 DECL_ARTIFICIAL (decl) = 1;
1082 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1083 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1084 DECL_CLASS_FIELD_P (decl) = 1;
1085 DECL_CONTEXT (decl) = type;
1088 return decl;
1091 /* Create a local variable that holds the current class$. */
1093 void
1094 cache_this_class_ref (tree fndecl)
1096 if (optimize)
1098 tree classdollar_field;
1099 if (flag_indirect_classes)
1100 classdollar_field = build_classdollar_field (output_class);
1101 else
1102 classdollar_field = build_static_class_ref (output_class);
1104 this_classdollar = build_decl (input_location,
1105 VAR_DECL, NULL_TREE,
1106 TREE_TYPE (classdollar_field));
1108 java_add_local_var (this_classdollar);
1109 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1110 this_classdollar, classdollar_field));
1112 else
1113 this_classdollar = build_classdollar_field (output_class);
1115 /* Prepend class initialization for static methods reachable from
1116 other classes. */
1117 if (METHOD_STATIC (fndecl)
1118 && (! METHOD_PRIVATE (fndecl)
1119 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1120 && ! DECL_CLINIT_P (fndecl)
1121 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1123 tree init = build_call_expr (soft_initclass_node, 1,
1124 this_classdollar);
1125 java_add_stmt (init);
1129 /* Remove the reference to the local variable that holds the current
1130 class$. */
1132 void
1133 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1135 this_classdollar = build_classdollar_field (output_class);
1138 /* Build a reference to the class TYPE.
1139 Also handles primitive types and array types. */
1141 tree
1142 build_class_ref (tree type)
1144 int is_compiled = is_compiled_class (type);
1145 if (is_compiled)
1147 tree ref, decl;
1148 if (TREE_CODE (type) == POINTER_TYPE)
1149 type = TREE_TYPE (type);
1151 if (flag_indirect_dispatch
1152 && type != output_class
1153 && TREE_CODE (type) == RECORD_TYPE)
1154 return build_indirect_class_ref (type);
1156 if (type == output_class && flag_indirect_classes)
1158 /* This can be NULL if we see a JNI stub before we see any
1159 other method. */
1160 if (! this_classdollar)
1161 this_classdollar = build_classdollar_field (output_class);
1162 return this_classdollar;
1165 if (TREE_CODE (type) == RECORD_TYPE)
1166 return build_static_class_ref (type);
1167 else
1169 const char *name;
1170 tree decl_name;
1171 char buffer[25];
1172 decl_name = TYPE_NAME (type);
1173 if (TREE_CODE (decl_name) == TYPE_DECL)
1174 decl_name = DECL_NAME (decl_name);
1175 name = IDENTIFIER_POINTER (decl_name);
1176 if (strncmp (name, "promoted_", 9) == 0)
1177 name += 9;
1178 sprintf (buffer, "_Jv_%sClass", name);
1179 decl_name = get_identifier (buffer);
1180 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1181 if (decl == NULL_TREE)
1183 decl = build_decl (input_location,
1184 VAR_DECL, decl_name, class_type_node);
1185 TREE_STATIC (decl) = 1;
1186 TREE_PUBLIC (decl) = 1;
1187 DECL_EXTERNAL (decl) = 1;
1188 DECL_ARTIFICIAL (decl) = 1;
1189 pushdecl_top_level (decl);
1193 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1194 return ref;
1196 else
1197 return build_indirect_class_ref (type);
1200 /* Create a local statically allocated variable that will hold a
1201 pointer to a static field. */
1203 static tree
1204 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1206 tree decl, decl_name;
1207 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1208 char *buf = (char *) alloca (strlen (name) + 20);
1209 sprintf (buf, "%s_%d_ref", name, index);
1210 decl_name = get_identifier (buf);
1211 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1212 if (decl == NULL_TREE)
1214 decl = build_decl (input_location,
1215 VAR_DECL, decl_name, ptr_type_node);
1216 TREE_STATIC (decl) = 1;
1217 TREE_PUBLIC (decl) = 0;
1218 DECL_EXTERNAL (decl) = 0;
1219 DECL_ARTIFICIAL (decl) = 1;
1220 DECL_IGNORED_P (decl) = 1;
1221 pushdecl_top_level (decl);
1223 return decl;
1226 tree
1227 build_static_field_ref (tree fdecl)
1229 tree fclass = DECL_CONTEXT (fdecl);
1230 int is_compiled = is_compiled_class (fclass);
1232 /* Allow static final fields to fold to a constant. When using
1233 -findirect-dispatch, we simply never do this folding if compiling
1234 from .class; in the .class file constants will be referred to via
1235 the constant pool. */
1236 if (!flag_indirect_dispatch
1237 && (is_compiled
1238 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1239 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1240 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1241 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1243 if (is_compiled == 1)
1244 DECL_EXTERNAL (fdecl) = 1;
1246 else
1248 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1249 and a class local static variable CACHE_ENTRY, then
1251 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1252 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1253 : cache_entry)
1255 This can mostly be optimized away, so that the usual path is a
1256 load followed by a test and branch. _Jv_ResolvePoolEntry is
1257 only called once for each constant pool entry.
1259 There is an optimization that we don't do: at the start of a
1260 method, create a local copy of CACHE_ENTRY and use that instead.
1264 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1265 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1266 tree test
1267 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT), 2,
1268 build2 (EQ_EXPR, boolean_type_node,
1269 cache_entry, null_pointer_node),
1270 boolean_false_node);
1271 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1272 tree init
1273 = build_call_expr (soft_resolvepoolentry_node, 2,
1274 build_class_ref (output_class),
1275 cpool_index_cst);
1276 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1277 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1278 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1279 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1281 return fdecl;
1285 get_access_flags_from_decl (tree decl)
1287 int access_flags = 0;
1288 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1290 if (FIELD_STATIC (decl))
1291 access_flags |= ACC_STATIC;
1292 if (FIELD_PUBLIC (decl))
1293 access_flags |= ACC_PUBLIC;
1294 if (FIELD_PROTECTED (decl))
1295 access_flags |= ACC_PROTECTED;
1296 if (FIELD_PRIVATE (decl))
1297 access_flags |= ACC_PRIVATE;
1298 if (FIELD_FINAL (decl))
1299 access_flags |= ACC_FINAL;
1300 if (FIELD_VOLATILE (decl))
1301 access_flags |= ACC_VOLATILE;
1302 if (FIELD_TRANSIENT (decl))
1303 access_flags |= ACC_TRANSIENT;
1304 if (FIELD_ENUM (decl))
1305 access_flags |= ACC_ENUM;
1306 if (FIELD_SYNTHETIC (decl))
1307 access_flags |= ACC_SYNTHETIC;
1308 return access_flags;
1310 if (TREE_CODE (decl) == TYPE_DECL)
1312 if (CLASS_PUBLIC (decl))
1313 access_flags |= ACC_PUBLIC;
1314 if (CLASS_FINAL (decl))
1315 access_flags |= ACC_FINAL;
1316 if (CLASS_SUPER (decl))
1317 access_flags |= ACC_SUPER;
1318 if (CLASS_INTERFACE (decl))
1319 access_flags |= ACC_INTERFACE;
1320 if (CLASS_ABSTRACT (decl))
1321 access_flags |= ACC_ABSTRACT;
1322 if (CLASS_STATIC (decl))
1323 access_flags |= ACC_STATIC;
1324 if (CLASS_PRIVATE (decl))
1325 access_flags |= ACC_PRIVATE;
1326 if (CLASS_PROTECTED (decl))
1327 access_flags |= ACC_PROTECTED;
1328 if (CLASS_STRICTFP (decl))
1329 access_flags |= ACC_STRICT;
1330 if (CLASS_ENUM (decl))
1331 access_flags |= ACC_ENUM;
1332 if (CLASS_SYNTHETIC (decl))
1333 access_flags |= ACC_SYNTHETIC;
1334 if (CLASS_ANNOTATION (decl))
1335 access_flags |= ACC_ANNOTATION;
1336 return access_flags;
1338 if (TREE_CODE (decl) == FUNCTION_DECL)
1340 if (METHOD_PUBLIC (decl))
1341 access_flags |= ACC_PUBLIC;
1342 if (METHOD_PRIVATE (decl))
1343 access_flags |= ACC_PRIVATE;
1344 if (METHOD_PROTECTED (decl))
1345 access_flags |= ACC_PROTECTED;
1346 if (METHOD_STATIC (decl))
1347 access_flags |= ACC_STATIC;
1348 if (METHOD_FINAL (decl))
1349 access_flags |= ACC_FINAL;
1350 if (METHOD_SYNCHRONIZED (decl))
1351 access_flags |= ACC_SYNCHRONIZED;
1352 if (METHOD_NATIVE (decl))
1353 access_flags |= ACC_NATIVE;
1354 if (METHOD_ABSTRACT (decl))
1355 access_flags |= ACC_ABSTRACT;
1356 if (METHOD_STRICTFP (decl))
1357 access_flags |= ACC_STRICT;
1358 if (METHOD_INVISIBLE (decl))
1359 access_flags |= ACC_INVISIBLE;
1360 if (DECL_ARTIFICIAL (decl))
1361 access_flags |= ACC_SYNTHETIC;
1362 if (METHOD_BRIDGE (decl))
1363 access_flags |= ACC_BRIDGE;
1364 if (METHOD_VARARGS (decl))
1365 access_flags |= ACC_VARARGS;
1366 return access_flags;
1368 gcc_unreachable ();
1371 static GTY (()) int alias_labelno = 0;
1373 /* Create a private alias for METHOD. Using this alias instead of the method
1374 decl ensures that ncode entries in the method table point to the real function
1375 at runtime, not a PLT entry. */
1377 static tree
1378 make_local_function_alias (tree method)
1380 #ifdef ASM_OUTPUT_DEF
1381 tree alias;
1383 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1384 char *name = (char *) alloca (strlen (method_name) + 2);
1385 char *buf = (char *) alloca (strlen (method_name) + 128);
1387 /* Only create aliases for local functions. */
1388 if (DECL_EXTERNAL (method))
1389 return method;
1391 /* Prefix method_name with 'L' for the alias label. */
1392 *name = 'L';
1393 strcpy (name + 1, method_name);
1395 targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);
1396 alias = build_decl (input_location,
1397 FUNCTION_DECL, get_identifier (buf),
1398 TREE_TYPE (method));
1399 DECL_CONTEXT (alias) = NULL;
1400 TREE_READONLY (alias) = TREE_READONLY (method);
1401 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1402 TREE_PUBLIC (alias) = 0;
1403 DECL_EXTERNAL (alias) = 0;
1404 DECL_ARTIFICIAL (alias) = 1;
1405 DECL_INITIAL (alias) = error_mark_node;
1406 TREE_ADDRESSABLE (alias) = 1;
1407 TREE_USED (alias) = 1;
1408 if (!flag_syntax_only)
1409 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1410 return alias;
1411 #else
1412 return method;
1413 #endif
1416 /** Make reflection data (_Jv_Field) for field FDECL. */
1418 static tree
1419 make_field_value (tree fdecl)
1421 tree finit;
1422 int flags;
1423 tree type = TREE_TYPE (fdecl);
1424 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1425 VEC(constructor_elt,gc) *v = NULL;
1427 START_RECORD_CONSTRUCTOR (v, field_type_node);
1428 PUSH_FIELD_VALUE (v, "name", build_utf8_ref (DECL_NAME (fdecl)));
1429 if (resolved)
1430 type = build_class_ref (type);
1431 else
1433 tree signature = build_java_signature (type);
1435 type = build_utf8_ref (unmangle_classname
1436 (IDENTIFIER_POINTER (signature),
1437 IDENTIFIER_LENGTH (signature)));
1439 PUSH_FIELD_VALUE (v, "type", type);
1441 flags = get_access_flags_from_decl (fdecl);
1442 if (! resolved)
1443 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1445 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, flags));
1446 PUSH_FIELD_VALUE (v, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1449 tree field_address = integer_zero_node;
1450 tree index, value;
1451 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1452 && FIELD_STATIC (fdecl))
1453 field_address = build_address_of (fdecl);
1455 index = (FIELD_STATIC (fdecl)
1456 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node))
1457 : TYPE_FIELDS (field_info_union_node));
1458 value = (FIELD_STATIC (fdecl)
1459 ? field_address
1460 : byte_position (fdecl));
1462 PUSH_FIELD_VALUE
1463 (v, "info",
1464 build_constructor_single (field_info_union_node, index, value));
1467 FINISH_RECORD_CONSTRUCTOR (finit, v, field_type_node);
1468 return finit;
1471 /** Make reflection data (_Jv_Method) for method MDECL. */
1473 static tree
1474 make_method_value (tree mdecl)
1476 static int method_name_count = 0;
1477 tree minit;
1478 tree index;
1479 tree code;
1480 tree class_decl;
1481 #define ACC_TRANSLATED 0x4000
1482 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1483 VEC(constructor_elt,gc) *v = NULL;
1485 class_decl = DECL_CONTEXT (mdecl);
1486 /* For interfaces, the index field contains the dispatch index. */
1487 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1488 index = build_int_cst (NULL_TREE,
1489 get_interface_method_index (mdecl, class_decl));
1490 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1491 index = get_method_index (mdecl);
1492 else
1493 index = integer_minus_one_node;
1495 code = null_pointer_node;
1496 if (METHOD_ABSTRACT (mdecl))
1497 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1498 soft_abstractmethod_node);
1499 else
1500 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1501 make_local_function_alias (mdecl));
1502 START_RECORD_CONSTRUCTOR (v, method_type_node);
1503 PUSH_FIELD_VALUE (v, "name",
1504 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1505 init_identifier_node
1506 : DECL_NAME (mdecl)));
1508 tree signature = build_java_signature (TREE_TYPE (mdecl));
1509 PUSH_FIELD_VALUE (v, "signature",
1510 (build_utf8_ref
1511 (unmangle_classname
1512 (IDENTIFIER_POINTER(signature),
1513 IDENTIFIER_LENGTH(signature)))));
1515 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, accflags));
1516 PUSH_FIELD_VALUE (v, "index", index);
1517 PUSH_FIELD_VALUE (v, "ncode", code);
1520 /* Compute the `throws' information for the method. */
1521 tree table = null_pointer_node;
1523 if (!VEC_empty (tree, DECL_FUNCTION_THROWS (mdecl)))
1525 int length = 1 + VEC_length (tree, DECL_FUNCTION_THROWS (mdecl));
1526 tree t, type, array;
1527 char buf[60];
1528 VEC(constructor_elt,gc) *v = NULL;
1529 int idx = length - 1;
1530 unsigned ix;
1531 constructor_elt *e;
1533 v = VEC_alloc (constructor_elt, gc, length);
1534 VEC_safe_grow_cleared (constructor_elt, gc, v, length);
1536 e = VEC_index (constructor_elt, v, idx--);
1537 e->value = null_pointer_node;
1539 FOR_EACH_VEC_ELT (tree, DECL_FUNCTION_THROWS (mdecl), ix, t)
1541 tree sig = DECL_NAME (TYPE_NAME (t));
1542 tree utf8
1543 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1544 IDENTIFIER_LENGTH (sig)));
1545 e = VEC_index (constructor_elt, v, idx--);
1546 e->value = utf8;
1548 gcc_assert (idx == -1);
1549 type = build_prim_array_type (ptr_type_node, length);
1550 table = build_constructor (type, v);
1551 /* Compute something unique enough. */
1552 sprintf (buf, "_methods%d", method_name_count++);
1553 array = build_decl (input_location,
1554 VAR_DECL, get_identifier (buf), type);
1555 DECL_INITIAL (array) = table;
1556 TREE_STATIC (array) = 1;
1557 DECL_ARTIFICIAL (array) = 1;
1558 DECL_IGNORED_P (array) = 1;
1559 rest_of_decl_compilation (array, 1, 0);
1561 table = build1 (ADDR_EXPR, ptr_type_node, array);
1564 PUSH_FIELD_VALUE (v, "throws", table);
1567 FINISH_RECORD_CONSTRUCTOR (minit, v, method_type_node);
1568 return minit;
1571 static tree
1572 get_dispatch_vector (tree type)
1574 tree vtable = TYPE_VTABLE (type);
1576 if (vtable == NULL_TREE)
1578 HOST_WIDE_INT i;
1579 tree method;
1580 tree super = CLASSTYPE_SUPER (type);
1581 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1582 vtable = make_tree_vec (nvirtuals);
1583 TYPE_VTABLE (type) = vtable;
1584 if (super != NULL_TREE)
1586 tree super_vtable = get_dispatch_vector (super);
1588 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1589 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1592 for (method = TYPE_METHODS (type); method != NULL_TREE;
1593 method = DECL_CHAIN (method))
1595 tree method_index = get_method_index (method);
1596 if (method_index != NULL_TREE
1597 && host_integerp (method_index, 0))
1598 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1602 return vtable;
1605 static tree
1606 get_dispatch_table (tree type, tree this_class_addr)
1608 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1609 tree vtable = get_dispatch_vector (type);
1610 int i, j;
1611 int nvirtuals = TREE_VEC_LENGTH (vtable);
1612 int arraysize;
1613 tree gc_descr;
1614 VEC(constructor_elt,gc) *v = NULL;
1615 constructor_elt *e;
1616 tree arraytype;
1618 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1619 if (TARGET_VTABLE_USES_DESCRIPTORS)
1620 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1621 arraysize += 2;
1623 VEC_safe_grow_cleared (constructor_elt, gc, v, arraysize);
1624 e = VEC_index (constructor_elt, v, arraysize - 1);
1626 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1627 for (i = nvirtuals; --i >= 0; )
1629 tree method = TREE_VEC_ELT (vtable, i);
1630 if (METHOD_ABSTRACT (method))
1632 if (! abstract_p)
1633 warning_at (DECL_SOURCE_LOCATION (method), 0,
1634 "abstract method in non-abstract class");
1636 if (TARGET_VTABLE_USES_DESCRIPTORS)
1637 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1638 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1639 else
1640 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1642 else
1644 if (TARGET_VTABLE_USES_DESCRIPTORS)
1645 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1647 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1648 method, build_int_cst (NULL_TREE, j));
1649 TREE_CONSTANT (fdesc) = 1;
1650 CONSTRUCTOR_PREPEND_VALUE (e, fdesc);
1652 else
1653 CONSTRUCTOR_PREPEND_VALUE (e,
1654 build1 (ADDR_EXPR,
1655 nativecode_ptr_type_node,
1656 method));
1660 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1661 using the Boehm GC we sometimes stash a GC type descriptor
1662 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1663 the emitted byte count during the output to the assembly file. */
1664 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1665 fake "function descriptor". It's first word is the is the class
1666 pointer, and subsequent words (usually one) contain the GC descriptor.
1667 In all other cases, we reserve two extra vtable slots. */
1668 gc_descr = get_boehm_type_descriptor (type);
1669 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1670 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1671 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1672 CONSTRUCTOR_PREPEND_VALUE (e, this_class_addr);
1674 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1675 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1676 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1677 gcc_assert (e == VEC_address (constructor_elt, v));
1678 e->index = integer_zero_node;
1679 e->value = null_pointer_node;
1680 #undef CONSTRUCTOR_PREPEND_VALUE
1682 arraytype = build_prim_array_type (nativecode_ptr_type_node, arraysize);
1683 return build_constructor (arraytype, v);
1687 /* Set the method_index for a method decl. */
1688 void
1689 set_method_index (tree decl, tree method_index)
1691 if (method_index != NULL_TREE)
1693 /* method_index is null if we're using indirect dispatch. */
1694 method_index = fold (convert (sizetype, method_index));
1696 if (TARGET_VTABLE_USES_DESCRIPTORS)
1697 /* Add one to skip bogus descriptor for class and GC descriptor. */
1698 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1699 else
1700 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1701 descriptor. */
1702 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1705 DECL_VINDEX (decl) = method_index;
1708 /* Get the method_index for a method decl. */
1709 tree
1710 get_method_index (tree decl)
1712 tree method_index = DECL_VINDEX (decl);
1714 if (! method_index)
1715 return NULL;
1717 if (TARGET_VTABLE_USES_DESCRIPTORS)
1718 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1719 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1720 else
1721 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1722 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1724 return method_index;
1727 static int
1728 supers_all_compiled (tree type)
1730 while (type != NULL_TREE)
1732 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1733 return 0;
1734 type = CLASSTYPE_SUPER (type);
1736 return 1;
1739 static void
1740 add_table_and_syms (VEC(constructor_elt,gc) **v,
1741 VEC(method_entry,gc) *methods,
1742 const char *table_name, tree table_slot, tree table_type,
1743 const char *syms_name, tree syms_slot)
1745 if (methods == NULL)
1747 PUSH_FIELD_VALUE (*v, table_name, null_pointer_node);
1748 PUSH_FIELD_VALUE (*v, syms_name, null_pointer_node);
1750 else
1752 pushdecl_top_level (syms_slot);
1753 PUSH_FIELD_VALUE (*v, table_name,
1754 build1 (ADDR_EXPR, table_type, table_slot));
1755 PUSH_FIELD_VALUE (*v, syms_name,
1756 build1 (ADDR_EXPR, symbols_array_ptr_type,
1757 syms_slot));
1758 TREE_CONSTANT (table_slot) = 1;
1762 void
1763 make_class_data (tree type)
1765 tree decl, cons, temp;
1766 tree field, fields_decl;
1767 HOST_WIDE_INT static_field_count = 0;
1768 HOST_WIDE_INT instance_field_count = 0;
1769 HOST_WIDE_INT field_count;
1770 tree field_array_type;
1771 tree method;
1772 tree dtable_decl = NULL_TREE;
1773 HOST_WIDE_INT method_count = 0;
1774 tree method_array_type;
1775 tree methods_decl;
1776 tree super;
1777 tree this_class_addr;
1778 tree constant_pool_constructor;
1779 tree interfaces = null_pointer_node;
1780 int interface_len = 0;
1781 int uses_jv_markobj = 0;
1782 tree type_decl = TYPE_NAME (type);
1783 tree id_main = get_identifier("main");
1784 tree id_class = get_identifier("java.lang.Class");
1785 /** Offset from start of virtual function table declaration
1786 to where objects actually point at, following new g++ ABI. */
1787 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1788 VEC(int, heap) *field_indexes;
1789 tree first_real_field;
1790 VEC(constructor_elt,gc) *v1 = NULL, *v2 = NULL;
1791 tree reflection_data;
1792 VEC(constructor_elt,gc) *static_fields = NULL;
1793 VEC(constructor_elt,gc) *instance_fields = NULL;
1794 VEC(constructor_elt,gc) *methods = NULL;
1796 this_class_addr = build_static_class_ref (type);
1797 decl = TREE_OPERAND (this_class_addr, 0);
1799 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1800 && !flag_indirect_dispatch)
1802 tree dtable = get_dispatch_table (type, this_class_addr);
1803 uses_jv_markobj = uses_jv_markobj_p (dtable);
1804 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1806 /* We've already created some other class, and consequently
1807 we made class_dtable_decl. Now we just want to fill it
1808 in. */
1809 dtable_decl = class_dtable_decl;
1811 else
1813 dtable_decl = build_dtable_decl (type);
1814 TREE_STATIC (dtable_decl) = 1;
1815 DECL_ARTIFICIAL (dtable_decl) = 1;
1816 DECL_IGNORED_P (dtable_decl) = 1;
1819 TREE_PUBLIC (dtable_decl) = 1;
1820 DECL_INITIAL (dtable_decl) = dtable;
1821 /* The only dispatch table exported from a DSO is the dispatch
1822 table for java.lang.Class. */
1823 if (DECL_NAME (type_decl) != id_class)
1824 java_hide_decl (dtable_decl);
1825 if (! flag_indirect_classes)
1826 rest_of_decl_compilation (dtable_decl, 1, 0);
1827 /* Maybe we're compiling Class as the first class. If so, set
1828 class_dtable_decl to the decl we just made. */
1829 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1830 class_dtable_decl = dtable_decl;
1833 /* Build Field array. */
1834 field = TYPE_FIELDS (type);
1835 while (field && DECL_ARTIFICIAL (field))
1836 field = DECL_CHAIN (field); /* Skip dummy fields. */
1837 if (field && DECL_NAME (field) == NULL_TREE)
1838 field = DECL_CHAIN (field); /* Skip dummy field for inherited data. */
1839 first_real_field = field;
1841 /* First count static and instance fields. */
1842 for ( ; field != NULL_TREE; field = DECL_CHAIN (field))
1844 if (! DECL_ARTIFICIAL (field))
1846 if (FIELD_STATIC (field))
1847 static_field_count++;
1848 else if (uses_jv_markobj || !flag_reduced_reflection)
1849 instance_field_count++;
1852 field_count = static_field_count + instance_field_count;
1853 field_indexes = VEC_alloc (int, heap, field_count);
1855 /* gcj sorts fields so that static fields come first, followed by
1856 instance fields. Unfortunately, by the time this takes place we
1857 have already generated the reflection_data for this class, and
1858 that data contains indexes into the fields. So, we generate a
1859 permutation that maps each original field index to its final
1860 position. Then we pass this permutation to
1861 rewrite_reflection_indexes(), which fixes up the reflection
1862 data. */
1864 int i;
1865 int static_count = 0;
1866 int instance_count = static_field_count;
1867 int field_index;
1869 for (i = 0, field = first_real_field;
1870 field != NULL_TREE;
1871 field = DECL_CHAIN (field), i++)
1873 if (! DECL_ARTIFICIAL (field))
1875 field_index = 0;
1876 if (FIELD_STATIC (field))
1877 field_index = static_count++;
1878 else if (uses_jv_markobj || !flag_reduced_reflection)
1879 field_index = instance_count++;
1880 else
1881 continue;
1882 VEC_quick_push (int, field_indexes, field_index);
1887 for (field = first_real_field; field != NULL_TREE;
1888 field = DECL_CHAIN (field))
1890 if (! DECL_ARTIFICIAL (field))
1892 if (FIELD_STATIC (field))
1894 /* We must always create reflection data for static fields
1895 as it is used in the creation of the field itself. */
1896 tree init = make_field_value (field);
1897 tree initial = DECL_INITIAL (field);
1898 CONSTRUCTOR_APPEND_ELT (static_fields, NULL_TREE, init);
1899 /* If the initial value is a string constant,
1900 prevent output_constant from trying to assemble the value. */
1901 if (initial != NULL_TREE
1902 && TREE_TYPE (initial) == string_ptr_type_node)
1903 DECL_INITIAL (field) = NULL_TREE;
1904 rest_of_decl_compilation (field, 1, 1);
1905 DECL_INITIAL (field) = initial;
1907 else if (uses_jv_markobj || !flag_reduced_reflection)
1909 tree init = make_field_value (field);
1910 CONSTRUCTOR_APPEND_ELT (instance_fields, NULL_TREE, init);
1915 gcc_assert (static_field_count
1916 == (int) VEC_length (constructor_elt, static_fields));
1917 gcc_assert (instance_field_count
1918 == (int) VEC_length (constructor_elt, instance_fields));
1920 if (field_count > 0)
1922 VEC_safe_splice (constructor_elt, gc, static_fields, instance_fields);
1923 field_array_type = build_prim_array_type (field_type_node, field_count);
1924 fields_decl = build_decl (input_location,
1925 VAR_DECL, mangled_classname ("_FL_", type),
1926 field_array_type);
1927 DECL_INITIAL (fields_decl)
1928 = build_constructor (field_array_type, static_fields);
1929 TREE_STATIC (fields_decl) = 1;
1930 DECL_ARTIFICIAL (fields_decl) = 1;
1931 DECL_IGNORED_P (fields_decl) = 1;
1932 rest_of_decl_compilation (fields_decl, 1, 0);
1934 else
1935 fields_decl = NULL_TREE;
1937 /* Build Method array. */
1938 for (method = TYPE_METHODS (type);
1939 method != NULL_TREE; method = DECL_CHAIN (method))
1941 tree init;
1942 if (METHOD_PRIVATE (method)
1943 && ! flag_keep_inline_functions
1944 && optimize)
1945 continue;
1946 /* Even if we have a decl, we don't necessarily have the code.
1947 This can happen if we inherit a method from a superclass for
1948 which we don't have a .class file. */
1949 if (METHOD_DUMMY (method))
1950 continue;
1952 /* Generate method reflection data if:
1954 - !flag_reduced_reflection.
1956 - <clinit> -- The runtime uses reflection to initialize the
1957 class.
1959 - Any method in class java.lang.Class -- Class.forName() and
1960 perhaps other things require it.
1962 - class$ -- It does not work if reflection data missing.
1964 - main -- Reflection is used to find main(String[]) methods.
1966 - public not static -- It is potentially part of an
1967 interface. The runtime uses reflection data to build
1968 interface dispatch tables. */
1969 if (!flag_reduced_reflection
1970 || DECL_CLINIT_P (method)
1971 || DECL_NAME (type_decl) == id_class
1972 || DECL_NAME (method) == id_main
1973 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
1975 init = make_method_value (method);
1976 method_count++;
1977 CONSTRUCTOR_APPEND_ELT (methods, NULL_TREE, init);
1980 method_array_type = build_prim_array_type (method_type_node, method_count);
1981 methods_decl = build_decl (input_location,
1982 VAR_DECL, mangled_classname ("_MT_", type),
1983 method_array_type);
1984 DECL_INITIAL (methods_decl) = build_constructor (method_array_type, methods);
1985 TREE_STATIC (methods_decl) = 1;
1986 DECL_ARTIFICIAL (methods_decl) = 1;
1987 DECL_IGNORED_P (methods_decl) = 1;
1988 rest_of_decl_compilation (methods_decl, 1, 0);
1990 if (class_dtable_decl == NULL_TREE)
1992 class_dtable_decl = build_dtable_decl (class_type_node);
1993 TREE_STATIC (class_dtable_decl) = 1;
1994 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1995 DECL_IGNORED_P (class_dtable_decl) = 1;
1996 if (is_compiled_class (class_type_node) != 2)
1998 DECL_EXTERNAL (class_dtable_decl) = 1;
1999 rest_of_decl_compilation (class_dtable_decl, 1, 0);
2003 super = CLASSTYPE_SUPER (type);
2004 if (super == NULL_TREE)
2005 super = null_pointer_node;
2006 else if (! flag_indirect_dispatch
2007 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
2008 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
2009 super = build_class_ref (super);
2010 else
2012 int super_index = alloc_class_constant (super);
2013 super = build_int_cst (ptr_type_node, super_index);
2016 /* Build and emit the array of implemented interfaces. */
2017 if (type != object_type_node)
2018 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
2020 if (interface_len > 0)
2022 int i;
2023 tree interface_array_type, idecl;
2024 VEC(constructor_elt,gc) *init = VEC_alloc (constructor_elt, gc,
2025 interface_len);
2026 interface_array_type
2027 = build_prim_array_type (class_ptr_type, interface_len);
2028 idecl = build_decl (input_location,
2029 VAR_DECL, mangled_classname ("_IF_", type),
2030 interface_array_type);
2032 for (i = 1; i <= interface_len; i++)
2034 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
2035 tree iclass = BINFO_TYPE (child);
2036 tree index;
2037 if (! flag_indirect_dispatch
2038 && (assume_compiled
2039 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
2040 index = build_class_ref (iclass);
2041 else
2043 int int_index = alloc_class_constant (iclass);
2044 index = build_int_cst (ptr_type_node, int_index);
2046 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, index);
2048 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
2049 TREE_STATIC (idecl) = 1;
2050 DECL_ARTIFICIAL (idecl) = 1;
2051 DECL_IGNORED_P (idecl) = 1;
2052 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
2053 rest_of_decl_compilation (idecl, 1, 0);
2056 constant_pool_constructor = build_constants_constructor ();
2058 if (flag_indirect_dispatch)
2060 TYPE_OTABLE_DECL (type)
2061 = emit_symbol_table
2062 (DECL_NAME (TYPE_OTABLE_DECL (type)),
2063 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
2064 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
2066 TYPE_ATABLE_DECL (type)
2067 = emit_symbol_table
2068 (DECL_NAME (TYPE_ATABLE_DECL (type)),
2069 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
2070 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
2072 TYPE_ITABLE_DECL (type)
2073 = emit_symbol_table
2074 (DECL_NAME (TYPE_ITABLE_DECL (type)),
2075 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
2076 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
2079 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
2081 START_RECORD_CONSTRUCTOR (v1, object_type_node);
2082 PUSH_FIELD_VALUE (v1, "vtable",
2083 (flag_indirect_classes
2084 ? null_pointer_node
2085 : fold_build_pointer_plus
2086 (build1 (ADDR_EXPR, dtable_ptr_type,
2087 class_dtable_decl),
2088 dtable_start_offset)));
2089 if (! flag_hash_synchronization)
2090 PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
2091 FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
2092 START_RECORD_CONSTRUCTOR (v2, class_type_node);
2093 PUSH_SUPER_VALUE (v2, temp);
2094 PUSH_FIELD_VALUE (v2, "next_or_version", gcj_abi_version);
2095 PUSH_FIELD_VALUE (v2, "name", build_utf8_ref (DECL_NAME (type_decl)));
2096 PUSH_FIELD_VALUE (v2, "accflags",
2097 build_int_cst (NULL_TREE,
2098 get_access_flags_from_decl (type_decl)));
2100 PUSH_FIELD_VALUE (v2, "superclass",
2101 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
2102 PUSH_FIELD_VALUE (v2, "constants", constant_pool_constructor);
2103 PUSH_FIELD_VALUE (v2, "methods",
2104 methods_decl == NULL_TREE ? null_pointer_node
2105 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
2106 PUSH_FIELD_VALUE (v2, "method_count",
2107 build_int_cst (NULL_TREE, method_count));
2109 PUSH_FIELD_VALUE (v2, "vtable_method_count",
2110 (flag_indirect_dispatch
2111 ? integer_minus_one_node
2112 : TYPE_NVIRTUALS (type)));
2114 PUSH_FIELD_VALUE (v2, "fields",
2115 fields_decl == NULL_TREE ? null_pointer_node
2116 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2117 /* If we're using the binary compatibility ABI we don't know the
2118 size until load time. */
2119 PUSH_FIELD_VALUE (v2, "size_in_bytes",
2120 (flag_indirect_dispatch
2121 ? integer_minus_one_node
2122 : size_in_bytes (type)));
2123 PUSH_FIELD_VALUE (v2, "field_count",
2124 build_int_cst (NULL_TREE, field_count));
2125 PUSH_FIELD_VALUE (v2, "static_field_count",
2126 build_int_cst (NULL_TREE, static_field_count));
2128 PUSH_FIELD_VALUE (v2, "vtable",
2129 (flag_indirect_dispatch || dtable_decl == NULL_TREE
2130 ? null_pointer_node
2131 : fold_build_pointer_plus
2132 (build1 (ADDR_EXPR, dtable_ptr_type,
2133 dtable_decl),
2134 dtable_start_offset)));
2135 add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
2136 "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
2137 "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
2138 add_table_and_syms (&v2, TYPE_ATABLE_METHODS (type),
2139 "atable", TYPE_ATABLE_DECL (type), atable_ptr_type,
2140 "atable_syms", TYPE_ATABLE_SYMS_DECL (type));
2141 add_table_and_syms (&v2, TYPE_ITABLE_METHODS (type),
2142 "itable", TYPE_ITABLE_DECL (type), itable_ptr_type,
2143 "itable_syms", TYPE_ITABLE_SYMS_DECL (type));
2145 PUSH_FIELD_VALUE (v2, "catch_classes",
2146 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2147 PUSH_FIELD_VALUE (v2, "interfaces", interfaces);
2148 PUSH_FIELD_VALUE (v2, "loader", null_pointer_node);
2149 PUSH_FIELD_VALUE (v2, "interface_count",
2150 build_int_cst (NULL_TREE, interface_len));
2151 PUSH_FIELD_VALUE (v2, "state",
2152 convert (byte_type_node,
2153 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2155 PUSH_FIELD_VALUE (v2, "thread", null_pointer_node);
2156 PUSH_FIELD_VALUE (v2, "depth", integer_zero_node);
2157 PUSH_FIELD_VALUE (v2, "ancestors", null_pointer_node);
2158 PUSH_FIELD_VALUE (v2, "idt", null_pointer_node);
2159 PUSH_FIELD_VALUE (v2, "arrayclass", null_pointer_node);
2160 PUSH_FIELD_VALUE (v2, "protectionDomain", null_pointer_node);
2163 tree assertion_table_ref;
2164 if (TYPE_ASSERTIONS (type) == NULL)
2165 assertion_table_ref = null_pointer_node;
2166 else
2167 assertion_table_ref = build1 (ADDR_EXPR,
2168 build_pointer_type (assertion_table_type),
2169 emit_assertion_table (type));
2171 PUSH_FIELD_VALUE (v2, "assertion_table", assertion_table_ref);
2174 PUSH_FIELD_VALUE (v2, "hack_signers", null_pointer_node);
2175 PUSH_FIELD_VALUE (v2, "chain", null_pointer_node);
2176 PUSH_FIELD_VALUE (v2, "aux_info", null_pointer_node);
2177 PUSH_FIELD_VALUE (v2, "engine", null_pointer_node);
2179 if (TYPE_REFLECTION_DATA (current_class))
2181 int i;
2182 int count = TYPE_REFLECTION_DATASIZE (current_class);
2183 VEC (constructor_elt, gc) *v
2184 = VEC_alloc (constructor_elt, gc, count);
2185 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2186 tree max_index = build_int_cst (sizetype, count);
2187 tree index = build_index_type (max_index);
2188 tree type = build_array_type (unsigned_byte_type_node, index);
2189 char buf[64];
2190 tree array;
2191 static int reflection_data_count;
2193 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2194 array = build_decl (input_location,
2195 VAR_DECL, get_identifier (buf), type);
2197 rewrite_reflection_indexes (field_indexes);
2199 for (i = 0; i < count; i++)
2201 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2202 elt->index = build_int_cst (sizetype, i);
2203 elt->value = build_int_cstu (byte_type_node, data[i]);
2206 DECL_INITIAL (array) = build_constructor (type, v);
2207 TREE_STATIC (array) = 1;
2208 DECL_ARTIFICIAL (array) = 1;
2209 DECL_IGNORED_P (array) = 1;
2210 TREE_READONLY (array) = 1;
2211 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2212 rest_of_decl_compilation (array, 1, 0);
2214 reflection_data = build_address_of (array);
2216 free (data);
2217 TYPE_REFLECTION_DATA (current_class) = NULL;
2219 else
2220 reflection_data = null_pointer_node;
2222 PUSH_FIELD_VALUE (v2, "reflection_data", reflection_data);
2223 FINISH_RECORD_CONSTRUCTOR (cons, v2, class_type_node);
2225 DECL_INITIAL (decl) = cons;
2227 /* Hash synchronization requires at least 64-bit alignment. */
2228 if (flag_hash_synchronization && POINTER_SIZE < 64)
2229 DECL_ALIGN (decl) = 64;
2231 if (flag_indirect_classes)
2233 TREE_READONLY (decl) = 1;
2234 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2237 rest_of_decl_compilation (decl, 1, 0);
2240 tree classdollar_field = build_classdollar_field (type);
2241 if (!flag_indirect_classes)
2242 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2243 rest_of_decl_compilation (classdollar_field, 1, 0);
2246 TYPE_OTABLE_DECL (type) = NULL_TREE;
2247 TYPE_ATABLE_DECL (type) = NULL_TREE;
2248 TYPE_CTABLE_DECL (type) = NULL_TREE;
2251 void
2252 finish_class (void)
2254 java_expand_catch_classes (current_class);
2256 current_function_decl = NULL_TREE;
2257 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2258 make_class_data (current_class);
2259 register_class ();
2260 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2263 /* Return 2 if KLASS is compiled by this compilation job;
2264 return 1 if KLASS can otherwise be assumed to be compiled;
2265 return 0 if we cannot assume that KLASS is compiled.
2266 Returns 1 for primitive and 0 for array types. */
2268 is_compiled_class (tree klass)
2270 int seen_in_zip;
2271 if (TREE_CODE (klass) == POINTER_TYPE)
2272 klass = TREE_TYPE (klass);
2273 if (TREE_CODE (klass) != RECORD_TYPE) /* Primitive types are static. */
2274 return 1;
2275 if (TYPE_ARRAY_P (klass))
2276 return 0;
2278 seen_in_zip = (TYPE_JCF (klass) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass)));
2279 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass))
2281 /* The class was seen in the current ZIP file and will be
2282 available as a compiled class in the future but may not have
2283 been loaded already. Load it if necessary. This prevent
2284 build_class_ref () from crashing. */
2286 if (seen_in_zip && !CLASS_LOADED_P (klass) && (klass != current_class))
2287 load_class (klass, 1);
2289 /* We return 2 for class seen in ZIP and class from files
2290 belonging to the same compilation unit */
2291 return 2;
2294 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass)))))
2296 if (!CLASS_LOADED_P (klass))
2298 if (klass != current_class)
2299 load_class (klass, 1);
2301 return 1;
2304 return 0;
2307 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2309 tree
2310 build_dtable_decl (tree type)
2312 tree dtype, decl;
2314 /* We need to build a new dtable type so that its size is uniquely
2315 computed when we're dealing with the class for real and not just
2316 faking it (like java.lang.Class during the initialization of the
2317 compiler.) We know we're not faking a class when CURRENT_CLASS is
2318 TYPE. */
2319 if (current_class == type)
2321 tree dummy = NULL_TREE;
2322 int n;
2324 dtype = make_node (RECORD_TYPE);
2326 PUSH_FIELD (input_location, dtype, dummy, "top_offset", ptr_type_node);
2327 PUSH_FIELD (input_location, dtype, dummy, "type_info", ptr_type_node);
2329 PUSH_FIELD (input_location, dtype, dummy, "class", class_ptr_type);
2330 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2332 tree tmp_field = build_decl (input_location,
2333 FIELD_DECL, NULL_TREE, ptr_type_node);
2334 TREE_CHAIN (dummy) = tmp_field;
2335 DECL_CONTEXT (tmp_field) = dtype;
2336 DECL_ARTIFICIAL (tmp_field) = 1;
2337 dummy = tmp_field;
2340 PUSH_FIELD (input_location, dtype, dummy, "gc_descr", ptr_type_node);
2341 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2343 tree tmp_field = build_decl (input_location,
2344 FIELD_DECL, NULL_TREE, ptr_type_node);
2345 TREE_CHAIN (dummy) = tmp_field;
2346 DECL_CONTEXT (tmp_field) = dtype;
2347 DECL_ARTIFICIAL (tmp_field) = 1;
2348 dummy = tmp_field;
2351 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2352 if (TARGET_VTABLE_USES_DESCRIPTORS)
2353 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2355 PUSH_FIELD (input_location, dtype, dummy, "methods",
2356 build_prim_array_type (nativecode_ptr_type_node, n));
2357 layout_type (dtype);
2359 else
2360 dtype = dtable_type;
2362 decl = build_decl (input_location,
2363 VAR_DECL, get_identifier ("vt$"), dtype);
2364 DECL_CONTEXT (decl) = type;
2365 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2366 DECL_VTABLE_P (decl) = 1;
2368 return decl;
2371 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2372 fields inherited from SUPER_CLASS. */
2374 void
2375 push_super_field (tree this_class, tree super_class)
2377 tree base_decl;
2378 /* Don't insert the field if we're just re-laying the class out. */
2379 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2380 return;
2381 base_decl = build_decl (input_location,
2382 FIELD_DECL, NULL_TREE, super_class);
2383 DECL_IGNORED_P (base_decl) = 1;
2384 DECL_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2385 TYPE_FIELDS (this_class) = base_decl;
2386 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2387 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2390 /* Handle the different manners we may have to lay out a super class. */
2392 static tree
2393 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2395 if (!super_class)
2396 return NULL_TREE;
2397 else if (TREE_CODE (super_class) == RECORD_TYPE)
2399 if (!CLASS_LOADED_P (super_class))
2400 load_class (super_class, 1);
2402 /* We might have to layout the class before its dependency on
2403 the super class gets resolved by java_complete_class */
2404 else if (TREE_CODE (super_class) == POINTER_TYPE)
2406 if (TREE_TYPE (super_class) != NULL_TREE)
2407 super_class = TREE_TYPE (super_class);
2408 else
2409 gcc_unreachable ();
2411 if (!TYPE_SIZE (super_class))
2412 safe_layout_class (super_class);
2414 return super_class;
2417 /* safe_layout_class just makes sure that we can load a class without
2418 disrupting the current_class, input_file, input_line, etc, information
2419 about the class processed currently. */
2421 void
2422 safe_layout_class (tree klass)
2424 tree save_current_class = current_class;
2425 location_t save_location = input_location;
2427 layout_class (klass);
2429 current_class = save_current_class;
2430 input_location = save_location;
2433 void
2434 layout_class (tree this_class)
2436 int i;
2437 tree super_class = CLASSTYPE_SUPER (this_class);
2439 class_list = tree_cons (this_class, NULL_TREE, class_list);
2440 if (CLASS_BEING_LAIDOUT (this_class))
2442 char buffer [1024];
2443 char *report;
2444 tree current;
2446 sprintf (buffer, " with '%s'",
2447 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2448 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2450 for (current = TREE_CHAIN (class_list); current;
2451 current = TREE_CHAIN (current))
2453 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2454 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2455 IDENTIFIER_POINTER (DECL_NAME (decl)),
2456 DECL_SOURCE_FILE (decl),
2457 DECL_SOURCE_LINE (decl));
2458 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2460 obstack_1grow (&temporary_obstack, '\0');
2461 report = XOBFINISH (&temporary_obstack, char *);
2462 cyclic_inheritance_report = ggc_strdup (report);
2463 obstack_free (&temporary_obstack, report);
2464 TYPE_SIZE (this_class) = error_mark_node;
2465 return;
2467 CLASS_BEING_LAIDOUT (this_class) = 1;
2469 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2471 tree maybe_super_class
2472 = maybe_layout_super_class (super_class, this_class);
2473 if (maybe_super_class == NULL
2474 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2476 TYPE_SIZE (this_class) = error_mark_node;
2477 CLASS_BEING_LAIDOUT (this_class) = 0;
2478 class_list = TREE_CHAIN (class_list);
2479 return;
2481 if (TYPE_SIZE (this_class) == NULL_TREE)
2482 push_super_field (this_class, maybe_super_class);
2485 layout_type (this_class);
2487 /* Also recursively load/layout any superinterfaces. */
2488 if (TYPE_BINFO (this_class))
2490 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2492 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2493 tree super_interface = BINFO_TYPE (binfo);
2494 tree maybe_super_interface
2495 = maybe_layout_super_class (super_interface, NULL_TREE);
2496 if (maybe_super_interface == NULL
2497 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2499 TYPE_SIZE (this_class) = error_mark_node;
2500 CLASS_BEING_LAIDOUT (this_class) = 0;
2501 class_list = TREE_CHAIN (class_list);
2502 return;
2507 /* Convert the size back to an SI integer value. */
2508 TYPE_SIZE_UNIT (this_class) =
2509 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2511 CLASS_BEING_LAIDOUT (this_class) = 0;
2512 class_list = TREE_CHAIN (class_list);
2515 static void
2516 add_miranda_methods (tree base_class, tree search_class)
2518 int i;
2519 tree binfo, base_binfo;
2521 if (!CLASS_PARSED_P (search_class))
2522 load_class (search_class, 1);
2524 for (binfo = TYPE_BINFO (search_class), i = 1;
2525 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2527 tree method_decl;
2528 tree elt = BINFO_TYPE (base_binfo);
2530 /* FIXME: This is totally bogus. We should not be handling
2531 Miranda methods at all if we're using the BC ABI. */
2532 if (TYPE_DUMMY (elt))
2533 continue;
2535 /* Ensure that interface methods are seen in declared order. */
2536 if (!CLASS_LOADED_P (elt))
2537 load_class (elt, 1);
2538 layout_class_methods (elt);
2540 /* All base classes will have been laid out at this point, so the order
2541 will be correct. This code must match similar layout code in the
2542 runtime. */
2543 for (method_decl = TYPE_METHODS (elt);
2544 method_decl; method_decl = DECL_CHAIN (method_decl))
2546 tree sig, override;
2548 /* An interface can have <clinit>. */
2549 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2550 continue;
2552 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2553 override = lookup_argument_method (base_class,
2554 DECL_NAME (method_decl), sig);
2555 if (override == NULL_TREE)
2557 /* Found a Miranda method. Add it. */
2558 tree new_method;
2559 sig = build_java_signature (TREE_TYPE (method_decl));
2560 new_method
2561 = add_method (base_class,
2562 get_access_flags_from_decl (method_decl),
2563 DECL_NAME (method_decl), sig);
2564 METHOD_INVISIBLE (new_method) = 1;
2568 /* Try superinterfaces. */
2569 add_miranda_methods (base_class, elt);
2573 void
2574 layout_class_methods (tree this_class)
2576 tree method_decl, dtable_count;
2577 tree super_class, type_name;
2579 if (TYPE_NVIRTUALS (this_class))
2580 return;
2582 super_class = CLASSTYPE_SUPER (this_class);
2584 if (super_class)
2586 super_class = maybe_layout_super_class (super_class, this_class);
2587 if (!TYPE_NVIRTUALS (super_class))
2588 layout_class_methods (super_class);
2589 dtable_count = TYPE_NVIRTUALS (super_class);
2591 else
2592 dtable_count = integer_zero_node;
2594 type_name = TYPE_NAME (this_class);
2595 if (!flag_indirect_dispatch
2596 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2598 /* An abstract class can have methods which are declared only in
2599 an implemented interface. These are called "Miranda
2600 methods". We make a dummy method entry for such methods
2601 here. */
2602 add_miranda_methods (this_class, this_class);
2605 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2607 for (method_decl = TYPE_METHODS (this_class);
2608 method_decl; method_decl = DECL_CHAIN (method_decl))
2609 dtable_count = layout_class_method (this_class, super_class,
2610 method_decl, dtable_count);
2612 TYPE_NVIRTUALS (this_class) = dtable_count;
2615 /* Return the index of METHOD in INTERFACE. This index begins at 1
2616 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2618 get_interface_method_index (tree method, tree interface)
2620 tree meth;
2621 int i = 1;
2623 for (meth = TYPE_METHODS (interface); ; meth = DECL_CHAIN (meth))
2625 if (meth == method)
2626 return i;
2627 /* We don't want to put <clinit> into the interface table. */
2628 if (! ID_CLINIT_P (DECL_NAME (meth)))
2629 ++i;
2630 gcc_assert (meth != NULL_TREE);
2634 /* Lay METHOD_DECL out, returning a possibly new value of
2635 DTABLE_COUNT. Also mangle the method's name. */
2637 tree
2638 layout_class_method (tree this_class, tree super_class,
2639 tree method_decl, tree dtable_count)
2641 tree method_name = DECL_NAME (method_decl);
2643 TREE_PUBLIC (method_decl) = 1;
2645 if (flag_indirect_classes
2646 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2647 && ! METHOD_NATIVE (method_decl)
2648 && ! special_method_p (method_decl)))
2649 java_hide_decl (method_decl);
2651 /* Considered external unless it is being compiled into this object
2652 file, or it was already flagged as external. */
2653 if (!DECL_EXTERNAL (method_decl))
2654 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2655 || METHOD_NATIVE (method_decl));
2657 if (ID_INIT_P (method_name))
2659 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2660 const char *ptr;
2661 for (ptr = p; *ptr; )
2663 if (*ptr++ == '.')
2664 p = ptr;
2666 DECL_CONSTRUCTOR_P (method_decl) = 1;
2667 build_java_signature (TREE_TYPE (method_decl));
2669 else if (! METHOD_STATIC (method_decl))
2671 tree method_sig =
2672 build_java_signature (TREE_TYPE (method_decl));
2673 bool method_override = false;
2674 tree super_method = lookup_java_method (super_class, method_name,
2675 method_sig);
2676 if (super_method != NULL_TREE
2677 && ! METHOD_DUMMY (super_method))
2679 method_override = true;
2680 if (! METHOD_PUBLIC (super_method) &&
2681 ! METHOD_PROTECTED (super_method))
2683 /* Don't override private method, or default-access method in
2684 another package. */
2685 if (METHOD_PRIVATE (super_method) ||
2686 ! in_same_package (TYPE_NAME (this_class),
2687 TYPE_NAME (super_class)))
2688 method_override = false;
2691 if (method_override)
2693 tree method_index = get_method_index (super_method);
2694 set_method_index (method_decl, method_index);
2695 if (method_index == NULL_TREE
2696 && ! flag_indirect_dispatch
2697 && ! DECL_ARTIFICIAL (super_method))
2698 error ("non-static method %q+D overrides static method",
2699 method_decl);
2701 else if (this_class == object_type_node
2702 && (METHOD_FINAL (method_decl)
2703 || METHOD_PRIVATE (method_decl)))
2705 /* We don't generate vtable entries for final Object
2706 methods. This is simply to save space, since every
2707 object would otherwise have to define them. */
2709 else if (! METHOD_PRIVATE (method_decl)
2710 && dtable_count)
2712 /* We generate vtable entries for final methods because they
2713 may one day be changed to non-final. */
2714 set_method_index (method_decl, dtable_count);
2715 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2716 dtable_count, integer_one_node);
2720 return dtable_count;
2723 static void
2724 register_class (void)
2726 tree node;
2728 if (!registered_class)
2729 registered_class = VEC_alloc (tree, gc, 8);
2731 if (flag_indirect_classes)
2732 node = current_class;
2733 else
2734 node = TREE_OPERAND (build_class_ref (current_class), 0);
2735 VEC_safe_push (tree, gc, registered_class, node);
2738 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2739 all the classes we have emitted. */
2741 static void
2742 emit_indirect_register_classes (tree *list_p)
2744 tree klass, t, register_class_fn;
2745 int i;
2747 int size = VEC_length (tree, registered_class) * 2 + 1;
2748 VEC(constructor_elt,gc) *init = VEC_alloc (constructor_elt, gc, size);
2749 tree class_array_type
2750 = build_prim_array_type (ptr_type_node, size);
2751 tree cdecl = build_decl (input_location,
2752 VAR_DECL, get_identifier ("_Jv_CLS"),
2753 class_array_type);
2754 tree reg_class_list;
2755 FOR_EACH_VEC_ELT (tree, registered_class, i, klass)
2757 t = fold_convert (ptr_type_node, build_static_class_ref (klass));
2758 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2759 t = fold_convert (ptr_type_node,
2760 build_address_of (build_classdollar_field (klass)));
2761 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2763 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, integer_zero_node);
2764 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2765 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2766 TREE_STATIC (cdecl) = 1;
2767 DECL_ARTIFICIAL (cdecl) = 1;
2768 DECL_IGNORED_P (cdecl) = 1;
2769 TREE_READONLY (cdecl) = 1;
2770 TREE_CONSTANT (cdecl) = 1;
2771 rest_of_decl_compilation (cdecl, 1, 0);
2772 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2774 t = build_function_type_list (void_type_node,
2775 build_pointer_type (ptr_type_node), NULL);
2776 t = build_decl (input_location,
2777 FUNCTION_DECL,
2778 get_identifier ("_Jv_RegisterNewClasses"), t);
2779 TREE_PUBLIC (t) = 1;
2780 DECL_EXTERNAL (t) = 1;
2781 register_class_fn = t;
2782 t = build_call_expr (register_class_fn, 1, reg_class_list);
2783 append_to_statement_list (t, list_p);
2786 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2788 static void
2789 emit_register_classes_in_jcr_section (void)
2791 #ifdef JCR_SECTION_NAME
2792 tree klass, cdecl, class_array_type;
2793 int i;
2794 int size = VEC_length (tree, registered_class);
2795 VEC(constructor_elt,gc) *init = VEC_alloc (constructor_elt, gc, size);
2797 FOR_EACH_VEC_ELT (tree, registered_class, i, klass)
2798 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_fold_addr_expr (klass));
2800 /* ??? I would like to use tree_output_constant_def() but there is no way
2801 to put the data in a named section name, or to set the alignment,
2802 via that function. So do everything manually here. */
2803 class_array_type = build_prim_array_type (ptr_type_node, size);
2804 cdecl = build_decl (UNKNOWN_LOCATION,
2805 VAR_DECL, get_identifier ("_Jv_JCR_SECTION_data"),
2806 class_array_type);
2807 DECL_SECTION_NAME (cdecl) = build_string (strlen (JCR_SECTION_NAME),
2808 JCR_SECTION_NAME);
2809 DECL_ALIGN (cdecl) = POINTER_SIZE;
2810 DECL_USER_ALIGN (cdecl) = 1;
2811 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2812 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2813 TREE_STATIC (cdecl) = 1;
2814 TREE_READONLY (cdecl) = 0;
2815 TREE_CONSTANT (cdecl) = 1;
2816 DECL_ARTIFICIAL (cdecl) = 1;
2817 DECL_IGNORED_P (cdecl) = 1;
2818 pushdecl_top_level (cdecl);
2819 relayout_decl (cdecl);
2820 rest_of_decl_compilation (cdecl, 1, 0);
2821 mark_decl_referenced (cdecl);
2822 #else
2823 /* A target has defined TARGET_USE_JCR_SECTION,
2824 but doesn't have a JCR_SECTION_NAME. */
2825 gcc_unreachable ();
2826 #endif
2830 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2831 A series of calls is added to LIST_P. */
2833 static void
2834 emit_Jv_RegisterClass_calls (tree *list_p)
2836 tree klass, t, register_class_fn;
2837 int i;
2839 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2840 t = build_decl (input_location,
2841 FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2842 TREE_PUBLIC (t) = 1;
2843 DECL_EXTERNAL (t) = 1;
2844 register_class_fn = t;
2846 FOR_EACH_VEC_ELT (tree, registered_class, i, klass)
2848 t = build_fold_addr_expr (klass);
2849 t = build_call_expr (register_class_fn, 1, t);
2850 append_to_statement_list (t, list_p);
2854 /* Emit something to register classes at start-up time.
2856 The default mechanism is to generate instances at run-time.
2858 An alternative mechanism is through the .jcr section, which contain
2859 a list of pointers to classes which get registered during constructor
2860 invocation time.
2862 The fallback mechanism is to add statements to *LIST_P to call
2863 _Jv_RegisterClass for each class in this file. These statements will
2864 be added to a static constructor function for this translation unit. */
2866 void
2867 emit_register_classes (tree *list_p)
2869 if (registered_class == NULL)
2870 return;
2872 /* By default, generate instances of Class at runtime. */
2873 if (flag_indirect_classes)
2874 emit_indirect_register_classes (list_p);
2875 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2876 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2877 but lack suitable crtbegin/end objects or linker support. These
2878 targets can override the default in tm.h to use the fallback mechanism. */
2879 else if (TARGET_USE_JCR_SECTION)
2880 emit_register_classes_in_jcr_section ();
2881 /* Use the fallback mechanism. */
2882 else
2883 emit_Jv_RegisterClass_calls (list_p);
2886 /* Build a constructor for an entry in the symbol table. */
2888 static tree
2889 build_symbol_table_entry (tree clname, tree name, tree signature)
2891 tree symbol;
2892 VEC(constructor_elt,gc) *v = NULL;
2894 START_RECORD_CONSTRUCTOR (v, symbol_type);
2895 PUSH_FIELD_VALUE (v, "clname", clname);
2896 PUSH_FIELD_VALUE (v, "name", name);
2897 PUSH_FIELD_VALUE (v, "signature", signature);
2898 FINISH_RECORD_CONSTRUCTOR (symbol, v, symbol_type);
2899 TREE_CONSTANT (symbol) = 1;
2901 return symbol;
2904 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2906 static tree
2907 build_symbol_entry (tree decl, tree special)
2909 tree clname, name, signature;
2910 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2911 /* ??? Constructors are given the name foo.foo all the way through
2912 the compiler, but in the method table they're all renamed
2913 foo.<init>. So, we have to do the same here unless we want an
2914 unresolved reference at runtime. */
2915 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2916 && DECL_CONSTRUCTOR_P (decl))
2917 ? init_identifier_node
2918 : DECL_NAME (decl));
2919 signature = build_java_signature (TREE_TYPE (decl));
2920 signature = build_utf8_ref (unmangle_classname
2921 (IDENTIFIER_POINTER (signature),
2922 IDENTIFIER_LENGTH (signature)));
2923 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2924 signature addr+1 if SPECIAL, and this indicates to the runtime
2925 system that this is a "special" symbol, i.e. one that should
2926 bypass access controls. */
2927 if (special != NULL_TREE)
2928 signature = fold_build_pointer_plus (signature, special);
2930 return build_symbol_table_entry (clname, name, signature);
2933 /* Emit a symbol table: used by -findirect-dispatch. */
2935 tree
2936 emit_symbol_table (tree name, tree the_table,
2937 VEC(method_entry,gc) *decl_table,
2938 tree the_syms_decl, tree the_array_element_type,
2939 int element_size)
2941 tree table, null_symbol, table_size, the_array_type;
2942 unsigned index;
2943 method_entry *e;
2944 VEC(constructor_elt,gc) *v = NULL;
2946 /* Only emit a table if this translation unit actually made any
2947 references via it. */
2948 if (decl_table == NULL)
2949 return the_table;
2951 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2952 FOR_EACH_VEC_ELT (method_entry, decl_table, index, e)
2953 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
2954 build_symbol_entry (e->method, e->special));
2956 /* Terminate the list with a "null" entry. */
2957 null_symbol = build_symbol_table_entry (null_pointer_node,
2958 null_pointer_node,
2959 null_pointer_node);
2960 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_symbol);
2962 table = build_constructor (symbols_array_type, v);
2964 /* Make it the initial value for otable_syms and emit the decl. */
2965 DECL_INITIAL (the_syms_decl) = table;
2966 DECL_ARTIFICIAL (the_syms_decl) = 1;
2967 DECL_IGNORED_P (the_syms_decl) = 1;
2968 rest_of_decl_compilation (the_syms_decl, 1, 0);
2970 /* Now that its size is known, redefine the table as an
2971 uninitialized static array of INDEX + 1 elements. The extra entry
2972 is used by the runtime to track whether the table has been
2973 initialized. */
2974 table_size
2975 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2976 the_array_type = build_array_type (the_array_element_type, table_size);
2977 the_table = build_decl (input_location,
2978 VAR_DECL, name, the_array_type);
2979 TREE_STATIC (the_table) = 1;
2980 TREE_READONLY (the_table) = 1;
2981 rest_of_decl_compilation (the_table, 1, 0);
2983 return the_table;
2986 /* Make an entry for the catch_classes list. */
2987 tree
2988 make_catch_class_record (tree catch_class, tree classname)
2990 tree entry;
2991 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2992 VEC(constructor_elt,gc) *v = NULL;
2993 START_RECORD_CONSTRUCTOR (v, type);
2994 PUSH_FIELD_VALUE (v, "address", catch_class);
2995 PUSH_FIELD_VALUE (v, "classname", classname);
2996 FINISH_RECORD_CONSTRUCTOR (entry, v, type);
2997 return entry;
3001 /* Generate the list of Throwable classes that are caught by exception
3002 handlers in this class. */
3003 tree
3004 emit_catch_table (tree this_class)
3006 tree table, table_size, array_type;
3007 int n_catch_classes;
3008 constructor_elt *e;
3009 /* Fill in the dummy entry that make_class created. */
3010 e = VEC_index (constructor_elt, TYPE_CATCH_CLASSES (this_class), 0);
3011 e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
3012 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
3013 make_catch_class_record (null_pointer_node,
3014 null_pointer_node));
3015 n_catch_classes = VEC_length (constructor_elt,
3016 TYPE_CATCH_CLASSES (this_class));
3017 table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
3018 array_type
3019 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
3020 table_size);
3021 table =
3022 build_decl (input_location,
3023 VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
3024 DECL_INITIAL (table) =
3025 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
3026 TREE_STATIC (table) = 1;
3027 TREE_READONLY (table) = 1;
3028 DECL_IGNORED_P (table) = 1;
3029 rest_of_decl_compilation (table, 1, 0);
3030 return table;
3033 /* Given a type, return the signature used by
3034 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3035 same as build_java_signature() because we want the canonical array
3036 type. */
3038 static tree
3039 build_signature_for_libgcj (tree type)
3041 tree sig, ref;
3043 sig = build_java_signature (type);
3044 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
3045 IDENTIFIER_LENGTH (sig)));
3046 return ref;
3049 /* Build an entry in the type assertion table. */
3051 static tree
3052 build_assertion_table_entry (tree code, tree op1, tree op2)
3054 VEC(constructor_elt,gc) *v = NULL;
3055 tree entry;
3057 START_RECORD_CONSTRUCTOR (v, assertion_entry_type);
3058 PUSH_FIELD_VALUE (v, "assertion_code", code);
3059 PUSH_FIELD_VALUE (v, "op1", op1);
3060 PUSH_FIELD_VALUE (v, "op2", op2);
3061 FINISH_RECORD_CONSTRUCTOR (entry, v, assertion_entry_type);
3063 return entry;
3066 /* Add an entry to the type assertion table. Callback used during hashtable
3067 traversal. */
3069 static int
3070 add_assertion_table_entry (void **htab_entry, void *ptr)
3072 tree entry;
3073 tree code_val, op1_utf8, op2_utf8;
3074 VEC(constructor_elt,gc) **v = (VEC(constructor_elt,gc) **) ptr;
3075 type_assertion *as = (type_assertion *) *htab_entry;
3077 code_val = build_int_cst (NULL_TREE, as->assertion_code);
3079 if (as->op1 == NULL_TREE)
3080 op1_utf8 = null_pointer_node;
3081 else
3082 op1_utf8 = build_signature_for_libgcj (as->op1);
3084 if (as->op2 == NULL_TREE)
3085 op2_utf8 = null_pointer_node;
3086 else
3087 op2_utf8 = build_signature_for_libgcj (as->op2);
3089 entry = build_assertion_table_entry (code_val, op1_utf8, op2_utf8);
3091 CONSTRUCTOR_APPEND_ELT (*v, NULL_TREE, entry);
3092 return true;
3095 /* Generate the type assertion table for KLASS, and return its DECL. */
3097 static tree
3098 emit_assertion_table (tree klass)
3100 tree null_entry, ctor, table_decl;
3101 htab_t assertions_htab = TYPE_ASSERTIONS (klass);
3102 VEC(constructor_elt,gc) *v = NULL;
3104 /* Iterate through the hash table. */
3105 htab_traverse (assertions_htab, add_assertion_table_entry, &v);
3107 /* Finish with a null entry. */
3108 null_entry = build_assertion_table_entry (integer_zero_node,
3109 null_pointer_node,
3110 null_pointer_node);
3112 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_entry);
3114 ctor = build_constructor (assertion_table_type, v);
3116 table_decl = build_decl (input_location,
3117 VAR_DECL, mangled_classname ("_type_assert_", klass),
3118 assertion_table_type);
3120 TREE_STATIC (table_decl) = 1;
3121 TREE_READONLY (table_decl) = 1;
3122 TREE_CONSTANT (table_decl) = 1;
3123 DECL_IGNORED_P (table_decl) = 1;
3125 DECL_INITIAL (table_decl) = ctor;
3126 DECL_ARTIFICIAL (table_decl) = 1;
3127 rest_of_decl_compilation (table_decl, 1, 0);
3129 return table_decl;
3132 void
3133 init_class_processing (void)
3135 fields_ident = get_identifier ("fields");
3136 info_ident = get_identifier ("info");
3138 gcc_obstack_init (&temporary_obstack);
3141 static hashval_t java_treetreehash_hash (const void *);
3142 static int java_treetreehash_compare (const void *, const void *);
3144 /* A hash table mapping trees to trees. Used generally. */
3146 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3148 static hashval_t
3149 java_treetreehash_hash (const void *k_p)
3151 const struct treetreehash_entry *const k
3152 = (const struct treetreehash_entry *) k_p;
3153 return JAVA_TREEHASHHASH_H (k->key);
3156 static int
3157 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3159 const struct treetreehash_entry *const k1
3160 = (const struct treetreehash_entry *) k1_p;
3161 const_tree const k2 = (const_tree) k2_p;
3162 return (k1->key == k2);
3165 tree
3166 java_treetreehash_find (htab_t ht, tree t)
3168 struct treetreehash_entry *e;
3169 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3170 e = (struct treetreehash_entry *) htab_find_with_hash (ht, t, hv);
3171 if (e == NULL)
3172 return NULL;
3173 else
3174 return e->value;
3177 tree *
3178 java_treetreehash_new (htab_t ht, tree t)
3180 void **e;
3181 struct treetreehash_entry *tthe;
3182 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3184 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3185 if (*e == NULL)
3187 tthe = ggc_alloc_cleared_treetreehash_entry ();
3188 tthe->key = t;
3189 *e = tthe;
3191 else
3192 tthe = (struct treetreehash_entry *) *e;
3193 return &tthe->value;
3196 htab_t
3197 java_treetreehash_create (size_t size)
3199 return htab_create_ggc (size, java_treetreehash_hash,
3200 java_treetreehash_compare, NULL);
3203 /* Break down qualified IDENTIFIER into package and class-name components.
3204 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3205 "pkg.foo", and RIGHT to "Bar". */
3208 split_qualified_name (tree *left, tree *right, tree source)
3210 char *p, *base;
3211 int l = IDENTIFIER_LENGTH (source);
3213 base = (char *) alloca (l + 1);
3214 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3216 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3217 p = base + l - 1;
3218 while (*p != '.' && p != base)
3219 p--;
3221 /* We didn't find a '.'. Return an error. */
3222 if (p == base)
3223 return 1;
3225 *p = '\0';
3226 if (right)
3227 *right = get_identifier (p+1);
3228 *left = get_identifier (base);
3230 return 0;
3233 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3234 if the classes are from the same package. */
3237 in_same_package (tree name1, tree name2)
3239 tree tmp;
3240 tree pkg1;
3241 tree pkg2;
3243 if (TREE_CODE (name1) == TYPE_DECL)
3244 name1 = DECL_NAME (name1);
3245 if (TREE_CODE (name2) == TYPE_DECL)
3246 name2 = DECL_NAME (name2);
3248 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3249 /* One in empty package. */
3250 return 0;
3252 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3253 /* Both in empty package. */
3254 return 1;
3256 split_qualified_name (&pkg1, &tmp, name1);
3257 split_qualified_name (&pkg2, &tmp, name2);
3259 return (pkg1 == pkg2);
3262 /* lang_hooks.decls.final_write_globals: perform final processing on
3263 global variables. */
3265 void
3266 java_write_globals (void)
3268 tree *vec = VEC_address (tree, pending_static_fields);
3269 int len = VEC_length (tree, pending_static_fields);
3270 write_global_declarations ();
3271 emit_debug_global_declarations (vec, len);
3272 VEC_free (tree, gc, pending_static_fields);
3275 #include "gt-java-class.h"