Introduce gimple_omp_task
[official-gcc.git] / gcc / java / class.c
blob25af6976ed0d1b354fed1ef34fb5044280127efd
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 "function.h"
42 #include "ggc.h"
43 #include "cgraph.h"
44 #include "tree-iterator.h"
45 #include "target.h"
47 static tree make_method_value (tree);
48 static tree build_java_method_type (tree, tree, int);
49 static int32 hashUtf8String (const char *, int);
50 static tree make_field_value (tree);
51 static tree get_dispatch_vector (tree);
52 static tree get_dispatch_table (tree, tree);
53 static int supers_all_compiled (tree type);
54 static tree maybe_layout_super_class (tree, tree);
55 static void add_miranda_methods (tree, tree);
56 static int assume_compiled (const char *);
57 static tree build_symbol_entry (tree, tree);
58 static tree emit_assertion_table (tree);
59 static void register_class (void);
61 struct obstack temporary_obstack;
63 static const char *cyclic_inheritance_report;
65 /* The compiler generates different code depending on whether or not
66 it can assume certain classes have been compiled down to native
67 code or not. The compiler options -fassume-compiled= and
68 -fno-assume-compiled= are used to create a tree of
69 class_flag_node objects. This tree is queried to determine if
70 a class is assume to be compiled or not. Each node in the tree
71 represents either a package or a specific class. */
73 typedef struct class_flag_node_struct
75 /* The class or package name. */
76 const char *ident;
78 /* Nonzero if this represents an exclusion. */
79 int value;
81 /* Pointers to other nodes in the tree. */
82 struct class_flag_node_struct *parent;
83 struct class_flag_node_struct *sibling;
84 struct class_flag_node_struct *child;
85 } class_flag_node;
87 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
88 static void add_class_flag (class_flag_node **, const char *, int);
90 /* This is the root of the include/exclude tree. */
92 static class_flag_node *assume_compiled_tree;
94 static class_flag_node *enable_assert_tree;
96 static GTY(()) tree class_roots[4];
97 #define fields_ident class_roots[0] /* get_identifier ("fields") */
98 #define info_ident class_roots[1] /* get_identifier ("info") */
99 #define class_list class_roots[2]
100 #define class_dtable_decl class_roots[3]
102 static GTY(()) vec<tree, va_gc> *registered_class;
104 /* A tree that returns the address of the class$ of the class
105 currently being compiled. */
106 static GTY(()) tree this_classdollar;
108 /* A list of static class fields. This is to emit proper debug
109 info for them. */
110 vec<tree, va_gc> *pending_static_fields;
112 /* Return the node that most closely represents the class whose name
113 is IDENT. Start the search from NODE (followed by its siblings).
114 Return NULL if an appropriate node does not exist. */
116 static class_flag_node *
117 find_class_flag_node (class_flag_node *node, const char *ident)
119 while (node)
121 size_t node_ident_length = strlen (node->ident);
123 /* node_ident_length is zero at the root of the tree. If the
124 identifiers are the same length, then we have matching
125 classes. Otherwise check if we've matched an enclosing
126 package name. */
128 if (node_ident_length == 0
129 || (strncmp (ident, node->ident, node_ident_length) == 0
130 && (ident[node_ident_length] == '\0'
131 || ident[node_ident_length] == '.')))
133 /* We've found a match, however, there might be a more
134 specific match. */
136 class_flag_node *found = find_class_flag_node (node->child, ident);
137 if (found)
138 return found;
139 else
140 return node;
143 /* No match yet. Continue through the sibling list. */
144 node = node->sibling;
147 /* No match at all in this tree. */
148 return NULL;
151 void
152 add_class_flag (class_flag_node **rootp, const char *ident, int value)
154 class_flag_node *root = *rootp;
155 class_flag_node *parent, *node;
157 /* Create the root of the tree if it doesn't exist yet. */
159 if (NULL == root)
161 root = XNEW (class_flag_node);
162 root->ident = "";
163 root->value = 0;
164 root->sibling = NULL;
165 root->child = NULL;
166 root->parent = NULL;
167 *rootp = root;
170 /* Calling the function with the empty string means we're setting
171 value for the root of the hierarchy. */
173 if (0 == ident[0])
175 root->value = value;
176 return;
179 /* Find the parent node for this new node. PARENT will either be a
180 class or a package name. Adjust PARENT accordingly. */
182 parent = find_class_flag_node (root, ident);
183 if (strcmp (ident, parent->ident) == 0)
184 parent->value = value;
185 else
187 /* Insert new node into the tree. */
188 node = XNEW (class_flag_node);
190 node->ident = xstrdup (ident);
191 node->value = value;
192 node->child = NULL;
194 node->parent = parent;
195 node->sibling = parent->child;
196 parent->child = node;
200 /* Add a new IDENT to the include/exclude tree. It's an exclusion
201 if EXCLUDEP is nonzero. */
203 void
204 add_assume_compiled (const char *ident, int excludep)
206 add_class_flag (&assume_compiled_tree, ident, excludep);
209 /* The default value returned by enable_assertions. */
211 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
213 /* Enter IDENT (a class or package name) into the enable-assertions table.
214 VALUE is true to enable and false to disable. */
216 void
217 add_enable_assert (const char *ident, int value)
219 if (enable_assert_tree == NULL)
220 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
221 add_class_flag (&enable_assert_tree, ident, value);
224 /* Returns nonzero if IDENT is the name of a class that the compiler
225 should assume has been compiled to object code. */
227 static int
228 assume_compiled (const char *ident)
230 class_flag_node *i;
231 int result;
233 if (NULL == assume_compiled_tree)
234 return 1;
236 i = find_class_flag_node (assume_compiled_tree, ident);
238 result = ! i->value;
240 return (result);
243 /* Return true if we should generate code to check assertions within KLASS. */
245 bool
246 enable_assertions (tree klass)
248 /* Check if command-line specifies whether we should check assertions. */
250 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
252 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
253 class_flag_node *node
254 = find_class_flag_node (enable_assert_tree, ident);
255 return node->value;
258 /* The default is to enable assertions if generating class files,
259 or not optimizing. */
260 return DEFAULT_ENABLE_ASSERT;
263 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
264 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
265 Also, PREFIX is prepended, and SUFFIX is appended. */
267 tree
268 ident_subst (const char* old_name,
269 int old_length,
270 const char *prefix,
271 int old_char,
272 int new_char,
273 const char *suffix)
275 int prefix_len = strlen (prefix);
276 int suffix_len = strlen (suffix);
277 int i = prefix_len + old_length + suffix_len + 1;
278 char *buffer = (char *) alloca (i);
280 strcpy (buffer, prefix);
281 for (i = 0; i < old_length; i++)
283 char ch = old_name[i];
284 if (ch == old_char)
285 ch = new_char;
286 buffer[prefix_len + i] = ch;
288 strcpy (buffer + prefix_len + old_length, suffix);
289 return get_identifier (buffer);
292 /* Return an IDENTIFIER_NODE the same as OLD_ID,
293 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
294 Also, PREFIX is prepended, and SUFFIX is appended. */
296 tree
297 identifier_subst (const tree old_id,
298 const char *prefix,
299 int old_char,
300 int new_char,
301 const char *suffix)
303 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
304 prefix, old_char, new_char, suffix);
307 /* Generate a valid C identifier from the name of the class TYPE,
308 prefixed by PREFIX. */
310 tree
311 mangled_classname (const char *prefix, tree type)
313 tree result;
314 tree ident = TYPE_NAME (type);
315 if (TREE_CODE (ident) != IDENTIFIER_NODE)
316 ident = DECL_NAME (ident);
317 result = identifier_subst (ident, prefix, '.', '_', "");
319 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
320 "_0xXX". Class names containing such chracters are uncommon, but
321 they do sometimes occur in class files. Without this check,
322 these names cause assembly errors.
324 There is a possibility that a real class name could conflict with
325 the identifier we generate, but it is unlikely and will
326 immediately be detected as an assembler error. At some point we
327 should do something more elaborate (perhaps using the full
328 unicode mangling scheme) in order to prevent such a conflict. */
330 int i;
331 const int len = IDENTIFIER_LENGTH (result);
332 const char *p = IDENTIFIER_POINTER (result);
333 int illegal_chars = 0;
335 /* Make two passes over the identifier. The first pass is merely
336 to count illegal characters; we need to do this in order to
337 allocate a buffer. */
338 for (i = 0; i < len; i++)
340 char c = p[i];
341 illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
344 /* And the second pass, which is rarely executed, does the
345 rewriting. */
346 if (illegal_chars != 0)
348 char *buffer = (char *) alloca (illegal_chars * 4 + len + 1);
349 int j;
351 for (i = 0, j = 0; i < len; i++)
353 char c = p[i];
354 if (! ISALNUM (c) && c != '_' && c != '$')
356 buffer[j++] = '_';
357 sprintf (&buffer[j], "0x%02x", c);
358 j += 4;
360 else
361 buffer[j++] = c;
364 buffer[j] = 0;
365 result = get_identifier (buffer);
369 return result;
372 tree
373 make_class (void)
375 tree type;
376 type = make_node (RECORD_TYPE);
377 /* Unfortunately we must create the binfo here, so that class
378 loading works. */
379 TYPE_BINFO (type) = make_tree_binfo (0);
380 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
381 TYPE_CATCH_CLASSES (type) = NULL;
382 /* Push a dummy entry; we can't call make_catch_class_record here
383 because other infrastructure may not be set up yet. We'll come
384 back and fill it in later once said infrastructure is
385 initialized. */
386 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE);
388 return type;
391 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
392 and where each of the constituents is separated by '/',
393 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
395 tree
396 unmangle_classname (const char *name, int name_length)
398 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
399 /* It's not sufficient to compare to_return and get_identifier
400 (name) to determine whether to_return is qualified. There are
401 cases in signature analysis where name will be stripped of a
402 trailing ';'. */
403 name = IDENTIFIER_POINTER (to_return);
404 while (*name)
405 if (*name++ == '.')
407 QUALIFIED_P (to_return) = 1;
408 break;
411 return to_return;
414 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
415 do \
417 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
418 char *buf = (char *) alloca (strlen (type_name) \
419 + strlen (#NAME "_syms_") + 1); \
420 tree decl; \
422 sprintf (buf, #NAME "_%s", type_name); \
423 TYPE_## TABLE ##_DECL (type) = decl = \
424 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
425 DECL_EXTERNAL (decl) = 1; \
426 TREE_STATIC (decl) = 1; \
427 TREE_READONLY (decl) = 1; \
428 TREE_CONSTANT (decl) = 1; \
429 DECL_IGNORED_P (decl) = 1; \
430 /* Mark the table as belonging to this class. */ \
431 pushdecl (decl); \
432 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
433 DECL_OWNER (decl) = TYPE; \
434 sprintf (buf, #NAME "_syms_%s", type_name); \
435 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
436 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
437 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
438 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
439 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
441 while (0)
443 /* Given a class, create the DECLs for all its associated indirect
444 dispatch tables. */
445 void
446 gen_indirect_dispatch_tables (tree type)
448 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", type));
450 tree field = NULL;
451 char *buf = (char *) alloca (strlen (type_name)
452 + strlen ("_catch_classes_") + 1);
453 tree catch_class_type = make_node (RECORD_TYPE);
455 sprintf (buf, "_catch_classes_%s", type_name);
456 PUSH_FIELD (input_location,
457 catch_class_type, field, "address", utf8const_ptr_type);
458 PUSH_FIELD (input_location,
459 catch_class_type, field, "classname", ptr_type_node);
460 FINISH_RECORD (catch_class_type);
462 TYPE_CTABLE_DECL (type)
463 = build_decl (input_location, VAR_DECL, get_identifier (buf),
464 build_array_type (catch_class_type, 0));
465 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
466 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
467 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
468 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
469 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
470 pushdecl (TYPE_CTABLE_DECL (type));
473 if (flag_indirect_dispatch)
475 GEN_TABLE (ATABLE, _atable, atable_type, type);
476 GEN_TABLE (OTABLE, _otable, otable_type, type);
477 GEN_TABLE (ITABLE, _itable, itable_type, type);
481 #undef GEN_TABLE
483 tree
484 push_class (tree class_type, tree class_name)
486 tree decl, signature;
487 location_t saved_loc = input_location;
488 CLASS_P (class_type) = 1;
489 decl = build_decl (input_location, TYPE_DECL, class_name, class_type);
490 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
492 /* dbxout needs a DECL_SIZE if in gstabs mode */
493 DECL_SIZE (decl) = integer_zero_node;
495 input_location = saved_loc;
496 signature = identifier_subst (class_name, "L", '.', '/', ";");
497 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
499 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
500 both a typedef and in the struct name-space. We may want to re-visit
501 this later, but for now it reduces the changes needed for gdb. */
502 DECL_ARTIFICIAL (decl) = 1;
504 pushdecl_top_level (decl);
506 return decl;
509 /* Finds the (global) class named NAME. Creates the class if not found.
510 Also creates associated TYPE_DECL.
511 Does not check if the class actually exists, load the class,
512 fill in field or methods, or do layout_type. */
514 tree
515 lookup_class (tree name)
517 tree decl = IDENTIFIER_CLASS_VALUE (name);
518 if (decl == NULL_TREE)
519 decl = push_class (make_class (), name);
520 return TREE_TYPE (decl);
523 void
524 set_super_info (int access_flags, tree this_class,
525 tree super_class, int interfaces_count)
527 int total_supers = interfaces_count;
528 tree class_decl = TYPE_NAME (this_class);
530 if (super_class)
531 total_supers++;
533 if (total_supers)
534 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
535 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
536 if (super_class)
538 tree super_binfo = make_tree_binfo (0);
539 BINFO_TYPE (super_binfo) = super_class;
540 BINFO_OFFSET (super_binfo) = integer_zero_node;
541 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
542 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
545 set_class_decl_access_flags (access_flags, class_decl);
548 void
549 set_class_decl_access_flags (int access_flags, tree class_decl)
551 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
552 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
553 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
554 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
555 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
556 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
557 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
558 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
559 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
560 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
561 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
562 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
565 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
566 direct sub-classes of Object are 1, and so on. */
569 class_depth (tree clas)
571 int depth = 0;
572 if (! CLASS_LOADED_P (clas))
573 load_class (clas, 1);
574 if (TYPE_SIZE (clas) == error_mark_node)
575 return -1;
576 while (clas != object_type_node)
578 depth++;
579 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
581 return depth;
584 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
587 interface_of_p (tree type1, tree type2)
589 int i;
590 tree binfo, base_binfo;
592 if (! TYPE_BINFO (type2))
593 return 0;
595 for (binfo = TYPE_BINFO (type2), i = 0;
596 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
597 if (BINFO_TYPE (base_binfo) == type1)
598 return 1;
600 for (binfo = TYPE_BINFO (type2), i = 0;
601 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
602 if (BINFO_TYPE (base_binfo)
603 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
604 return 1;
606 return 0;
609 /* Return true iff TYPE1 inherits from TYPE2. */
612 inherits_from_p (tree type1, tree type2)
614 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
616 if (type1 == type2)
617 return 1;
619 if (! CLASS_LOADED_P (type1))
620 load_class (type1, 1);
622 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
624 return 0;
627 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
630 enclosing_context_p (tree type1, tree type2)
632 if (!INNER_CLASS_TYPE_P (type2))
633 return 0;
635 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
636 type2;
637 type2 = (INNER_CLASS_TYPE_P (type2) ?
638 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
640 if (type2 == type1)
641 return 1;
644 return 0;
648 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
649 nesting level. */
652 common_enclosing_context_p (tree type1, tree type2)
654 while (type1)
656 tree current;
657 for (current = type2; current;
658 current = (INNER_CLASS_TYPE_P (current) ?
659 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
660 NULL_TREE))
661 if (type1 == current)
662 return 1;
664 if (INNER_CLASS_TYPE_P (type1))
665 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
666 else
667 break;
669 return 0;
672 /* Return 1 iff there exists a common enclosing "this" between TYPE1
673 and TYPE2, without crossing any static context. */
676 common_enclosing_instance_p (tree type1, tree type2)
678 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
679 return 0;
681 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
682 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
683 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
685 tree current;
686 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
687 current = (PURE_INNER_CLASS_TYPE_P (current) ?
688 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
689 NULL_TREE))
690 if (type1 == current)
691 return 1;
693 return 0;
696 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
697 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
698 if attempt is made to add it twice. */
700 tree
701 maybe_add_interface (tree this_class, tree interface_class)
703 tree binfo, base_binfo;
704 int i;
706 for (binfo = TYPE_BINFO (this_class), i = 0;
707 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
708 if (BINFO_TYPE (base_binfo) == interface_class)
709 return interface_class;
710 add_interface (this_class, interface_class);
711 return NULL_TREE;
714 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
716 void
717 add_interface (tree this_class, tree interface_class)
719 tree interface_binfo = make_tree_binfo (0);
721 BINFO_TYPE (interface_binfo) = interface_class;
722 BINFO_OFFSET (interface_binfo) = integer_zero_node;
723 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
724 BINFO_VIRTUAL_P (interface_binfo) = 1;
726 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
729 static tree
730 build_java_method_type (tree fntype, tree this_class, int access_flags)
732 if (access_flags & ACC_STATIC)
733 return fntype;
734 fntype = build_method_type (this_class, fntype);
736 /* We know that arg 1 of every nonstatic method is non-null; tell
737 the back-end so. */
738 TYPE_ATTRIBUTES (fntype) = (tree_cons
739 (get_identifier ("nonnull"),
740 tree_cons (NULL_TREE,
741 build_int_cst (NULL_TREE, 1),
742 NULL_TREE),
743 TYPE_ATTRIBUTES (fntype)));
744 return fntype;
747 void
748 java_hide_decl (tree decl ATTRIBUTE_UNUSED)
750 #ifdef HAVE_GAS_HIDDEN
751 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
752 DECL_VISIBILITY_SPECIFIED (decl) = 1;
753 #endif
756 tree
757 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
759 tree method_type, fndecl;
761 method_type = build_java_method_type (function_type,
762 this_class, access_flags);
764 fndecl = build_decl (input_location, FUNCTION_DECL, name, method_type);
765 DECL_CONTEXT (fndecl) = this_class;
767 DECL_LANG_SPECIFIC (fndecl) = ggc_cleared_alloc<struct lang_decl> ();
768 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
770 /* Initialize the static initializer test table. */
772 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = java_treetreehash_create (10);
774 /* Initialize the initialized (static) class table. */
775 if (access_flags & ACC_STATIC)
776 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
777 hash_table<ict_hasher>::create_ggc (50);
779 DECL_CHAIN (fndecl) = TYPE_METHODS (this_class);
780 TYPE_METHODS (this_class) = fndecl;
782 /* If pointers to member functions use the least significant bit to
783 indicate whether a function is virtual, ensure a pointer
784 to this function will have that bit clear. */
785 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
786 && !(access_flags & ACC_STATIC)
787 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
788 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
790 /* Notice that this is a finalizer and update the class type
791 accordingly. This is used to optimize instance allocation. */
792 if (name == finalize_identifier_node
793 && TREE_TYPE (function_type) == void_type_node
794 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
795 HAS_FINALIZER_P (this_class) = 1;
797 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
798 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
799 if (access_flags & ACC_PRIVATE)
800 METHOD_PRIVATE (fndecl) = 1;
801 if (access_flags & ACC_NATIVE)
803 METHOD_NATIVE (fndecl) = 1;
804 DECL_EXTERNAL (fndecl) = 1;
806 else
807 /* FNDECL is external unless we are compiling it into this object
808 file. */
809 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
810 if (access_flags & ACC_STATIC)
811 METHOD_STATIC (fndecl) = 1;
812 if (access_flags & ACC_FINAL)
813 METHOD_FINAL (fndecl) = 1;
814 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
815 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
816 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
817 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
818 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
819 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
820 return fndecl;
823 /* Add a method to THIS_CLASS.
824 The method's name is NAME.
825 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
827 tree
828 add_method (tree this_class, int access_flags, tree name, tree method_sig)
830 tree function_type, fndecl;
831 const unsigned char *sig
832 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
834 if (sig[0] != '(')
835 fatal_error ("bad method signature");
837 function_type = get_type_from_signature (method_sig);
838 fndecl = add_method_1 (this_class, access_flags, name, function_type);
839 set_java_signature (TREE_TYPE (fndecl), method_sig);
840 return fndecl;
843 tree
844 add_field (tree klass, tree name, tree field_type, int flags)
846 int is_static = (flags & ACC_STATIC) != 0;
847 tree field;
848 field = build_decl (input_location,
849 is_static ? VAR_DECL : FIELD_DECL, name, field_type);
850 DECL_CHAIN (field) = TYPE_FIELDS (klass);
851 TYPE_FIELDS (klass) = field;
852 DECL_CONTEXT (field) = klass;
853 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
855 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
856 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
857 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
858 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
859 if (flags & ACC_VOLATILE)
861 FIELD_VOLATILE (field) = 1;
862 TREE_THIS_VOLATILE (field) = 1;
864 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
865 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
866 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
867 if (is_static)
869 FIELD_STATIC (field) = 1;
870 /* Always make field externally visible. This is required so
871 that native methods can always access the field. */
872 TREE_PUBLIC (field) = 1;
873 /* Hide everything that shouldn't be visible outside a DSO. */
874 if (flag_indirect_classes
875 || (FIELD_PRIVATE (field)))
876 java_hide_decl (field);
877 /* Considered external unless we are compiling it into this
878 object file. */
879 DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2);
880 if (!DECL_EXTERNAL (field))
881 vec_safe_push (pending_static_fields, field);
884 return field;
887 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
889 void
890 set_constant_value (tree field, tree constant)
892 if (field == NULL_TREE)
893 warning (OPT_Wattributes,
894 "misplaced ConstantValue attribute (not in any field)");
895 else if (DECL_INITIAL (field) != NULL_TREE)
896 warning (OPT_Wattributes,
897 "duplicate ConstantValue attribute for field '%s'",
898 IDENTIFIER_POINTER (DECL_NAME (field)));
899 else
901 DECL_INITIAL (field) = constant;
902 if (TREE_TYPE (constant) != TREE_TYPE (field)
903 && ! (TREE_TYPE (constant) == int_type_node
904 && INTEGRAL_TYPE_P (TREE_TYPE (field))
905 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
906 && ! (TREE_TYPE (constant) == utf8const_ptr_type
907 && TREE_TYPE (field) == string_ptr_type_node))
908 error ("ConstantValue attribute of field '%s' has wrong type",
909 IDENTIFIER_POINTER (DECL_NAME (field)));
913 /* Calculate a hash value for a string encoded in Utf8 format.
914 * This returns the same hash value as specified for java.lang.String.hashCode.
917 static int32
918 hashUtf8String (const char *str, int len)
920 const unsigned char* ptr = (const unsigned char*) str;
921 const unsigned char *limit = ptr + len;
922 uint32 hash = 0;
923 for (; ptr < limit;)
925 int ch = UTF8_GET (ptr, limit);
926 /* Updated specification from
927 http://www.javasoft.com/docs/books/jls/clarify.html. */
928 hash = (31 * hash) + ch;
930 return hash;
933 tree
934 build_utf8_ref (tree name)
936 const char * name_ptr = IDENTIFIER_POINTER (name);
937 int name_len = IDENTIFIER_LENGTH (name), name_pad;
938 char buf[60];
939 tree ctype, field = NULL_TREE, str_type, cinit, string;
940 static int utf8_count = 0;
941 int name_hash;
942 tree ref = IDENTIFIER_UTF8_REF (name);
943 tree decl;
944 vec<constructor_elt, va_gc> *v = NULL;
945 if (ref != NULL_TREE)
946 return ref;
948 ctype = make_node (RECORD_TYPE);
949 /* '\0' byte plus padding to utf8const_type's alignment. */
950 name_pad = TYPE_ALIGN_UNIT (utf8const_type)
951 - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
952 str_type = build_prim_array_type (unsigned_byte_type_node,
953 name_len + name_pad);
954 PUSH_FIELD (input_location, ctype, field, "hash", unsigned_short_type_node);
955 PUSH_FIELD (input_location,
956 ctype, field, "length", unsigned_short_type_node);
957 PUSH_FIELD (input_location, ctype, field, "data", str_type);
958 FINISH_RECORD (ctype);
959 START_RECORD_CONSTRUCTOR (v, ctype);
960 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
961 PUSH_FIELD_VALUE (v, "hash", build_int_cst (NULL_TREE, name_hash));
962 PUSH_FIELD_VALUE (v, "length", build_int_cst (NULL_TREE, name_len));
963 string = build_string (name_len, name_ptr);
964 TREE_TYPE (string) = str_type;
965 PUSH_FIELD_VALUE (v, "data", string);
966 FINISH_RECORD_CONSTRUCTOR (cinit, v, ctype);
967 TREE_CONSTANT (cinit) = 1;
969 /* Generate a unique-enough identifier. */
970 sprintf(buf, "_Utf%d", ++utf8_count);
972 decl = build_decl (input_location,
973 VAR_DECL, get_identifier (buf), utf8const_type);
974 TREE_STATIC (decl) = 1;
975 DECL_ARTIFICIAL (decl) = 1;
976 DECL_IGNORED_P (decl) = 1;
977 TREE_READONLY (decl) = 1;
978 TREE_THIS_VOLATILE (decl) = 0;
979 DECL_INITIAL (decl) = cinit;
980 DECL_USER_ALIGN (decl) = 1;
982 if (HAVE_GAS_SHF_MERGE)
984 int decl_size;
985 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
986 decl_size = name_len + 4 + name_pad;
987 if (flag_merge_constants && decl_size < 256)
989 char buf[32];
990 int flags = (SECTION_OVERRIDE
991 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
992 sprintf (buf, ".rodata.jutf8.%d", decl_size);
993 switch_to_section (get_section (buf, flags, NULL));
994 set_decl_section_name (decl, buf);
998 layout_decl (decl, 0);
999 DECL_SIZE (decl) = TYPE_SIZE (ctype);
1000 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (ctype);
1001 pushdecl (decl);
1002 rest_of_decl_compilation (decl, global_bindings_p (), 0);
1003 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
1004 IDENTIFIER_UTF8_REF (name) = ref;
1005 return ref;
1008 /* Like build_class_ref, but instead of a direct reference generate a
1009 pointer into the constant pool. */
1011 static tree
1012 build_indirect_class_ref (tree type)
1014 int index;
1015 tree cl;
1016 index = alloc_class_constant (type);
1017 cl = build_ref_from_constant_pool (index);
1018 return convert (promote_type (class_ptr_type), cl);
1021 static tree
1022 build_static_class_ref (tree type)
1024 tree decl_name, decl, ref;
1026 if (TYPE_SIZE (type) == error_mark_node)
1027 return null_pointer_node;
1028 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1029 "", '/', '/', ".class$$");
1030 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1031 if (decl == NULL_TREE)
1033 decl = build_decl (input_location, VAR_DECL, decl_name, class_type_node);
1034 TREE_STATIC (decl) = 1;
1035 if (! flag_indirect_classes)
1037 TREE_PUBLIC (decl) = 1;
1038 if (CLASS_PRIVATE (TYPE_NAME (type)))
1039 java_hide_decl (decl);
1041 DECL_IGNORED_P (decl) = 1;
1042 DECL_ARTIFICIAL (decl) = 1;
1043 if (is_compiled_class (type) == 1)
1044 DECL_EXTERNAL (decl) = 1;
1045 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1046 DECL_CLASS_FIELD_P (decl) = 1;
1047 DECL_CONTEXT (decl) = type;
1049 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1050 that that means not calling pushdecl_top_level. */
1051 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1054 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1055 return ref;
1058 static tree
1059 build_classdollar_field (tree type)
1061 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1062 "", '/', '/', ".class$");
1063 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1065 if (decl == NULL_TREE)
1067 decl
1068 = build_decl (input_location,
1069 VAR_DECL, decl_name,
1070 (build_qualified_type
1071 (build_pointer_type
1072 (build_qualified_type (class_type_node,
1073 TYPE_QUAL_CONST)),
1074 TYPE_QUAL_CONST)));
1075 TREE_STATIC (decl) = 1;
1076 TREE_CONSTANT (decl) = 1;
1077 TREE_READONLY (decl) = 1;
1078 TREE_PUBLIC (decl) = 1;
1079 java_hide_decl (decl);
1080 DECL_IGNORED_P (decl) = 1;
1081 DECL_ARTIFICIAL (decl) = 1;
1082 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1083 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1084 DECL_CLASS_FIELD_P (decl) = 1;
1085 DECL_CONTEXT (decl) = type;
1088 return decl;
1091 /* Create a local variable that holds the current class$. */
1093 void
1094 cache_this_class_ref (tree fndecl)
1096 if (optimize)
1098 tree classdollar_field;
1099 if (flag_indirect_classes)
1100 classdollar_field = build_classdollar_field (output_class);
1101 else
1102 classdollar_field = build_static_class_ref (output_class);
1104 this_classdollar = build_decl (input_location,
1105 VAR_DECL, NULL_TREE,
1106 TREE_TYPE (classdollar_field));
1108 java_add_local_var (this_classdollar);
1109 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1110 this_classdollar, classdollar_field));
1112 else
1113 this_classdollar = build_classdollar_field (output_class);
1115 /* Prepend class initialization for static methods reachable from
1116 other classes. */
1117 if (METHOD_STATIC (fndecl)
1118 && (! METHOD_PRIVATE (fndecl)
1119 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1120 && ! DECL_CLINIT_P (fndecl)
1121 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1123 tree init = build_call_expr (soft_initclass_node, 1,
1124 this_classdollar);
1125 java_add_stmt (init);
1129 /* Remove the reference to the local variable that holds the current
1130 class$. */
1132 void
1133 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1135 this_classdollar = build_classdollar_field (output_class);
1138 /* Build a reference to the class TYPE.
1139 Also handles primitive types and array types. */
1141 tree
1142 build_class_ref (tree type)
1144 int is_compiled = is_compiled_class (type);
1145 if (is_compiled)
1147 tree ref, decl;
1148 if (TREE_CODE (type) == POINTER_TYPE)
1149 type = TREE_TYPE (type);
1151 if (flag_indirect_dispatch
1152 && type != output_class
1153 && TREE_CODE (type) == RECORD_TYPE)
1154 return build_indirect_class_ref (type);
1156 if (type == output_class && flag_indirect_classes)
1158 /* This can be NULL if we see a JNI stub before we see any
1159 other method. */
1160 if (! this_classdollar)
1161 this_classdollar = build_classdollar_field (output_class);
1162 return this_classdollar;
1165 if (TREE_CODE (type) == RECORD_TYPE)
1166 return build_static_class_ref (type);
1167 else
1169 const char *name;
1170 tree decl_name;
1171 char buffer[25];
1172 decl_name = TYPE_NAME (type);
1173 if (TREE_CODE (decl_name) == TYPE_DECL)
1174 decl_name = DECL_NAME (decl_name);
1175 name = IDENTIFIER_POINTER (decl_name);
1176 if (strncmp (name, "promoted_", 9) == 0)
1177 name += 9;
1178 sprintf (buffer, "_Jv_%sClass", name);
1179 decl_name = get_identifier (buffer);
1180 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1181 if (decl == NULL_TREE)
1183 decl = build_decl (input_location,
1184 VAR_DECL, decl_name, class_type_node);
1185 TREE_STATIC (decl) = 1;
1186 TREE_PUBLIC (decl) = 1;
1187 DECL_EXTERNAL (decl) = 1;
1188 DECL_ARTIFICIAL (decl) = 1;
1189 pushdecl_top_level (decl);
1193 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1194 return ref;
1196 else
1197 return build_indirect_class_ref (type);
1200 /* Create a local statically allocated variable that will hold a
1201 pointer to a static field. */
1203 static tree
1204 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1206 tree decl, decl_name;
1207 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1208 char *buf = (char *) alloca (strlen (name) + 20);
1209 sprintf (buf, "%s_%d_ref", name, index);
1210 decl_name = get_identifier (buf);
1211 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1212 if (decl == NULL_TREE)
1214 decl = build_decl (input_location,
1215 VAR_DECL, decl_name, ptr_type_node);
1216 TREE_STATIC (decl) = 1;
1217 TREE_PUBLIC (decl) = 0;
1218 DECL_EXTERNAL (decl) = 0;
1219 DECL_ARTIFICIAL (decl) = 1;
1220 DECL_IGNORED_P (decl) = 1;
1221 pushdecl_top_level (decl);
1223 return decl;
1226 tree
1227 build_static_field_ref (tree fdecl)
1229 tree fclass = DECL_CONTEXT (fdecl);
1230 int is_compiled = is_compiled_class (fclass);
1232 /* Allow static final fields to fold to a constant. When using
1233 -findirect-dispatch, we simply never do this folding if compiling
1234 from .class; in the .class file constants will be referred to via
1235 the constant pool. */
1236 if (!flag_indirect_dispatch
1237 && (is_compiled
1238 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1239 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1240 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1241 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1243 if (is_compiled == 1)
1244 DECL_EXTERNAL (fdecl) = 1;
1246 else
1248 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1249 and a class local static variable CACHE_ENTRY, then
1251 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1252 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1253 : cache_entry)
1255 This can mostly be optimized away, so that the usual path is a
1256 load followed by a test and branch. _Jv_ResolvePoolEntry is
1257 only called once for each constant pool entry.
1259 There is an optimization that we don't do: at the start of a
1260 method, create a local copy of CACHE_ENTRY and use that instead.
1264 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1265 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1266 tree test
1267 = build_call_expr (builtin_decl_implicit (BUILT_IN_EXPECT), 2,
1268 build2 (EQ_EXPR, boolean_type_node,
1269 cache_entry, null_pointer_node),
1270 boolean_false_node);
1271 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1272 tree init
1273 = build_call_expr (soft_resolvepoolentry_node, 2,
1274 build_class_ref (output_class),
1275 cpool_index_cst);
1276 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1277 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1278 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1279 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1281 return fdecl;
1285 get_access_flags_from_decl (tree decl)
1287 int access_flags = 0;
1288 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1290 if (FIELD_STATIC (decl))
1291 access_flags |= ACC_STATIC;
1292 if (FIELD_PUBLIC (decl))
1293 access_flags |= ACC_PUBLIC;
1294 if (FIELD_PROTECTED (decl))
1295 access_flags |= ACC_PROTECTED;
1296 if (FIELD_PRIVATE (decl))
1297 access_flags |= ACC_PRIVATE;
1298 if (FIELD_FINAL (decl))
1299 access_flags |= ACC_FINAL;
1300 if (FIELD_VOLATILE (decl))
1301 access_flags |= ACC_VOLATILE;
1302 if (FIELD_TRANSIENT (decl))
1303 access_flags |= ACC_TRANSIENT;
1304 if (FIELD_ENUM (decl))
1305 access_flags |= ACC_ENUM;
1306 if (FIELD_SYNTHETIC (decl))
1307 access_flags |= ACC_SYNTHETIC;
1308 return access_flags;
1310 if (TREE_CODE (decl) == TYPE_DECL)
1312 if (CLASS_PUBLIC (decl))
1313 access_flags |= ACC_PUBLIC;
1314 if (CLASS_FINAL (decl))
1315 access_flags |= ACC_FINAL;
1316 if (CLASS_SUPER (decl))
1317 access_flags |= ACC_SUPER;
1318 if (CLASS_INTERFACE (decl))
1319 access_flags |= ACC_INTERFACE;
1320 if (CLASS_ABSTRACT (decl))
1321 access_flags |= ACC_ABSTRACT;
1322 if (CLASS_STATIC (decl))
1323 access_flags |= ACC_STATIC;
1324 if (CLASS_PRIVATE (decl))
1325 access_flags |= ACC_PRIVATE;
1326 if (CLASS_PROTECTED (decl))
1327 access_flags |= ACC_PROTECTED;
1328 if (CLASS_STRICTFP (decl))
1329 access_flags |= ACC_STRICT;
1330 if (CLASS_ENUM (decl))
1331 access_flags |= ACC_ENUM;
1332 if (CLASS_SYNTHETIC (decl))
1333 access_flags |= ACC_SYNTHETIC;
1334 if (CLASS_ANNOTATION (decl))
1335 access_flags |= ACC_ANNOTATION;
1336 return access_flags;
1338 if (TREE_CODE (decl) == FUNCTION_DECL)
1340 if (METHOD_PUBLIC (decl))
1341 access_flags |= ACC_PUBLIC;
1342 if (METHOD_PRIVATE (decl))
1343 access_flags |= ACC_PRIVATE;
1344 if (METHOD_PROTECTED (decl))
1345 access_flags |= ACC_PROTECTED;
1346 if (METHOD_STATIC (decl))
1347 access_flags |= ACC_STATIC;
1348 if (METHOD_FINAL (decl))
1349 access_flags |= ACC_FINAL;
1350 if (METHOD_SYNCHRONIZED (decl))
1351 access_flags |= ACC_SYNCHRONIZED;
1352 if (METHOD_NATIVE (decl))
1353 access_flags |= ACC_NATIVE;
1354 if (METHOD_ABSTRACT (decl))
1355 access_flags |= ACC_ABSTRACT;
1356 if (METHOD_STRICTFP (decl))
1357 access_flags |= ACC_STRICT;
1358 if (METHOD_INVISIBLE (decl))
1359 access_flags |= ACC_INVISIBLE;
1360 if (DECL_ARTIFICIAL (decl))
1361 access_flags |= ACC_SYNTHETIC;
1362 if (METHOD_BRIDGE (decl))
1363 access_flags |= ACC_BRIDGE;
1364 if (METHOD_VARARGS (decl))
1365 access_flags |= ACC_VARARGS;
1366 return access_flags;
1368 gcc_unreachable ();
1371 static GTY (()) int alias_labelno = 0;
1373 /* Create a private alias for METHOD. Using this alias instead of the method
1374 decl ensures that ncode entries in the method table point to the real function
1375 at runtime, not a PLT entry. */
1377 static tree
1378 make_local_function_alias (tree method)
1380 #ifdef ASM_OUTPUT_DEF
1381 tree alias;
1383 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1384 char *name = (char *) alloca (strlen (method_name) + 2);
1385 char *buf = (char *) alloca (strlen (method_name) + 128);
1387 /* Only create aliases for local functions. */
1388 if (DECL_EXTERNAL (method))
1389 return method;
1391 /* Prefix method_name with 'L' for the alias label. */
1392 *name = 'L';
1393 strcpy (name + 1, method_name);
1395 targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);
1396 alias = build_decl (input_location,
1397 FUNCTION_DECL, get_identifier (buf),
1398 TREE_TYPE (method));
1399 DECL_CONTEXT (alias) = NULL;
1400 TREE_READONLY (alias) = TREE_READONLY (method);
1401 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1402 TREE_PUBLIC (alias) = 0;
1403 DECL_EXTERNAL (alias) = 0;
1404 DECL_ARTIFICIAL (alias) = 1;
1405 DECL_INITIAL (alias) = error_mark_node;
1406 TREE_ADDRESSABLE (alias) = 1;
1407 TREE_USED (alias) = 1;
1408 if (!flag_syntax_only)
1409 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1410 return alias;
1411 #else
1412 return method;
1413 #endif
1416 /** Make reflection data (_Jv_Field) for field FDECL. */
1418 static tree
1419 make_field_value (tree fdecl)
1421 tree finit;
1422 int flags;
1423 tree type = TREE_TYPE (fdecl);
1424 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1425 vec<constructor_elt, va_gc> *v = NULL;
1427 START_RECORD_CONSTRUCTOR (v, field_type_node);
1428 PUSH_FIELD_VALUE (v, "name", build_utf8_ref (DECL_NAME (fdecl)));
1429 if (resolved)
1430 type = build_class_ref (type);
1431 else
1433 tree signature = build_java_signature (type);
1435 type = build_utf8_ref (unmangle_classname
1436 (IDENTIFIER_POINTER (signature),
1437 IDENTIFIER_LENGTH (signature)));
1439 PUSH_FIELD_VALUE (v, "type", type);
1441 flags = get_access_flags_from_decl (fdecl);
1442 if (! resolved)
1443 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1445 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, flags));
1446 PUSH_FIELD_VALUE (v, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1449 tree field_address = integer_zero_node;
1450 tree index, value;
1451 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1452 && FIELD_STATIC (fdecl))
1453 field_address = build_address_of (fdecl);
1455 index = (FIELD_STATIC (fdecl)
1456 ? DECL_CHAIN (TYPE_FIELDS (field_info_union_node))
1457 : TYPE_FIELDS (field_info_union_node));
1458 value = (FIELD_STATIC (fdecl)
1459 ? field_address
1460 : byte_position (fdecl));
1462 PUSH_FIELD_VALUE
1463 (v, "info",
1464 build_constructor_single (field_info_union_node, index, value));
1467 FINISH_RECORD_CONSTRUCTOR (finit, v, field_type_node);
1468 return finit;
1471 /** Make reflection data (_Jv_Method) for method MDECL. */
1473 static tree
1474 make_method_value (tree mdecl)
1476 static int method_name_count = 0;
1477 tree minit;
1478 tree index;
1479 tree code;
1480 tree class_decl;
1481 #define ACC_TRANSLATED 0x4000
1482 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1483 vec<constructor_elt, va_gc> *v = NULL;
1485 class_decl = DECL_CONTEXT (mdecl);
1486 /* For interfaces, the index field contains the dispatch index. */
1487 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1488 index = build_int_cst (NULL_TREE,
1489 get_interface_method_index (mdecl, class_decl));
1490 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1491 index = get_method_index (mdecl);
1492 else
1493 index = integer_minus_one_node;
1495 code = null_pointer_node;
1496 if (METHOD_ABSTRACT (mdecl))
1497 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1498 soft_abstractmethod_node);
1499 else
1500 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1501 make_local_function_alias (mdecl));
1502 START_RECORD_CONSTRUCTOR (v, method_type_node);
1503 PUSH_FIELD_VALUE (v, "name",
1504 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1505 init_identifier_node
1506 : DECL_NAME (mdecl)));
1508 tree signature = build_java_signature (TREE_TYPE (mdecl));
1509 PUSH_FIELD_VALUE (v, "signature",
1510 (build_utf8_ref
1511 (unmangle_classname
1512 (IDENTIFIER_POINTER(signature),
1513 IDENTIFIER_LENGTH(signature)))));
1515 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, accflags));
1516 PUSH_FIELD_VALUE (v, "index", index);
1517 PUSH_FIELD_VALUE (v, "ncode", code);
1520 /* Compute the `throws' information for the method. */
1521 tree table = null_pointer_node;
1523 if (!vec_safe_is_empty (DECL_FUNCTION_THROWS (mdecl)))
1525 int length = 1 + DECL_FUNCTION_THROWS (mdecl)->length ();
1526 tree t, type, array;
1527 char buf[60];
1528 vec<constructor_elt, va_gc> *v = NULL;
1529 int idx = length - 1;
1530 unsigned ix;
1531 constructor_elt *e;
1533 vec_alloc (v, length);
1534 v->quick_grow_cleared (length);
1536 e = &(*v)[idx--];
1537 e->value = null_pointer_node;
1539 FOR_EACH_VEC_SAFE_ELT (DECL_FUNCTION_THROWS (mdecl), ix, t)
1541 tree sig = DECL_NAME (TYPE_NAME (t));
1542 tree utf8
1543 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1544 IDENTIFIER_LENGTH (sig)));
1545 e = &(*v)[idx--];
1546 e->value = utf8;
1548 gcc_assert (idx == -1);
1549 type = build_prim_array_type (ptr_type_node, length);
1550 table = build_constructor (type, v);
1551 /* Compute something unique enough. */
1552 sprintf (buf, "_methods%d", method_name_count++);
1553 array = build_decl (input_location,
1554 VAR_DECL, get_identifier (buf), type);
1555 DECL_INITIAL (array) = table;
1556 TREE_STATIC (array) = 1;
1557 DECL_ARTIFICIAL (array) = 1;
1558 DECL_IGNORED_P (array) = 1;
1559 rest_of_decl_compilation (array, 1, 0);
1561 table = build1 (ADDR_EXPR, ptr_type_node, array);
1564 PUSH_FIELD_VALUE (v, "throws", table);
1567 FINISH_RECORD_CONSTRUCTOR (minit, v, method_type_node);
1568 return minit;
1571 static tree
1572 get_dispatch_vector (tree type)
1574 tree vtable = TYPE_VTABLE (type);
1576 if (vtable == NULL_TREE)
1578 HOST_WIDE_INT i;
1579 tree method;
1580 tree super = CLASSTYPE_SUPER (type);
1581 HOST_WIDE_INT nvirtuals = tree_to_shwi (TYPE_NVIRTUALS (type));
1582 vtable = make_tree_vec (nvirtuals);
1583 TYPE_VTABLE (type) = vtable;
1584 if (super != NULL_TREE)
1586 tree super_vtable = get_dispatch_vector (super);
1588 for (i = tree_to_shwi (TYPE_NVIRTUALS (super)); --i >= 0; )
1589 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1592 for (method = TYPE_METHODS (type); method != NULL_TREE;
1593 method = DECL_CHAIN (method))
1595 tree method_index = get_method_index (method);
1596 if (method_index != NULL_TREE
1597 && tree_fits_shwi_p (method_index))
1598 TREE_VEC_ELT (vtable, tree_to_shwi (method_index)) = method;
1602 return vtable;
1605 static tree
1606 get_dispatch_table (tree type, tree this_class_addr)
1608 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1609 tree vtable = get_dispatch_vector (type);
1610 int i, j;
1611 int nvirtuals = TREE_VEC_LENGTH (vtable);
1612 int arraysize;
1613 tree gc_descr;
1614 vec<constructor_elt, va_gc> *v = NULL;
1615 constructor_elt *e;
1616 tree arraytype;
1618 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1619 if (TARGET_VTABLE_USES_DESCRIPTORS)
1620 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1621 arraysize += 2;
1623 vec_safe_grow_cleared (v, arraysize);
1624 e = &(*v)[arraysize - 1];
1626 #define CONSTRUCTOR_PREPEND_VALUE(E, V) E->value = V, E--
1627 for (i = nvirtuals; --i >= 0; )
1629 tree method = TREE_VEC_ELT (vtable, i);
1630 if (METHOD_ABSTRACT (method))
1632 if (! abstract_p)
1633 warning_at (DECL_SOURCE_LOCATION (method), 0,
1634 "abstract method in non-abstract class");
1636 if (TARGET_VTABLE_USES_DESCRIPTORS)
1637 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1638 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1639 else
1640 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1642 else
1644 if (TARGET_VTABLE_USES_DESCRIPTORS)
1645 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1647 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1648 method, build_int_cst (NULL_TREE, j));
1649 TREE_CONSTANT (fdesc) = 1;
1650 CONSTRUCTOR_PREPEND_VALUE (e, fdesc);
1652 else
1653 CONSTRUCTOR_PREPEND_VALUE (e,
1654 build1 (ADDR_EXPR,
1655 nativecode_ptr_type_node,
1656 method));
1660 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1661 using the Boehm GC we sometimes stash a GC type descriptor
1662 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1663 the emitted byte count during the output to the assembly file. */
1664 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1665 fake "function descriptor". It's first word is the is the class
1666 pointer, and subsequent words (usually one) contain the GC descriptor.
1667 In all other cases, we reserve two extra vtable slots. */
1668 gc_descr = get_boehm_type_descriptor (type);
1669 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1670 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1671 CONSTRUCTOR_PREPEND_VALUE (e, gc_descr);
1672 CONSTRUCTOR_PREPEND_VALUE (e, this_class_addr);
1674 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1675 CONSTRUCTOR_PREPEND_VALUE (e, null_pointer_node);
1676 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1677 gcc_assert (e == v->address ());
1678 e->index = integer_zero_node;
1679 e->value = null_pointer_node;
1680 #undef CONSTRUCTOR_PREPEND_VALUE
1682 arraytype = build_prim_array_type (nativecode_ptr_type_node, arraysize);
1683 return build_constructor (arraytype, v);
1687 /* Set the method_index for a method decl. */
1688 void
1689 set_method_index (tree decl, tree method_index)
1691 if (method_index != NULL_TREE)
1693 /* method_index is null if we're using indirect dispatch. */
1694 method_index = fold (convert (sizetype, method_index));
1696 if (TARGET_VTABLE_USES_DESCRIPTORS)
1697 /* Add one to skip bogus descriptor for class and GC descriptor. */
1698 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1699 else
1700 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1701 descriptor. */
1702 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1705 DECL_VINDEX (decl) = method_index;
1708 /* Get the method_index for a method decl. */
1709 tree
1710 get_method_index (tree decl)
1712 tree method_index = DECL_VINDEX (decl);
1714 if (! method_index)
1715 return NULL;
1717 if (TARGET_VTABLE_USES_DESCRIPTORS)
1718 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1719 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1720 else
1721 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1722 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1724 return method_index;
1727 static int
1728 supers_all_compiled (tree type)
1730 while (type != NULL_TREE)
1732 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1733 return 0;
1734 type = CLASSTYPE_SUPER (type);
1736 return 1;
1739 static void
1740 add_table_and_syms (vec<constructor_elt, va_gc> **v,
1741 vec<method_entry, va_gc> *methods,
1742 const char *table_name, tree table_slot, tree table_type,
1743 const char *syms_name, tree syms_slot)
1745 if (methods == NULL)
1747 PUSH_FIELD_VALUE (*v, table_name, null_pointer_node);
1748 PUSH_FIELD_VALUE (*v, syms_name, null_pointer_node);
1750 else
1752 pushdecl_top_level (syms_slot);
1753 PUSH_FIELD_VALUE (*v, table_name,
1754 build1 (ADDR_EXPR, table_type, table_slot));
1755 PUSH_FIELD_VALUE (*v, syms_name,
1756 build1 (ADDR_EXPR, symbols_array_ptr_type,
1757 syms_slot));
1758 TREE_CONSTANT (table_slot) = 1;
1762 void
1763 make_class_data (tree type)
1765 tree decl, cons, temp;
1766 tree field, fields_decl;
1767 HOST_WIDE_INT static_field_count = 0;
1768 HOST_WIDE_INT instance_field_count = 0;
1769 HOST_WIDE_INT field_count;
1770 tree field_array_type;
1771 tree method;
1772 tree dtable_decl = NULL_TREE;
1773 HOST_WIDE_INT method_count = 0;
1774 tree method_array_type;
1775 tree methods_decl;
1776 tree super;
1777 tree this_class_addr;
1778 tree constant_pool_constructor;
1779 tree interfaces = null_pointer_node;
1780 int interface_len = 0;
1781 int uses_jv_markobj = 0;
1782 tree type_decl = TYPE_NAME (type);
1783 tree id_main = get_identifier("main");
1784 tree id_class = get_identifier("java.lang.Class");
1785 /** Offset from start of virtual function table declaration
1786 to where objects actually point at, following new g++ ABI. */
1787 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1788 vec<int> field_indexes;
1789 tree first_real_field;
1790 vec<constructor_elt, va_gc> *v1 = NULL, *v2 = NULL;
1791 tree reflection_data;
1792 vec<constructor_elt, va_gc> *static_fields = NULL;
1793 vec<constructor_elt, va_gc> *instance_fields = NULL;
1794 vec<constructor_elt, va_gc> *methods = NULL;
1796 this_class_addr = build_static_class_ref (type);
1797 decl = TREE_OPERAND (this_class_addr, 0);
1799 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1800 && !flag_indirect_dispatch)
1802 tree dtable = get_dispatch_table (type, this_class_addr);
1803 uses_jv_markobj = uses_jv_markobj_p (dtable);
1804 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1806 /* We've already created some other class, and consequently
1807 we made class_dtable_decl. Now we just want to fill it
1808 in. */
1809 dtable_decl = class_dtable_decl;
1811 else
1813 dtable_decl = build_dtable_decl (type);
1814 TREE_STATIC (dtable_decl) = 1;
1815 DECL_ARTIFICIAL (dtable_decl) = 1;
1816 DECL_IGNORED_P (dtable_decl) = 1;
1819 TREE_PUBLIC (dtable_decl) = 1;
1820 DECL_INITIAL (dtable_decl) = dtable;
1821 /* The only dispatch table exported from a DSO is the dispatch
1822 table for java.lang.Class. */
1823 if (DECL_NAME (type_decl) != id_class)
1824 java_hide_decl (dtable_decl);
1825 if (! flag_indirect_classes)
1826 rest_of_decl_compilation (dtable_decl, 1, 0);
1827 /* Maybe we're compiling Class as the first class. If so, set
1828 class_dtable_decl to the decl we just made. */
1829 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1830 class_dtable_decl = dtable_decl;
1833 /* Build Field array. */
1834 field = TYPE_FIELDS (type);
1835 while (field && DECL_ARTIFICIAL (field))
1836 field = DECL_CHAIN (field); /* Skip dummy fields. */
1837 if (field && DECL_NAME (field) == NULL_TREE)
1838 field = DECL_CHAIN (field); /* Skip dummy field for inherited data. */
1839 first_real_field = field;
1841 /* First count static and instance fields. */
1842 for ( ; field != NULL_TREE; field = DECL_CHAIN (field))
1844 if (! DECL_ARTIFICIAL (field))
1846 if (FIELD_STATIC (field))
1847 static_field_count++;
1848 else if (uses_jv_markobj || !flag_reduced_reflection)
1849 instance_field_count++;
1852 field_count = static_field_count + instance_field_count;
1853 field_indexes.create (field_count);
1855 /* gcj sorts fields so that static fields come first, followed by
1856 instance fields. Unfortunately, by the time this takes place we
1857 have already generated the reflection_data for this class, and
1858 that data contains indexes into the fields. So, we generate a
1859 permutation that maps each original field index to its final
1860 position. Then we pass this permutation to
1861 rewrite_reflection_indexes(), which fixes up the reflection
1862 data. */
1864 int i;
1865 int static_count = 0;
1866 int instance_count = static_field_count;
1867 int field_index;
1869 for (i = 0, field = first_real_field;
1870 field != NULL_TREE;
1871 field = DECL_CHAIN (field), i++)
1873 if (! DECL_ARTIFICIAL (field))
1875 field_index = 0;
1876 if (FIELD_STATIC (field))
1877 field_index = static_count++;
1878 else if (uses_jv_markobj || !flag_reduced_reflection)
1879 field_index = instance_count++;
1880 else
1881 continue;
1882 field_indexes.quick_push (field_index);
1887 for (field = first_real_field; field != NULL_TREE;
1888 field = DECL_CHAIN (field))
1890 if (! DECL_ARTIFICIAL (field))
1892 if (FIELD_STATIC (field))
1894 /* We must always create reflection data for static fields
1895 as it is used in the creation of the field itself. */
1896 tree init = make_field_value (field);
1897 tree initial = DECL_INITIAL (field);
1898 CONSTRUCTOR_APPEND_ELT (static_fields, NULL_TREE, init);
1899 /* If the initial value is a string constant,
1900 prevent output_constant from trying to assemble the value. */
1901 if (initial != NULL_TREE
1902 && TREE_TYPE (initial) == string_ptr_type_node)
1903 DECL_INITIAL (field) = NULL_TREE;
1904 rest_of_decl_compilation (field, 1, 1);
1905 DECL_INITIAL (field) = initial;
1907 else if (uses_jv_markobj || !flag_reduced_reflection)
1909 tree init = make_field_value (field);
1910 CONSTRUCTOR_APPEND_ELT (instance_fields, NULL_TREE, init);
1915 gcc_assert (static_field_count == (int) vec_safe_length (static_fields));
1916 gcc_assert (instance_field_count == (int) vec_safe_length (instance_fields));
1918 if (field_count > 0)
1920 vec_safe_splice (static_fields, instance_fields);
1921 field_array_type = build_prim_array_type (field_type_node, field_count);
1922 fields_decl = build_decl (input_location,
1923 VAR_DECL, mangled_classname ("_FL_", type),
1924 field_array_type);
1925 DECL_INITIAL (fields_decl)
1926 = build_constructor (field_array_type, static_fields);
1927 TREE_STATIC (fields_decl) = 1;
1928 DECL_ARTIFICIAL (fields_decl) = 1;
1929 DECL_IGNORED_P (fields_decl) = 1;
1930 rest_of_decl_compilation (fields_decl, 1, 0);
1932 else
1933 fields_decl = NULL_TREE;
1935 /* Build Method array. */
1936 for (method = TYPE_METHODS (type);
1937 method != NULL_TREE; method = DECL_CHAIN (method))
1939 tree init;
1940 if (METHOD_PRIVATE (method)
1941 && ! flag_keep_inline_functions
1942 && optimize)
1943 continue;
1944 /* Even if we have a decl, we don't necessarily have the code.
1945 This can happen if we inherit a method from a superclass for
1946 which we don't have a .class file. */
1947 if (METHOD_DUMMY (method))
1948 continue;
1950 /* Generate method reflection data if:
1952 - !flag_reduced_reflection.
1954 - <clinit> -- The runtime uses reflection to initialize the
1955 class.
1957 - Any method in class java.lang.Class -- Class.forName() and
1958 perhaps other things require it.
1960 - class$ -- It does not work if reflection data missing.
1962 - main -- Reflection is used to find main(String[]) methods.
1964 - public not static -- It is potentially part of an
1965 interface. The runtime uses reflection data to build
1966 interface dispatch tables. */
1967 if (!flag_reduced_reflection
1968 || DECL_CLINIT_P (method)
1969 || DECL_NAME (type_decl) == id_class
1970 || DECL_NAME (method) == id_main
1971 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
1973 init = make_method_value (method);
1974 method_count++;
1975 CONSTRUCTOR_APPEND_ELT (methods, NULL_TREE, init);
1978 method_array_type = build_prim_array_type (method_type_node, method_count);
1979 methods_decl = build_decl (input_location,
1980 VAR_DECL, mangled_classname ("_MT_", type),
1981 method_array_type);
1982 DECL_INITIAL (methods_decl) = build_constructor (method_array_type, methods);
1983 TREE_STATIC (methods_decl) = 1;
1984 DECL_ARTIFICIAL (methods_decl) = 1;
1985 DECL_IGNORED_P (methods_decl) = 1;
1986 rest_of_decl_compilation (methods_decl, 1, 0);
1988 if (class_dtable_decl == NULL_TREE)
1990 class_dtable_decl = build_dtable_decl (class_type_node);
1991 TREE_STATIC (class_dtable_decl) = 1;
1992 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1993 DECL_IGNORED_P (class_dtable_decl) = 1;
1994 if (is_compiled_class (class_type_node) != 2)
1996 DECL_EXTERNAL (class_dtable_decl) = 1;
1997 rest_of_decl_compilation (class_dtable_decl, 1, 0);
2001 super = CLASSTYPE_SUPER (type);
2002 if (super == NULL_TREE)
2003 super = null_pointer_node;
2004 else if (! flag_indirect_dispatch
2005 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
2006 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
2007 super = build_class_ref (super);
2008 else
2010 int super_index = alloc_class_constant (super);
2011 super = build_int_cst (ptr_type_node, super_index);
2014 /* Build and emit the array of implemented interfaces. */
2015 if (type != object_type_node)
2016 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
2018 if (interface_len > 0)
2020 int i;
2021 tree interface_array_type, idecl;
2022 vec<constructor_elt, va_gc> *init;
2023 vec_alloc (init, interface_len);
2024 interface_array_type
2025 = build_prim_array_type (class_ptr_type, interface_len);
2026 idecl = build_decl (input_location,
2027 VAR_DECL, mangled_classname ("_IF_", type),
2028 interface_array_type);
2030 for (i = 1; i <= interface_len; i++)
2032 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
2033 tree iclass = BINFO_TYPE (child);
2034 tree index;
2035 if (! flag_indirect_dispatch
2036 && (assume_compiled
2037 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
2038 index = build_class_ref (iclass);
2039 else
2041 int int_index = alloc_class_constant (iclass);
2042 index = build_int_cst (ptr_type_node, int_index);
2044 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, index);
2046 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
2047 TREE_STATIC (idecl) = 1;
2048 DECL_ARTIFICIAL (idecl) = 1;
2049 DECL_IGNORED_P (idecl) = 1;
2050 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
2051 rest_of_decl_compilation (idecl, 1, 0);
2054 constant_pool_constructor = build_constants_constructor ();
2056 if (flag_indirect_dispatch)
2058 TYPE_OTABLE_DECL (type)
2059 = emit_symbol_table
2060 (DECL_NAME (TYPE_OTABLE_DECL (type)),
2061 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
2062 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
2064 TYPE_ATABLE_DECL (type)
2065 = emit_symbol_table
2066 (DECL_NAME (TYPE_ATABLE_DECL (type)),
2067 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
2068 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
2070 TYPE_ITABLE_DECL (type)
2071 = emit_symbol_table
2072 (DECL_NAME (TYPE_ITABLE_DECL (type)),
2073 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
2074 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
2077 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
2079 START_RECORD_CONSTRUCTOR (v1, object_type_node);
2080 PUSH_FIELD_VALUE (v1, "vtable",
2081 (flag_indirect_classes
2082 ? null_pointer_node
2083 : fold_build_pointer_plus
2084 (build1 (ADDR_EXPR, dtable_ptr_type,
2085 class_dtable_decl),
2086 dtable_start_offset)));
2087 if (! flag_hash_synchronization)
2088 PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
2089 FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
2090 START_RECORD_CONSTRUCTOR (v2, class_type_node);
2091 PUSH_SUPER_VALUE (v2, temp);
2092 PUSH_FIELD_VALUE (v2, "next_or_version", gcj_abi_version);
2093 PUSH_FIELD_VALUE (v2, "name", build_utf8_ref (DECL_NAME (type_decl)));
2094 PUSH_FIELD_VALUE (v2, "accflags",
2095 build_int_cst (NULL_TREE,
2096 get_access_flags_from_decl (type_decl)));
2098 PUSH_FIELD_VALUE (v2, "superclass",
2099 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
2100 PUSH_FIELD_VALUE (v2, "constants", constant_pool_constructor);
2101 PUSH_FIELD_VALUE (v2, "methods",
2102 methods_decl == NULL_TREE ? null_pointer_node
2103 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
2104 PUSH_FIELD_VALUE (v2, "method_count",
2105 build_int_cst (NULL_TREE, method_count));
2107 PUSH_FIELD_VALUE (v2, "vtable_method_count",
2108 (flag_indirect_dispatch
2109 ? integer_minus_one_node
2110 : TYPE_NVIRTUALS (type)));
2112 PUSH_FIELD_VALUE (v2, "fields",
2113 fields_decl == NULL_TREE ? null_pointer_node
2114 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2115 /* If we're using the binary compatibility ABI we don't know the
2116 size until load time. */
2117 PUSH_FIELD_VALUE (v2, "size_in_bytes",
2118 (flag_indirect_dispatch
2119 ? integer_minus_one_node
2120 : size_in_bytes (type)));
2121 PUSH_FIELD_VALUE (v2, "field_count",
2122 build_int_cst (NULL_TREE, field_count));
2123 PUSH_FIELD_VALUE (v2, "static_field_count",
2124 build_int_cst (NULL_TREE, static_field_count));
2126 PUSH_FIELD_VALUE (v2, "vtable",
2127 (flag_indirect_dispatch || dtable_decl == NULL_TREE
2128 ? null_pointer_node
2129 : fold_build_pointer_plus
2130 (build1 (ADDR_EXPR, dtable_ptr_type,
2131 dtable_decl),
2132 dtable_start_offset)));
2133 add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
2134 "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
2135 "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
2136 add_table_and_syms (&v2, TYPE_ATABLE_METHODS (type),
2137 "atable", TYPE_ATABLE_DECL (type), atable_ptr_type,
2138 "atable_syms", TYPE_ATABLE_SYMS_DECL (type));
2139 add_table_and_syms (&v2, TYPE_ITABLE_METHODS (type),
2140 "itable", TYPE_ITABLE_DECL (type), itable_ptr_type,
2141 "itable_syms", TYPE_ITABLE_SYMS_DECL (type));
2143 PUSH_FIELD_VALUE (v2, "catch_classes",
2144 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2145 PUSH_FIELD_VALUE (v2, "interfaces", interfaces);
2146 PUSH_FIELD_VALUE (v2, "loader", null_pointer_node);
2147 PUSH_FIELD_VALUE (v2, "interface_count",
2148 build_int_cst (NULL_TREE, interface_len));
2149 PUSH_FIELD_VALUE (v2, "state",
2150 convert (byte_type_node,
2151 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2153 PUSH_FIELD_VALUE (v2, "thread", null_pointer_node);
2154 PUSH_FIELD_VALUE (v2, "depth", integer_zero_node);
2155 PUSH_FIELD_VALUE (v2, "ancestors", null_pointer_node);
2156 PUSH_FIELD_VALUE (v2, "idt", null_pointer_node);
2157 PUSH_FIELD_VALUE (v2, "arrayclass", null_pointer_node);
2158 PUSH_FIELD_VALUE (v2, "protectionDomain", null_pointer_node);
2161 tree assertion_table_ref;
2162 if (TYPE_ASSERTIONS (type) == NULL)
2163 assertion_table_ref = null_pointer_node;
2164 else
2165 assertion_table_ref = build1 (ADDR_EXPR,
2166 build_pointer_type (assertion_table_type),
2167 emit_assertion_table (type));
2169 PUSH_FIELD_VALUE (v2, "assertion_table", assertion_table_ref);
2172 PUSH_FIELD_VALUE (v2, "hack_signers", null_pointer_node);
2173 PUSH_FIELD_VALUE (v2, "chain", null_pointer_node);
2174 PUSH_FIELD_VALUE (v2, "aux_info", null_pointer_node);
2175 PUSH_FIELD_VALUE (v2, "engine", null_pointer_node);
2177 if (TYPE_REFLECTION_DATA (current_class))
2179 int i;
2180 int count = TYPE_REFLECTION_DATASIZE (current_class);
2181 vec<constructor_elt, va_gc> *v;
2182 vec_alloc (v, count);
2183 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2184 tree max_index = build_int_cst (sizetype, count);
2185 tree index = build_index_type (max_index);
2186 tree type = build_array_type (unsigned_byte_type_node, index);
2187 char buf[64];
2188 tree array;
2189 static int reflection_data_count;
2191 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2192 array = build_decl (input_location,
2193 VAR_DECL, get_identifier (buf), type);
2195 rewrite_reflection_indexes (&field_indexes);
2197 for (i = 0; i < count; i++)
2199 constructor_elt elt;
2200 elt.index = build_int_cst (sizetype, i);
2201 elt.value = build_int_cstu (byte_type_node, data[i]);
2202 v->quick_push (elt);
2205 DECL_INITIAL (array) = build_constructor (type, v);
2206 TREE_STATIC (array) = 1;
2207 DECL_ARTIFICIAL (array) = 1;
2208 DECL_IGNORED_P (array) = 1;
2209 TREE_READONLY (array) = 1;
2210 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2211 rest_of_decl_compilation (array, 1, 0);
2213 reflection_data = build_address_of (array);
2215 free (data);
2216 TYPE_REFLECTION_DATA (current_class) = NULL;
2218 else
2219 reflection_data = null_pointer_node;
2221 PUSH_FIELD_VALUE (v2, "reflection_data", reflection_data);
2222 FINISH_RECORD_CONSTRUCTOR (cons, v2, class_type_node);
2224 DECL_INITIAL (decl) = cons;
2226 /* Hash synchronization requires at least 64-bit alignment. */
2227 if (flag_hash_synchronization && POINTER_SIZE < 64)
2228 DECL_ALIGN (decl) = 64;
2230 if (flag_indirect_classes)
2232 TREE_READONLY (decl) = 1;
2233 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2236 rest_of_decl_compilation (decl, 1, 0);
2239 tree classdollar_field = build_classdollar_field (type);
2240 if (!flag_indirect_classes)
2241 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2242 rest_of_decl_compilation (classdollar_field, 1, 0);
2245 TYPE_OTABLE_DECL (type) = NULL_TREE;
2246 TYPE_ATABLE_DECL (type) = NULL_TREE;
2247 TYPE_CTABLE_DECL (type) = NULL_TREE;
2250 void
2251 finish_class (void)
2253 java_expand_catch_classes (current_class);
2255 current_function_decl = NULL_TREE;
2256 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2257 make_class_data (current_class);
2258 register_class ();
2259 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2262 /* Return 2 if KLASS is compiled by this compilation job;
2263 return 1 if KLASS can otherwise be assumed to be compiled;
2264 return 0 if we cannot assume that KLASS is compiled.
2265 Returns 1 for primitive and 0 for array types. */
2267 is_compiled_class (tree klass)
2269 int seen_in_zip;
2270 if (TREE_CODE (klass) == POINTER_TYPE)
2271 klass = TREE_TYPE (klass);
2272 if (TREE_CODE (klass) != RECORD_TYPE) /* Primitive types are static. */
2273 return 1;
2274 if (TYPE_ARRAY_P (klass))
2275 return 0;
2277 seen_in_zip = (TYPE_JCF (klass) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass)));
2278 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass))
2280 /* The class was seen in the current ZIP file and will be
2281 available as a compiled class in the future but may not have
2282 been loaded already. Load it if necessary. This prevent
2283 build_class_ref () from crashing. */
2285 if (seen_in_zip && !CLASS_LOADED_P (klass) && (klass != current_class))
2286 load_class (klass, 1);
2288 /* We return 2 for class seen in ZIP and class from files
2289 belonging to the same compilation unit */
2290 return 2;
2293 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass)))))
2295 if (!CLASS_LOADED_P (klass))
2297 if (klass != current_class)
2298 load_class (klass, 1);
2300 return 1;
2303 return 0;
2306 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2308 tree
2309 build_dtable_decl (tree type)
2311 tree dtype, decl;
2313 /* We need to build a new dtable type so that its size is uniquely
2314 computed when we're dealing with the class for real and not just
2315 faking it (like java.lang.Class during the initialization of the
2316 compiler.) We know we're not faking a class when CURRENT_CLASS is
2317 TYPE. */
2318 if (current_class == type)
2320 tree dummy = NULL_TREE;
2321 int n;
2323 dtype = make_node (RECORD_TYPE);
2325 PUSH_FIELD (input_location, dtype, dummy, "top_offset", ptr_type_node);
2326 PUSH_FIELD (input_location, dtype, dummy, "type_info", ptr_type_node);
2328 PUSH_FIELD (input_location, dtype, dummy, "class", class_ptr_type);
2329 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2331 tree tmp_field = build_decl (input_location,
2332 FIELD_DECL, NULL_TREE, ptr_type_node);
2333 TREE_CHAIN (dummy) = tmp_field;
2334 DECL_CONTEXT (tmp_field) = dtype;
2335 DECL_ARTIFICIAL (tmp_field) = 1;
2336 dummy = tmp_field;
2339 PUSH_FIELD (input_location, dtype, dummy, "gc_descr", ptr_type_node);
2340 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2342 tree tmp_field = build_decl (input_location,
2343 FIELD_DECL, NULL_TREE, ptr_type_node);
2344 TREE_CHAIN (dummy) = tmp_field;
2345 DECL_CONTEXT (tmp_field) = dtype;
2346 DECL_ARTIFICIAL (tmp_field) = 1;
2347 dummy = tmp_field;
2350 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2351 if (TARGET_VTABLE_USES_DESCRIPTORS)
2352 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2354 PUSH_FIELD (input_location, dtype, dummy, "methods",
2355 build_prim_array_type (nativecode_ptr_type_node, n));
2356 layout_type (dtype);
2358 else
2359 dtype = dtable_type;
2361 decl = build_decl (input_location,
2362 VAR_DECL, get_identifier ("vt$"), dtype);
2363 DECL_CONTEXT (decl) = type;
2364 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2365 DECL_VTABLE_P (decl) = 1;
2367 return decl;
2370 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2371 fields inherited from SUPER_CLASS. */
2373 void
2374 push_super_field (tree this_class, tree super_class)
2376 tree base_decl;
2377 /* Don't insert the field if we're just re-laying the class out. */
2378 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2379 return;
2380 base_decl = build_decl (input_location,
2381 FIELD_DECL, NULL_TREE, super_class);
2382 DECL_IGNORED_P (base_decl) = 1;
2383 DECL_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2384 TYPE_FIELDS (this_class) = base_decl;
2385 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2386 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2389 /* Handle the different manners we may have to lay out a super class. */
2391 static tree
2392 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2394 if (!super_class)
2395 return NULL_TREE;
2396 else if (TREE_CODE (super_class) == RECORD_TYPE)
2398 if (!CLASS_LOADED_P (super_class))
2399 load_class (super_class, 1);
2401 /* We might have to layout the class before its dependency on
2402 the super class gets resolved by java_complete_class */
2403 else if (TREE_CODE (super_class) == POINTER_TYPE)
2405 if (TREE_TYPE (super_class) != NULL_TREE)
2406 super_class = TREE_TYPE (super_class);
2407 else
2408 gcc_unreachable ();
2410 if (!TYPE_SIZE (super_class))
2411 safe_layout_class (super_class);
2413 return super_class;
2416 /* safe_layout_class just makes sure that we can load a class without
2417 disrupting the current_class, input_location, etc, information
2418 about the class processed currently. */
2420 void
2421 safe_layout_class (tree klass)
2423 tree save_current_class = current_class;
2424 location_t save_location = input_location;
2426 layout_class (klass);
2428 current_class = save_current_class;
2429 input_location = save_location;
2432 void
2433 layout_class (tree this_class)
2435 int i;
2436 tree super_class = CLASSTYPE_SUPER (this_class);
2438 class_list = tree_cons (this_class, NULL_TREE, class_list);
2439 if (CLASS_BEING_LAIDOUT (this_class))
2441 char buffer [1024];
2442 char *report;
2443 tree current;
2445 sprintf (buffer, " with '%s'",
2446 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2447 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2449 for (current = TREE_CHAIN (class_list); current;
2450 current = TREE_CHAIN (current))
2452 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2453 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2454 IDENTIFIER_POINTER (DECL_NAME (decl)),
2455 DECL_SOURCE_FILE (decl),
2456 DECL_SOURCE_LINE (decl));
2457 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2459 obstack_1grow (&temporary_obstack, '\0');
2460 report = XOBFINISH (&temporary_obstack, char *);
2461 cyclic_inheritance_report = ggc_strdup (report);
2462 obstack_free (&temporary_obstack, report);
2463 TYPE_SIZE (this_class) = error_mark_node;
2464 return;
2466 CLASS_BEING_LAIDOUT (this_class) = 1;
2468 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2470 tree maybe_super_class
2471 = maybe_layout_super_class (super_class, this_class);
2472 if (maybe_super_class == NULL
2473 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2475 TYPE_SIZE (this_class) = error_mark_node;
2476 CLASS_BEING_LAIDOUT (this_class) = 0;
2477 class_list = TREE_CHAIN (class_list);
2478 return;
2480 if (TYPE_SIZE (this_class) == NULL_TREE)
2481 push_super_field (this_class, maybe_super_class);
2484 layout_type (this_class);
2486 /* Also recursively load/layout any superinterfaces. */
2487 if (TYPE_BINFO (this_class))
2489 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2491 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2492 tree super_interface = BINFO_TYPE (binfo);
2493 tree maybe_super_interface
2494 = maybe_layout_super_class (super_interface, NULL_TREE);
2495 if (maybe_super_interface == NULL
2496 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2498 TYPE_SIZE (this_class) = error_mark_node;
2499 CLASS_BEING_LAIDOUT (this_class) = 0;
2500 class_list = TREE_CHAIN (class_list);
2501 return;
2506 /* Convert the size back to an SI integer value. */
2507 TYPE_SIZE_UNIT (this_class) =
2508 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2510 CLASS_BEING_LAIDOUT (this_class) = 0;
2511 class_list = TREE_CHAIN (class_list);
2514 static void
2515 add_miranda_methods (tree base_class, tree search_class)
2517 int i;
2518 tree binfo, base_binfo;
2520 if (!CLASS_PARSED_P (search_class))
2521 load_class (search_class, 1);
2523 for (binfo = TYPE_BINFO (search_class), i = 1;
2524 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2526 tree method_decl;
2527 tree elt = BINFO_TYPE (base_binfo);
2529 /* FIXME: This is totally bogus. We should not be handling
2530 Miranda methods at all if we're using the BC ABI. */
2531 if (TYPE_DUMMY (elt))
2532 continue;
2534 /* Ensure that interface methods are seen in declared order. */
2535 if (!CLASS_LOADED_P (elt))
2536 load_class (elt, 1);
2537 layout_class_methods (elt);
2539 /* All base classes will have been laid out at this point, so the order
2540 will be correct. This code must match similar layout code in the
2541 runtime. */
2542 for (method_decl = TYPE_METHODS (elt);
2543 method_decl; method_decl = DECL_CHAIN (method_decl))
2545 tree sig, override;
2547 /* An interface can have <clinit>. */
2548 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2549 continue;
2551 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2552 override = lookup_argument_method (base_class,
2553 DECL_NAME (method_decl), sig);
2554 if (override == NULL_TREE)
2556 /* Found a Miranda method. Add it. */
2557 tree new_method;
2558 sig = build_java_signature (TREE_TYPE (method_decl));
2559 new_method
2560 = add_method (base_class,
2561 get_access_flags_from_decl (method_decl),
2562 DECL_NAME (method_decl), sig);
2563 METHOD_INVISIBLE (new_method) = 1;
2567 /* Try superinterfaces. */
2568 add_miranda_methods (base_class, elt);
2572 void
2573 layout_class_methods (tree this_class)
2575 tree method_decl, dtable_count;
2576 tree super_class, type_name;
2578 if (TYPE_NVIRTUALS (this_class))
2579 return;
2581 super_class = CLASSTYPE_SUPER (this_class);
2583 if (super_class)
2585 super_class = maybe_layout_super_class (super_class, this_class);
2586 if (!TYPE_NVIRTUALS (super_class))
2587 layout_class_methods (super_class);
2588 dtable_count = TYPE_NVIRTUALS (super_class);
2590 else
2591 dtable_count = integer_zero_node;
2593 type_name = TYPE_NAME (this_class);
2594 if (!flag_indirect_dispatch
2595 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2597 /* An abstract class can have methods which are declared only in
2598 an implemented interface. These are called "Miranda
2599 methods". We make a dummy method entry for such methods
2600 here. */
2601 add_miranda_methods (this_class, this_class);
2604 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2606 for (method_decl = TYPE_METHODS (this_class);
2607 method_decl; method_decl = DECL_CHAIN (method_decl))
2608 dtable_count = layout_class_method (this_class, super_class,
2609 method_decl, dtable_count);
2611 TYPE_NVIRTUALS (this_class) = dtable_count;
2614 /* Return the index of METHOD in INTERFACE. This index begins at 1
2615 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2617 get_interface_method_index (tree method, tree interface)
2619 tree meth;
2620 int i = 1;
2622 for (meth = TYPE_METHODS (interface); ; meth = DECL_CHAIN (meth))
2624 if (meth == method)
2625 return i;
2626 /* We don't want to put <clinit> into the interface table. */
2627 if (! ID_CLINIT_P (DECL_NAME (meth)))
2628 ++i;
2629 gcc_assert (meth != NULL_TREE);
2633 /* Lay METHOD_DECL out, returning a possibly new value of
2634 DTABLE_COUNT. Also mangle the method's name. */
2636 tree
2637 layout_class_method (tree this_class, tree super_class,
2638 tree method_decl, tree dtable_count)
2640 tree method_name = DECL_NAME (method_decl);
2642 TREE_PUBLIC (method_decl) = 1;
2644 if (flag_indirect_classes
2645 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2646 && ! METHOD_NATIVE (method_decl)
2647 && ! special_method_p (method_decl)))
2648 java_hide_decl (method_decl);
2650 /* Considered external unless it is being compiled into this object
2651 file, or it was already flagged as external. */
2652 if (!DECL_EXTERNAL (method_decl))
2653 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2654 || METHOD_NATIVE (method_decl));
2656 if (ID_INIT_P (method_name))
2658 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2659 const char *ptr;
2660 for (ptr = p; *ptr; )
2662 if (*ptr++ == '.')
2663 p = ptr;
2665 DECL_CONSTRUCTOR_P (method_decl) = 1;
2666 build_java_signature (TREE_TYPE (method_decl));
2668 else if (! METHOD_STATIC (method_decl))
2670 tree method_sig =
2671 build_java_signature (TREE_TYPE (method_decl));
2672 bool method_override = false;
2673 tree super_method = lookup_java_method (super_class, method_name,
2674 method_sig);
2675 if (super_method != NULL_TREE
2676 && ! METHOD_DUMMY (super_method))
2678 method_override = true;
2679 if (! METHOD_PUBLIC (super_method) &&
2680 ! METHOD_PROTECTED (super_method))
2682 /* Don't override private method, or default-access method in
2683 another package. */
2684 if (METHOD_PRIVATE (super_method) ||
2685 ! in_same_package (TYPE_NAME (this_class),
2686 TYPE_NAME (super_class)))
2687 method_override = false;
2690 if (method_override)
2692 tree method_index = get_method_index (super_method);
2693 set_method_index (method_decl, method_index);
2694 if (method_index == NULL_TREE
2695 && ! flag_indirect_dispatch
2696 && ! DECL_ARTIFICIAL (super_method))
2697 error ("non-static method %q+D overrides static method",
2698 method_decl);
2700 else if (this_class == object_type_node
2701 && (METHOD_FINAL (method_decl)
2702 || METHOD_PRIVATE (method_decl)))
2704 /* We don't generate vtable entries for final Object
2705 methods. This is simply to save space, since every
2706 object would otherwise have to define them. */
2708 else if (! METHOD_PRIVATE (method_decl)
2709 && dtable_count)
2711 /* We generate vtable entries for final methods because they
2712 may one day be changed to non-final. */
2713 set_method_index (method_decl, dtable_count);
2714 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2715 dtable_count, integer_one_node);
2719 return dtable_count;
2722 static void
2723 register_class (void)
2725 tree node;
2727 if (!registered_class)
2728 vec_alloc (registered_class, 8);
2730 if (flag_indirect_classes)
2731 node = current_class;
2732 else
2733 node = TREE_OPERAND (build_class_ref (current_class), 0);
2734 vec_safe_push (registered_class, node);
2737 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2738 all the classes we have emitted. */
2740 static void
2741 emit_indirect_register_classes (tree *list_p)
2743 tree klass, t, register_class_fn;
2744 int i;
2746 int size = vec_safe_length (registered_class) * 2 + 1;
2747 vec<constructor_elt, va_gc> *init;
2748 vec_alloc (init, size);
2749 tree class_array_type
2750 = build_prim_array_type (ptr_type_node, size);
2751 tree cdecl = build_decl (input_location,
2752 VAR_DECL, get_identifier ("_Jv_CLS"),
2753 class_array_type);
2754 tree reg_class_list;
2755 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2757 t = fold_convert (ptr_type_node, build_static_class_ref (klass));
2758 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2759 t = fold_convert (ptr_type_node,
2760 build_address_of (build_classdollar_field (klass)));
2761 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, t);
2763 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, integer_zero_node);
2764 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2765 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2766 TREE_STATIC (cdecl) = 1;
2767 DECL_ARTIFICIAL (cdecl) = 1;
2768 DECL_IGNORED_P (cdecl) = 1;
2769 TREE_READONLY (cdecl) = 1;
2770 TREE_CONSTANT (cdecl) = 1;
2771 rest_of_decl_compilation (cdecl, 1, 0);
2772 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2774 t = build_function_type_list (void_type_node,
2775 build_pointer_type (ptr_type_node), NULL);
2776 t = build_decl (input_location,
2777 FUNCTION_DECL,
2778 get_identifier ("_Jv_RegisterNewClasses"), t);
2779 TREE_PUBLIC (t) = 1;
2780 DECL_EXTERNAL (t) = 1;
2781 register_class_fn = t;
2782 t = build_call_expr (register_class_fn, 1, reg_class_list);
2783 append_to_statement_list (t, list_p);
2786 /* Emit a list of pointers to all classes we have emitted to JCR_SECTION. */
2788 static void
2789 emit_register_classes_in_jcr_section (void)
2791 #ifdef JCR_SECTION_NAME
2792 tree klass, cdecl, class_array_type;
2793 int i;
2794 int size = vec_safe_length (registered_class);
2795 vec<constructor_elt, va_gc> *init;
2796 vec_alloc (init, size);
2798 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2799 CONSTRUCTOR_APPEND_ELT (init, NULL_TREE, build_fold_addr_expr (klass));
2801 /* ??? I would like to use tree_output_constant_def() but there is no way
2802 to put the data in a named section name, or to set the alignment,
2803 via that function. So do everything manually here. */
2804 class_array_type = build_prim_array_type (ptr_type_node, size);
2805 cdecl = build_decl (UNKNOWN_LOCATION,
2806 VAR_DECL, get_identifier ("_Jv_JCR_SECTION_data"),
2807 class_array_type);
2808 DECL_ALIGN (cdecl) = POINTER_SIZE;
2809 DECL_USER_ALIGN (cdecl) = 1;
2810 DECL_INITIAL (cdecl) = build_constructor (class_array_type, init);
2811 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2812 TREE_STATIC (cdecl) = 1;
2813 TREE_READONLY (cdecl) = 0;
2814 TREE_CONSTANT (cdecl) = 1;
2815 DECL_ARTIFICIAL (cdecl) = 1;
2816 DECL_IGNORED_P (cdecl) = 1;
2817 DECL_PRESERVE_P (cdecl) = 1;
2818 set_decl_section_name (cdecl, JCR_SECTION_NAME);
2819 pushdecl_top_level (cdecl);
2820 relayout_decl (cdecl);
2821 rest_of_decl_compilation (cdecl, 1, 0);
2822 #else
2823 /* A target has defined TARGET_USE_JCR_SECTION,
2824 but doesn't have a JCR_SECTION_NAME. */
2825 gcc_unreachable ();
2826 #endif
2830 /* Emit a series of calls to _Jv_RegisterClass for every class we emitted.
2831 A series of calls is added to LIST_P. */
2833 static void
2834 emit_Jv_RegisterClass_calls (tree *list_p)
2836 tree klass, t, register_class_fn;
2837 int i;
2839 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2840 t = build_decl (input_location,
2841 FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2842 TREE_PUBLIC (t) = 1;
2843 DECL_EXTERNAL (t) = 1;
2844 register_class_fn = t;
2846 FOR_EACH_VEC_SAFE_ELT (registered_class, i, klass)
2848 t = build_fold_addr_expr (klass);
2849 t = build_call_expr (register_class_fn, 1, t);
2850 append_to_statement_list (t, list_p);
2854 /* Emit something to register classes at start-up time.
2856 The default mechanism is to generate instances at run-time.
2858 An alternative mechanism is through the .jcr section, which contain
2859 a list of pointers to classes which get registered during constructor
2860 invocation time.
2862 The fallback mechanism is to add statements to *LIST_P to call
2863 _Jv_RegisterClass for each class in this file. These statements will
2864 be added to a static constructor function for this translation unit. */
2866 void
2867 emit_register_classes (tree *list_p)
2869 if (registered_class == NULL)
2870 return;
2872 /* By default, generate instances of Class at runtime. */
2873 if (flag_indirect_classes)
2874 emit_indirect_register_classes (list_p);
2875 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2876 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2877 but lack suitable crtbegin/end objects or linker support. These
2878 targets can override the default in tm.h to use the fallback mechanism. */
2879 else if (TARGET_USE_JCR_SECTION)
2880 emit_register_classes_in_jcr_section ();
2881 /* Use the fallback mechanism. */
2882 else
2883 emit_Jv_RegisterClass_calls (list_p);
2886 /* Build a constructor for an entry in the symbol table. */
2888 static tree
2889 build_symbol_table_entry (tree clname, tree name, tree signature)
2891 tree symbol;
2892 vec<constructor_elt, va_gc> *v = NULL;
2894 START_RECORD_CONSTRUCTOR (v, symbol_type);
2895 PUSH_FIELD_VALUE (v, "clname", clname);
2896 PUSH_FIELD_VALUE (v, "name", name);
2897 PUSH_FIELD_VALUE (v, "signature", signature);
2898 FINISH_RECORD_CONSTRUCTOR (symbol, v, symbol_type);
2899 TREE_CONSTANT (symbol) = 1;
2901 return symbol;
2904 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2906 static tree
2907 build_symbol_entry (tree decl, tree special)
2909 tree clname, name, signature;
2910 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2911 /* ??? Constructors are given the name foo.foo all the way through
2912 the compiler, but in the method table they're all renamed
2913 foo.<init>. So, we have to do the same here unless we want an
2914 unresolved reference at runtime. */
2915 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2916 && DECL_CONSTRUCTOR_P (decl))
2917 ? init_identifier_node
2918 : DECL_NAME (decl));
2919 signature = build_java_signature (TREE_TYPE (decl));
2920 signature = build_utf8_ref (unmangle_classname
2921 (IDENTIFIER_POINTER (signature),
2922 IDENTIFIER_LENGTH (signature)));
2923 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2924 signature addr+1 if SPECIAL, and this indicates to the runtime
2925 system that this is a "special" symbol, i.e. one that should
2926 bypass access controls. */
2927 if (special != NULL_TREE)
2928 signature = fold_build_pointer_plus (signature, special);
2930 return build_symbol_table_entry (clname, name, signature);
2933 /* Emit a symbol table: used by -findirect-dispatch. */
2935 tree
2936 emit_symbol_table (tree name, tree the_table,
2937 vec<method_entry, va_gc> *decl_table,
2938 tree the_syms_decl, tree the_array_element_type,
2939 int element_size)
2941 tree table, null_symbol, table_size, the_array_type;
2942 unsigned index;
2943 method_entry *e;
2944 vec<constructor_elt, va_gc> *v = NULL;
2946 /* Only emit a table if this translation unit actually made any
2947 references via it. */
2948 if (!decl_table)
2949 return the_table;
2951 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2952 FOR_EACH_VEC_ELT (*decl_table, index, e)
2953 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE,
2954 build_symbol_entry (e->method, e->special));
2956 /* Terminate the list with a "null" entry. */
2957 null_symbol = build_symbol_table_entry (null_pointer_node,
2958 null_pointer_node,
2959 null_pointer_node);
2960 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_symbol);
2962 tree symbols_arr_type
2963 = build_prim_array_type (symbol_type, vec_safe_length (v));
2965 table = build_constructor (symbols_arr_type, v);
2967 /* Make it the initial value for otable_syms and emit the decl. */
2968 TREE_TYPE (the_syms_decl) = symbols_arr_type;
2969 relayout_decl (the_syms_decl);
2970 DECL_INITIAL (the_syms_decl) = table;
2971 DECL_ARTIFICIAL (the_syms_decl) = 1;
2972 DECL_IGNORED_P (the_syms_decl) = 1;
2973 rest_of_decl_compilation (the_syms_decl, 1, 0);
2975 /* Now that its size is known, redefine the table as an
2976 uninitialized static array of INDEX + 1 elements. The extra entry
2977 is used by the runtime to track whether the table has been
2978 initialized. */
2979 table_size
2980 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2981 the_array_type = build_array_type (the_array_element_type, table_size);
2982 the_table = build_decl (input_location,
2983 VAR_DECL, name, the_array_type);
2984 TREE_STATIC (the_table) = 1;
2985 TREE_READONLY (the_table) = 1;
2986 rest_of_decl_compilation (the_table, 1, 0);
2988 return the_table;
2991 /* Make an entry for the catch_classes list. */
2992 tree
2993 make_catch_class_record (tree catch_class, tree classname)
2995 tree entry;
2996 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2997 vec<constructor_elt, va_gc> *v = NULL;
2998 START_RECORD_CONSTRUCTOR (v, type);
2999 PUSH_FIELD_VALUE (v, "address", catch_class);
3000 PUSH_FIELD_VALUE (v, "classname", classname);
3001 FINISH_RECORD_CONSTRUCTOR (entry, v, type);
3002 return entry;
3006 /* Generate the list of Throwable classes that are caught by exception
3007 handlers in this class. */
3008 tree
3009 emit_catch_table (tree this_class)
3011 tree table, table_size, array_type;
3012 int n_catch_classes;
3013 constructor_elt *e;
3014 /* Fill in the dummy entry that make_class created. */
3015 e = &(*TYPE_CATCH_CLASSES (this_class))[0];
3016 e->value = make_catch_class_record (null_pointer_node, null_pointer_node);
3017 CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE,
3018 make_catch_class_record (null_pointer_node,
3019 null_pointer_node));
3020 n_catch_classes = TYPE_CATCH_CLASSES (this_class)->length ();
3021 table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes));
3022 array_type
3023 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
3024 table_size);
3025 table =
3026 build_decl (input_location,
3027 VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
3028 DECL_INITIAL (table) =
3029 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
3030 TREE_STATIC (table) = 1;
3031 TREE_READONLY (table) = 1;
3032 DECL_IGNORED_P (table) = 1;
3033 rest_of_decl_compilation (table, 1, 0);
3034 return table;
3037 /* Given a type, return the signature used by
3038 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3039 same as build_java_signature() because we want the canonical array
3040 type. */
3042 static tree
3043 build_signature_for_libgcj (tree type)
3045 tree sig, ref;
3047 sig = build_java_signature (type);
3048 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
3049 IDENTIFIER_LENGTH (sig)));
3050 return ref;
3053 /* Build an entry in the type assertion table. */
3055 static tree
3056 build_assertion_table_entry (tree code, tree op1, tree op2)
3058 vec<constructor_elt, va_gc> *v = NULL;
3059 tree entry;
3061 START_RECORD_CONSTRUCTOR (v, assertion_entry_type);
3062 PUSH_FIELD_VALUE (v, "assertion_code", code);
3063 PUSH_FIELD_VALUE (v, "op1", op1);
3064 PUSH_FIELD_VALUE (v, "op2", op2);
3065 FINISH_RECORD_CONSTRUCTOR (entry, v, assertion_entry_type);
3067 return entry;
3070 /* Add an entry to the type assertion table. Callback used during hashtable
3071 traversal. */
3074 add_assertion_table_entry (type_assertion **slot, vec<constructor_elt, va_gc> **v)
3076 tree entry;
3077 tree code_val, op1_utf8, op2_utf8;
3078 type_assertion *as = *slot;
3080 code_val = build_int_cst (NULL_TREE, as->assertion_code);
3082 if (as->op1 == NULL_TREE)
3083 op1_utf8 = null_pointer_node;
3084 else
3085 op1_utf8 = build_signature_for_libgcj (as->op1);
3087 if (as->op2 == NULL_TREE)
3088 op2_utf8 = null_pointer_node;
3089 else
3090 op2_utf8 = build_signature_for_libgcj (as->op2);
3092 entry = build_assertion_table_entry (code_val, op1_utf8, op2_utf8);
3094 CONSTRUCTOR_APPEND_ELT (*v, NULL_TREE, entry);
3095 return true;
3098 /* Generate the type assertion table for KLASS, and return its DECL. */
3100 static tree
3101 emit_assertion_table (tree klass)
3103 tree null_entry, ctor, table_decl;
3104 hash_table<type_assertion_hasher> *assertions_htab = TYPE_ASSERTIONS (klass);
3105 vec<constructor_elt, va_gc> *v = NULL;
3107 /* Iterate through the hash table. */
3108 assertions_htab
3109 ->traverse<vec<constructor_elt, va_gc> **, add_assertion_table_entry> (&v);
3111 /* Finish with a null entry. */
3112 null_entry = build_assertion_table_entry (integer_zero_node,
3113 null_pointer_node,
3114 null_pointer_node);
3116 CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, null_entry);
3118 tree type
3119 = build_prim_array_type (assertion_entry_type, vec_safe_length (v));
3121 ctor = build_constructor (type, v);
3123 table_decl = build_decl (input_location,
3124 VAR_DECL, mangled_classname ("_type_assert_", klass),
3125 type);
3127 TREE_STATIC (table_decl) = 1;
3128 TREE_READONLY (table_decl) = 1;
3129 TREE_CONSTANT (table_decl) = 1;
3130 DECL_IGNORED_P (table_decl) = 1;
3132 DECL_INITIAL (table_decl) = ctor;
3133 DECL_ARTIFICIAL (table_decl) = 1;
3134 rest_of_decl_compilation (table_decl, 1, 0);
3136 return table_decl;
3139 void
3140 init_class_processing (void)
3142 fields_ident = get_identifier ("fields");
3143 info_ident = get_identifier ("info");
3145 gcc_obstack_init (&temporary_obstack);
3148 /* A hash table mapping trees to trees. Used generally. */
3150 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3152 hashval_t
3153 treetreehasher::hash (treetreehash_entry *k)
3155 return JAVA_TREEHASHHASH_H (k->key);
3158 bool
3159 treetreehasher::equal (treetreehash_entry *k1, tree k2)
3161 return (k1->key == k2);
3164 tree
3165 java_treetreehash_find (hash_table<treetreehasher> *ht, tree t)
3167 struct treetreehash_entry *e;
3168 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3169 e = ht->find_with_hash (t, hv);
3170 if (e == NULL)
3171 return NULL;
3172 else
3173 return e->value;
3176 tree *
3177 java_treetreehash_new (hash_table<treetreehasher> *ht, tree t)
3179 struct treetreehash_entry *tthe;
3180 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3182 treetreehash_entry **e = ht->find_slot_with_hash (t, hv, INSERT);
3183 if (*e == NULL)
3185 tthe = ggc_cleared_alloc<treetreehash_entry> ();
3186 tthe->key = t;
3187 *e = tthe;
3189 else
3190 tthe = *e;
3191 return &tthe->value;
3194 hash_table<treetreehasher> *
3195 java_treetreehash_create (size_t size)
3197 return hash_table<treetreehasher>::create_ggc (size);
3200 /* Break down qualified IDENTIFIER into package and class-name components.
3201 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3202 "pkg.foo", and RIGHT to "Bar". */
3205 split_qualified_name (tree *left, tree *right, tree source)
3207 char *p, *base;
3208 int l = IDENTIFIER_LENGTH (source);
3210 base = (char *) alloca (l + 1);
3211 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3213 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3214 p = base + l - 1;
3215 while (*p != '.' && p != base)
3216 p--;
3218 /* We didn't find a '.'. Return an error. */
3219 if (p == base)
3220 return 1;
3222 *p = '\0';
3223 if (right)
3224 *right = get_identifier (p+1);
3225 *left = get_identifier (base);
3227 return 0;
3230 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3231 if the classes are from the same package. */
3234 in_same_package (tree name1, tree name2)
3236 tree tmp;
3237 tree pkg1;
3238 tree pkg2;
3240 if (TREE_CODE (name1) == TYPE_DECL)
3241 name1 = DECL_NAME (name1);
3242 if (TREE_CODE (name2) == TYPE_DECL)
3243 name2 = DECL_NAME (name2);
3245 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3246 /* One in empty package. */
3247 return 0;
3249 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3250 /* Both in empty package. */
3251 return 1;
3253 split_qualified_name (&pkg1, &tmp, name1);
3254 split_qualified_name (&pkg2, &tmp, name2);
3256 return (pkg1 == pkg2);
3259 /* lang_hooks.decls.final_write_globals: perform final processing on
3260 global variables. */
3262 void
3263 java_write_globals (void)
3265 tree *vec = vec_safe_address (pending_static_fields);
3266 int len = vec_safe_length (pending_static_fields);
3267 write_global_declarations ();
3268 emit_debug_global_declarations (vec, len);
3269 vec_free (pending_static_fields);
3272 #include "gt-java-class.h"