1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 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 2, or (at your option)
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 COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Written by Per Bothner <bothner@cygnus.com> */
30 #include "coretypes.h"
35 #include "java-tree.h"
47 #include "tree-iterator.h"
50 /* DOS brain-damage */
52 #define O_BINARY 0 /* MS-DOS brain-damage */
55 static tree make_method_value (tree);
56 static tree build_java_method_type (tree, tree, int);
57 static int32 hashUtf8String (const char *, int);
58 static tree make_field_value (tree);
59 static tree get_dispatch_vector (tree);
60 static tree get_dispatch_table (tree, tree);
61 static int supers_all_compiled (tree type);
62 static tree maybe_layout_super_class (tree, tree);
63 static void add_miranda_methods (tree, tree);
64 static int assume_compiled (const char *);
65 static tree build_symbol_entry (tree);
66 static tree emit_assertion_table (tree);
68 struct obstack temporary_obstack;
70 /* The compiler generates different code depending on whether or not
71 it can assume certain classes have been compiled down to native
72 code or not. The compiler options -fassume-compiled= and
73 -fno-assume-compiled= are used to create a tree of
74 class_flag_node objects. This tree is queried to determine if
75 a class is assume to be compiled or not. Each node in the tree
76 represents either a package or a specific class. */
78 typedef struct class_flag_node_struct
80 /* The class or package name. */
83 /* Nonzero if this represents an exclusion. */
86 /* Pointers to other nodes in the tree. */
87 struct class_flag_node_struct *parent;
88 struct class_flag_node_struct *sibling;
89 struct class_flag_node_struct *child;
92 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
93 static void add_class_flag (class_flag_node **, const char *, int);
95 /* This is the root of the include/exclude tree. */
97 static class_flag_node *assume_compiled_tree;
99 static class_flag_node *enable_assert_tree;
101 static GTY(()) tree class_roots[5];
102 #define registered_class class_roots[0]
103 #define fields_ident class_roots[1] /* get_identifier ("fields") */
104 #define info_ident class_roots[2] /* get_identifier ("info") */
105 #define class_list class_roots[3]
106 #define class_dtable_decl class_roots[4]
108 /* Return the node that most closely represents the class whose name
109 is IDENT. Start the search from NODE (followed by its siblings).
110 Return NULL if an appropriate node does not exist. */
112 static class_flag_node *
113 find_class_flag_node (class_flag_node *node, const char *ident)
117 size_t node_ident_length = strlen (node->ident);
119 /* node_ident_length is zero at the root of the tree. If the
120 identifiers are the same length, then we have matching
121 classes. Otherwise check if we've matched an enclosing
124 if (node_ident_length == 0
125 || (strncmp (ident, node->ident, node_ident_length) == 0
126 && (ident[node_ident_length] == '\0'
127 || ident[node_ident_length] == '.')))
129 /* We've found a match, however, there might be a more
132 class_flag_node *found = find_class_flag_node (node->child, ident);
139 /* No match yet. Continue through the sibling list. */
140 node = node->sibling;
143 /* No match at all in this tree. */
148 add_class_flag (class_flag_node **rootp, const char *ident, int value)
150 class_flag_node *root = *rootp;
151 class_flag_node *parent, *node;
153 /* Create the root of the tree if it doesn't exist yet. */
157 root = xmalloc (sizeof (class_flag_node));
160 root->sibling = NULL;
166 /* Calling the function with the empty string means we're setting
167 value for the root of the hierarchy. */
175 /* Find the parent node for this new node. PARENT will either be a
176 class or a package name. Adjust PARENT accordingly. */
178 parent = find_class_flag_node (root, ident);
179 if (strcmp (ident, parent->ident) == 0)
180 parent->value = value;
183 /* Insert new node into the tree. */
184 node = xmalloc (sizeof (class_flag_node));
186 node->ident = xstrdup (ident);
190 node->parent = parent;
191 node->sibling = parent->child;
192 parent->child = node;
196 /* Add a new IDENT to the include/exclude tree. It's an exclusion
197 if EXCLUDEP is nonzero. */
200 add_assume_compiled (const char *ident, int excludep)
202 add_class_flag (&assume_compiled_tree, ident, excludep);
205 /* The default value returned by enable_assertions. */
207 #define DEFAULT_ENABLE_ASSERT (flag_emit_class_files || optimize == 0)
209 /* Enter IDENT (a class or package name) into the enable-assertions table.
210 VALUE is true to enable and false to disable. */
213 add_enable_assert (const char *ident, int value)
215 if (enable_assert_tree == NULL)
216 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
217 add_class_flag (&enable_assert_tree, ident, value);
220 /* Returns nonzero if IDENT is the name of a class that the compiler
221 should assume has been compiled to object code. */
224 assume_compiled (const char *ident)
229 if (NULL == assume_compiled_tree)
232 i = find_class_flag_node (assume_compiled_tree, ident);
239 /* Return true if we should generate code to check assertions within KLASS. */
242 enable_assertions (tree klass)
244 /* Check if command-line specifies whether we should check assertions. */
246 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
248 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
249 class_flag_node *node
250 = find_class_flag_node (enable_assert_tree, ident);
254 /* The default is to enable assertions if generating class files,
255 or not optimizing. */
256 return DEFAULT_ENABLE_ASSERT;
259 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
260 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
261 Also, PREFIX is prepended, and SUFFIX is appended. */
264 ident_subst (const char* old_name,
271 int prefix_len = strlen (prefix);
272 int suffix_len = strlen (suffix);
273 int i = prefix_len + old_length + suffix_len + 1;
274 char *buffer = alloca (i);
276 strcpy (buffer, prefix);
277 for (i = 0; i < old_length; i++)
279 char ch = old_name[i];
282 buffer[prefix_len + i] = ch;
284 strcpy (buffer + prefix_len + old_length, suffix);
285 return get_identifier (buffer);
288 /* Return an IDENTIFIER_NODE the same as OLD_ID,
289 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
290 Also, PREFIX is prepended, and SUFFIX is appended. */
293 identifier_subst (const tree old_id,
299 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
300 prefix, old_char, new_char, suffix);
303 /* Generate a valid C identifier from the name of the class TYPE,
304 prefixed by PREFIX. */
307 mangled_classname (const char *prefix, tree type)
309 tree ident = TYPE_NAME (type);
310 if (TREE_CODE (ident) != IDENTIFIER_NODE)
311 ident = DECL_NAME (ident);
312 return identifier_subst (ident, prefix, '.', '_', "");
319 type = make_node (RECORD_TYPE);
320 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
325 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
326 and where each of the constituents is separated by '/',
327 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
330 unmangle_classname (const char *name, int name_length)
332 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
333 /* It's not sufficient to compare to_return and get_identifier
334 (name) to determine whether to_return is qualified. There are
335 cases in signature analysis where name will be stripped of a
337 name = IDENTIFIER_POINTER (to_return);
341 QUALIFIED_P (to_return) = 1;
348 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
351 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
352 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
355 sprintf (buf, #NAME "_%s", typename); \
356 TYPE_## TABLE ##_DECL (type) = decl = \
357 build_decl (VAR_DECL, get_identifier (buf), TABLE_TYPE); \
358 DECL_EXTERNAL (decl) = 1; \
359 TREE_STATIC (decl) = 1; \
360 TREE_READONLY (decl) = 1; \
361 TREE_CONSTANT (decl) = 1; \
362 DECL_IGNORED_P (decl) = 1; \
363 /* Mark the table as belonging to this class. */ \
365 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
366 DECL_OWNER (decl) = TYPE; \
367 sprintf (buf, #NAME "_syms_%s", typename); \
368 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
369 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type); \
370 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
371 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
372 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
373 pushdecl (TYPE_## TABLE ##_SYMS_DECL (TYPE)); \
377 /* Given a class, create the DECLs for all its associated indirect
380 gen_indirect_dispatch_tables (tree type)
382 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
385 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
386 tree catch_class_type = make_node (RECORD_TYPE);
388 sprintf (buf, "_catch_classes_%s", typename);
389 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
390 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
391 FINISH_RECORD (catch_class_type);
393 TYPE_CTABLE_DECL (type)
394 = build_decl (VAR_DECL, get_identifier (buf),
395 build_array_type (catch_class_type, 0));
396 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
397 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
398 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
399 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
400 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
401 pushdecl (TYPE_CTABLE_DECL (type));
404 if (flag_indirect_dispatch)
406 GEN_TABLE (ATABLE, _atable, atable_type, type);
407 GEN_TABLE (OTABLE, _otable, otable_type, type);
408 GEN_TABLE (ITABLE, _itable, itable_type, type);
415 push_class (tree class_type, tree class_name)
417 tree decl, signature;
418 location_t saved_loc = input_location;
419 #ifndef USE_MAPPED_LOCATION
420 tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
421 input_filename = IDENTIFIER_POINTER (source_name);
424 CLASS_P (class_type) = 1;
425 decl = build_decl (TYPE_DECL, class_name, class_type);
427 /* dbxout needs a DECL_SIZE if in gstabs mode */
428 DECL_SIZE (decl) = integer_zero_node;
430 input_location = saved_loc;
431 signature = identifier_subst (class_name, "L", '.', '/', ";");
432 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
434 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
435 both a typedef and in the struct name-space. We may want to re-visit
436 this later, but for now it reduces the changes needed for gdb. */
437 DECL_ARTIFICIAL (decl) = 1;
439 pushdecl_top_level (decl);
444 /* Finds the (global) class named NAME. Creates the class if not found.
445 Also creates associated TYPE_DECL.
446 Does not check if the class actually exists, load the class,
447 fill in field or methods, or do layout_type. */
450 lookup_class (tree name)
452 tree decl = IDENTIFIER_CLASS_VALUE (name);
453 if (decl == NULL_TREE)
454 decl = push_class (make_class (), name);
455 return TREE_TYPE (decl);
459 set_super_info (int access_flags, tree this_class,
460 tree super_class, int interfaces_count)
462 int total_supers = interfaces_count;
463 tree class_decl = TYPE_NAME (this_class);
468 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
469 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
472 tree super_binfo = make_tree_binfo (0);
473 BINFO_TYPE (super_binfo) = super_class;
474 BINFO_OFFSET (super_binfo) = integer_zero_node;
475 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
476 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
479 set_class_decl_access_flags (access_flags, class_decl);
483 set_class_decl_access_flags (int access_flags, tree class_decl)
485 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
486 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
487 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
488 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
489 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
490 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
491 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
492 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
493 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
496 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
497 direct sub-classes of Object are 1, and so on. */
500 class_depth (tree clas)
503 if (! CLASS_LOADED_P (clas))
504 load_class (clas, 1);
505 if (TYPE_SIZE (clas) == error_mark_node)
507 while (clas != object_type_node)
510 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
515 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
518 interface_of_p (tree type1, tree type2)
521 tree binfo, base_binfo;
523 if (! TYPE_BINFO (type2))
526 for (binfo = TYPE_BINFO (type2), i = 0;
527 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
528 if (BINFO_TYPE (base_binfo) == type1)
531 for (binfo = TYPE_BINFO (type2), i = 0;
532 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
533 if (BINFO_TYPE (base_binfo)
534 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
540 /* Return true iff TYPE1 inherits from TYPE2. */
543 inherits_from_p (tree type1, tree type2)
545 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
549 type1 = CLASSTYPE_SUPER (type1);
554 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
557 enclosing_context_p (tree type1, tree type2)
559 if (!INNER_CLASS_TYPE_P (type2))
562 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
564 type2 = (INNER_CLASS_TYPE_P (type2) ?
565 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
575 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
579 common_enclosing_context_p (tree type1, tree type2)
584 for (current = type2; current;
585 current = (INNER_CLASS_TYPE_P (current) ?
586 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
588 if (type1 == current)
591 if (INNER_CLASS_TYPE_P (type1))
592 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
599 /* Return 1 iff there exists a common enclosing "this" between TYPE1
600 and TYPE2, without crossing any static context. */
603 common_enclosing_instance_p (tree type1, tree type2)
605 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
608 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
609 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
610 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
613 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
614 current = (PURE_INNER_CLASS_TYPE_P (current) ?
615 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
617 if (type1 == current)
623 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
624 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
625 if attempt is made to add it twice. */
628 maybe_add_interface (tree this_class, tree interface_class)
630 tree binfo, base_binfo;
633 for (binfo = TYPE_BINFO (this_class), i = 0;
634 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
635 if (BINFO_TYPE (base_binfo) == interface_class)
636 return interface_class;
637 add_interface (this_class, interface_class);
641 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
644 add_interface (tree this_class, tree interface_class)
646 tree interface_binfo = make_tree_binfo (0);
648 BINFO_TYPE (interface_binfo) = interface_class;
649 BINFO_OFFSET (interface_binfo) = integer_zero_node;
650 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
651 BINFO_VIRTUAL_P (interface_binfo) = 1;
653 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
657 /* Return the address of a pointer to the first FUNCTION_DECL
658 in the list (*LIST) whose DECL_NAME is NAME. */
661 find_named_method (tree *list, tree name)
663 while (*list && DECL_NAME (*list) != name)
664 list = &TREE_CHAIN (*list);
670 build_java_method_type (tree fntype, tree this_class, int access_flags)
672 if (access_flags & ACC_STATIC)
674 return build_method_type (this_class, fntype);
678 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
680 tree method_type, fndecl;
682 method_type = build_java_method_type (function_type,
683 this_class, access_flags);
685 fndecl = build_decl (FUNCTION_DECL, name, method_type);
686 DECL_CONTEXT (fndecl) = this_class;
688 DECL_LANG_SPECIFIC (fndecl)
689 = ggc_alloc_cleared (sizeof (struct lang_decl));
690 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
692 /* Initialize the static initializer test table. */
694 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
695 java_treetreehash_create (10, 1);
697 /* Initialize the initialized (static) class table. */
698 if (access_flags & ACC_STATIC)
699 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
700 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
702 /* Initialize the static method invocation compound list */
703 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = NULL_TREE;
705 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
706 TYPE_METHODS (this_class) = fndecl;
708 /* Notice that this is a finalizer and update the class type
709 accordingly. This is used to optimize instance allocation. */
710 if (name == finalize_identifier_node
711 && TREE_TYPE (function_type) == void_type_node
712 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
713 HAS_FINALIZER_P (this_class) = 1;
715 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
716 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
717 if (access_flags & ACC_PRIVATE)
718 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
719 if (access_flags & ACC_NATIVE)
721 METHOD_NATIVE (fndecl) = 1;
722 DECL_EXTERNAL (fndecl) = 1;
724 if (access_flags & ACC_STATIC)
725 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
726 if (access_flags & ACC_FINAL)
727 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
728 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
729 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
730 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
734 /* Add a method to THIS_CLASS.
735 The method's name is NAME.
736 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
739 add_method (tree this_class, int access_flags, tree name, tree method_sig)
741 tree function_type, fndecl;
742 const unsigned char *sig
743 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
746 fatal_error ("bad method signature");
748 function_type = get_type_from_signature (method_sig);
749 fndecl = add_method_1 (this_class, access_flags, name, function_type);
750 set_java_signature (TREE_TYPE (fndecl), method_sig);
755 add_field (tree class, tree name, tree field_type, int flags)
757 int is_static = (flags & ACC_STATIC) != 0;
759 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
760 TREE_CHAIN (field) = TYPE_FIELDS (class);
761 TYPE_FIELDS (class) = field;
762 DECL_CONTEXT (field) = class;
764 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
765 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
766 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
767 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
768 if (flags & ACC_VOLATILE) FIELD_VOLATILE (field) = 1;
769 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
772 FIELD_STATIC (field) = 1;
773 /* Always make field externally visible. This is required so
774 that native methods can always access the field. */
775 TREE_PUBLIC (field) = 1;
776 /* Considered external until we know what classes are being
777 compiled into this object file. */
778 DECL_EXTERNAL (field) = 1;
784 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
787 set_constant_value (tree field, tree constant)
789 if (field == NULL_TREE)
790 warning ("misplaced ConstantValue attribute (not in any field)");
791 else if (DECL_INITIAL (field) != NULL_TREE)
792 warning ("duplicate ConstantValue attribute for field '%s'",
793 IDENTIFIER_POINTER (DECL_NAME (field)));
796 DECL_INITIAL (field) = constant;
797 if (TREE_TYPE (constant) != TREE_TYPE (field)
798 && ! (TREE_TYPE (constant) == int_type_node
799 && INTEGRAL_TYPE_P (TREE_TYPE (field))
800 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
801 && ! (TREE_TYPE (constant) == utf8const_ptr_type
802 && TREE_TYPE (field) == string_ptr_type_node))
803 error ("ConstantValue attribute of field '%s' has wrong type",
804 IDENTIFIER_POINTER (DECL_NAME (field)));
805 if (FIELD_FINAL (field))
806 DECL_FIELD_FINAL_IUD (field) = 1;
810 /* Count the number of Unicode chars encoded in a given Ut8 string. */
814 strLengthUtf8 (char *str, int len)
816 register unsigned char* ptr = (unsigned char*) str;
817 register unsigned char *limit = ptr + len;
819 for (; ptr < limit; str_length++) {
820 if (UTF8_GET (ptr, limit) < 0)
828 /* Calculate a hash value for a string encoded in Utf8 format.
829 * This returns the same hash value as specified for java.lang.String.hashCode.
833 hashUtf8String (const char *str, int len)
835 const unsigned char* ptr = (const unsigned char*) str;
836 const unsigned char *limit = ptr + len;
840 int ch = UTF8_GET (ptr, limit);
841 /* Updated specification from
842 http://www.javasoft.com/docs/books/jls/clarify.html. */
843 hash = (31 * hash) + ch;
848 static GTY(()) tree utf8_decl_list = NULL_TREE;
851 build_utf8_ref (tree name)
853 const char * name_ptr = IDENTIFIER_POINTER(name);
854 int name_len = IDENTIFIER_LENGTH(name);
856 tree ctype, field = NULL_TREE, str_type, cinit, string;
857 static int utf8_count = 0;
859 tree ref = IDENTIFIER_UTF8_REF (name);
861 if (ref != NULL_TREE)
864 ctype = make_node (RECORD_TYPE);
865 str_type = build_prim_array_type (unsigned_byte_type_node,
866 name_len + 1); /* Allow for final '\0'. */
867 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
868 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
869 PUSH_FIELD (ctype, field, "data", str_type);
870 FINISH_RECORD (ctype);
871 START_RECORD_CONSTRUCTOR (cinit, ctype);
872 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
873 PUSH_FIELD_VALUE (cinit, "hash", build_int_cst (NULL_TREE, name_hash));
874 PUSH_FIELD_VALUE (cinit, "length", build_int_cst (NULL_TREE, name_len));
875 string = build_string (name_len, name_ptr);
876 TREE_TYPE (string) = str_type;
877 PUSH_FIELD_VALUE (cinit, "data", string);
878 FINISH_RECORD_CONSTRUCTOR (cinit);
879 TREE_CONSTANT (cinit) = 1;
880 TREE_INVARIANT (cinit) = 1;
882 /* Generate a unique-enough identifier. */
883 sprintf(buf, "_Utf%d", ++utf8_count);
885 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
886 TREE_STATIC (decl) = 1;
887 DECL_ARTIFICIAL (decl) = 1;
888 DECL_IGNORED_P (decl) = 1;
889 TREE_READONLY (decl) = 1;
890 TREE_THIS_VOLATILE (decl) = 0;
891 DECL_INITIAL (decl) = cinit;
893 if (HAVE_GAS_SHF_MERGE)
896 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
897 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
898 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
899 if (flag_merge_constants && decl_size < 256)
902 int flags = (SECTION_OVERRIDE
903 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
904 sprintf (buf, ".rodata.jutf8.%d", decl_size);
905 named_section_flags (buf, flags);
906 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
910 TREE_CHAIN (decl) = utf8_decl_list;
911 layout_decl (decl, 0);
913 rest_of_decl_compilation (decl, global_bindings_p (), 0);
914 cgraph_varpool_mark_needed_node (cgraph_varpool_node (decl));
915 utf8_decl_list = decl;
916 make_decl_rtl (decl);
917 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
918 IDENTIFIER_UTF8_REF (name) = ref;
922 /* Like build_class_ref, but instead of a direct reference generate a
923 pointer into the constant pool. */
926 build_indirect_class_ref (tree type)
930 index = alloc_class_constant (type);
931 cl = build_ref_from_constant_pool (index);
932 return convert (promote_type (class_ptr_type), cl);
935 /* Build a reference to the class TYPE.
936 Also handles primitive types and array types. */
939 build_class_ref (tree type)
941 int is_compiled = is_compiled_class (type);
944 tree ref, decl_name, decl;
945 if (TREE_CODE (type) == POINTER_TYPE)
946 type = TREE_TYPE (type);
948 if (flag_indirect_dispatch
949 && type != output_class
950 && TREE_CODE (type) == RECORD_TYPE)
951 return build_indirect_class_ref (type);
953 if (TREE_CODE (type) == RECORD_TYPE)
955 if (TYPE_SIZE (type) == error_mark_node)
956 return null_pointer_node;
957 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
958 "", '/', '/', ".class");
959 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
960 if (decl == NULL_TREE)
962 decl = build_decl (VAR_DECL, decl_name, class_type_node);
963 DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
964 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
965 TREE_STATIC (decl) = 1;
966 TREE_PUBLIC (decl) = 1;
967 DECL_IGNORED_P (decl) = 1;
968 DECL_ARTIFICIAL (decl) = 1;
969 if (is_compiled == 1)
970 DECL_EXTERNAL (decl) = 1;
971 SET_DECL_ASSEMBLER_NAME (decl,
972 java_mangle_class_field
973 (&temporary_obstack, type));
974 make_decl_rtl (decl);
975 pushdecl_top_level (decl);
982 if (flag_emit_class_files)
984 const char *prim_class_name;
986 if (type == char_type_node)
987 prim_class_name = "java.lang.Character";
988 else if (type == boolean_type_node)
989 prim_class_name = "java.lang.Boolean";
990 else if (type == byte_type_node)
991 prim_class_name = "java.lang.Byte";
992 else if (type == short_type_node)
993 prim_class_name = "java.lang.Short";
994 else if (type == int_type_node)
995 prim_class_name = "java.lang.Integer";
996 else if (type == long_type_node)
997 prim_class_name = "java.lang.Long";
998 else if (type == float_type_node)
999 prim_class_name = "java.lang.Float";
1000 else if (type == double_type_node)
1001 prim_class_name = "java.lang.Double";
1002 else if (type == void_type_node)
1003 prim_class_name = "java.lang.Void";
1007 prim_class = lookup_class (get_identifier (prim_class_name));
1008 return build3 (COMPONENT_REF, NULL_TREE,
1009 prim_class, TYPE_identifier_node, NULL_TREE);
1011 decl_name = TYPE_NAME (type);
1012 if (TREE_CODE (decl_name) == TYPE_DECL)
1013 decl_name = DECL_NAME (decl_name);
1014 name = IDENTIFIER_POINTER (decl_name);
1015 if (strncmp (name, "promoted_", 9) == 0)
1017 sprintf (buffer, "_Jv_%sClass", name);
1018 decl_name = get_identifier (buffer);
1019 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1020 if (decl == NULL_TREE)
1022 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1023 TREE_STATIC (decl) = 1;
1024 TREE_PUBLIC (decl) = 1;
1025 DECL_EXTERNAL (decl) = 1;
1026 DECL_ARTIFICIAL (decl) = 1;
1027 make_decl_rtl (decl);
1028 pushdecl_top_level (decl);
1032 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1036 return build_indirect_class_ref (type);
1040 build_static_field_ref (tree fdecl)
1042 tree fclass = DECL_CONTEXT (fdecl);
1043 int is_compiled = is_compiled_class (fclass);
1045 /* Allow static final fields to fold to a constant. When using
1046 -fno-assume-compiled, gcj will sometimes try to fold a field from
1047 an uncompiled class. This is required when the field in question
1048 meets the appropriate criteria for a compile-time constant.
1049 However, currently sometimes gcj is too eager and will end up
1050 returning the field itself, leading to an incorrect external
1051 reference being generated. */
1052 if ((is_compiled && !flag_indirect_dispatch)
1053 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1054 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1055 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1056 && TREE_CONSTANT (DECL_INITIAL (fdecl))))
1058 if (!DECL_RTL_SET_P (fdecl))
1060 if (is_compiled == 1)
1061 DECL_EXTERNAL (fdecl) = 1;
1062 make_decl_rtl (fdecl);
1067 if (flag_indirect_dispatch)
1070 = build_int_cst (NULL_TREE, get_symbol_table_index
1071 (fdecl, &TYPE_ATABLE_METHODS (output_class)));
1073 = build4 (ARRAY_REF,
1074 TREE_TYPE (TREE_TYPE (TYPE_ATABLE_DECL (output_class))),
1075 TYPE_ATABLE_DECL (output_class), table_index,
1076 NULL_TREE, NULL_TREE);
1077 field_address = convert (build_pointer_type (TREE_TYPE (fdecl)),
1079 return fold (build1 (INDIRECT_REF, TREE_TYPE (fdecl),
1085 *(FTYPE*)build_class_ref(FCLASS)->fields[INDEX].info.addr */
1086 tree ref = build_class_ref (fclass);
1088 int field_index = 0;
1089 ref = build1 (INDIRECT_REF, class_type_node, ref);
1090 ref = build3 (COMPONENT_REF, field_ptr_type_node, ref,
1091 lookup_field (&class_type_node, fields_ident),
1094 for (fld = TYPE_FIELDS (fclass); ; fld = TREE_CHAIN (fld))
1098 if (fld == NULL_TREE)
1099 fatal_error ("field '%s' not found in class",
1100 IDENTIFIER_POINTER (DECL_NAME (fdecl)));
1101 if (FIELD_STATIC (fld))
1104 field_index *= int_size_in_bytes (field_type_node);
1105 ref = fold (build2 (PLUS_EXPR, field_ptr_type_node,
1106 ref, build_int_cst (NULL_TREE, field_index)));
1107 ref = build1 (INDIRECT_REF, field_type_node, ref);
1108 ref = build3 (COMPONENT_REF, field_info_union_node,
1109 ref, lookup_field (&field_type_node, info_ident),
1111 ref = build3 (COMPONENT_REF, ptr_type_node,
1112 ref, TREE_CHAIN (TYPE_FIELDS (field_info_union_node)),
1114 ref = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (fdecl)), ref);
1115 return fold (build1 (INDIRECT_REF, TREE_TYPE(fdecl), ref));
1120 get_access_flags_from_decl (tree decl)
1122 int access_flags = 0;
1123 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1125 if (FIELD_STATIC (decl))
1126 access_flags |= ACC_STATIC;
1127 if (FIELD_PUBLIC (decl))
1128 access_flags |= ACC_PUBLIC;
1129 if (FIELD_PROTECTED (decl))
1130 access_flags |= ACC_PROTECTED;
1131 if (FIELD_PRIVATE (decl))
1132 access_flags |= ACC_PRIVATE;
1133 if (FIELD_FINAL (decl))
1134 access_flags |= ACC_FINAL;
1135 if (FIELD_VOLATILE (decl))
1136 access_flags |= ACC_VOLATILE;
1137 if (FIELD_TRANSIENT (decl))
1138 access_flags |= ACC_TRANSIENT;
1139 return access_flags;
1141 if (TREE_CODE (decl) == TYPE_DECL)
1143 if (CLASS_PUBLIC (decl))
1144 access_flags |= ACC_PUBLIC;
1145 if (CLASS_FINAL (decl))
1146 access_flags |= ACC_FINAL;
1147 if (CLASS_SUPER (decl))
1148 access_flags |= ACC_SUPER;
1149 if (CLASS_INTERFACE (decl))
1150 access_flags |= ACC_INTERFACE;
1151 if (CLASS_ABSTRACT (decl))
1152 access_flags |= ACC_ABSTRACT;
1153 if (CLASS_STATIC (decl))
1154 access_flags |= ACC_STATIC;
1155 if (CLASS_PRIVATE (decl))
1156 access_flags |= ACC_PRIVATE;
1157 if (CLASS_PROTECTED (decl))
1158 access_flags |= ACC_PROTECTED;
1159 if (CLASS_STRICTFP (decl))
1160 access_flags |= ACC_STRICT;
1161 return access_flags;
1163 if (TREE_CODE (decl) == FUNCTION_DECL)
1165 if (METHOD_PUBLIC (decl))
1166 access_flags |= ACC_PUBLIC;
1167 if (METHOD_PRIVATE (decl))
1168 access_flags |= ACC_PRIVATE;
1169 if (METHOD_PROTECTED (decl))
1170 access_flags |= ACC_PROTECTED;
1171 if (METHOD_STATIC (decl))
1172 access_flags |= ACC_STATIC;
1173 if (METHOD_FINAL (decl))
1174 access_flags |= ACC_FINAL;
1175 if (METHOD_SYNCHRONIZED (decl))
1176 access_flags |= ACC_SYNCHRONIZED;
1177 if (METHOD_NATIVE (decl))
1178 access_flags |= ACC_NATIVE;
1179 if (METHOD_ABSTRACT (decl))
1180 access_flags |= ACC_ABSTRACT;
1181 if (METHOD_STRICTFP (decl))
1182 access_flags |= ACC_STRICT;
1183 if (METHOD_INVISIBLE (decl))
1184 access_flags |= ACC_INVISIBLE;
1185 return access_flags;
1190 static GTY (()) int alias_labelno = 0;
1192 /* Create a private alias for METHOD. Using this alias instead of the method
1193 decl ensures that ncode entries in the method table point to the real function
1194 at runtime, not a PLT entry. */
1197 make_local_function_alias (tree method)
1199 #ifdef ASM_OUTPUT_DEF
1202 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1203 char *name = alloca (strlen (method_name) + 2);
1204 char *buf = alloca (strlen (method_name) + 128);
1206 /* Only create aliases for local functions. */
1207 if (DECL_EXTERNAL (method))
1210 /* Prefix method_name with 'L' for the alias label. */
1212 strcpy (name + 1, method_name);
1214 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1215 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1216 TREE_TYPE (method));
1217 DECL_CONTEXT (alias) = NULL;
1218 TREE_READONLY (alias) = TREE_READONLY (method);
1219 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1220 TREE_PUBLIC (alias) = 0;
1221 DECL_EXTERNAL (alias) = 0;
1222 DECL_ARTIFICIAL (alias) = 1;
1223 DECL_INLINE (alias) = 0;
1224 DECL_INITIAL (alias) = error_mark_node;
1225 TREE_ADDRESSABLE (alias) = 1;
1226 TREE_USED (alias) = 1;
1227 SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
1228 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1229 if (!flag_syntax_only)
1230 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1237 /** Make reflection data (_Jv_Field) for field FDECL. */
1240 make_field_value (tree fdecl)
1244 tree type = TREE_TYPE (fdecl);
1245 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1247 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1248 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1250 type = build_class_ref (type);
1253 tree signature = build_java_signature (type);
1255 type = build_utf8_ref (unmangle_classname
1256 (IDENTIFIER_POINTER (signature),
1257 IDENTIFIER_LENGTH (signature)));
1259 PUSH_FIELD_VALUE (finit, "type", type);
1261 flags = get_access_flags_from_decl (fdecl);
1263 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1265 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1266 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1270 build_constructor (field_info_union_node,
1272 ((FIELD_STATIC (fdecl)
1273 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1274 : TYPE_FIELDS (field_info_union_node)),
1275 (FIELD_STATIC (fdecl)
1276 ? build_address_of (fdecl)
1277 : byte_position (fdecl)))));
1279 FINISH_RECORD_CONSTRUCTOR (finit);
1283 /** Make reflection data (_Jv_Method) for method MDECL. */
1286 make_method_value (tree mdecl)
1288 static int method_name_count = 0;
1293 #define ACC_TRANSLATED 0x4000
1294 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1296 class_decl = DECL_CONTEXT (mdecl);
1297 /* For interfaces, the index field contains the dispatch index. */
1298 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1299 index = build_int_cst (NULL_TREE,
1300 get_interface_method_index (mdecl, class_decl));
1301 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1302 index = get_method_index (mdecl);
1304 index = integer_minus_one_node;
1306 code = null_pointer_node;
1307 if (DECL_RTL_SET_P (mdecl))
1308 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1309 make_local_function_alias (mdecl));
1310 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1311 PUSH_FIELD_VALUE (minit, "name",
1312 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1313 init_identifier_node
1314 : DECL_NAME (mdecl)));
1316 tree signature = build_java_signature (TREE_TYPE (mdecl));
1317 PUSH_FIELD_VALUE (minit, "signature",
1320 (IDENTIFIER_POINTER(signature),
1321 IDENTIFIER_LENGTH(signature)))));
1323 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1324 PUSH_FIELD_VALUE (minit, "index", index);
1325 PUSH_FIELD_VALUE (minit, "ncode", code);
1328 /* Compute the `throws' information for the method. */
1329 tree table = null_pointer_node;
1330 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1332 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1333 tree iter, type, array;
1336 table = tree_cons (NULL_TREE, table, NULL_TREE);
1337 for (iter = DECL_FUNCTION_THROWS (mdecl);
1339 iter = TREE_CHAIN (iter))
1341 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1343 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1344 IDENTIFIER_LENGTH (sig)));
1345 table = tree_cons (NULL_TREE, utf8, table);
1347 type = build_prim_array_type (ptr_type_node, length);
1348 table = build_constructor (type, table);
1349 /* Compute something unique enough. */
1350 sprintf (buf, "_methods%d", method_name_count++);
1351 array = build_decl (VAR_DECL, get_identifier (buf), type);
1352 DECL_INITIAL (array) = table;
1353 TREE_STATIC (array) = 1;
1354 DECL_ARTIFICIAL (array) = 1;
1355 DECL_IGNORED_P (array) = 1;
1356 rest_of_decl_compilation (array, 1, 0);
1358 table = build1 (ADDR_EXPR, ptr_type_node, array);
1361 PUSH_FIELD_VALUE (minit, "throws", table);
1364 FINISH_RECORD_CONSTRUCTOR (minit);
1369 get_dispatch_vector (tree type)
1371 tree vtable = TYPE_VTABLE (type);
1373 if (vtable == NULL_TREE)
1377 tree super = CLASSTYPE_SUPER (type);
1378 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1379 vtable = make_tree_vec (nvirtuals);
1380 TYPE_VTABLE (type) = vtable;
1381 if (super != NULL_TREE)
1383 tree super_vtable = get_dispatch_vector (super);
1385 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1386 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1389 for (method = TYPE_METHODS (type); method != NULL_TREE;
1390 method = TREE_CHAIN (method))
1392 tree method_index = get_method_index (method);
1393 if (method_index != NULL_TREE
1394 && host_integerp (method_index, 0))
1395 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1403 get_dispatch_table (tree type, tree this_class_addr)
1405 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1406 tree vtable = get_dispatch_vector (type);
1408 tree list = NULL_TREE;
1409 int nvirtuals = TREE_VEC_LENGTH (vtable);
1413 for (i = nvirtuals; --i >= 0; )
1415 tree method = TREE_VEC_ELT (vtable, i);
1416 if (METHOD_ABSTRACT (method))
1419 warning ("%Jabstract method in non-abstract class", method);
1421 if (TARGET_VTABLE_USES_DESCRIPTORS)
1422 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1423 list = tree_cons (NULL_TREE, null_pointer_node, list);
1425 list = tree_cons (NULL_TREE, null_pointer_node, list);
1429 if (!DECL_RTL_SET_P (method))
1430 make_decl_rtl (method);
1432 if (TARGET_VTABLE_USES_DESCRIPTORS)
1433 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1435 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1436 method, build_int_cst (NULL_TREE, j));
1437 TREE_CONSTANT (fdesc) = 1;
1438 TREE_INVARIANT (fdesc) = 1;
1439 list = tree_cons (NULL_TREE, fdesc, list);
1442 list = tree_cons (NULL_TREE,
1443 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1449 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1450 using the Boehm GC we sometimes stash a GC type descriptor
1451 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1452 the emitted byte count during the output to the assembly file. */
1453 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1454 fake "function descriptor". It's first word is the is the class
1455 pointer, and subsequent words (usually one) contain the GC descriptor.
1456 In all other cases, we reserve two extra vtable slots. */
1457 gc_descr = get_boehm_type_descriptor (type);
1458 list = tree_cons (NULL_TREE, gc_descr, list);
1459 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1460 list = tree_cons (NULL_TREE, gc_descr, list);
1461 list = tree_cons (NULL_TREE, this_class_addr, list);
1463 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1464 list = tree_cons (NULL_TREE, null_pointer_node, list);
1465 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1466 list = tree_cons (integer_zero_node, null_pointer_node, list);
1468 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1469 if (TARGET_VTABLE_USES_DESCRIPTORS)
1470 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1472 return build_constructor (build_prim_array_type (nativecode_ptr_type_node,
1477 /* Set the method_index for a method decl. */
1479 set_method_index (tree decl, tree method_index)
1481 if (method_index != NULL_TREE)
1483 /* method_index is null if we're using indirect dispatch. */
1484 method_index = fold (convert (sizetype, method_index));
1486 if (TARGET_VTABLE_USES_DESCRIPTORS)
1487 /* Add one to skip bogus descriptor for class and GC descriptor. */
1488 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1490 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1492 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1495 DECL_VINDEX (decl) = method_index;
1498 /* Get the method_index for a method decl. */
1500 get_method_index (tree decl)
1502 tree method_index = DECL_VINDEX (decl);
1507 if (TARGET_VTABLE_USES_DESCRIPTORS)
1508 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1509 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1511 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1512 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1514 return method_index;
1518 supers_all_compiled (tree type)
1520 while (type != NULL_TREE)
1522 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1524 type = CLASSTYPE_SUPER (type);
1530 make_class_data (tree type)
1532 tree decl, cons, temp;
1533 tree field, fields_decl;
1534 tree static_fields = NULL_TREE;
1535 tree instance_fields = NULL_TREE;
1536 HOST_WIDE_INT static_field_count = 0;
1537 HOST_WIDE_INT instance_field_count = 0;
1538 HOST_WIDE_INT field_count;
1539 tree field_array_type;
1541 tree methods = NULL_TREE;
1542 tree dtable_decl = NULL_TREE;
1543 HOST_WIDE_INT method_count = 0;
1544 tree method_array_type;
1547 tree this_class_addr;
1548 tree constant_pool_constructor;
1549 tree interfaces = null_pointer_node;
1550 int interface_len = 0;
1551 tree type_decl = TYPE_NAME (type);
1552 /** Offset from start of virtual function table declaration
1553 to where objects actually point at, following new g++ ABI. */
1554 tree dtable_start_offset = build_int_cst (NULL_TREE,
1555 2 * POINTER_SIZE / BITS_PER_UNIT);
1557 this_class_addr = build_class_ref (type);
1558 decl = TREE_OPERAND (this_class_addr, 0);
1560 /* Build Field array. */
1561 field = TYPE_FIELDS (type);
1562 while (field && DECL_ARTIFICIAL (field))
1563 field = TREE_CHAIN (field); /* Skip dummy fields. */
1564 if (field && DECL_NAME (field) == NULL_TREE)
1565 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1566 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1568 if (! DECL_ARTIFICIAL (field))
1570 tree init = make_field_value (field);
1571 if (FIELD_STATIC (field))
1573 tree initial = DECL_INITIAL (field);
1574 static_field_count++;
1575 static_fields = tree_cons (NULL_TREE, init, static_fields);
1576 /* If the initial value is a string constant,
1577 prevent output_constant from trying to assemble the value. */
1578 if (initial != NULL_TREE
1579 && TREE_TYPE (initial) == string_ptr_type_node)
1580 DECL_INITIAL (field) = NULL_TREE;
1581 rest_of_decl_compilation (field, 1, 1);
1582 DECL_INITIAL (field) = initial;
1586 instance_field_count++;
1587 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1591 field_count = static_field_count + instance_field_count;
1592 if (field_count > 0)
1594 static_fields = nreverse (static_fields);
1595 instance_fields = nreverse (instance_fields);
1596 static_fields = chainon (static_fields, instance_fields);
1597 field_array_type = build_prim_array_type (field_type_node, field_count);
1598 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1600 DECL_INITIAL (fields_decl) = build_constructor (field_array_type,
1602 TREE_STATIC (fields_decl) = 1;
1603 DECL_ARTIFICIAL (fields_decl) = 1;
1604 DECL_IGNORED_P (fields_decl) = 1;
1605 rest_of_decl_compilation (fields_decl, 1, 0);
1608 fields_decl = NULL_TREE;
1610 /* Build Method array. */
1611 for (method = TYPE_METHODS (type);
1612 method != NULL_TREE; method = TREE_CHAIN (method))
1615 if (METHOD_PRIVATE (method)
1616 && ! flag_keep_inline_functions
1619 /* Even if we have a decl, we don't necessarily have the code.
1620 This can happen if we inherit a method from a superclass for
1621 which we don't have a .class file. */
1622 if (METHOD_DUMMY (method))
1624 init = make_method_value (method);
1626 methods = tree_cons (NULL_TREE, init, methods);
1628 method_array_type = build_prim_array_type (method_type_node, method_count);
1629 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1631 DECL_INITIAL (methods_decl) = build_constructor (method_array_type,
1632 nreverse (methods));
1633 TREE_STATIC (methods_decl) = 1;
1634 DECL_ARTIFICIAL (methods_decl) = 1;
1635 DECL_IGNORED_P (methods_decl) = 1;
1636 rest_of_decl_compilation (methods_decl, 1, 0);
1638 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1639 && !flag_indirect_dispatch)
1641 tree dtable = get_dispatch_table (type, this_class_addr);
1642 dtable_decl = build_dtable_decl (type);
1643 DECL_INITIAL (dtable_decl) = dtable;
1644 TREE_STATIC (dtable_decl) = 1;
1645 DECL_ARTIFICIAL (dtable_decl) = 1;
1646 DECL_IGNORED_P (dtable_decl) = 1;
1647 TREE_PUBLIC (dtable_decl) = 1;
1648 rest_of_decl_compilation (dtable_decl, 1, 0);
1649 if (type == class_type_node)
1650 class_dtable_decl = dtable_decl;
1653 if (class_dtable_decl == NULL_TREE)
1655 class_dtable_decl = build_dtable_decl (class_type_node);
1656 TREE_STATIC (class_dtable_decl) = 1;
1657 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1658 DECL_IGNORED_P (class_dtable_decl) = 1;
1659 if (is_compiled_class (class_type_node) != 2)
1660 DECL_EXTERNAL (class_dtable_decl) = 1;
1661 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1664 super = CLASSTYPE_SUPER (type);
1665 if (super == NULL_TREE)
1666 super = null_pointer_node;
1667 else if (! flag_indirect_dispatch
1668 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1669 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1670 super = build_class_ref (super);
1673 int super_index = alloc_class_constant (super);
1674 super = build_int_cst (ptr_type_node, super_index);
1677 /* Build and emit the array of implemented interfaces. */
1678 if (type != object_type_node)
1679 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1681 if (interface_len > 0)
1683 tree init = NULL_TREE;
1685 tree interface_array_type, idecl;
1686 interface_array_type
1687 = build_prim_array_type (class_ptr_type, interface_len);
1688 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1689 interface_array_type);
1691 for (i = interface_len; i > 0; i--)
1693 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1694 tree iclass = BINFO_TYPE (child);
1696 if (! flag_indirect_dispatch
1698 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1699 index = build_class_ref (iclass);
1702 int int_index = alloc_class_constant (iclass);
1703 index = build_int_cst (ptr_type_node, int_index);
1705 init = tree_cons (NULL_TREE, index, init);
1707 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
1708 TREE_STATIC (idecl) = 1;
1709 DECL_ARTIFICIAL (idecl) = 1;
1710 DECL_IGNORED_P (idecl) = 1;
1711 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1712 rest_of_decl_compilation (idecl, 1, 0);
1715 constant_pool_constructor = build_constants_constructor ();
1717 if (flag_indirect_dispatch)
1719 TYPE_OTABLE_DECL (type)
1721 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1722 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1723 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1725 TYPE_ATABLE_DECL (type)
1727 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1728 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1729 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1731 TYPE_ITABLE_DECL (type)
1733 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1734 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1735 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1738 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1740 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1741 PUSH_FIELD_VALUE (temp, "vtable",
1742 build2 (PLUS_EXPR, dtable_ptr_type,
1743 build1 (ADDR_EXPR, dtable_ptr_type,
1745 dtable_start_offset));
1746 if (! flag_hash_synchronization)
1747 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1748 FINISH_RECORD_CONSTRUCTOR (temp);
1749 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1750 PUSH_SUPER_VALUE (cons, temp);
1751 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1752 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1753 PUSH_FIELD_VALUE (cons, "accflags",
1754 build_int_cst (NULL_TREE,
1755 get_access_flags_from_decl (type_decl)));
1757 PUSH_FIELD_VALUE (cons, "superclass",
1758 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1759 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1760 PUSH_FIELD_VALUE (cons, "methods",
1761 build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1762 PUSH_FIELD_VALUE (cons, "method_count",
1763 build_int_cst (NULL_TREE, method_count));
1765 if (flag_indirect_dispatch)
1766 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1768 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1770 PUSH_FIELD_VALUE (cons, "fields",
1771 fields_decl == NULL_TREE ? null_pointer_node
1772 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1773 /* If we're using the binary compatibility ABI we don't know the
1774 size until load time. */
1775 PUSH_FIELD_VALUE (cons, "size_in_bytes",
1776 (flag_indirect_dispatch
1777 ? integer_minus_one_node
1778 : size_in_bytes (type)));
1779 PUSH_FIELD_VALUE (cons, "field_count",
1780 build_int_cst (NULL_TREE, field_count));
1781 PUSH_FIELD_VALUE (cons, "static_field_count",
1782 build_int_cst (NULL_TREE, static_field_count));
1784 if (flag_indirect_dispatch)
1785 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
1787 PUSH_FIELD_VALUE (cons, "vtable",
1788 dtable_decl == NULL_TREE ? null_pointer_node
1789 : build2 (PLUS_EXPR, dtable_ptr_type,
1790 build1 (ADDR_EXPR, dtable_ptr_type,
1792 dtable_start_offset));
1793 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
1795 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
1796 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
1800 PUSH_FIELD_VALUE (cons, "otable",
1801 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
1802 PUSH_FIELD_VALUE (cons, "otable_syms",
1803 build1 (ADDR_EXPR, symbols_array_ptr_type,
1804 TYPE_OTABLE_SYMS_DECL (type)));
1805 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
1806 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
1808 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
1810 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
1811 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
1815 PUSH_FIELD_VALUE (cons, "atable",
1816 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
1817 PUSH_FIELD_VALUE (cons, "atable_syms",
1818 build1 (ADDR_EXPR, symbols_array_ptr_type,
1819 TYPE_ATABLE_SYMS_DECL (type)));
1820 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
1821 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
1823 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
1825 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
1826 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
1830 PUSH_FIELD_VALUE (cons, "itable",
1831 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
1832 PUSH_FIELD_VALUE (cons, "itable_syms",
1833 build1 (ADDR_EXPR, symbols_array_ptr_type,
1834 TYPE_ITABLE_SYMS_DECL (type)));
1835 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
1836 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
1839 PUSH_FIELD_VALUE (cons, "catch_classes",
1840 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
1841 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
1842 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
1843 PUSH_FIELD_VALUE (cons, "interface_count",
1844 build_int_cst (NULL_TREE, interface_len));
1847 convert (byte_type_node,
1848 build_int_cst (NULL_TREE,
1849 flag_indirect_dispatch
1850 ? JV_STATE_PRELOADING
1851 : JV_STATE_COMPILED)));
1853 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
1854 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
1855 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
1856 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
1857 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
1858 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
1861 tree assertion_table_ref;
1862 if (TYPE_ASSERTIONS (type) == NULL)
1863 assertion_table_ref = null_pointer_node;
1865 assertion_table_ref = build1 (ADDR_EXPR,
1866 build_pointer_type (assertion_table_type),
1867 emit_assertion_table (type));
1869 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
1872 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
1873 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
1874 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
1875 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
1877 FINISH_RECORD_CONSTRUCTOR (cons);
1879 DECL_INITIAL (decl) = cons;
1881 /* Hash synchronization requires at least 64-bit alignment. */
1882 if (flag_hash_synchronization && POINTER_SIZE < 64)
1883 DECL_ALIGN (decl) = 64;
1885 rest_of_decl_compilation (decl, 1, 0);
1887 TYPE_OTABLE_DECL (type) = NULL_TREE;
1888 TYPE_ATABLE_DECL (type) = NULL_TREE;
1889 TYPE_CTABLE_DECL (type) = NULL_TREE;
1895 if (TYPE_VERIFY_METHOD (output_class))
1897 tree verify_method = TYPE_VERIFY_METHOD (output_class);
1898 DECL_SAVED_TREE (verify_method)
1899 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
1900 build (RETURN_EXPR, void_type_node, NULL));
1901 java_genericize (verify_method);
1902 cgraph_finalize_function (verify_method, false);
1903 TYPE_ASSERTIONS (current_class) = NULL;
1906 java_expand_catch_classes (current_class);
1908 current_function_decl = NULL_TREE;
1909 make_class_data (current_class);
1911 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
1914 /* Return 2 if CLASS is compiled by this compilation job;
1915 return 1 if CLASS can otherwise be assumed to be compiled;
1916 return 0 if we cannot assume that CLASS is compiled.
1917 Returns 1 for primitive and 0 for array types. */
1919 is_compiled_class (tree class)
1922 if (TREE_CODE (class) == POINTER_TYPE)
1923 class = TREE_TYPE (class);
1924 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
1926 if (TYPE_ARRAY_P (class))
1928 if (class == current_class)
1931 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
1932 if (CLASS_FROM_CURRENTLY_COMPILED_P (class) || seen_in_zip)
1934 /* The class was seen in the current ZIP file and will be
1935 available as a compiled class in the future but may not have
1936 been loaded already. Load it if necessary. This prevent
1937 build_class_ref () from crashing. */
1939 if (seen_in_zip && !CLASS_LOADED_P (class))
1940 load_class (class, 1);
1942 /* We return 2 for class seen in ZIP and class from files
1943 belonging to the same compilation unit */
1947 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
1949 if (!CLASS_LOADED_P (class))
1951 if (CLASS_FROM_SOURCE_P (class))
1952 safe_layout_class (class);
1954 load_class (class, 1);
1962 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
1965 build_dtable_decl (tree type)
1969 /* We need to build a new dtable type so that its size is uniquely
1970 computed when we're dealing with the class for real and not just
1971 faking it (like java.lang.Class during the initialization of the
1972 compiler.) We know we're not faking a class when CURRENT_CLASS is
1974 if (current_class == type)
1976 tree dummy = NULL_TREE;
1979 dtype = make_node (RECORD_TYPE);
1981 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
1982 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
1984 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
1985 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1987 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1988 TREE_CHAIN (dummy) = tmp_field;
1989 DECL_CONTEXT (tmp_field) = dtype;
1990 DECL_ARTIFICIAL (tmp_field) = 1;
1994 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
1995 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1997 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1998 TREE_CHAIN (dummy) = tmp_field;
1999 DECL_CONTEXT (tmp_field) = dtype;
2000 DECL_ARTIFICIAL (tmp_field) = 1;
2004 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2005 if (TARGET_VTABLE_USES_DESCRIPTORS)
2006 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2008 PUSH_FIELD (dtype, dummy, "methods",
2009 build_prim_array_type (nativecode_ptr_type_node, n));
2010 layout_type (dtype);
2013 dtype = dtable_type;
2015 return build_decl (VAR_DECL,
2016 java_mangle_vtable (&temporary_obstack, type), dtype);
2019 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2020 fields inherited from SUPER_CLASS. */
2023 push_super_field (tree this_class, tree super_class)
2026 /* Don't insert the field if we're just re-laying the class out. */
2027 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2029 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2030 DECL_IGNORED_P (base_decl) = 1;
2031 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2032 TYPE_FIELDS (this_class) = base_decl;
2033 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2034 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2037 /* Handle the different manners we may have to lay out a super class. */
2040 maybe_layout_super_class (tree super_class, tree this_class)
2042 if (TREE_CODE (super_class) == RECORD_TYPE)
2044 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2045 safe_layout_class (super_class);
2046 if (!CLASS_LOADED_P (super_class))
2047 load_class (super_class, 1);
2049 /* We might have to layout the class before its dependency on
2050 the super class gets resolved by java_complete_class */
2051 else if (TREE_CODE (super_class) == POINTER_TYPE)
2053 if (TREE_TYPE (super_class) != NULL_TREE)
2054 super_class = TREE_TYPE (super_class);
2057 /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
2059 tree this_wrap = NULL_TREE;
2063 tree this_decl = TYPE_NAME (this_class);
2064 #ifdef USE_MAPPED_LOCATION
2065 this_wrap = build_expr_wfl (this_class,
2066 DECL_SOURCE_LOCATION (this_decl));
2068 this_wrap = build_expr_wfl (this_class,
2069 DECL_SOURCE_FILE (this_decl),
2070 DECL_SOURCE_LINE (this_decl), 0);
2073 super_class = do_resolve_class (NULL_TREE, /* FIXME? */
2074 super_class, NULL_TREE, this_wrap);
2076 return NULL_TREE; /* FIXME, NULL_TREE not checked by caller. */
2077 super_class = TREE_TYPE (super_class);
2080 if (!TYPE_SIZE (super_class))
2081 safe_layout_class (super_class);
2087 layout_class (tree this_class)
2089 tree super_class = CLASSTYPE_SUPER (this_class);
2092 class_list = tree_cons (this_class, NULL_TREE, class_list);
2093 if (CLASS_BEING_LAIDOUT (this_class))
2099 sprintf (buffer, " with '%s'",
2100 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2101 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2103 for (current = TREE_CHAIN (class_list); current;
2104 current = TREE_CHAIN (current))
2106 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2107 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2108 IDENTIFIER_POINTER (DECL_NAME (decl)),
2109 DECL_SOURCE_FILE (decl),
2110 DECL_SOURCE_LINE (decl));
2111 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2113 obstack_1grow (&temporary_obstack, '\0');
2114 report = obstack_finish (&temporary_obstack);
2115 cyclic_inheritance_report = ggc_strdup (report);
2116 obstack_free (&temporary_obstack, report);
2117 TYPE_SIZE (this_class) = error_mark_node;
2120 CLASS_BEING_LAIDOUT (this_class) = 1;
2122 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2124 tree maybe_super_class
2125 = maybe_layout_super_class (super_class, this_class);
2126 if (maybe_super_class == NULL
2127 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2129 TYPE_SIZE (this_class) = error_mark_node;
2130 CLASS_BEING_LAIDOUT (this_class) = 0;
2131 class_list = TREE_CHAIN (class_list);
2134 if (TYPE_SIZE (this_class) == NULL_TREE)
2135 push_super_field (this_class, maybe_super_class);
2138 for (field = TYPE_FIELDS (this_class);
2139 field != NULL_TREE; field = TREE_CHAIN (field))
2141 if (FIELD_STATIC (field))
2143 /* Set DECL_ASSEMBLER_NAME to something suitably mangled. */
2144 SET_DECL_ASSEMBLER_NAME (field,
2146 (&temporary_obstack, field));
2150 layout_type (this_class);
2152 /* Also recursively load/layout any superinterfaces, but only if
2153 class was loaded from bytecode. The source parser will take care
2155 if (!CLASS_FROM_SOURCE_P (this_class))
2158 if (TYPE_BINFO (this_class))
2160 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2162 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2163 tree super_interface = BINFO_TYPE (binfo);
2164 tree maybe_super_interface
2165 = maybe_layout_super_class (super_interface, NULL_TREE);
2166 if (maybe_super_interface == NULL
2167 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2169 TYPE_SIZE (this_class) = error_mark_node;
2170 CLASS_BEING_LAIDOUT (this_class) = 0;
2171 class_list = TREE_CHAIN (class_list);
2178 /* Convert the size back to an SI integer value. */
2179 TYPE_SIZE_UNIT (this_class) =
2180 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2182 CLASS_BEING_LAIDOUT (this_class) = 0;
2183 class_list = TREE_CHAIN (class_list);
2187 add_miranda_methods (tree base_class, tree search_class)
2190 tree binfo, base_binfo;
2192 if (!CLASS_PARSED_P (search_class))
2193 load_class (search_class, 1);
2195 for (binfo = TYPE_BINFO (search_class), i = 1;
2196 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2199 tree elt = BINFO_TYPE (base_binfo);
2201 /* FIXME: This is totally bogus. We should not be handling
2202 Miranda methods at all if we're using the BC ABI. */
2203 if (TYPE_DUMMY (elt))
2206 /* Ensure that interface methods are seen in declared order. */
2207 if (!CLASS_LOADED_P (elt))
2208 load_class (elt, 1);
2209 layout_class_methods (elt);
2211 /* All base classes will have been laid out at this point, so the order
2212 will be correct. This code must match similar layout code in the
2214 for (method_decl = TYPE_METHODS (elt);
2215 method_decl; method_decl = TREE_CHAIN (method_decl))
2219 /* An interface can have <clinit>. */
2220 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2223 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2224 override = lookup_argument_method (base_class,
2225 DECL_NAME (method_decl), sig);
2226 if (override == NULL_TREE)
2228 /* Found a Miranda method. Add it. */
2230 sig = build_java_signature (TREE_TYPE (method_decl));
2232 = add_method (base_class,
2233 get_access_flags_from_decl (method_decl),
2234 DECL_NAME (method_decl), sig);
2235 METHOD_INVISIBLE (new_method) = 1;
2239 /* Try superinterfaces. */
2240 add_miranda_methods (base_class, elt);
2245 layout_class_methods (tree this_class)
2247 tree method_decl, dtable_count;
2248 tree super_class, type_name;
2250 if (TYPE_NVIRTUALS (this_class))
2253 super_class = CLASSTYPE_SUPER (this_class);
2257 super_class = maybe_layout_super_class (super_class, this_class);
2258 if (!TYPE_NVIRTUALS (super_class))
2259 layout_class_methods (super_class);
2260 dtable_count = TYPE_NVIRTUALS (super_class);
2263 dtable_count = integer_zero_node;
2265 type_name = TYPE_NAME (this_class);
2266 if (!flag_indirect_dispatch
2267 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2269 /* An abstract class can have methods which are declared only in
2270 an implemented interface. These are called "Miranda
2271 methods". We make a dummy method entry for such methods
2273 add_miranda_methods (this_class, this_class);
2276 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2278 for (method_decl = TYPE_METHODS (this_class);
2279 method_decl; method_decl = TREE_CHAIN (method_decl))
2280 dtable_count = layout_class_method (this_class, super_class,
2281 method_decl, dtable_count);
2283 TYPE_NVIRTUALS (this_class) = dtable_count;
2286 /* Return the index of METHOD in INTERFACE. This index begins at 1 and is used as an
2287 argument for _Jv_LookupInterfaceMethodIdx(). */
2289 get_interface_method_index (tree method, tree interface)
2294 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++)
2298 if (meth == NULL_TREE)
2303 /* Lay METHOD_DECL out, returning a possibly new value of
2304 DTABLE_COUNT. Also mangle the method's name. */
2307 layout_class_method (tree this_class, tree super_class,
2308 tree method_decl, tree dtable_count)
2310 tree method_name = DECL_NAME (method_decl);
2312 TREE_PUBLIC (method_decl) = 1;
2313 /* Considered external until we know what classes are being
2314 compiled into this object file. */
2315 DECL_EXTERNAL (method_decl) = 1;
2317 /* This is a good occasion to mangle the method's name */
2318 SET_DECL_ASSEMBLER_NAME (method_decl,
2319 java_mangle_decl (&temporary_obstack,
2321 /* We don't generate a RTL for the method if it's abstract, or if
2322 it's an interface method that isn't clinit. */
2323 if (! METHOD_ABSTRACT (method_decl)
2324 || (CLASS_INTERFACE (TYPE_NAME (this_class))
2325 && (DECL_CLINIT_P (method_decl))))
2326 make_decl_rtl (method_decl);
2328 if (ID_INIT_P (method_name))
2330 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2332 for (ptr = p; *ptr; )
2337 DECL_CONSTRUCTOR_P (method_decl) = 1;
2338 build_java_argument_signature (TREE_TYPE (method_decl));
2340 else if (! METHOD_STATIC (method_decl))
2343 build_java_argument_signature (TREE_TYPE (method_decl));
2344 bool method_override = false;
2345 tree super_method = lookup_argument_method (super_class, method_name,
2347 if (super_method != NULL_TREE
2348 && ! METHOD_DUMMY (super_method))
2350 method_override = true;
2351 if (! METHOD_PUBLIC (super_method) &&
2352 ! METHOD_PROTECTED (super_method))
2354 /* Don't override private method, or default-access method in
2356 if (METHOD_PRIVATE (super_method) ||
2357 ! in_same_package (TYPE_NAME (this_class),
2358 TYPE_NAME (super_class)))
2359 method_override = false;
2362 if (method_override)
2364 tree method_index = get_method_index (super_method);
2365 set_method_index (method_decl, method_index);
2366 if (method_index == NULL_TREE
2367 && ! flag_indirect_dispatch
2368 && !CLASS_FROM_SOURCE_P (this_class)
2369 && ! DECL_ARTIFICIAL (super_method))
2370 error ("%Jnon-static method '%D' overrides static method",
2371 method_decl, method_decl);
2373 else if (this_class == object_type_node
2374 && (METHOD_FINAL (method_decl)
2375 || METHOD_PRIVATE (method_decl)))
2377 /* We don't generate vtable entries for final Object
2378 methods. This is simply to save space, since every
2379 object would otherwise have to define them. */
2381 else if (! METHOD_PRIVATE (method_decl)
2384 /* We generate vtable entries for final methods because they
2385 may one day be changed to non-final. */
2386 set_method_index (method_decl, dtable_count);
2387 dtable_count = fold (build2 (PLUS_EXPR, integer_type_node,
2388 dtable_count, integer_one_node));
2392 return dtable_count;
2396 register_class (void)
2398 /* END does not need to be registered with the garbage collector
2399 because it always points into the list given by REGISTERED_CLASS,
2400 and that variable is registered with the collector. */
2402 tree node = TREE_OPERAND (build_class_ref (current_class), 0);
2403 tree current = copy_node (node);
2405 XEXP (DECL_RTL (current), 0) = copy_rtx (XEXP (DECL_RTL(node), 0));
2406 if (!registered_class)
2407 registered_class = current;
2409 TREE_CHAIN (end) = current;
2414 /* Emit something to register classes at start-up time.
2416 The preferred mechanism is through the .jcr section, which contain
2417 a list of pointers to classes which get registered during constructor
2420 The fallback mechanism is to add statements to *LIST_P to call
2421 _Jv_RegisterClass for each class in this file. These statements will
2422 be added to a static constructor function for this translation unit. */
2425 emit_register_classes (tree *list_p)
2427 if (registered_class == NULL)
2430 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2431 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2432 but lack suitable crtbegin/end objects or linker support. These
2433 targets can overide the default in tm.h to use the fallback mechanism. */
2434 if (TARGET_USE_JCR_SECTION)
2436 #ifdef JCR_SECTION_NAME
2438 named_section_flags (JCR_SECTION_NAME, SECTION_WRITE);
2439 assemble_align (POINTER_SIZE);
2440 for (t = registered_class; t; t = TREE_CHAIN (t))
2442 mark_decl_referenced (t);
2443 assemble_integer (XEXP (DECL_RTL (t), 0),
2444 POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2447 /* A target has defined TARGET_USE_JCR_SECTION, but doesn't have a
2448 JCR_SECTION_NAME. */
2454 tree klass, t, register_class_fn;
2456 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2457 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2458 TREE_PUBLIC (t) = 1;
2459 DECL_EXTERNAL (t) = 1;
2460 register_class_fn = t;
2462 for (klass = registered_class; klass; klass = TREE_CHAIN (klass))
2464 t = build_fold_addr_expr (klass);
2465 t = tree_cons (NULL, t, NULL);
2466 t = build_function_call_expr (register_class_fn, t);
2467 append_to_statement_list (t, list_p);
2472 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2475 build_symbol_entry (tree decl)
2477 tree clname, name, signature, sym;
2478 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2479 /* ??? Constructors are given the name foo.foo all the way through
2480 the compiler, but in the method table they're all renamed
2481 foo.<init>. So, we have to do the same here unless we want an
2482 unresolved reference at runtime. */
2483 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2484 && DECL_CONSTRUCTOR_P (decl))
2485 ? init_identifier_node
2486 : DECL_NAME (decl));
2487 signature = build_java_signature (TREE_TYPE (decl));
2488 signature = build_utf8_ref (unmangle_classname
2489 (IDENTIFIER_POINTER (signature),
2490 IDENTIFIER_LENGTH (signature)));
2492 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2493 PUSH_FIELD_VALUE (sym, "clname", clname);
2494 PUSH_FIELD_VALUE (sym, "name", name);
2495 PUSH_FIELD_VALUE (sym, "signature", signature);
2496 FINISH_RECORD_CONSTRUCTOR (sym);
2497 TREE_CONSTANT (sym) = 1;
2498 TREE_INVARIANT (sym) = 1;
2503 /* Emit a symbol table: used by -findirect-dispatch. */
2506 emit_symbol_table (tree name, tree the_table, tree decl_list,
2507 tree the_syms_decl, tree the_array_element_type,
2510 tree method_list, method, table, list, null_symbol;
2511 tree table_size, the_array_type;
2514 /* Only emit a table if this translation unit actually made any
2515 references via it. */
2516 if (decl_list == NULL_TREE)
2519 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2521 method_list = decl_list;
2523 while (method_list != NULL_TREE)
2525 method = TREE_VALUE (method_list);
2526 list = tree_cons (NULL_TREE, build_symbol_entry (method), list);
2527 method_list = TREE_CHAIN (method_list);
2531 /* Terminate the list with a "null" entry. */
2532 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2533 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2534 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2535 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2536 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2537 TREE_CONSTANT (null_symbol) = 1;
2538 TREE_INVARIANT (null_symbol) = 1;
2539 list = tree_cons (NULL_TREE, null_symbol, list);
2541 /* Put the list in the right order and make it a constructor. */
2542 list = nreverse (list);
2543 table = build_constructor (symbols_array_type, list);
2545 /* Make it the initial value for otable_syms and emit the decl. */
2546 DECL_INITIAL (the_syms_decl) = table;
2547 DECL_ARTIFICIAL (the_syms_decl) = 1;
2548 DECL_IGNORED_P (the_syms_decl) = 1;
2549 rest_of_decl_compilation (the_syms_decl, 1, 0);
2551 /* Now that its size is known, redefine the table as an
2552 uninitialized static array of INDEX + 1 elements. The extra entry
2553 is used by the runtime to track whether the table has been
2556 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2557 the_array_type = build_array_type (the_array_element_type, table_size);
2558 the_table = build_decl (VAR_DECL, name, the_array_type);
2559 TREE_STATIC (the_table) = 1;
2560 TREE_READONLY (the_table) = 1;
2561 rest_of_decl_compilation (the_table, 1, 0);
2566 /* Make an entry for the catch_classes list. */
2568 make_catch_class_record (tree catch_class, tree classname)
2571 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2572 START_RECORD_CONSTRUCTOR (entry, type);
2573 PUSH_FIELD_VALUE (entry, "address", catch_class);
2574 PUSH_FIELD_VALUE (entry, "classname", classname);
2575 FINISH_RECORD_CONSTRUCTOR (entry);
2580 /* Generate the list of Throwable classes that are caught by exception
2581 handlers in this class. */
2583 emit_catch_table (tree this_class)
2585 tree table, table_size, array_type;
2586 TYPE_CATCH_CLASSES (this_class) =
2588 make_catch_class_record (null_pointer_node, null_pointer_node),
2589 TYPE_CATCH_CLASSES (this_class));
2590 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2591 TYPE_CATCH_CLASSES (this_class) =
2593 make_catch_class_record (null_pointer_node, null_pointer_node),
2594 TYPE_CATCH_CLASSES (this_class));
2595 table_size = build_index_type
2596 (build_int_cst (NULL_TREE,
2597 list_length (TYPE_CATCH_CLASSES (this_class))));
2599 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2602 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2603 DECL_INITIAL (table) =
2604 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
2605 TREE_STATIC (table) = 1;
2606 TREE_READONLY (table) = 1;
2607 DECL_IGNORED_P (table) = 1;
2608 rest_of_decl_compilation (table, 1, 0);
2612 /* Given a type, return the signature used by
2613 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2614 same as build_java_signature() because we want the canonical array
2618 build_signature_for_libgcj (tree type)
2622 sig = build_java_signature (type);
2623 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2624 IDENTIFIER_LENGTH (sig)));
2628 /* Add an entry to the type assertion table. Callback used during hashtable
2632 add_assertion_table_entry (void **htab_entry, void *ptr)
2635 tree code_val, op1_utf8, op2_utf8;
2636 tree *list = (tree *) ptr;
2637 type_assertion *as = (type_assertion *) *htab_entry;
2639 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2641 if (as->op1 == NULL_TREE)
2642 op1_utf8 = null_pointer_node;
2644 op1_utf8 = build_signature_for_libgcj (as->op1);
2646 if (as->op2 == NULL_TREE)
2647 op2_utf8 = null_pointer_node;
2649 op2_utf8 = build_signature_for_libgcj (as->op2);
2651 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2652 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2653 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2654 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2655 FINISH_RECORD_CONSTRUCTOR (entry);
2657 *list = tree_cons (NULL_TREE, entry, *list);
2661 /* Generate the type assertion table for CLASS, and return its DECL. */
2664 emit_assertion_table (tree class)
2666 tree null_entry, ctor, table_decl;
2667 tree list = NULL_TREE;
2668 htab_t assertions_htab = TYPE_ASSERTIONS (class);
2670 /* Iterate through the hash table. */
2671 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
2673 /* Finish with a null entry. */
2674 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
2675 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
2676 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
2677 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
2678 FINISH_RECORD_CONSTRUCTOR (null_entry);
2680 list = tree_cons (NULL_TREE, null_entry, list);
2682 /* Put the list in the right order and make it a constructor. */
2683 list = nreverse (list);
2684 ctor = build_constructor (assertion_table_type, list);
2686 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
2687 assertion_table_type);
2689 TREE_STATIC (table_decl) = 1;
2690 TREE_READONLY (table_decl) = 1;
2691 TREE_CONSTANT (table_decl) = 1;
2692 DECL_IGNORED_P (table_decl) = 1;
2694 DECL_INITIAL (table_decl) = ctor;
2695 DECL_ARTIFICIAL (table_decl) = 1;
2696 rest_of_decl_compilation (table_decl, 1, 0);
2702 init_class_processing (void)
2704 fields_ident = get_identifier ("fields");
2705 info_ident = get_identifier ("info");
2707 gcc_obstack_init (&temporary_obstack);
2710 static hashval_t java_treetreehash_hash (const void *);
2711 static int java_treetreehash_compare (const void *, const void *);
2713 /* A hash table mapping trees to trees. Used generally. */
2715 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
2718 java_treetreehash_hash (const void *k_p)
2720 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
2721 return JAVA_TREEHASHHASH_H (k->key);
2725 java_treetreehash_compare (const void * k1_p, const void * k2_p)
2727 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
2728 tree k2 = (tree) k2_p;
2729 return (k1->key == k2);
2733 java_treetreehash_find (htab_t ht, tree t)
2735 struct treetreehash_entry *e;
2736 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2737 e = htab_find_with_hash (ht, t, hv);
2745 java_treetreehash_new (htab_t ht, tree t)
2748 struct treetreehash_entry *tthe;
2749 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2751 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
2754 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
2759 tthe = (struct treetreehash_entry *) *e;
2760 return &tthe->value;
2764 java_treetreehash_create (size_t size, int gc)
2767 return htab_create_ggc (size, java_treetreehash_hash,
2768 java_treetreehash_compare, NULL);
2770 return htab_create_alloc (size, java_treetreehash_hash,
2771 java_treetreehash_compare, free, xcalloc, free);
2774 /* Break down qualified IDENTIFIER into package and class-name components.
2775 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
2776 "pkg.foo", and RIGHT to "Bar". */
2779 split_qualified_name (tree *left, tree *right, tree source)
2782 int l = IDENTIFIER_LENGTH (source);
2784 base = alloca (l + 1);
2785 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
2787 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
2789 while (*p != '.' && p != base)
2792 /* We didn't find a '.'. Return an error. */
2798 *right = get_identifier (p+1);
2799 *left = get_identifier (base);
2804 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
2805 if the classes are from the same package. */
2808 in_same_package (tree name1, tree name2)
2814 if (TREE_CODE (name1) == TYPE_DECL)
2815 name1 = DECL_NAME (name1);
2816 if (TREE_CODE (name2) == TYPE_DECL)
2817 name2 = DECL_NAME (name2);
2819 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
2820 /* One in empty package. */
2823 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
2824 /* Both in empty package. */
2827 split_qualified_name (&pkg1, &tmp, name1);
2828 split_qualified_name (&pkg2, &tmp, name2);
2830 return (pkg1 == pkg2);
2833 #include "gt-java-class.h"