Account for prologue spills in reg_pressure scheduling
[official-gcc.git] / gcc / java / class.c
blob2c29a44837c6c66d35b0eafd16edf2a4ca396020
1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>.
20 Java and all Java-based marks are trademarks or registered trademarks
21 of Sun Microsystems, Inc. in the United States and other countries.
22 The Free Software Foundation is independent of Sun Microsystems, Inc. */
24 /* Written by Per Bothner <bothner@cygnus.com> */
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "tree.h"
30 #include "stringpool.h"
31 #include "stor-layout.h"
32 #include "varasm.h"
33 #include "flags.h"
34 #include "java-tree.h"
35 #include "jcf.h"
36 #include "obstack.h"
37 #include "diagnostic-core.h"
38 #include "toplev.h"
39 #include "output.h" /* for switch_to_section and get_section */
40 #include "parse.h"
41 #include "hashtab.h"
42 #include "hash-set.h"
43 #include "vec.h"
44 #include "machmode.h"
45 #include "tm.h"
46 #include "hard-reg-set.h"
47 #include "input.h"
48 #include "function.h"
49 #include "ggc.h"
50 #include "cgraph.h"
51 #include "tree-iterator.h"
52 #include "target.h"
54 static tree make_method_value (tree);
55 static tree build_java_method_type (tree, tree, int);
56 static int32 hashUtf8String (const char *, int);
57 static tree make_field_value (tree);
58 static tree get_dispatch_vector (tree);
59 static tree get_dispatch_table (tree, tree);
60 static int supers_all_compiled (tree type);
61 static tree maybe_layout_super_class (tree, tree);
62 static void add_miranda_methods (tree, tree);
63 static int assume_compiled (const char *);
64 static tree build_symbol_entry (tree, tree);
65 static tree emit_assertion_table (tree);
66 static void register_class (void);
68 struct obstack temporary_obstack;
70 static const char *cyclic_inheritance_report;
72 /* The compiler generates different code depending on whether or not
73 it can assume certain classes have been compiled down to native
74 code or not. The compiler options -fassume-compiled= and
75 -fno-assume-compiled= are used to create a tree of
76 class_flag_node objects. This tree is queried to determine if
77 a class is assume to be compiled or not. Each node in the tree
78 represents either a package or a specific class. */
80 typedef struct class_flag_node_struct
82 /* The class or package name. */
83 const char *ident;
85 /* Nonzero if this represents an exclusion. */
86 int value;
88 /* Pointers to other nodes in the tree. */
89 struct class_flag_node_struct *parent;
90 struct class_flag_node_struct *sibling;
91 struct class_flag_node_struct *child;
92 } class_flag_node;
94 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
95 static void add_class_flag (class_flag_node **, const char *, int);
97 /* This is the root of the include/exclude tree. */
99 static class_flag_node *assume_compiled_tree;
101 static class_flag_node *enable_assert_tree;
103 static GTY(()) tree class_roots[4];
104 #define fields_ident class_roots[0] /* get_identifier ("fields") */
105 #define info_ident class_roots[1] /* get_identifier ("info") */
106 #define class_list class_roots[2]
107 #define class_dtable_decl class_roots[3]
109 static GTY(()) vec<tree, va_gc> *registered_class;
111 /* A tree that returns the address of the class$ of the class
112 currently being compiled. */
113 static GTY(()) tree this_classdollar;
115 /* A list of static class fields. This is to emit proper debug
116 info for them. */
117 vec<tree, va_gc> *pending_static_fields;
119 /* Return the node that most closely represents the class whose name
120 is IDENT. Start the search from NODE (followed by its siblings).
121 Return NULL if an appropriate node does not exist. */
123 static class_flag_node *
124 find_class_flag_node (class_flag_node *node, const char *ident)
126 while (node)
128 size_t node_ident_length = strlen (node->ident);
130 /* node_ident_length is zero at the root of the tree. If the
131 identifiers are the same length, then we have matching
132 classes. Otherwise check if we've matched an enclosing
133 package name. */
135 if (node_ident_length == 0
136 || (strncmp (ident, node->ident, node_ident_length) == 0
137 && (ident[node_ident_length] == '\0'
138 || ident[node_ident_length] == '.')))
140 /* We've found a match, however, there might be a more
141 specific match. */
143 class_flag_node *found = find_class_flag_node (node->child, ident);
144 if (found)
145 return found;
146 else
147 return node;
150 /* No match yet. Continue through the sibling list. */
151 node = node->sibling;
154 /* No match at all in this tree. */
155 return NULL;
158 void
159 add_class_flag (class_flag_node **rootp, const char *ident, int value)
161 class_flag_node *root = *rootp;
162 class_flag_node *parent, *node;
164 /* Create the root of the tree if it doesn't exist yet. */
166 if (NULL == root)
168 root = XNEW (class_flag_node);
169 root->ident = "";
170 root->value = 0;
171 root->sibling = NULL;
172 root->child = NULL;
173 root->parent = NULL;
174 *rootp = root;
177 /* Calling the function with the empty string means we're setting
178 value for the root of the hierarchy. */
180 if (0 == ident[0])
182 root->value = value;
183 return;
186 /* Find the parent node for this new node. PARENT will either be a
187 class or a package name. Adjust PARENT accordingly. */
189 parent = find_class_flag_node (root, ident);
190 if (strcmp (ident, parent->ident) == 0)
191 parent->value = value;
192 else
194 /* Insert new node into the tree. */
195 node = XNEW (class_flag_node);
197 node->ident = xstrdup (ident);
198 node->value = value;
199 node->child = NULL;
201 node->parent = parent;
202 node->sibling = parent->child;
203 parent->child = node;
207 /* Add a new IDENT to the include/exclude tree. It's an exclusion
208 if EXCLUDEP is nonzero. */
210 void
211 add_assume_compiled (const char *ident, int excludep)
213 add_class_flag (&assume_compiled_tree, ident, excludep);
216 /* The default value returned by enable_assertions. */
218 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
220 /* Enter IDENT (a class or package name) into the enable-assertions table.
221 VALUE is true to enable and false to disable. */
223 void
224 add_enable_assert (const char *ident, int value)
226 if (enable_assert_tree == NULL)
227 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
228 add_class_flag (&enable_assert_tree, ident, value);
231 /* Returns nonzero if IDENT is the name of a class that the compiler
232 should assume has been compiled to object code. */
234 static int
235 assume_compiled (const char *ident)
237 class_flag_node *i;
238 int result;
240 if (NULL == assume_compiled_tree)
241 return 1;
243 i = find_class_flag_node (assume_compiled_tree, ident);
245 result = ! i->value;
247 return (result);
250 /* Return true if we should generate code to check assertions within KLASS. */
252 bool
253 enable_assertions (tree klass)
255 /* Check if command-line specifies whether we should check assertions. */
257 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
259 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
260 class_flag_node *node
261 = find_class_flag_node (enable_assert_tree, ident);
262 return node->value;
265 /* The default is to enable assertions if generating class files,
266 or not optimizing. */
267 return DEFAULT_ENABLE_ASSERT;
270 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
271 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
272 Also, PREFIX is prepended, and SUFFIX is appended. */
274 tree
275 ident_subst (const char* old_name,
276 int old_length,
277 const char *prefix,
278 int old_char,
279 int new_char,
280 const char *suffix)
282 int prefix_len = strlen (prefix);
283 int suffix_len = strlen (suffix);
284 int i = prefix_len + old_length + suffix_len + 1;
285 char *buffer = (char *) alloca (i);
287 strcpy (buffer, prefix);
288 for (i = 0; i < old_length; i++)
290 char ch = old_name[i];
291 if (ch == old_char)
292 ch = new_char;
293 buffer[prefix_len + i] = ch;
295 strcpy (buffer + prefix_len + old_length, suffix);
296 return get_identifier (buffer);
299 /* Return an IDENTIFIER_NODE the same as OLD_ID,
300 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
301 Also, PREFIX is prepended, and SUFFIX is appended. */
303 tree
304 identifier_subst (const tree old_id,
305 const char *prefix,
306 int old_char,
307 int new_char,
308 const char *suffix)
310 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
311 prefix, old_char, new_char, suffix);
314 /* Generate a valid C identifier from the name of the class TYPE,
315 prefixed by PREFIX. */
317 tree
318 mangled_classname (const char *prefix, tree type)
320 tree result;
321 tree ident = TYPE_NAME (type);
322 if (TREE_CODE (ident) != IDENTIFIER_NODE)
323 ident = DECL_NAME (ident);
324 result = identifier_subst (ident, prefix, '.', '_', "");
326 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
327 "_0xXX". Class names containing such chracters are uncommon, but
328 they do sometimes occur in class files. Without this check,
329 these names cause assembly errors.
331 There is a possibility that a real class name could conflict with
332 the identifier we generate, but it is unlikely and will
333 immediately be detected as an assembler error. At some point we
334 should do something more elaborate (perhaps using the full
335 unicode mangling scheme) in order to prevent such a conflict. */
337 int i;
338 const int len = IDENTIFIER_LENGTH (result);
339 const char *p = IDENTIFIER_POINTER (result);
340 int illegal_chars = 0;
342 /* Make two passes over the identifier. The first pass is merely
343 to count illegal characters; we need to do this in order to
344 allocate a buffer. */
345 for (i = 0; i < len; i++)
347 char c = p[i];
348 illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
351 /* And the second pass, which is rarely executed, does the
352 rewriting. */
353 if (illegal_chars != 0)
355 char *buffer = (char *) alloca (illegal_chars * 4 + len + 1);
356 int j;
358 for (i = 0, j = 0; i < len; i++)
360 char c = p[i];
361 if (! ISALNUM (c) && c != '_' && c != '$')
363 buffer[j++] = '_';
364 sprintf (&buffer[j], "0x%02x", c);
365 j += 4;
367 else
368 buffer[j++] = c;
371 buffer[j] = 0;
372 result = get_identifier (buffer);
376 return result;
379 tree
380 make_class (void)
382 tree type;
383 type = make_node (RECORD_TYPE);
384 /* Unfortunately we must create the binfo here, so that class
385 loading works. */
386 TYPE_BINFO (type) = make_tree_binfo (0);
387 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
388 TYPE_CATCH_CLASSES (type) = NULL;
389 /* Push a dummy entry; we can't call make_catch_class_record here
390 because other infrastructure may not be set up yet. We'll come
391 back and fill it in later once said infrastructure is
392 initialized. */
393 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
395 return type;
398 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
399 and where each of the constituents is separated by '/',
400 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
402 tree
403 unmangle_classname (const char *name, int name_length)
405 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
406 /* It's not sufficient to compare to_return and get_identifier
407 (name) to determine whether to_return is qualified. There are
408 cases in signature analysis where name will be stripped of a
409 trailing ';'. */
410 name = IDENTIFIER_POINTER (to_return);
411 while (*name)
412 if (*name++ == '.')
414 QUALIFIED_P (to_return) = 1;
415 break;
418 return to_return;
421 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
422 do \
424 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
425 char *buf = (char *) alloca (strlen (type_name) \
426 + strlen (#NAME "_syms_") + 1); \
427 tree decl; \
429 sprintf (buf, #NAME "_%s", type_name); \
430 TYPE_## TABLE ##_DECL (type) = decl = \
431 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
432 DECL_EXTERNAL (decl) = 1; \
433 TREE_STATIC (decl) = 1; \
434 TREE_READONLY (decl) = 1; \
435 TREE_CONSTANT (decl) = 1; \
436 DECL_IGNORED_P (decl) = 1; \
437 /* Mark the table as belonging to this class. */ \
438 pushdecl (decl); \
439 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
440 DECL_OWNER (decl) = TYPE; \
441 sprintf (buf, #NAME "_syms_%s", type_name); \
442 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
443 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
444 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
445 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
446 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
448 while (0)
450 /* Given a class, create the DECLs for all its associated indirect
451 dispatch tables. */
452 void
453 gen_indirect_dispatch_tables (tree type)
455 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", type));
457 tree field = NULL;
458 char *buf = (char *) alloca (strlen (type_name)
459 + strlen ("_catch_classes_") + 1);
460 tree catch_class_type = make_node (RECORD_TYPE);
462 sprintf (buf, "_catch_classes_%s", type_name);
463 PUSH_FIELD (input_location,
464 catch_class_type, field, "address", utf8const_ptr_type);
465 PUSH_FIELD (input_location,
466 catch_class_type, field, "classname", ptr_type_node);
467 FINISH_RECORD (catch_class_type);
469 TYPE_CTABLE_DECL (type)
470 = build_decl (input_location, VAR_DECL, get_identifier (buf),
471 build_array_type (catch_class_type, 0));
472 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
473 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
474 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
475 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
476 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
477 pushdecl (TYPE_CTABLE_DECL (type));
480 if (flag_indirect_dispatch)
482 GEN_TABLE (ATABLE, _atable, atable_type, type);
483 GEN_TABLE (OTABLE, _otable, otable_type, type);
484 GEN_TABLE (ITABLE, _itable, itable_type, type);
488 #undef GEN_TABLE
490 tree
491 push_class (tree class_type, tree class_name)
493 tree decl, signature;
494 location_t saved_loc = input_location;
495 CLASS_P (class_type) = 1;
496 decl = build_decl (input_location, TYPE_DECL, class_name, class_type);
497 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
499 /* dbxout needs a DECL_SIZE if in gstabs mode */
500 DECL_SIZE (decl) = integer_zero_node;
502 input_location = saved_loc;
503 signature = identifier_subst (class_name, "L", '.', '/', ";");
504 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
506 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
507 both a typedef and in the struct name-space. We may want to re-visit
508 this later, but for now it reduces the changes needed for gdb. */
509 DECL_ARTIFICIAL (decl) = 1;
511 pushdecl_top_level (decl);
513 return decl;
516 /* Finds the (global) class named NAME. Creates the class if not found.
517 Also creates associated TYPE_DECL.
518 Does not check if the class actually exists, load the class,
519 fill in field or methods, or do layout_type. */
521 tree
522 lookup_class (tree name)
524 tree decl = IDENTIFIER_CLASS_VALUE (name);
525 if (decl == NULL_TREE)
526 decl = push_class (make_class (), name);
527 return TREE_TYPE (decl);
530 void
531 set_super_info (int access_flags, tree this_class,
532 tree super_class, int interfaces_count)
534 int total_supers = interfaces_count;
535 tree class_decl = TYPE_NAME (this_class);
537 if (super_class)
538 total_supers++;
540 if (total_supers)
541 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
542 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
543 if (super_class)
545 tree super_binfo = make_tree_binfo (0);
546 BINFO_TYPE (super_binfo) = super_class;
547 BINFO_OFFSET (super_binfo) = integer_zero_node;
548 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
549 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
552 set_class_decl_access_flags (access_flags, class_decl);
555 void
556 set_class_decl_access_flags (int access_flags, tree class_decl)
558 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
559 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
560 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
561 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
562 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
563 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
564 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
565 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
566 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
567 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
568 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
569 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
572 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
573 direct sub-classes of Object are 1, and so on. */
576 class_depth (tree clas)
578 int depth = 0;
579 if (! CLASS_LOADED_P (clas))
580 load_class (clas, 1);
581 if (TYPE_SIZE (clas) == error_mark_node)
582 return -1;
583 while (clas != object_type_node)
585 depth++;
586 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
588 return depth;
591 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
594 interface_of_p (tree type1, tree type2)
596 int i;
597 tree binfo, base_binfo;
599 if (! TYPE_BINFO (type2))
600 return 0;
602 for (binfo = TYPE_BINFO (type2), i = 0;
603 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
604 if (BINFO_TYPE (base_binfo) == type1)
605 return 1;
607 for (binfo = TYPE_BINFO (type2), i = 0;
608 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
609 if (BINFO_TYPE (base_binfo)
610 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
611 return 1;
613 return 0;
616 /* Return true iff TYPE1 inherits from TYPE2. */
619 inherits_from_p (tree type1, tree type2)
621 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
623 if (type1 == type2)
624 return 1;
626 if (! CLASS_LOADED_P (type1))
627 load_class (type1, 1);
629 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
631 return 0;
634 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
637 enclosing_context_p (tree type1, tree type2)
639 if (!INNER_CLASS_TYPE_P (type2))
640 return 0;
642 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
643 type2;
644 type2 = (INNER_CLASS_TYPE_P (type2) ?
645 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
647 if (type2 == type1)
648 return 1;
651 return 0;
655 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
656 nesting level. */
659 common_enclosing_context_p (tree type1, tree type2)
661 while (type1)
663 tree current;
664 for (current = type2; current;
665 current = (INNER_CLASS_TYPE_P (current) ?
666 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
667 NULL_TREE))
668 if (type1 == current)
669 return 1;
671 if (INNER_CLASS_TYPE_P (type1))
672 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
673 else
674 break;
676 return 0;
679 /* Return 1 iff there exists a common enclosing "this" between TYPE1
680 and TYPE2, without crossing any static context. */
683 common_enclosing_instance_p (tree type1, tree type2)
685 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
686 return 0;
688 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
689 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
690 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
692 tree current;
693 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
694 current = (PURE_INNER_CLASS_TYPE_P (current) ?
695 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
696 NULL_TREE))
697 if (type1 == current)
698 return 1;
700 return 0;
703 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
704 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
705 if attempt is made to add it twice. */
707 tree
708 maybe_add_interface (tree this_class, tree interface_class)
710 tree binfo, base_binfo;
711 int i;
713 for (binfo = TYPE_BINFO (this_class), i = 0;
714 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
715 if (BINFO_TYPE (base_binfo) == interface_class)
716 return interface_class;
717 add_interface (this_class, interface_class);
718 return NULL_TREE;
721 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
723 void
724 add_interface (tree this_class, tree interface_class)
726 tree interface_binfo = make_tree_binfo (0);
728 BINFO_TYPE (interface_binfo) = interface_class;
729 BINFO_OFFSET (interface_binfo) = integer_zero_node;
730 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
731 BINFO_VIRTUAL_P (interface_binfo) = 1;
733 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
736 static tree
737 build_java_method_type (tree fntype, tree this_class, int access_flags)
739 if (access_flags & ACC_STATIC)
740 return fntype;
741 fntype = build_method_type (this_class, fntype);
743 /* We know that arg 1 of every nonstatic method is non-null; tell
744 the back-end so. */
745 TYPE_ATTRIBUTES (fntype) = (tree_cons
746 (get_identifier ("nonnull"),
747 tree_cons (NULL_TREE,
748 build_int_cst (NULL_TREE, 1),
749 NULL_TREE),
750 TYPE_ATTRIBUTES (fntype)));
751 return fntype;
754 void
755 java_hide_decl (tree decl ATTRIBUTE_UNUSED)
757 #ifdef HAVE_GAS_HIDDEN
758 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
759 DECL_VISIBILITY_SPECIFIED (decl) = 1;
760 #endif
763 tree
764 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
766 tree method_type, fndecl;
768 method_type = build_java_method_type (function_type,
769 this_class, access_flags);
771 fndecl = build_decl (input_location, FUNCTION_DECL, name, method_type);
772 DECL_CONTEXT (fndecl) = this_class;
774 DECL_LANG_SPECIFIC (fndecl) = ggc_cleared_alloc<struct lang_decl> ();
775 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
777 /* Initialize the static initializer test table. */
779 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = java_treetreehash_create (10);
781 /* Initialize the initialized (static) class table. */
782 if (access_flags & ACC_STATIC)
783 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
784 hash_table<ict_hasher>::create_ggc (50);
786 DECL_CHAIN (fndecl) = TYPE_METHODS (this_class);
787 TYPE_METHODS (this_class) = fndecl;
789 /* If pointers to member functions use the least significant bit to
790 indicate whether a function is virtual, ensure a pointer
791 to this function will have that bit clear. */
792 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
793 && !(access_flags & ACC_STATIC)
794 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
795 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
797 /* Notice that this is a finalizer and update the class type
798 accordingly. This is used to optimize instance allocation. */
799 if (name == finalize_identifier_node
800 && TREE_TYPE (function_type) == void_type_node
801 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
802 HAS_FINALIZER_P (this_class) = 1;
804 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
805 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
806 if (access_flags & ACC_PRIVATE)
807 METHOD_PRIVATE (fndecl) = 1;
808 if (access_flags & ACC_NATIVE)
810 METHOD_NATIVE (fndecl) = 1;
811 DECL_EXTERNAL (fndecl) = 1;
813 else
814 /* FNDECL is external unless we are compiling it into this object
815 file. */
816 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
817 if (access_flags & ACC_STATIC)
818 METHOD_STATIC (fndecl) = 1;
819 if (access_flags & ACC_FINAL)
820 METHOD_FINAL (fndecl) = 1;
821 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
822 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
823 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
824 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
825 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
826 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
827 return fndecl;
830 /* Add a method to THIS_CLASS.
831 The method's name is NAME.
832 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
834 tree
835 add_method (tree this_class, int access_flags, tree name, tree method_sig)
837 tree function_type, fndecl;
838 const unsigned char *sig
839 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
841 if (sig[0] != '(')
842 fatal_error ("bad method signature");
844 function_type = get_type_from_signature (method_sig);
845 fndecl = add_method_1 (this_class, access_flags, name, function_type);
846 set_java_signature (TREE_TYPE (fndecl), method_sig);
847 return fndecl;
850 tree
851 add_field (tree klass, tree name, tree field_type, int flags)
853 int is_static = (flags & ACC_STATIC) != 0;
854 tree field;
855 field = build_decl (input_location,
856 is_static ? VAR_DECL : FIELD_DECL, name, field_type);
857 DECL_CHAIN (field) = TYPE_FIELDS (klass);
858 TYPE_FIELDS (klass) = field;
859 DECL_CONTEXT (field) = klass;
860 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
862 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
863 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
864 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
865 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
866 if (flags & ACC_VOLATILE)
868 FIELD_VOLATILE (field) = 1;
869 TREE_THIS_VOLATILE (field) = 1;
871 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
872 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
873 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
874 if (is_static)
876 FIELD_STATIC (field) = 1;
877 /* Always make field externally visible. This is required so
878 that native methods can always access the field. */
879 TREE_PUBLIC (field) = 1;
880 /* Hide everything that shouldn't be visible outside a DSO. */
881 if (flag_indirect_classes
882 || (FIELD_PRIVATE (field)))
883 java_hide_decl (field);
884 /* Considered external unless we are compiling it into this
885 object file. */
886 DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2);
887 if (!DECL_EXTERNAL (field))
888 vec_safe_push (pending_static_fields, field);
891 return field;
894 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
896 void
897 set_constant_value (tree field, tree constant)
899 if (field == NULL_TREE)
900 warning (OPT_Wattributes,
901 "misplaced ConstantValue attribute (not in any field)");
902 else if (DECL_INITIAL (field) != NULL_TREE)
903 warning (OPT_Wattributes,
904 "duplicate ConstantValue attribute for field '%s'",
905 IDENTIFIER_POINTER (DECL_NAME (field)));
906 else
908 DECL_INITIAL (field) = constant;
909 if (TREE_TYPE (constant) != TREE_TYPE (field)
910 && ! (TREE_TYPE (constant) == int_type_node
911 && INTEGRAL_TYPE_P (TREE_TYPE (field))
912 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
913 && ! (TREE_TYPE (constant) == utf8const_ptr_type
914 && TREE_TYPE (field) == string_ptr_type_node))
915 error ("ConstantValue attribute of field '%s' has wrong type",
916 IDENTIFIER_POINTER (DECL_NAME (field)));
920 /* Calculate a hash value for a string encoded in Utf8 format.
921 * This returns the same hash value as specified for java.lang.String.hashCode.
924 static int32
925 hashUtf8String (const char *str, int len)
927 const unsigned char* ptr = (const unsigned char*) str;
928 const unsigned char *limit = ptr + len;
929 uint32 hash = 0;
930 for (; ptr < limit;)
932 int ch = UTF8_GET (ptr, limit);
933 /* Updated specification from
934 http://www.javasoft.com/docs/books/jls/clarify.html. */
935 hash = (31 * hash) + ch;
937 return hash;
940 tree
941 build_utf8_ref (tree name)
943 const char * name_ptr = IDENTIFIER_POINTER (name);
944 int name_len = IDENTIFIER_LENGTH (name), name_pad;
945 char buf[60];
946 tree ctype, field = NULL_TREE, str_type, cinit, string;
947 static int utf8_count = 0;
948 int name_hash;
949 tree ref = IDENTIFIER_UTF8_REF (name);
950 tree decl;
951 vec<constructor_elt, va_gc> *v = NULL;
952 if (ref != NULL_TREE)
953 return ref;
955 ctype = make_node (RECORD_TYPE);
956 /* '\0' byte plus padding to utf8const_type's alignment. */
957 name_pad = TYPE_ALIGN_UNIT (utf8const_type)
958 - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
959 str_type = build_prim_array_type (unsigned_byte_type_node,
960 name_len + name_pad);
961 PUSH_FIELD (input_location, ctype, field, "hash", unsigned_short_type_node);
962 PUSH_FIELD (input_location,
963 ctype, field, "length", unsigned_short_type_node);
964 PUSH_FIELD (input_location, ctype, field, "data", str_type);
965 FINISH_RECORD (ctype);
966 START_RECORD_CONSTRUCTOR (v, ctype);
967 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
968 PUSH_FIELD_VALUE (v, "hash", build_int_cst (NULL_TREE, name_hash));
969 PUSH_FIELD_VALUE (v, "length", build_int_cst (NULL_TREE, name_len));
970 string = build_string (name_len, name_ptr);
971 TREE_TYPE (string) = str_type;
972 PUSH_FIELD_VALUE (v, "data", string);
973 FINISH_RECORD_CONSTRUCTOR (cinit, v, ctype);
974 TREE_CONSTANT (cinit) = 1;
976 /* Generate a unique-enough identifier. */
977 sprintf(buf, "_Utf%d", ++utf8_count);
979 decl = build_decl (input_location,
980 VAR_DECL, get_identifier (buf), utf8const_type);
981 TREE_STATIC (decl) = 1;
982 DECL_ARTIFICIAL (decl) = 1;
983 DECL_IGNORED_P (decl) = 1;
984 TREE_READONLY (decl) = 1;
985 TREE_THIS_VOLATILE (decl) = 0;
986 DECL_INITIAL (decl) = cinit;
987 DECL_USER_ALIGN (decl) = 1;
989 if (HAVE_GAS_SHF_MERGE)
991 int decl_size;
992 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
993 decl_size = name_len + 4 + name_pad;
994 if (flag_merge_constants && decl_size < 256)
996 char buf[32];
997 int flags = (SECTION_OVERRIDE
998 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
999 sprintf (buf, ".rodata.jutf8.%d", decl_size);
1000 switch_to_section (get_section (buf, flags, NULL));
1001 set_decl_section_name (decl, buf);
1005 layout_decl (decl, 0);
1006 DECL_SIZE (decl) = TYPE_SIZE (ctype);
1007 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (ctype);
1008 pushdecl (decl);
1009 rest_of_decl_compilation (decl, global_bindings_p (), 0);
1010 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
1011 IDENTIFIER_UTF8_REF (name) = ref;
1012 return ref;
1015 /* Like build_class_ref, but instead of a direct reference generate a
1016 pointer into the constant pool. */
1018 static tree
1019 build_indirect_class_ref (tree type)
1021 int index;
1022 tree cl;
1023 index = alloc_class_constant (type);
1024 cl = build_ref_from_constant_pool (index);
1025 return convert (promote_type (class_ptr_type), cl);
1028 static tree
1029 build_static_class_ref (tree type)
1031 tree decl_name, decl, ref;
1033 if (TYPE_SIZE (type) == error_mark_node)
1034 return null_pointer_node;
1035 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1036 "", '/', '/', ".class$$");
1037 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1038 if (decl == NULL_TREE)
1040 decl = build_decl (input_location, VAR_DECL, decl_name, class_type_node);
1041 TREE_STATIC (decl) = 1;
1042 if (! flag_indirect_classes)
1044 TREE_PUBLIC (decl) = 1;
1045 if (CLASS_PRIVATE (TYPE_NAME (type)))
1046 java_hide_decl (decl);
1048 DECL_IGNORED_P (decl) = 1;
1049 DECL_ARTIFICIAL (decl) = 1;
1050 if (is_compiled_class (type) == 1)
1051 DECL_EXTERNAL (decl) = 1;
1052 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1053 DECL_CLASS_FIELD_P (decl) = 1;
1054 DECL_CONTEXT (decl) = type;
1056 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1057 that that means not calling pushdecl_top_level. */
1058 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1061 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1062 return ref;
1065 static tree
1066 build_classdollar_field (tree type)
1068 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1069 "", '/', '/', ".class$");
1070 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1072 if (decl == NULL_TREE)
1074 decl
1075 = build_decl (input_location,
1076 VAR_DECL, decl_name,
1077 (build_qualified_type
1078 (build_pointer_type
1079 (build_qualified_type (class_type_node,
1080 TYPE_QUAL_CONST)),
1081 TYPE_QUAL_CONST)));
1082 TREE_STATIC (decl) = 1;
1083 TREE_CONSTANT (decl) = 1;
1084 TREE_READONLY (decl) = 1;
1085 TREE_PUBLIC (decl) = 1;
1086 java_hide_decl (decl);
1087 DECL_IGNORED_P (decl) = 1;
1088 DECL_ARTIFICIAL (decl) = 1;
1089 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1090 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1091 DECL_CLASS_FIELD_P (decl) = 1;
1092 DECL_CONTEXT (decl) = type;
1095 return decl;
1098 /* Create a local variable that holds the current class$. */
1100 void
1101 cache_this_class_ref (tree fndecl)
1103 if (optimize)
1105 tree classdollar_field;
1106 if (flag_indirect_classes)
1107 classdollar_field = build_classdollar_field (output_class);
1108 else
1109 classdollar_field = build_static_class_ref (output_class);
1111 this_classdollar = build_decl (input_location,
1112 VAR_DECL, NULL_TREE,
1113 TREE_TYPE (classdollar_field));
1115 java_add_local_var (this_classdollar);
1116 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1117 this_classdollar, classdollar_field));
1119 else
1120 this_classdollar = build_classdollar_field (output_class);
1122 /* Prepend class initialization for static methods reachable from
1123 other classes. */
1124 if (METHOD_STATIC (fndecl)
1125 && (! METHOD_PRIVATE (fndecl)
1126 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1127 && ! DECL_CLINIT_P (fndecl)
1128 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1130 tree init = build_call_expr (soft_initclass_node, 1,
1131 this_classdollar);
1132 java_add_stmt (init);
1136 /* Remove the reference to the local variable that holds the current
1137 class$. */
1139 void
1140 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1142 this_classdollar = build_classdollar_field (output_class);
1145 /* Build a reference to the class TYPE.
1146 Also handles primitive types and array types. */
1148 tree
1149 build_class_ref (tree type)
1151 int is_compiled = is_compiled_class (type);
1152 if (is_compiled)
1154 tree ref, decl;
1155 if (TREE_CODE (type) == POINTER_TYPE)
1156 type = TREE_TYPE (type);
1158 if (flag_indirect_dispatch
1159 && type != output_class
1160 && TREE_CODE (type) == RECORD_TYPE)
1161 return build_indirect_class_ref (type);
1163 if (type == output_class && flag_indirect_classes)
1165 /* This can be NULL if we see a JNI stub before we see any
1166 other method. */
1167 if (! this_classdollar)
1168 this_classdollar = build_classdollar_field (output_class);
1169 return this_classdollar;
1172 if (TREE_CODE (type) == RECORD_TYPE)
1173 return build_static_class_ref (type);
1174 else
1176 const char *name;
1177 tree decl_name;
1178 char buffer[25];
1179 decl_name = TYPE_NAME (type);
1180 if (TREE_CODE (decl_name) == TYPE_DECL)
1181 decl_name = DECL_NAME (decl_name);
1182 name = IDENTIFIER_POINTER (decl_name);
1183 if (strncmp (name, "promoted_", 9) == 0)
1184 name += 9;
1185 sprintf (buffer, "_Jv_%sClass", name);
1186 decl_name = get_identifier (buffer);
1187 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1188 if (decl == NULL_TREE)
1190 decl = build_decl (input_location,
1191 VAR_DECL, decl_name, class_type_node);
1192 TREE_STATIC (decl) = 1;
1193 TREE_PUBLIC (decl) = 1;
1194 DECL_EXTERNAL (decl) = 1;
1195 DECL_ARTIFICIAL (decl) = 1;
1196 pushdecl_top_level (decl);
1200 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1201 return ref;
1203 else
1204 return build_indirect_class_ref (type);
1207 /* Create a local statically allocated variable that will hold a
1208 pointer to a static field. */
1210 static tree
1211 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1213 tree decl, decl_name;
1214 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1215 char *buf = (char *) alloca (strlen (name) + 20);
1216 sprintf (buf, "%s_%d_ref", name, index);
1217 decl_name = get_identifier (buf);
1218 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1219 if (decl == NULL_TREE)
1221 decl = build_decl (input_location,
1222 VAR_DECL, decl_name, ptr_type_node);
1223 TREE_STATIC (decl) = 1;
1224 TREE_PUBLIC (decl) = 0;
1225 DECL_EXTERNAL (decl) = 0;
1226 DECL_ARTIFICIAL (decl) = 1;
1227 DECL_IGNORED_P (decl) = 1;
1228 pushdecl_top_level (decl);
1230 return decl;
1233 tree
1234 build_static_field_ref (tree fdecl)
1236 tree fclass = DECL_CONTEXT (fdecl);
1237 int is_compiled = is_compiled_class (fclass);
1239 /* Allow static final fields to fold to a constant. When using
1240 -findirect-dispatch, we simply never do this folding if compiling
1241 from .class; in the .class file constants will be referred to via
1242 the constant pool. */
1243 if (!flag_indirect_dispatch
1244 && (is_compiled
1245 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1246 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1247 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1248 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1250 if (is_compiled == 1)
1251 DECL_EXTERNAL (fdecl) = 1;
1253 else
1255 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1256 and a class local static variable CACHE_ENTRY, then
1258 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1259 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1260 : cache_entry)
1262 This can mostly be optimized away, so that the usual path is a
1263 load followed by a test and branch. _Jv_ResolvePoolEntry is
1264 only called once for each constant pool entry.
1266 There is an optimization that we don't do: at the start of a
1267 method, create a local copy of CACHE_ENTRY and use that instead.
1271 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1272 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1273 tree test
1274 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT), 2,
1275 build2 (EQ_EXPR, boolean_type_node,
1276 cache_entry, null_pointer_node),
1277 boolean_false_node);
1278 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1279 tree init
1280 = build_call_expr (soft_resolvepoolentry_node, 2,
1281 build_class_ref (output_class),
1282 cpool_index_cst);
1283 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1284 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1285 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1286 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1288 return fdecl;
1292 get_access_flags_from_decl (tree decl)
1294 int access_flags = 0;
1295 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1297 if (FIELD_STATIC (decl))
1298 access_flags |= ACC_STATIC;
1299 if (FIELD_PUBLIC (decl))
1300 access_flags |= ACC_PUBLIC;
1301 if (FIELD_PROTECTED (decl))
1302 access_flags |= ACC_PROTECTED;
1303 if (FIELD_PRIVATE (decl))
1304 access_flags |= ACC_PRIVATE;
1305 if (FIELD_FINAL (decl))
1306 access_flags |= ACC_FINAL;
1307 if (FIELD_VOLATILE (decl))
1308 access_flags |= ACC_VOLATILE;
1309 if (FIELD_TRANSIENT (decl))
1310 access_flags |= ACC_TRANSIENT;
1311 if (FIELD_ENUM (decl))
1312 access_flags |= ACC_ENUM;
1313 if (FIELD_SYNTHETIC (decl))
1314 access_flags |= ACC_SYNTHETIC;
1315 return access_flags;
1317 if (TREE_CODE (decl) == TYPE_DECL)
1319 if (CLASS_PUBLIC (decl))
1320 access_flags |= ACC_PUBLIC;
1321 if (CLASS_FINAL (decl))
1322 access_flags |= ACC_FINAL;
1323 if (CLASS_SUPER (decl))
1324 access_flags |= ACC_SUPER;
1325 if (CLASS_INTERFACE (decl))
1326 access_flags |= ACC_INTERFACE;
1327 if (CLASS_ABSTRACT (decl))
1328 access_flags |= ACC_ABSTRACT;
1329 if (CLASS_STATIC (decl))
1330 access_flags |= ACC_STATIC;
1331 if (CLASS_PRIVATE (decl))
1332 access_flags |= ACC_PRIVATE;
1333 if (CLASS_PROTECTED (decl))
1334 access_flags |= ACC_PROTECTED;
1335 if (CLASS_STRICTFP (decl))
1336 access_flags |= ACC_STRICT;
1337 if (CLASS_ENUM (decl))
1338 access_flags |= ACC_ENUM;
1339 if (CLASS_SYNTHETIC (decl))
1340 access_flags |= ACC_SYNTHETIC;
1341 if (CLASS_ANNOTATION (decl))
1342 access_flags |= ACC_ANNOTATION;
1343 return access_flags;
1345 if (TREE_CODE (decl) == FUNCTION_DECL)
1347 if (METHOD_PUBLIC (decl))
1348 access_flags |= ACC_PUBLIC;
1349 if (METHOD_PRIVATE (decl))
1350 access_flags |= ACC_PRIVATE;
1351 if (METHOD_PROTECTED (decl))
1352 access_flags |= ACC_PROTECTED;
1353 if (METHOD_STATIC (decl))
1354 access_flags |= ACC_STATIC;
1355 if (METHOD_FINAL (decl))
1356 access_flags |= ACC_FINAL;
1357 if (METHOD_SYNCHRONIZED (decl))
1358 access_flags |= ACC_SYNCHRONIZED;
1359 if (METHOD_NATIVE (decl))
1360 access_flags |= ACC_NATIVE;
1361 if (METHOD_ABSTRACT (decl))
1362 access_flags |= ACC_ABSTRACT;
1363 if (METHOD_STRICTFP (decl))
1364 access_flags |= ACC_STRICT;
1365 if (METHOD_INVISIBLE (decl))
1366 access_flags |= ACC_INVISIBLE;
1367 if (DECL_ARTIFICIAL (decl))
1368 access_flags |= ACC_SYNTHETIC;
1369 if (METHOD_BRIDGE (decl))
1370 access_flags |= ACC_BRIDGE;
1371 if (METHOD_VARARGS (decl))
1372 access_flags |= ACC_VARARGS;
1373 return access_flags;
1375 gcc_unreachable ();
1378 static GTY (()) int alias_labelno = 0;
1380 /* Create a private alias for METHOD. Using this alias instead of the method
1381 decl ensures that ncode entries in the method table point to the real function
1382 at runtime, not a PLT entry. */
1384 static tree
1385 make_local_function_alias (tree method)
1387 #ifdef ASM_OUTPUT_DEF
1388 tree alias;
1390 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1391 char *name = (char *) alloca (strlen (method_name) + 2);
1392 char *buf = (char *) alloca (strlen (method_name) + 128);
1394 /* Only create aliases for local functions. */
1395 if (DECL_EXTERNAL (method))
1396 return method;
1398 /* Prefix method_name with 'L' for the alias label. */
1399 *name = 'L';
1400 strcpy (name + 1, method_name);
1402 targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);
1403 alias = build_decl (input_location,
1404 FUNCTION_DECL, get_identifier (buf),
1405 TREE_TYPE (method));
1406 DECL_CONTEXT (alias) = NULL;
1407 TREE_READONLY (alias) = TREE_READONLY (method);
1408 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1409 TREE_PUBLIC (alias) = 0;
1410 DECL_EXTERNAL (alias) = 0;
1411 DECL_ARTIFICIAL (alias) = 1;
1412 DECL_INITIAL (alias) = error_mark_node;
1413 TREE_ADDRESSABLE (alias) = 1;
1414 TREE_USED (alias) = 1;
1415 if (!flag_syntax_only)
1416 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1417 return alias;
1418 #else
1419 return method;
1420 #endif
1423 /** Make reflection data (_Jv_Field) for field FDECL. */
1425 static tree
1426 make_field_value (tree fdecl)
1428 tree finit;
1429 int flags;
1430 tree type = TREE_TYPE (fdecl);
1431 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1432 vec<constructor_elt, va_gc> *v = NULL;
1434 START_RECORD_CONSTRUCTOR (v, field_type_node);
1435 PUSH_FIELD_VALUE (v, "name", build_utf8_ref (DECL_NAME (fdecl)));
1436 if (resolved)
1437 type = build_class_ref (type);
1438 else
1440 tree signature = build_java_signature (type);
1442 type = build_utf8_ref (unmangle_classname
1443 (IDENTIFIER_POINTER (signature),
1444 IDENTIFIER_LENGTH (signature)));
1446 PUSH_FIELD_VALUE (v, "type", type);
1448 flags = get_access_flags_from_decl (fdecl);
1449 if (! resolved)
1450 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1452 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, flags));
1453 PUSH_FIELD_VALUE (v, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1456 tree field_address = integer_zero_node;
1457 tree index, value;
1458 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1459 && FIELD_STATIC (fdecl))
1460 field_address = build_address_of (fdecl);
1462 index = (FIELD_STATIC (fdecl)
1463 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node))
1464 : TYPE_FIELDS (field_info_union_node));
1465 value = (FIELD_STATIC (fdecl)
1466 ? field_address
1467 : byte_position (fdecl));
1469 PUSH_FIELD_VALUE
1470 (v, "info",
1471 build_constructor_single (field_info_union_node, index, value));
1474 FINISH_RECORD_CONSTRUCTOR (finit, v, field_type_node);
1475 return finit;
1478 /** Make reflection data (_Jv_Method) for method MDECL. */
1480 static tree
1481 make_method_value (tree mdecl)
1483 static int method_name_count = 0;
1484 tree minit;
1485 tree index;
1486 tree code;
1487 tree class_decl;
1488 #define ACC_TRANSLATED 0x4000
1489 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1490 vec<constructor_elt, va_gc> *v = NULL;
1492 class_decl = DECL_CONTEXT (mdecl);
1493 /* For interfaces, the index field contains the dispatch index. */
1494 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1495 index = build_int_cst (NULL_TREE,
1496 get_interface_method_index (mdecl, class_decl));
1497 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1498 index = get_method_index (mdecl);
1499 else
1500 index = integer_minus_one_node;
1502 code = null_pointer_node;
1503 if (METHOD_ABSTRACT (mdecl))
1504 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1505 soft_abstractmethod_node);
1506 else
1507 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1508 make_local_function_alias (mdecl));
1509 START_RECORD_CONSTRUCTOR (v, method_type_node);
1510 PUSH_FIELD_VALUE (v, "name",
1511 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1512 init_identifier_node
1513 : DECL_NAME (mdecl)));
1515 tree signature = build_java_signature (TREE_TYPE (mdecl));
1516 PUSH_FIELD_VALUE (v, "signature",
1517 (build_utf8_ref
1518 (unmangle_classname
1519 (IDENTIFIER_POINTER(signature),
1520 IDENTIFIER_LENGTH(signature)))));
1522 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, accflags));
1523 PUSH_FIELD_VALUE (v, "index", index);
1524 PUSH_FIELD_VALUE (v, "ncode", code);
1527 /* Compute the `throws' information for the method. */
1528 tree table = null_pointer_node;
1530 if (!vec_safe_is_empty (DECL_FUNCTION_THROWS (mdecl)))
1532 int length = 1 + DECL_FUNCTION_THROWS (mdecl)->length ();
1533 tree t, type, array;
1534 char buf[60];
1535 vec<constructor_elt, va_gc> *v = NULL;
1536 int idx = length - 1;
1537 unsigned ix;
1538 constructor_elt *e;
1540 vec_alloc (v, length);
1541 v->quick_grow_cleared (length);
1543 e = &(*v)[idx--];
1544 e->value = null_pointer_node;
1546 FOR_EACH_VEC_SAFE_ELT (DECL_FUNCTION_THROWS (mdecl), ix, t)
1548 tree sig = DECL_NAME (TYPE_NAME (t));
1549 tree utf8
1550 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1551 IDENTIFIER_LENGTH (sig)));
1552 e = &(*v)[idx--];
1553 e->value = utf8;
1555 gcc_assert (idx == -1);
1556 type = build_prim_array_type (ptr_type_node, length);
1557 table = build_constructor (type, v);
1558 /* Compute something unique enough. */
1559 sprintf (buf, "_methods%d", method_name_count++);
1560 array = build_decl (input_location,
1561 VAR_DECL, get_identifier (buf), type);
1562 DECL_INITIAL (array) = table;
1563 TREE_STATIC (array) = 1;
1564 DECL_ARTIFICIAL (array) = 1;
1565 DECL_IGNORED_P (array) = 1;
1566 rest_of_decl_compilation (array, 1, 0);
1568 table = build1 (ADDR_EXPR, ptr_type_node, array);
1571 PUSH_FIELD_VALUE (v, "throws", table);
1574 FINISH_RECORD_CONSTRUCTOR (minit, v, method_type_node);
1575 return minit;
1578 static tree
1579 get_dispatch_vector (tree type)
1581 tree vtable = TYPE_VTABLE (type);
1583 if (vtable == NULL_TREE)
1585 HOST_WIDE_INT i;
1586 tree method;
1587 tree super = CLASSTYPE_SUPER (type);
1588 HOST_WIDE_INT nvirtuals = tree_to_shwi (TYPE_NVIRTUALS (type));
1589 vtable = make_tree_vec (nvirtuals);
1590 TYPE_VTABLE (type) = vtable;
1591 if (super != NULL_TREE)
1593 tree super_vtable = get_dispatch_vector (super);
1595 for (i = tree_to_shwi (TYPE_NVIRTUALS (super)); --i >= 0; )
1596 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1599 for (method = TYPE_METHODS (type); method != NULL_TREE;
1600 method = DECL_CHAIN (method))
1602 tree method_index = get_method_index (method);
1603 if (method_index != NULL_TREE
1604 && tree_fits_shwi_p (method_index))
1605 TREE_VEC_ELT (vtable, tree_to_shwi (method_index)) = method;
1609 return vtable;
1612 static tree
1613 get_dispatch_table (tree type, tree this_class_addr)
1615 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1616 tree vtable = get_dispatch_vector (type);
1617 int i, j;
1618 int nvirtuals = TREE_VEC_LENGTH (vtable);
1619 int arraysize;
1620 tree gc_descr;
1621 vec<constructor_elt, va_gc> *v = NULL;
1622 constructor_elt *e;
1623 tree arraytype;
1625 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1626 if (TARGET_VTABLE_USES_DESCRIPTORS)
1627 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1628 arraysize += 2;
1630 vec_safe_grow_cleared (v, arraysize);
1631 e = &(*v)[arraysize - 1];
1633 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1634 for (i = nvirtuals; --i >= 0; )
1636 tree method = TREE_VEC_ELT (vtable, i);
1637 if (METHOD_ABSTRACT (method))
1639 if (! abstract_p)
1640 warning_at (DECL_SOURCE_LOCATION (method), 0,
1641 "abstract method in non-abstract class");
1643 if (TARGET_VTABLE_USES_DESCRIPTORS)
1644 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1645 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1646 else
1647 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1649 else
1651 if (TARGET_VTABLE_USES_DESCRIPTORS)
1652 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1654 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1655 method, build_int_cst (NULL_TREE, j));
1656 TREE_CONSTANT (fdesc) = 1;
1657 CONSTRUCTOR_PREPEND_VALUE (e, fdesc);
1659 else
1660 CONSTRUCTOR_PREPEND_VALUE (e,
1661 build1 (ADDR_EXPR,
1662 nativecode_ptr_type_node,
1663 method));
1667 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1668 using the Boehm GC we sometimes stash a GC type descriptor
1669 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1670 the emitted byte count during the output to the assembly file. */
1671 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1672 fake "function descriptor". It's first word is the is the class
1673 pointer, and subsequent words (usually one) contain the GC descriptor.
1674 In all other cases, we reserve two extra vtable slots. */
1675 gc_descr = get_boehm_type_descriptor (type);
1676 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1677 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1678 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1679 CONSTRUCTOR_PREPEND_VALUE (e, this_class_addr);
1681 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1682 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1683 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1684 gcc_assert (e == v->address ());
1685 e->index = integer_zero_node;
1686 e->value = null_pointer_node;
1687 #undef CONSTRUCTOR_PREPEND_VALUE
1689 arraytype = build_prim_array_type (nativecode_ptr_type_node, arraysize);
1690 return build_constructor (arraytype, v);
1694 /* Set the method_index for a method decl. */
1695 void
1696 set_method_index (tree decl, tree method_index)
1698 if (method_index != NULL_TREE)
1700 /* method_index is null if we're using indirect dispatch. */
1701 method_index = fold (convert (sizetype, method_index));
1703 if (TARGET_VTABLE_USES_DESCRIPTORS)
1704 /* Add one to skip bogus descriptor for class and GC descriptor. */
1705 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1706 else
1707 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1708 descriptor. */
1709 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1712 DECL_VINDEX (decl) = method_index;
1715 /* Get the method_index for a method decl. */
1716 tree
1717 get_method_index (tree decl)
1719 tree method_index = DECL_VINDEX (decl);
1721 if (! method_index)
1722 return NULL;
1724 if (TARGET_VTABLE_USES_DESCRIPTORS)
1725 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1726 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1727 else
1728 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1729 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1731 return method_index;
1734 static int
1735 supers_all_compiled (tree type)
1737 while (type != NULL_TREE)
1739 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1740 return 0;
1741 type = CLASSTYPE_SUPER (type);
1743 return 1;
1746 static void
1747 add_table_and_syms (vec<constructor_elt, va_gc> **v,
1748 vec<method_entry, va_gc> *methods,
1749 const char *table_name, tree table_slot, tree table_type,
1750 const char *syms_name, tree syms_slot)
1752 if (methods == NULL)
1754 PUSH_FIELD_VALUE (*v, table_name, null_pointer_node);
1755 PUSH_FIELD_VALUE (*v, syms_name, null_pointer_node);
1757 else
1759 pushdecl_top_level (syms_slot);
1760 PUSH_FIELD_VALUE (*v, table_name,
1761 build1 (ADDR_EXPR, table_type, table_slot));
1762 PUSH_FIELD_VALUE (*v, syms_name,
1763 build1 (ADDR_EXPR, symbols_array_ptr_type,
1764 syms_slot));
1765 TREE_CONSTANT (table_slot) = 1;
1769 void
1770 make_class_data (tree type)
1772 tree decl, cons, temp;
1773 tree field, fields_decl;
1774 HOST_WIDE_INT static_field_count = 0;
1775 HOST_WIDE_INT instance_field_count = 0;
1776 HOST_WIDE_INT field_count;
1777 tree field_array_type;
1778 tree method;
1779 tree dtable_decl = NULL_TREE;
1780 HOST_WIDE_INT method_count = 0;
1781 tree method_array_type;
1782 tree methods_decl;
1783 tree super;
1784 tree this_class_addr;
1785 tree constant_pool_constructor;
1786 tree interfaces = null_pointer_node;
1787 int interface_len = 0;
1788 int uses_jv_markobj = 0;
1789 tree type_decl = TYPE_NAME (type);
1790 tree id_main = get_identifier("main");
1791 tree id_class = get_identifier("java.lang.Class");
1792 /** Offset from start of virtual function table declaration
1793 to where objects actually point at, following new g++ ABI. */
1794 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1795 vec<int> field_indexes;
1796 tree first_real_field;
1797 vec<constructor_elt, va_gc> *v1 = NULL, *v2 = NULL;
1798 tree reflection_data;
1799 vec<constructor_elt, va_gc> *static_fields = NULL;
1800 vec<constructor_elt, va_gc> *instance_fields = NULL;
1801 vec<constructor_elt, va_gc> *methods = NULL;
1803 this_class_addr = build_static_class_ref (type);
1804 decl = TREE_OPERAND (this_class_addr, 0);
1806 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1807 && !flag_indirect_dispatch)
1809 tree dtable = get_dispatch_table (type, this_class_addr);
1810 uses_jv_markobj = uses_jv_markobj_p (dtable);
1811 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1813 /* We've already created some other class, and consequently
1814 we made class_dtable_decl. Now we just want to fill it
1815 in. */
1816 dtable_decl = class_dtable_decl;
1818 else
1820 dtable_decl = build_dtable_decl (type);
1821 TREE_STATIC (dtable_decl) = 1;
1822 DECL_ARTIFICIAL (dtable_decl) = 1;
1823 DECL_IGNORED_P (dtable_decl) = 1;
1826 TREE_PUBLIC (dtable_decl) = 1;
1827 DECL_INITIAL (dtable_decl) = dtable;
1828 /* The only dispatch table exported from a DSO is the dispatch
1829 table for java.lang.Class. */
1830 if (DECL_NAME (type_decl) != id_class)
1831 java_hide_decl (dtable_decl);
1832 if (! flag_indirect_classes)
1833 rest_of_decl_compilation (dtable_decl, 1, 0);
1834 /* Maybe we're compiling Class as the first class. If so, set
1835 class_dtable_decl to the decl we just made. */
1836 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1837 class_dtable_decl = dtable_decl;
1840 /* Build Field array. */
1841 field = TYPE_FIELDS (type);
1842 while (field && DECL_ARTIFICIAL (field))
1843 field = DECL_CHAIN (field); /* Skip dummy fields. */
1844 if (field && DECL_NAME (field) == NULL_TREE)
1845 field = DECL_CHAIN (field); /* Skip dummy field for inherited data. */
1846 first_real_field = field;
1848 /* First count static and instance fields. */
1849 for ( ; field != NULL_TREE; field = DECL_CHAIN (field))
1851 if (! DECL_ARTIFICIAL (field))
1853 if (FIELD_STATIC (field))
1854 static_field_count++;
1855 else if (uses_jv_markobj || !flag_reduced_reflection)
1856 instance_field_count++;
1859 field_count = static_field_count + instance_field_count;
1860 field_indexes.create (field_count);
1862 /* gcj sorts fields so that static fields come first, followed by
1863 instance fields. Unfortunately, by the time this takes place we
1864 have already generated the reflection_data for this class, and
1865 that data contains indexes into the fields. So, we generate a
1866 permutation that maps each original field index to its final
1867 position. Then we pass this permutation to
1868 rewrite_reflection_indexes(), which fixes up the reflection
1869 data. */
1871 int i;
1872 int static_count = 0;
1873 int instance_count = static_field_count;
1874 int field_index;
1876 for (i = 0, field = first_real_field;
1877 field != NULL_TREE;
1878 field = DECL_CHAIN (field), i++)
1880 if (! DECL_ARTIFICIAL (field))
1882 field_index = 0;
1883 if (FIELD_STATIC (field))
1884 field_index = static_count++;
1885 else if (uses_jv_markobj || !flag_reduced_reflection)
1886 field_index = instance_count++;
1887 else
1888 continue;
1889 field_indexes.quick_push (field_index);
1894 for (field = first_real_field; field != NULL_TREE;
1895 field = DECL_CHAIN (field))
1897 if (! DECL_ARTIFICIAL (field))
1899 if (FIELD_STATIC (field))
1901 /* We must always create reflection data for static fields
1902 as it is used in the creation of the field itself. */
1903 tree init = make_field_value (field);
1904 tree initial = DECL_INITIAL (field);
1905 CONSTRUCTOR_APPEND_ELT (static_fields, NULL_TREE, init);
1906 /* If the initial value is a string constant,
1907 prevent output_constant from trying to assemble the value. */
1908 if (initial != NULL_TREE
1909 && TREE_TYPE (initial) == string_ptr_type_node)
1910 DECL_INITIAL (field) = NULL_TREE;
1911 rest_of_decl_compilation (field, 1, 1);
1912 DECL_INITIAL (field) = initial;
1914 else if (uses_jv_markobj || !flag_reduced_reflection)
1916 tree init = make_field_value (field);
1917 CONSTRUCTOR_APPEND_ELT (instance_fields, NULL_TREE, init);
1922 gcc_assert (static_field_count == (int) vec_safe_length (static_fields));
1923 gcc_assert (instance_field_count == (int) vec_safe_length (instance_fields));
1925 if (field_count > 0)
1927 vec_safe_splice (static_fields, instance_fields);
1928 field_array_type = build_prim_array_type (field_type_node, field_count);
1929 fields_decl = build_decl (input_location,
1930 VAR_DECL, mangled_classname ("_FL_", type),
1931 field_array_type);
1932 DECL_INITIAL (fields_decl)
1933 = build_constructor (field_array_type, static_fields);
1934 TREE_STATIC (fields_decl) = 1;
1935 DECL_ARTIFICIAL (fields_decl) = 1;
1936 DECL_IGNORED_P (fields_decl) = 1;
1937 rest_of_decl_compilation (fields_decl, 1, 0);
1939 else
1940 fields_decl = NULL_TREE;
1942 /* Build Method array. */
1943 for (method = TYPE_METHODS (type);
1944 method != NULL_TREE; method = DECL_CHAIN (method))
1946 tree init;
1947 if (METHOD_PRIVATE (method)
1948 && ! flag_keep_inline_functions
1949 && optimize)
1950 continue;
1951 /* Even if we have a decl, we don't necessarily have the code.
1952 This can happen if we inherit a method from a superclass for
1953 which we don't have a .class file. */
1954 if (METHOD_DUMMY (method))
1955 continue;
1957 /* Generate method reflection data if:
1959 - !flag_reduced_reflection.
1961 - <clinit> -- The runtime uses reflection to initialize the
1962 class.
1964 - Any method in class java.lang.Class -- Class.forName() and
1965 perhaps other things require it.
1967 - class$ -- It does not work if reflection data missing.
1969 - main -- Reflection is used to find main(String[]) methods.
1971 - public not static -- It is potentially part of an
1972 interface. The runtime uses reflection data to build
1973 interface dispatch tables. */
1974 if (!flag_reduced_reflection
1975 || DECL_CLINIT_P (method)
1976 || DECL_NAME (type_decl) == id_class
1977 || DECL_NAME (method) == id_main
1978 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
1980 init = make_method_value (method);
1981 method_count++;
1982 CONSTRUCTOR_APPEND_ELT (methods, NULL_TREE, init);
1985 method_array_type = build_prim_array_type (method_type_node, method_count);
1986 methods_decl = build_decl (input_location,
1987 VAR_DECL, mangled_classname ("_MT_", type),
1988 method_array_type);
1989 DECL_INITIAL (methods_decl) = build_constructor (method_array_type, methods);
1990 TREE_STATIC (methods_decl) = 1;
1991 DECL_ARTIFICIAL (methods_decl) = 1;
1992 DECL_IGNORED_P (methods_decl) = 1;
1993 rest_of_decl_compilation (methods_decl, 1, 0);
1995 if (class_dtable_decl == NULL_TREE)
1997 class_dtable_decl = build_dtable_decl (class_type_node);
1998 TREE_STATIC (class_dtable_decl) = 1;
1999 DECL_ARTIFICIAL (class_dtable_decl) = 1;
2000 DECL_IGNORED_P (class_dtable_decl) = 1;
2001 if (is_compiled_class (class_type_node) != 2)
2003 DECL_EXTERNAL (class_dtable_decl) = 1;
2004 rest_of_decl_compilation (class_dtable_decl, 1, 0);
2008 super = CLASSTYPE_SUPER (type);
2009 if (super == NULL_TREE)
2010 super = null_pointer_node;
2011 else if (! flag_indirect_dispatch
2012 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
2013 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
2014 super = build_class_ref (super);
2015 else
2017 int super_index = alloc_class_constant (super);
2018 super = build_int_cst (ptr_type_node, super_index);
2021 /* Build and emit the array of implemented interfaces. */
2022 if (type != object_type_node)
2023 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
2025 if (interface_len > 0)
2027 int i;
2028 tree interface_array_type, idecl;
2029 vec<constructor_elt, va_gc> *init;
2030 vec_alloc (init, interface_len);
2031 interface_array_type
2032 = build_prim_array_type (class_ptr_type, interface_len);
2033 idecl = build_decl (input_location,
2034 VAR_DECL, mangled_classname ("_IF_", type),
2035 interface_array_type);
2037 for (i = 1; i <= interface_len; i++)
2039 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
2040 tree iclass = BINFO_TYPE (child);
2041 tree index;
2042 if (! flag_indirect_dispatch
2043 && (assume_compiled
2044 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
2045 index = build_class_ref (iclass);
2046 else
2048 int int_index = alloc_class_constant (iclass);
2049 index = build_int_cst (ptr_type_node, int_index);
2051 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, index);
2053 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
2054 TREE_STATIC (idecl) = 1;
2055 DECL_ARTIFICIAL (idecl) = 1;
2056 DECL_IGNORED_P (idecl) = 1;
2057 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
2058 rest_of_decl_compilation (idecl, 1, 0);
2061 constant_pool_constructor = build_constants_constructor ();
2063 if (flag_indirect_dispatch)
2065 TYPE_OTABLE_DECL (type)
2066 = emit_symbol_table
2067 (DECL_NAME (TYPE_OTABLE_DECL (type)),
2068 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
2069 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
2071 TYPE_ATABLE_DECL (type)
2072 = emit_symbol_table
2073 (DECL_NAME (TYPE_ATABLE_DECL (type)),
2074 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
2075 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
2077 TYPE_ITABLE_DECL (type)
2078 = emit_symbol_table
2079 (DECL_NAME (TYPE_ITABLE_DECL (type)),
2080 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
2081 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
2084 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
2086 START_RECORD_CONSTRUCTOR (v1, object_type_node);
2087 PUSH_FIELD_VALUE (v1, "vtable",
2088 (flag_indirect_classes
2089 ? null_pointer_node
2090 : fold_build_pointer_plus
2091 (build1 (ADDR_EXPR, dtable_ptr_type,
2092 class_dtable_decl),
2093 dtable_start_offset)));
2094 if (! flag_hash_synchronization)
2095 PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
2096 FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
2097 START_RECORD_CONSTRUCTOR (v2, class_type_node);
2098 PUSH_SUPER_VALUE (v2, temp);
2099 PUSH_FIELD_VALUE (v2, "next_or_version", gcj_abi_version);
2100 PUSH_FIELD_VALUE (v2, "name", build_utf8_ref (DECL_NAME (type_decl)));
2101 PUSH_FIELD_VALUE (v2, "accflags",
2102 build_int_cst (NULL_TREE,
2103 get_access_flags_from_decl (type_decl)));
2105 PUSH_FIELD_VALUE (v2, "superclass",
2106 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
2107 PUSH_FIELD_VALUE (v2, "constants", constant_pool_constructor);
2108 PUSH_FIELD_VALUE (v2, "methods",
2109 methods_decl == NULL_TREE ? null_pointer_node
2110 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
2111 PUSH_FIELD_VALUE (v2, "method_count",
2112 build_int_cst (NULL_TREE, method_count));
2114 PUSH_FIELD_VALUE (v2, "vtable_method_count",
2115 (flag_indirect_dispatch
2116 ? integer_minus_one_node
2117 : TYPE_NVIRTUALS (type)));
2119 PUSH_FIELD_VALUE (v2, "fields",
2120 fields_decl == NULL_TREE ? null_pointer_node
2121 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2122 /* If we're using the binary compatibility ABI we don't know the
2123 size until load time. */
2124 PUSH_FIELD_VALUE (v2, "size_in_bytes",
2125 (flag_indirect_dispatch
2126 ? integer_minus_one_node
2127 : size_in_bytes (type)));
2128 PUSH_FIELD_VALUE (v2, "field_count",
2129 build_int_cst (NULL_TREE, field_count));
2130 PUSH_FIELD_VALUE (v2, "static_field_count",
2131 build_int_cst (NULL_TREE, static_field_count));
2133 PUSH_FIELD_VALUE (v2, "vtable",
2134 (flag_indirect_dispatch || dtable_decl == NULL_TREE
2135 ? null_pointer_node
2136 : fold_build_pointer_plus
2137 (build1 (ADDR_EXPR, dtable_ptr_type,
2138 dtable_decl),
2139 dtable_start_offset)));
2140 add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
2141 "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
2142 "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
2143 add_table_and_syms (&v2, TYPE_ATABLE_METHODS (type),
2144 "atable", TYPE_ATABLE_DECL (type), atable_ptr_type,
2145 "atable_syms", TYPE_ATABLE_SYMS_DECL (type));
2146 add_table_and_syms (&v2, TYPE_ITABLE_METHODS (type),
2147 "itable", TYPE_ITABLE_DECL (type), itable_ptr_type,
2148 "itable_syms", TYPE_ITABLE_SYMS_DECL (type));
2150 PUSH_FIELD_VALUE (v2, "catch_classes",
2151 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2152 PUSH_FIELD_VALUE (v2, "interfaces", interfaces);
2153 PUSH_FIELD_VALUE (v2, "loader", null_pointer_node);
2154 PUSH_FIELD_VALUE (v2, "interface_count",
2155 build_int_cst (NULL_TREE, interface_len));
2156 PUSH_FIELD_VALUE (v2, "state",
2157 convert (byte_type_node,
2158 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2160 PUSH_FIELD_VALUE (v2, "thread", null_pointer_node);
2161 PUSH_FIELD_VALUE (v2, "depth", integer_zero_node);
2162 PUSH_FIELD_VALUE (v2, "ancestors", null_pointer_node);
2163 PUSH_FIELD_VALUE (v2, "idt", null_pointer_node);
2164 PUSH_FIELD_VALUE (v2, "arrayclass", null_pointer_node);
2165 PUSH_FIELD_VALUE (v2, "protectionDomain", null_pointer_node);
2168 tree assertion_table_ref;
2169 if (TYPE_ASSERTIONS (type) == NULL)
2170 assertion_table_ref = null_pointer_node;
2171 else
2172 assertion_table_ref = build1 (ADDR_EXPR,
2173 build_pointer_type (assertion_table_type),
2174 emit_assertion_table (type));
2176 PUSH_FIELD_VALUE (v2, "assertion_table", assertion_table_ref);
2179 PUSH_FIELD_VALUE (v2, "hack_signers", null_pointer_node);
2180 PUSH_FIELD_VALUE (v2, "chain", null_pointer_node);
2181 PUSH_FIELD_VALUE (v2, "aux_info", null_pointer_node);
2182 PUSH_FIELD_VALUE (v2, "engine", null_pointer_node);
2184 if (TYPE_REFLECTION_DATA (current_class))
2186 int i;
2187 int count = TYPE_REFLECTION_DATASIZE (current_class);
2188 vec<constructor_elt, va_gc> *v;
2189 vec_alloc (v, count);
2190 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2191 tree max_index = build_int_cst (sizetype, count);
2192 tree index = build_index_type (max_index);
2193 tree type = build_array_type (unsigned_byte_type_node, index);
2194 char buf[64];
2195 tree array;
2196 static int reflection_data_count;
2198 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2199 array = build_decl (input_location,
2200 VAR_DECL, get_identifier (buf), type);
2202 rewrite_reflection_indexes (&field_indexes);
2204 for (i = 0; i < count; i++)
2206 constructor_elt elt;
2207 elt.index = build_int_cst (sizetype, i);
2208 elt.value = build_int_cstu (byte_type_node, data[i]);
2209 v->quick_push (elt);
2212 DECL_INITIAL (array) = build_constructor (type, v);
2213 TREE_STATIC (array) = 1;
2214 DECL_ARTIFICIAL (array) = 1;
2215 DECL_IGNORED_P (array) = 1;
2216 TREE_READONLY (array) = 1;
2217 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2218 rest_of_decl_compilation (array, 1, 0);
2220 reflection_data = build_address_of (array);
2222 free (data);
2223 TYPE_REFLECTION_DATA (current_class) = NULL;
2225 else
2226 reflection_data = null_pointer_node;
2228 PUSH_FIELD_VALUE (v2, "reflection_data", reflection_data);
2229 FINISH_RECORD_CONSTRUCTOR (cons, v2, class_type_node);
2231 DECL_INITIAL (decl) = cons;
2233 /* Hash synchronization requires at least 64-bit alignment. */
2234 if (flag_hash_synchronization && POINTER_SIZE < 64)
2235 DECL_ALIGN (decl) = 64;
2237 if (flag_indirect_classes)
2239 TREE_READONLY (decl) = 1;
2240 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2243 rest_of_decl_compilation (decl, 1, 0);
2246 tree classdollar_field = build_classdollar_field (type);
2247 if (!flag_indirect_classes)
2248 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2249 rest_of_decl_compilation (classdollar_field, 1, 0);
2252 TYPE_OTABLE_DECL (type) = NULL_TREE;
2253 TYPE_ATABLE_DECL (type) = NULL_TREE;
2254 TYPE_CTABLE_DECL (type) = NULL_TREE;
2257 void
2258 finish_class (void)
2260 java_expand_catch_classes (current_class);
2262 current_function_decl = NULL_TREE;
2263 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2264 make_class_data (current_class);
2265 register_class ();
2266 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2269 /* Return 2 if KLASS is compiled by this compilation job;
2270 return 1 if KLASS can otherwise be assumed to be compiled;
2271 return 0 if we cannot assume that KLASS is compiled.
2272 Returns 1 for primitive and 0 for array types. */
2274 is_compiled_class (tree klass)
2276 int seen_in_zip;
2277 if (TREE_CODE (klass) == POINTER_TYPE)
2278 klass = TREE_TYPE (klass);
2279 if (TREE_CODE (klass) != RECORD_TYPE) /* Primitive types are static. */
2280 return 1;
2281 if (TYPE_ARRAY_P (klass))
2282 return 0;
2284 seen_in_zip = (TYPE_JCF (klass) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass)));
2285 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass))
2287 /* The class was seen in the current ZIP file and will be
2288 available as a compiled class in the future but may not have
2289 been loaded already. Load it if necessary. This prevent
2290 build_class_ref () from crashing. */
2292 if (seen_in_zip && !CLASS_LOADED_P (klass) && (klass != current_class))
2293 load_class (klass, 1);
2295 /* We return 2 for class seen in ZIP and class from files
2296 belonging to the same compilation unit */
2297 return 2;
2300 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass)))))
2302 if (!CLASS_LOADED_P (klass))
2304 if (klass != current_class)
2305 load_class (klass, 1);
2307 return 1;
2310 return 0;
2313 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2315 tree
2316 build_dtable_decl (tree type)
2318 tree dtype, decl;
2320 /* We need to build a new dtable type so that its size is uniquely
2321 computed when we're dealing with the class for real and not just
2322 faking it (like java.lang.Class during the initialization of the
2323 compiler.) We know we're not faking a class when CURRENT_CLASS is
2324 TYPE. */
2325 if (current_class == type)
2327 tree dummy = NULL_TREE;
2328 int n;
2330 dtype = make_node (RECORD_TYPE);
2332 PUSH_FIELD (input_location, dtype, dummy, "top_offset", ptr_type_node);
2333 PUSH_FIELD (input_location, dtype, dummy, "type_info", ptr_type_node);
2335 PUSH_FIELD (input_location, dtype, dummy, "class", class_ptr_type);
2336 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2338 tree tmp_field = build_decl (input_location,
2339 FIELD_DECL, NULL_TREE, ptr_type_node);
2340 TREE_CHAIN (dummy) = tmp_field;
2341 DECL_CONTEXT (tmp_field) = dtype;
2342 DECL_ARTIFICIAL (tmp_field) = 1;
2343 dummy = tmp_field;
2346 PUSH_FIELD (input_location, dtype, dummy, "gc_descr", ptr_type_node);
2347 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2349 tree tmp_field = build_decl (input_location,
2350 FIELD_DECL, NULL_TREE, ptr_type_node);
2351 TREE_CHAIN (dummy) = tmp_field;
2352 DECL_CONTEXT (tmp_field) = dtype;
2353 DECL_ARTIFICIAL (tmp_field) = 1;
2354 dummy = tmp_field;
2357 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2358 if (TARGET_VTABLE_USES_DESCRIPTORS)
2359 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2361 PUSH_FIELD (input_location, dtype, dummy, "methods",
2362 build_prim_array_type (nativecode_ptr_type_node, n));
2363 layout_type (dtype);
2365 else
2366 dtype = dtable_type;
2368 decl = build_decl (input_location,
2369 VAR_DECL, get_identifier ("vt$"), dtype);
2370 DECL_CONTEXT (decl) = type;
2371 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2372 DECL_VTABLE_P (decl) = 1;
2374 return decl;
2377 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2378 fields inherited from SUPER_CLASS. */
2380 void
2381 push_super_field (tree this_class, tree super_class)
2383 tree base_decl;
2384 /* Don't insert the field if we're just re-laying the class out. */
2385 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2386 return;
2387 base_decl = build_decl (input_location,
2388 FIELD_DECL, NULL_TREE, super_class);
2389 DECL_IGNORED_P (base_decl) = 1;
2390 DECL_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2391 TYPE_FIELDS (this_class) = base_decl;
2392 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2393 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2396 /* Handle the different manners we may have to lay out a super class. */
2398 static tree
2399 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2401 if (!super_class)
2402 return NULL_TREE;
2403 else if (TREE_CODE (super_class) == RECORD_TYPE)
2405 if (!CLASS_LOADED_P (super_class))
2406 load_class (super_class, 1);
2408 /* We might have to layout the class before its dependency on
2409 the super class gets resolved by java_complete_class */
2410 else if (TREE_CODE (super_class) == POINTER_TYPE)
2412 if (TREE_TYPE (super_class) != NULL_TREE)
2413 super_class = TREE_TYPE (super_class);
2414 else
2415 gcc_unreachable ();
2417 if (!TYPE_SIZE (super_class))
2418 safe_layout_class (super_class);
2420 return super_class;
2423 /* safe_layout_class just makes sure that we can load a class without
2424 disrupting the current_class, input_location, etc, information
2425 about the class processed currently. */
2427 void
2428 safe_layout_class (tree klass)
2430 tree save_current_class = current_class;
2431 location_t save_location = input_location;
2433 layout_class (klass);
2435 current_class = save_current_class;
2436 input_location = save_location;
2439 void
2440 layout_class (tree this_class)
2442 int i;
2443 tree super_class = CLASSTYPE_SUPER (this_class);
2445 class_list = tree_cons (this_class, NULL_TREE, class_list);
2446 if (CLASS_BEING_LAIDOUT (this_class))
2448 char buffer [1024];
2449 char *report;
2450 tree current;
2452 sprintf (buffer, " with '%s'",
2453 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2454 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2456 for (current = TREE_CHAIN (class_list); current;
2457 current = TREE_CHAIN (current))
2459 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2460 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2461 IDENTIFIER_POINTER (DECL_NAME (decl)),
2462 DECL_SOURCE_FILE (decl),
2463 DECL_SOURCE_LINE (decl));
2464 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2466 obstack_1grow (&temporary_obstack, '\0');
2467 report = XOBFINISH (&temporary_obstack, char *);
2468 cyclic_inheritance_report = ggc_strdup (report);
2469 obstack_free (&temporary_obstack, report);
2470 TYPE_SIZE (this_class) = error_mark_node;
2471 return;
2473 CLASS_BEING_LAIDOUT (this_class) = 1;
2475 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2477 tree maybe_super_class
2478 = maybe_layout_super_class (super_class, this_class);
2479 if (maybe_super_class == NULL
2480 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2482 TYPE_SIZE (this_class) = error_mark_node;
2483 CLASS_BEING_LAIDOUT (this_class) = 0;
2484 class_list = TREE_CHAIN (class_list);
2485 return;
2487 if (TYPE_SIZE (this_class) == NULL_TREE)
2488 push_super_field (this_class, maybe_super_class);
2491 layout_type (this_class);
2493 /* Also recursively load/layout any superinterfaces. */
2494 if (TYPE_BINFO (this_class))
2496 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2498 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2499 tree super_interface = BINFO_TYPE (binfo);
2500 tree maybe_super_interface
2501 = maybe_layout_super_class (super_interface, NULL_TREE);
2502 if (maybe_super_interface == NULL
2503 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2505 TYPE_SIZE (this_class) = error_mark_node;
2506 CLASS_BEING_LAIDOUT (this_class) = 0;
2507 class_list = TREE_CHAIN (class_list);
2508 return;
2513 /* Convert the size back to an SI integer value. */
2514 TYPE_SIZE_UNIT (this_class) =
2515 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2517 CLASS_BEING_LAIDOUT (this_class) = 0;
2518 class_list = TREE_CHAIN (class_list);
2521 static void
2522 add_miranda_methods (tree base_class, tree search_class)
2524 int i;
2525 tree binfo, base_binfo;
2527 if (!CLASS_PARSED_P (search_class))
2528 load_class (search_class, 1);
2530 for (binfo = TYPE_BINFO (search_class), i = 1;
2531 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2533 tree method_decl;
2534 tree elt = BINFO_TYPE (base_binfo);
2536 /* FIXME: This is totally bogus. We should not be handling
2537 Miranda methods at all if we're using the BC ABI. */
2538 if (TYPE_DUMMY (elt))
2539 continue;
2541 /* Ensure that interface methods are seen in declared order. */
2542 if (!CLASS_LOADED_P (elt))
2543 load_class (elt, 1);
2544 layout_class_methods (elt);
2546 /* All base classes will have been laid out at this point, so the order
2547 will be correct. This code must match similar layout code in the
2548 runtime. */
2549 for (method_decl = TYPE_METHODS (elt);
2550 method_decl; method_decl = DECL_CHAIN (method_decl))
2552 tree sig, override;
2554 /* An interface can have <clinit>. */
2555 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2556 continue;
2558 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2559 override = lookup_argument_method (base_class,
2560 DECL_NAME (method_decl), sig);
2561 if (override == NULL_TREE)
2563 /* Found a Miranda method. Add it. */
2564 tree new_method;
2565 sig = build_java_signature (TREE_TYPE (method_decl));
2566 new_method
2567 = add_method (base_class,
2568 get_access_flags_from_decl (method_decl),
2569 DECL_NAME (method_decl), sig);
2570 METHOD_INVISIBLE (new_method) = 1;
2574 /* Try superinterfaces. */
2575 add_miranda_methods (base_class, elt);
2579 void
2580 layout_class_methods (tree this_class)
2582 tree method_decl, dtable_count;
2583 tree super_class, type_name;
2585 if (TYPE_NVIRTUALS (this_class))
2586 return;
2588 super_class = CLASSTYPE_SUPER (this_class);
2590 if (super_class)
2592 super_class = maybe_layout_super_class (super_class, this_class);
2593 if (!TYPE_NVIRTUALS (super_class))
2594 layout_class_methods (super_class);
2595 dtable_count = TYPE_NVIRTUALS (super_class);
2597 else
2598 dtable_count = integer_zero_node;
2600 type_name = TYPE_NAME (this_class);
2601 if (!flag_indirect_dispatch
2602 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2604 /* An abstract class can have methods which are declared only in
2605 an implemented interface. These are called "Miranda
2606 methods". We make a dummy method entry for such methods
2607 here. */
2608 add_miranda_methods (this_class, this_class);
2611 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2613 for (method_decl = TYPE_METHODS (this_class);
2614 method_decl; method_decl = DECL_CHAIN (method_decl))
2615 dtable_count = layout_class_method (this_class, super_class,
2616 method_decl, dtable_count);
2618 TYPE_NVIRTUALS (this_class) = dtable_count;
2621 /* Return the index of METHOD in INTERFACE. This index begins at 1
2622 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2624 get_interface_method_index (tree method, tree interface)
2626 tree meth;
2627 int i = 1;
2629 for (meth = TYPE_METHODS (interface); ; meth = DECL_CHAIN (meth))
2631 if (meth == method)
2632 return i;
2633 /* We don't want to put <clinit> into the interface table. */
2634 if (! ID_CLINIT_P (DECL_NAME (meth)))
2635 ++i;
2636 gcc_assert (meth != NULL_TREE);
2640 /* Lay METHOD_DECL out, returning a possibly new value of
2641 DTABLE_COUNT. Also mangle the method's name. */
2643 tree
2644 layout_class_method (tree this_class, tree super_class,
2645 tree method_decl, tree dtable_count)
2647 tree method_name = DECL_NAME (method_decl);
2649 TREE_PUBLIC (method_decl) = 1;
2651 if (flag_indirect_classes
2652 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2653 && ! METHOD_NATIVE (method_decl)
2654 && ! special_method_p (method_decl)))
2655 java_hide_decl (method_decl);
2657 /* Considered external unless it is being compiled into this object
2658 file, or it was already flagged as external. */
2659 if (!DECL_EXTERNAL (method_decl))
2660 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2661 || METHOD_NATIVE (method_decl));
2663 if (ID_INIT_P (method_name))
2665 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2666 const char *ptr;
2667 for (ptr = p; *ptr; )
2669 if (*ptr++ == '.')
2670 p = ptr;
2672 DECL_CONSTRUCTOR_P (method_decl) = 1;
2673 build_java_signature (TREE_TYPE (method_decl));
2675 else if (! METHOD_STATIC (method_decl))
2677 tree method_sig =
2678 build_java_signature (TREE_TYPE (method_decl));
2679 bool method_override = false;
2680 tree super_method = lookup_java_method (super_class, method_name,
2681 method_sig);
2682 if (super_method != NULL_TREE
2683 && ! METHOD_DUMMY (super_method))
2685 method_override = true;
2686 if (! METHOD_PUBLIC (super_method) &&
2687 ! METHOD_PROTECTED (super_method))
2689 /* Don't override private method, or default-access method in
2690 another package. */
2691 if (METHOD_PRIVATE (super_method) ||
2692 ! in_same_package (TYPE_NAME (this_class),
2693 TYPE_NAME (super_class)))
2694 method_override = false;
2697 if (method_override)
2699 tree method_index = get_method_index (super_method);
2700 set_method_index (method_decl, method_index);
2701 if (method_index == NULL_TREE
2702 && ! flag_indirect_dispatch
2703 && ! DECL_ARTIFICIAL (super_method))
2704 error ("non-static method %q+D overrides static method",
2705 method_decl);
2707 else if (this_class == object_type_node
2708 && (METHOD_FINAL (method_decl)
2709 || METHOD_PRIVATE (method_decl)))
2711 /* We don't generate vtable entries for final Object
2712 methods. This is simply to save space, since every
2713 object would otherwise have to define them. */
2715 else if (! METHOD_PRIVATE (method_decl)
2716 && dtable_count)
2718 /* We generate vtable entries for final methods because they
2719 may one day be changed to non-final. */
2720 set_method_index (method_decl, dtable_count);
2721 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2722 dtable_count, integer_one_node);
2726 return dtable_count;
2729 static void
2730 register_class (void)
2732 tree node;
2734 if (!registered_class)
2735 vec_alloc (registered_class, 8);
2737 if (flag_indirect_classes)
2738 node = current_class;
2739 else
2740 node = TREE_OPERAND (build_class_ref (current_class), 0);
2741 vec_safe_push (registered_class, node);
2744 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2745 all the classes we have emitted. */
2747 static void
2748 emit_indirect_register_classes (tree *list_p)
2750 tree klass, t, register_class_fn;
2751 int i;
2753 int size = vec_safe_length (registered_class) * 2 + 1;
2754 vec<constructor_elt, va_gc> *init;
2755 vec_alloc (init, size);
2756 tree class_array_type
2757 = build_prim_array_type (ptr_type_node, size);
2758 tree cdecl = build_decl (input_location,
2759 VAR_DECL, get_identifier ("_Jv_CLS"),
2760 class_array_type);
2761 tree reg_class_list;
2762 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2764 t = fold_convert (ptr_type_node, build_static_class_ref (klass));
2765 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2766 t = fold_convert (ptr_type_node,
2767 build_address_of (build_classdollar_field (klass)));
2768 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2770 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, integer_zero_node);
2771 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2772 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2773 TREE_STATIC (cdecl) = 1;
2774 DECL_ARTIFICIAL (cdecl) = 1;
2775 DECL_IGNORED_P (cdecl) = 1;
2776 TREE_READONLY (cdecl) = 1;
2777 TREE_CONSTANT (cdecl) = 1;
2778 rest_of_decl_compilation (cdecl, 1, 0);
2779 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2781 t = build_function_type_list (void_type_node,
2782 build_pointer_type (ptr_type_node), NULL);
2783 t = build_decl (input_location,
2784 FUNCTION_DECL,
2785 get_identifier ("_Jv_RegisterNewClasses"), t);
2786 TREE_PUBLIC (t) = 1;
2787 DECL_EXTERNAL (t) = 1;
2788 register_class_fn = t;
2789 t = build_call_expr (register_class_fn, 1, reg_class_list);
2790 append_to_statement_list (t, list_p);
2793 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2795 static void
2796 emit_register_classes_in_jcr_section (void)
2798 #ifdef JCR_SECTION_NAME
2799 tree klass, cdecl, class_array_type;
2800 int i;
2801 int size = vec_safe_length (registered_class);
2802 vec<constructor_elt, va_gc> *init;
2803 vec_alloc (init, size);
2805 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2806 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_fold_addr_expr (klass));
2808 /* ??? I would like to use tree_output_constant_def() but there is no way
2809 to put the data in a named section name, or to set the alignment,
2810 via that function. So do everything manually here. */
2811 class_array_type = build_prim_array_type (ptr_type_node, size);
2812 cdecl = build_decl (UNKNOWN_LOCATION,
2813 VAR_DECL, get_identifier ("_Jv_JCR_SECTION_data"),
2814 class_array_type);
2815 DECL_ALIGN (cdecl) = POINTER_SIZE;
2816 DECL_USER_ALIGN (cdecl) = 1;
2817 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2818 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2819 TREE_STATIC (cdecl) = 1;
2820 TREE_READONLY (cdecl) = 0;
2821 TREE_CONSTANT (cdecl) = 1;
2822 DECL_ARTIFICIAL (cdecl) = 1;
2823 DECL_IGNORED_P (cdecl) = 1;
2824 DECL_PRESERVE_P (cdecl) = 1;
2825 set_decl_section_name (cdecl, JCR_SECTION_NAME);
2826 pushdecl_top_level (cdecl);
2827 relayout_decl (cdecl);
2828 rest_of_decl_compilation (cdecl, 1, 0);
2829 #else
2830 /* A target has defined TARGET_USE_JCR_SECTION,
2831 but doesn't have a JCR_SECTION_NAME. */
2832 gcc_unreachable ();
2833 #endif
2837 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2838 A series of calls is added to LIST_P. */
2840 static void
2841 emit_Jv_RegisterClass_calls (tree *list_p)
2843 tree klass, t, register_class_fn;
2844 int i;
2846 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2847 t = build_decl (input_location,
2848 FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2849 TREE_PUBLIC (t) = 1;
2850 DECL_EXTERNAL (t) = 1;
2851 register_class_fn = t;
2853 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2855 t = build_fold_addr_expr (klass);
2856 t = build_call_expr (register_class_fn, 1, t);
2857 append_to_statement_list (t, list_p);
2861 /* Emit something to register classes at start-up time.
2863 The default mechanism is to generate instances at run-time.
2865 An alternative mechanism is through the .jcr section, which contain
2866 a list of pointers to classes which get registered during constructor
2867 invocation time.
2869 The fallback mechanism is to add statements to *LIST_P to call
2870 _Jv_RegisterClass for each class in this file. These statements will
2871 be added to a static constructor function for this translation unit. */
2873 void
2874 emit_register_classes (tree *list_p)
2876 if (registered_class == NULL)
2877 return;
2879 /* By default, generate instances of Class at runtime. */
2880 if (flag_indirect_classes)
2881 emit_indirect_register_classes (list_p);
2882 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2883 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2884 but lack suitable crtbegin/end objects or linker support. These
2885 targets can override the default in tm.h to use the fallback mechanism. */
2886 else if (TARGET_USE_JCR_SECTION)
2887 emit_register_classes_in_jcr_section ();
2888 /* Use the fallback mechanism. */
2889 else
2890 emit_Jv_RegisterClass_calls (list_p);
2893 /* Build a constructor for an entry in the symbol table. */
2895 static tree
2896 build_symbol_table_entry (tree clname, tree name, tree signature)
2898 tree symbol;
2899 vec<constructor_elt, va_gc> *v = NULL;
2901 START_RECORD_CONSTRUCTOR (v, symbol_type);
2902 PUSH_FIELD_VALUE (v, "clname", clname);
2903 PUSH_FIELD_VALUE (v, "name", name);
2904 PUSH_FIELD_VALUE (v, "signature", signature);
2905 FINISH_RECORD_CONSTRUCTOR (symbol, v, symbol_type);
2906 TREE_CONSTANT (symbol) = 1;
2908 return symbol;
2911 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2913 static tree
2914 build_symbol_entry (tree decl, tree special)
2916 tree clname, name, signature;
2917 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2918 /* ??? Constructors are given the name foo.foo all the way through
2919 the compiler, but in the method table they're all renamed
2920 foo.<init>. So, we have to do the same here unless we want an
2921 unresolved reference at runtime. */
2922 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2923 && DECL_CONSTRUCTOR_P (decl))
2924 ? init_identifier_node
2925 : DECL_NAME (decl));
2926 signature = build_java_signature (TREE_TYPE (decl));
2927 signature = build_utf8_ref (unmangle_classname
2928 (IDENTIFIER_POINTER (signature),
2929 IDENTIFIER_LENGTH (signature)));
2930 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2931 signature addr+1 if SPECIAL, and this indicates to the runtime
2932 system that this is a "special" symbol, i.e. one that should
2933 bypass access controls. */
2934 if (special != NULL_TREE)
2935 signature = fold_build_pointer_plus (signature, special);
2937 return build_symbol_table_entry (clname, name, signature);
2940 /* Emit a symbol table: used by -findirect-dispatch. */
2942 tree
2943 emit_symbol_table (tree name, tree the_table,
2944 vec<method_entry, va_gc> *decl_table,
2945 tree the_syms_decl, tree the_array_element_type,
2946 int element_size)
2948 tree table, null_symbol, table_size, the_array_type;
2949 unsigned index;
2950 method_entry *e;
2951 vec<constructor_elt, va_gc> *v = NULL;
2953 /* Only emit a table if this translation unit actually made any
2954 references via it. */
2955 if (!decl_table)
2956 return the_table;
2958 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2959 FOR_EACH_VEC_ELT (*decl_table, index, e)
2960 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
2961 build_symbol_entry (e->method, e->special));
2963 /* Terminate the list with a "null" entry. */
2964 null_symbol = build_symbol_table_entry (null_pointer_node,
2965 null_pointer_node,
2966 null_pointer_node);
2967 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_symbol);
2969 tree symbols_arr_type
2970 = build_prim_array_type (symbol_type, vec_safe_length (v));
2972 table = build_constructor (symbols_arr_type, v);
2974 /* Make it the initial value for otable_syms and emit the decl. */
2975 TREE_TYPE (the_syms_decl) = symbols_arr_type;
2976 relayout_decl (the_syms_decl);
2977 DECL_INITIAL (the_syms_decl) = table;
2978 DECL_ARTIFICIAL (the_syms_decl) = 1;
2979 DECL_IGNORED_P (the_syms_decl) = 1;
2980 rest_of_decl_compilation (the_syms_decl, 1, 0);
2982 /* Now that its size is known, redefine the table as an
2983 uninitialized static array of INDEX + 1 elements. The extra entry
2984 is used by the runtime to track whether the table has been
2985 initialized. */
2986 table_size
2987 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2988 the_array_type = build_array_type (the_array_element_type, table_size);
2989 the_table = build_decl (input_location,
2990 VAR_DECL, name, the_array_type);
2991 TREE_STATIC (the_table) = 1;
2992 TREE_READONLY (the_table) = 1;
2993 rest_of_decl_compilation (the_table, 1, 0);
2995 return the_table;
2998 /* Make an entry for the catch_classes list. */
2999 tree
3000 make_catch_class_record (tree catch_class, tree classname)
3002 tree entry;
3003 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
3004 vec<constructor_elt, va_gc> *v = NULL;
3005 START_RECORD_CONSTRUCTOR (v, type);
3006 PUSH_FIELD_VALUE (v, "address", catch_class);
3007 PUSH_FIELD_VALUE (v, "classname", classname);
3008 FINISH_RECORD_CONSTRUCTOR (entry, v, type);
3009 return entry;
3013 /* Generate the list of Throwable classes that are caught by exception
3014 handlers in this class. */
3015 tree
3016 emit_catch_table (tree this_class)
3018 tree table, table_size, array_type;
3019 int n_catch_classes;
3020 constructor_elt *e;
3021 /* Fill in the dummy entry that make_class created. */
3022 e = &(*TYPE_CATCH_CLASSES (this_class))[0];
3023 e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
3024 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
3025 make_catch_class_record (null_pointer_node,
3026 null_pointer_node));
3027 n_catch_classes = TYPE_CATCH_CLASSES (this_class)->length ();
3028 table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
3029 array_type
3030 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
3031 table_size);
3032 table =
3033 build_decl (input_location,
3034 VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
3035 DECL_INITIAL (table) =
3036 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
3037 TREE_STATIC (table) = 1;
3038 TREE_READONLY (table) = 1;
3039 DECL_IGNORED_P (table) = 1;
3040 rest_of_decl_compilation (table, 1, 0);
3041 return table;
3044 /* Given a type, return the signature used by
3045 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3046 same as build_java_signature() because we want the canonical array
3047 type. */
3049 static tree
3050 build_signature_for_libgcj (tree type)
3052 tree sig, ref;
3054 sig = build_java_signature (type);
3055 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
3056 IDENTIFIER_LENGTH (sig)));
3057 return ref;
3060 /* Build an entry in the type assertion table. */
3062 static tree
3063 build_assertion_table_entry (tree code, tree op1, tree op2)
3065 vec<constructor_elt, va_gc> *v = NULL;
3066 tree entry;
3068 START_RECORD_CONSTRUCTOR (v, assertion_entry_type);
3069 PUSH_FIELD_VALUE (v, "assertion_code", code);
3070 PUSH_FIELD_VALUE (v, "op1", op1);
3071 PUSH_FIELD_VALUE (v, "op2", op2);
3072 FINISH_RECORD_CONSTRUCTOR (entry, v, assertion_entry_type);
3074 return entry;
3077 /* Add an entry to the type assertion table. Callback used during hashtable
3078 traversal. */
3081 add_assertion_table_entry (type_assertion **slot, vec<constructor_elt, va_gc> **v)
3083 tree entry;
3084 tree code_val, op1_utf8, op2_utf8;
3085 type_assertion *as = *slot;
3087 code_val = build_int_cst (NULL_TREE, as->assertion_code);
3089 if (as->op1 == NULL_TREE)
3090 op1_utf8 = null_pointer_node;
3091 else
3092 op1_utf8 = build_signature_for_libgcj (as->op1);
3094 if (as->op2 == NULL_TREE)
3095 op2_utf8 = null_pointer_node;
3096 else
3097 op2_utf8 = build_signature_for_libgcj (as->op2);
3099 entry = build_assertion_table_entry (code_val, op1_utf8, op2_utf8);
3101 CONSTRUCTOR_APPEND_ELT (*v, NULL_TREE, entry);
3102 return true;
3105 /* Generate the type assertion table for KLASS, and return its DECL. */
3107 static tree
3108 emit_assertion_table (tree klass)
3110 tree null_entry, ctor, table_decl;
3111 hash_table<type_assertion_hasher> *assertions_htab = TYPE_ASSERTIONS (klass);
3112 vec<constructor_elt, va_gc> *v = NULL;
3114 /* Iterate through the hash table. */
3115 assertions_htab
3116 ->traverse<vec<constructor_elt, va_gc> **, add_assertion_table_entry> (&v);
3118 /* Finish with a null entry. */
3119 null_entry = build_assertion_table_entry (integer_zero_node,
3120 null_pointer_node,
3121 null_pointer_node);
3123 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_entry);
3125 tree type
3126 = build_prim_array_type (assertion_entry_type, vec_safe_length (v));
3128 ctor = build_constructor (type, v);
3130 table_decl = build_decl (input_location,
3131 VAR_DECL, mangled_classname ("_type_assert_", klass),
3132 type);
3134 TREE_STATIC (table_decl) = 1;
3135 TREE_READONLY (table_decl) = 1;
3136 TREE_CONSTANT (table_decl) = 1;
3137 DECL_IGNORED_P (table_decl) = 1;
3139 DECL_INITIAL (table_decl) = ctor;
3140 DECL_ARTIFICIAL (table_decl) = 1;
3141 rest_of_decl_compilation (table_decl, 1, 0);
3143 return table_decl;
3146 void
3147 init_class_processing (void)
3149 fields_ident = get_identifier ("fields");
3150 info_ident = get_identifier ("info");
3152 gcc_obstack_init (&temporary_obstack);
3155 /* A hash table mapping trees to trees. Used generally. */
3157 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3159 hashval_t
3160 treetreehasher::hash (treetreehash_entry *k)
3162 return JAVA_TREEHASHHASH_H (k->key);
3165 bool
3166 treetreehasher::equal (treetreehash_entry *k1, tree k2)
3168 return (k1->key == k2);
3171 tree
3172 java_treetreehash_find (hash_table<treetreehasher> *ht, tree t)
3174 struct treetreehash_entry *e;
3175 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3176 e = ht->find_with_hash (t, hv);
3177 if (e == NULL)
3178 return NULL;
3179 else
3180 return e->value;
3183 tree *
3184 java_treetreehash_new (hash_table<treetreehasher> *ht, tree t)
3186 struct treetreehash_entry *tthe;
3187 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3189 treetreehash_entry **e = ht->find_slot_with_hash (t, hv, INSERT);
3190 if (*e == NULL)
3192 tthe = ggc_cleared_alloc<treetreehash_entry> ();
3193 tthe->key = t;
3194 *e = tthe;
3196 else
3197 tthe = *e;
3198 return &tthe->value;
3201 hash_table<treetreehasher> *
3202 java_treetreehash_create (size_t size)
3204 return hash_table<treetreehasher>::create_ggc (size);
3207 /* Break down qualified IDENTIFIER into package and class-name components.
3208 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3209 "pkg.foo", and RIGHT to "Bar". */
3212 split_qualified_name (tree *left, tree *right, tree source)
3214 char *p, *base;
3215 int l = IDENTIFIER_LENGTH (source);
3217 base = (char *) alloca (l + 1);
3218 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3220 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3221 p = base + l - 1;
3222 while (*p != '.' && p != base)
3223 p--;
3225 /* We didn't find a '.'. Return an error. */
3226 if (p == base)
3227 return 1;
3229 *p = '\0';
3230 if (right)
3231 *right = get_identifier (p+1);
3232 *left = get_identifier (base);
3234 return 0;
3237 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3238 if the classes are from the same package. */
3241 in_same_package (tree name1, tree name2)
3243 tree tmp;
3244 tree pkg1;
3245 tree pkg2;
3247 if (TREE_CODE (name1) == TYPE_DECL)
3248 name1 = DECL_NAME (name1);
3249 if (TREE_CODE (name2) == TYPE_DECL)
3250 name2 = DECL_NAME (name2);
3252 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3253 /* One in empty package. */
3254 return 0;
3256 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3257 /* Both in empty package. */
3258 return 1;
3260 split_qualified_name (&pkg1, &tmp, name1);
3261 split_qualified_name (&pkg2, &tmp, name2);
3263 return (pkg1 == pkg2);
3266 /* lang_hooks.decls.final_write_globals: perform final processing on
3267 global variables. */
3269 void
3270 java_write_globals (void)
3272 tree *vec = vec_safe_address (pending_static_fields);
3273 int len = vec_safe_length (pending_static_fields);
3274 write_global_declarations ();
3275 emit_debug_global_declarations (vec, len);
3276 vec_free (pending_static_fields);
3279 #include "gt-java-class.h"