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