1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
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"
46 #include "tree-iterator.h"
48 /* DOS brain-damage */
50 #define O_BINARY 0 /* MS-DOS brain-damage */
53 static tree make_method_value (tree);
54 static tree build_java_method_type (tree, tree, int);
55 static int32 hashUtf8String (const char *, int);
56 static tree make_field_value (tree);
57 static tree get_dispatch_vector (tree);
58 static tree get_dispatch_table (tree, tree);
59 static int supers_all_compiled (tree type);
60 static tree maybe_layout_super_class (tree, tree);
61 static void add_miranda_methods (tree, tree);
62 static int assume_compiled (const char *);
63 static tree build_symbol_entry (tree);
65 struct obstack temporary_obstack;
67 /* The compiler generates different code depending on whether or not
68 it can assume certain classes have been compiled down to native
69 code or not. The compiler options -fassume-compiled= and
70 -fno-assume-compiled= are used to create a tree of
71 class_flag_node objects. This tree is queried to determine if
72 a class is assume to be compiled or not. Each node in the tree
73 represents either a package or a specific class. */
75 typedef struct class_flag_node_struct
77 /* The class or package name. */
80 /* Nonzero if this represents an exclusion. */
83 /* Pointers to other nodes in the tree. */
84 struct class_flag_node_struct *parent;
85 struct class_flag_node_struct *sibling;
86 struct class_flag_node_struct *child;
89 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
90 static void add_class_flag (class_flag_node **, const char *, int);
92 /* This is the root of the include/exclude tree. */
94 static class_flag_node *assume_compiled_tree;
96 static class_flag_node *enable_assert_tree;
98 static GTY(()) tree class_roots[5];
99 #define registered_class class_roots[0]
100 #define fields_ident class_roots[1] /* get_identifier ("fields") */
101 #define info_ident class_roots[2] /* get_identifier ("info") */
102 #define class_list class_roots[3]
103 #define class_dtable_decl class_roots[4]
105 /* Return the node that most closely represents the class whose name
106 is IDENT. Start the search from NODE (followed by its siblings).
107 Return NULL if an appropriate node does not exist. */
109 static class_flag_node *
110 find_class_flag_node (class_flag_node *node, const char *ident)
114 size_t node_ident_length = strlen (node->ident);
116 /* node_ident_length is zero at the root of the tree. If the
117 identifiers are the same length, then we have matching
118 classes. Otherwise check if we've matched an enclosing
121 if (node_ident_length == 0
122 || (strncmp (ident, node->ident, node_ident_length) == 0
123 && (ident[node_ident_length] == '\0'
124 || ident[node_ident_length] == '.')))
126 /* We've found a match, however, there might be a more
129 class_flag_node *found = find_class_flag_node (node->child, ident);
136 /* No match yet. Continue through the sibling list. */
137 node = node->sibling;
140 /* No match at all in this tree. */
145 add_class_flag (class_flag_node **rootp, const char *ident, int value)
147 class_flag_node *root = *rootp;
148 class_flag_node *parent, *node;
150 /* Create the root of the tree if it doesn't exist yet. */
154 root = xmalloc (sizeof (class_flag_node));
157 root->sibling = NULL;
163 /* Calling the function with the empty string means we're setting
164 value for the root of the hierarchy. */
172 /* Find the parent node for this new node. PARENT will either be a
173 class or a package name. Adjust PARENT accordingly. */
175 parent = find_class_flag_node (root, ident);
176 if (strcmp (ident, parent->ident) == 0)
177 parent->value = value;
180 /* Insert new node into the tree. */
181 node = xmalloc (sizeof (class_flag_node));
183 node->ident = xstrdup (ident);
187 node->parent = parent;
188 node->sibling = parent->child;
189 parent->child = node;
193 /* Add a new IDENT to the include/exclude tree. It's an exclusion
194 if EXCLUDEP is nonzero. */
197 add_assume_compiled (const char *ident, int excludep)
199 add_class_flag (&assume_compiled_tree, ident, excludep);
202 /* The default value returned by enable_assertions. */
204 #define DEFAULT_ENABLE_ASSERT (flag_emit_class_files || optimize == 0)
206 /* Enter IDENT (a class or package name) into the enable-assertions table.
207 VALUE is true to enable and false to disable. */
210 add_enable_assert (const char *ident, int value)
212 if (enable_assert_tree == NULL)
213 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
214 add_class_flag (&enable_assert_tree, ident, value);
217 /* Returns nonzero if IDENT is the name of a class that the compiler
218 should assume has been compiled to object code. */
221 assume_compiled (const char *ident)
226 if (NULL == assume_compiled_tree)
229 i = find_class_flag_node (assume_compiled_tree, ident);
236 /* Return true if we should generate code to check assertions within KLASS. */
239 enable_assertions (tree klass)
241 /* Check if command-line specifies whether we should check assertions. */
243 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
245 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
246 class_flag_node *node
247 = find_class_flag_node (enable_assert_tree, ident);
251 /* The default is to enable assertions if generating class files,
252 or not optimizing. */
253 return DEFAULT_ENABLE_ASSERT;
256 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
257 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
258 Also, PREFIX is prepended, and SUFFIX is appended. */
261 ident_subst (const char* old_name,
268 int prefix_len = strlen (prefix);
269 int suffix_len = strlen (suffix);
270 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;
349 /* Given a class, create the DECLs for all its associated indirect
352 gen_indirect_dispatch_tables (tree type)
354 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
357 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
358 tree catch_class_type = make_node (RECORD_TYPE);
360 sprintf (buf, "_catch_classes_%s", typename);
361 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
362 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
363 FINISH_RECORD (catch_class_type);
365 TYPE_CTABLE_DECL (type)
366 = build_decl (VAR_DECL, get_identifier (buf),
367 build_array_type (catch_class_type, 0));
368 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
369 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
370 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
371 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
372 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
373 pushdecl (TYPE_CTABLE_DECL (type));
376 if (flag_indirect_dispatch)
379 char *buf = alloca (strlen (typename) + strlen ("_otable_syms_") + 1);
381 sprintf (buf, "_otable_%s", typename);
382 TYPE_OTABLE_DECL (type) =
383 build_decl (VAR_DECL, get_identifier (buf), otable_type);
384 DECL_EXTERNAL (TYPE_OTABLE_DECL (type)) = 1;
385 TREE_STATIC (TYPE_OTABLE_DECL (type)) = 1;
386 TREE_READONLY (TYPE_OTABLE_DECL (type)) = 1;
387 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
388 DECL_IGNORED_P (TYPE_OTABLE_DECL (type)) = 1;
389 pushdecl (TYPE_OTABLE_DECL (type));
390 sprintf (buf, "_otable_syms_%s", typename);
391 TYPE_OTABLE_SYMS_DECL (type) =
392 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type);
393 TREE_STATIC (TYPE_OTABLE_SYMS_DECL (type)) = 1;
394 TREE_CONSTANT (TYPE_OTABLE_SYMS_DECL (type)) = 1;
395 DECL_IGNORED_P(TYPE_OTABLE_SYMS_DECL (type)) = 1;
396 pushdecl (TYPE_OTABLE_SYMS_DECL (type));
400 char *buf = alloca (strlen (typename) + strlen ("_atable_syms_") + 1);
403 sprintf (buf, "_atable_%s", typename);
404 TYPE_ATABLE_DECL (type) = decl =
405 build_decl (VAR_DECL, get_identifier (buf), atable_type);
406 DECL_EXTERNAL (decl) = 1;
407 TREE_STATIC (decl) = 1;
408 TREE_READONLY (decl) = 1;
409 TREE_CONSTANT (decl) = 1;
410 DECL_IGNORED_P (decl) = 1;
411 /* Mark the atable as belonging to this class. */
413 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
414 DECL_OWNER (decl) = type;
415 sprintf (buf, "_atable_syms_%s", typename);
416 TYPE_ATABLE_SYMS_DECL (type) =
417 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type);
418 TREE_STATIC (TYPE_ATABLE_SYMS_DECL (type)) = 1;
419 TREE_CONSTANT (TYPE_ATABLE_SYMS_DECL (type)) = 1;
420 DECL_IGNORED_P (TYPE_ATABLE_SYMS_DECL (type)) = 1;
421 pushdecl (TYPE_ATABLE_SYMS_DECL (type));
427 push_class (tree class_type, tree class_name)
429 tree decl, signature;
430 location_t saved_loc = input_location;
431 tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
432 CLASS_P (class_type) = 1;
433 input_filename = IDENTIFIER_POINTER (source_name);
435 decl = build_decl (TYPE_DECL, class_name, class_type);
437 /* dbxout needs a DECL_SIZE if in gstabs mode */
438 DECL_SIZE (decl) = integer_zero_node;
440 input_location = saved_loc;
441 signature = identifier_subst (class_name, "L", '.', '/', ";");
442 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
444 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
445 both a typedef and in the struct name-space. We may want to re-visit
446 this later, but for now it reduces the changes needed for gdb. */
447 DECL_ARTIFICIAL (decl) = 1;
449 pushdecl_top_level (decl);
454 /* Finds the (global) class named NAME. Creates the class if not found.
455 Also creates associated TYPE_DECL.
456 Does not check if the class actually exists, load the class,
457 fill in field or methods, or do layout_type. */
460 lookup_class (tree name)
462 tree decl = IDENTIFIER_CLASS_VALUE (name);
463 if (decl == NULL_TREE)
464 decl = push_class (make_class (), name);
465 return TREE_TYPE (decl);
469 set_super_info (int access_flags, tree this_class,
470 tree super_class, int interfaces_count)
472 int total_supers = interfaces_count;
473 tree class_decl = TYPE_NAME (this_class);
478 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
479 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
482 tree super_binfo = make_tree_binfo (0);
483 BINFO_TYPE (super_binfo) = super_class;
484 BINFO_OFFSET (super_binfo) = integer_zero_node;
485 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
486 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
489 set_class_decl_access_flags (access_flags, class_decl);
493 set_class_decl_access_flags (int access_flags, tree class_decl)
495 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
496 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
497 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
498 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
499 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
500 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
501 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
502 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
503 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
506 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
507 direct sub-classes of Object are 1, and so on. */
510 class_depth (tree clas)
513 if (! CLASS_LOADED_P (clas))
514 load_class (clas, 1);
515 if (TYPE_SIZE (clas) == error_mark_node)
517 while (clas != object_type_node)
520 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
525 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
528 interface_of_p (tree type1, tree type2)
531 tree binfo, base_binfo;
533 if (! TYPE_BINFO (type2))
536 for (binfo = TYPE_BINFO (type2), i = 0;
537 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
538 if (BINFO_TYPE (base_binfo) == type1)
541 for (binfo = TYPE_BINFO (type2), i = 0;
542 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
543 if (BINFO_TYPE (base_binfo)
544 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
550 /* Return true iff TYPE1 inherits from TYPE2. */
553 inherits_from_p (tree type1, tree type2)
555 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
559 type1 = CLASSTYPE_SUPER (type1);
564 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
567 enclosing_context_p (tree type1, tree type2)
569 if (!INNER_CLASS_TYPE_P (type2))
572 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
574 type2 = (INNER_CLASS_TYPE_P (type2) ?
575 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
585 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
589 common_enclosing_context_p (tree type1, tree type2)
594 for (current = type2; current;
595 current = (INNER_CLASS_TYPE_P (current) ?
596 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
598 if (type1 == current)
601 if (INNER_CLASS_TYPE_P (type1))
602 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
609 /* Return 1 iff there exists a common enclosing "this" between TYPE1
610 and TYPE2, without crossing any static context. */
613 common_enclosing_instance_p (tree type1, tree type2)
615 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
618 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
619 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
620 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
623 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
624 current = (PURE_INNER_CLASS_TYPE_P (current) ?
625 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
627 if (type1 == current)
633 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
634 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
635 if attempt is made to add it twice. */
638 maybe_add_interface (tree this_class, tree interface_class)
640 tree binfo, base_binfo;
643 for (binfo = TYPE_BINFO (this_class), i = 0;
644 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
645 if (BINFO_TYPE (base_binfo) == interface_class)
646 return interface_class;
647 add_interface (this_class, interface_class);
651 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
654 add_interface (tree this_class, tree interface_class)
656 tree interface_binfo = make_tree_binfo (0);
658 BINFO_TYPE (interface_binfo) = interface_class;
659 BINFO_OFFSET (interface_binfo) = integer_zero_node;
660 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
661 BINFO_VIRTUAL_P (interface_binfo) = 1;
663 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
667 /* Return the address of a pointer to the first FUNCTION_DECL
668 in the list (*LIST) whose DECL_NAME is NAME. */
671 find_named_method (tree *list, tree name)
673 while (*list && DECL_NAME (*list) != name)
674 list = &TREE_CHAIN (*list);
680 build_java_method_type (tree fntype, tree this_class, int access_flags)
682 if (access_flags & ACC_STATIC)
684 return build_method_type (this_class, fntype);
688 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
690 tree method_type, fndecl;
692 method_type = build_java_method_type (function_type,
693 this_class, access_flags);
695 fndecl = build_decl (FUNCTION_DECL, name, method_type);
696 DECL_CONTEXT (fndecl) = this_class;
698 DECL_LANG_SPECIFIC (fndecl)
699 = ggc_alloc_cleared (sizeof (struct lang_decl));
700 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
702 /* Initialize the static initializer test table. */
704 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
705 java_treetreehash_create (10, 1);
707 /* Initialize the initialized (static) class table. */
708 if (access_flags & ACC_STATIC)
709 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
710 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
712 /* Initialize the static method invocation compound list */
713 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = NULL_TREE;
715 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
716 TYPE_METHODS (this_class) = fndecl;
718 /* Notice that this is a finalizer and update the class type
719 accordingly. This is used to optimize instance allocation. */
720 if (name == finalize_identifier_node
721 && TREE_TYPE (function_type) == void_type_node
722 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
723 HAS_FINALIZER_P (this_class) = 1;
725 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
726 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
727 if (access_flags & ACC_PRIVATE)
728 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
729 if (access_flags & ACC_NATIVE)
731 METHOD_NATIVE (fndecl) = 1;
732 DECL_EXTERNAL (fndecl) = 1;
734 if (access_flags & ACC_STATIC)
735 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
736 if (access_flags & ACC_FINAL)
737 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
738 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
739 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
740 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
744 /* Add a method to THIS_CLASS.
745 The method's name is NAME.
746 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
749 add_method (tree this_class, int access_flags, tree name, tree method_sig)
751 tree function_type, fndecl;
752 const unsigned char *sig
753 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
756 fatal_error ("bad method signature");
758 function_type = get_type_from_signature (method_sig);
759 fndecl = add_method_1 (this_class, access_flags, name, function_type);
760 set_java_signature (TREE_TYPE (fndecl), method_sig);
765 add_field (tree class, tree name, tree field_type, int flags)
767 int is_static = (flags & ACC_STATIC) != 0;
769 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
770 TREE_CHAIN (field) = TYPE_FIELDS (class);
771 TYPE_FIELDS (class) = field;
772 DECL_CONTEXT (field) = class;
774 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
775 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
776 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
777 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
778 if (flags & ACC_VOLATILE) FIELD_VOLATILE (field) = 1;
779 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
782 FIELD_STATIC (field) = 1;
783 /* Always make field externally visible. This is required so
784 that native methods can always access the field. */
785 TREE_PUBLIC (field) = 1;
786 /* Considered external until we know what classes are being
787 compiled into this object file. */
788 DECL_EXTERNAL (field) = 1;
794 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
797 set_constant_value (tree field, tree constant)
799 if (field == NULL_TREE)
800 warning ("misplaced ConstantValue attribute (not in any field)");
801 else if (DECL_INITIAL (field) != NULL_TREE)
802 warning ("duplicate ConstantValue attribute for field '%s'",
803 IDENTIFIER_POINTER (DECL_NAME (field)));
806 DECL_INITIAL (field) = constant;
807 if (TREE_TYPE (constant) != TREE_TYPE (field)
808 && ! (TREE_TYPE (constant) == int_type_node
809 && INTEGRAL_TYPE_P (TREE_TYPE (field))
810 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
811 && ! (TREE_TYPE (constant) == utf8const_ptr_type
812 && TREE_TYPE (field) == string_ptr_type_node))
813 error ("ConstantValue attribute of field '%s' has wrong type",
814 IDENTIFIER_POINTER (DECL_NAME (field)));
815 if (FIELD_FINAL (field))
816 DECL_FIELD_FINAL_IUD (field) = 1;
820 /* Count the number of Unicode chars encoded in a given Ut8 string. */
824 strLengthUtf8 (char *str, int len)
826 register unsigned char* ptr = (unsigned char*) str;
827 register unsigned char *limit = ptr + len;
829 for (; ptr < limit; str_length++) {
830 if (UTF8_GET (ptr, limit) < 0)
838 /* Calculate a hash value for a string encoded in Utf8 format.
839 * This returns the same hash value as specified for java.lang.String.hashCode.
843 hashUtf8String (const char *str, int len)
845 const unsigned char* ptr = (const unsigned char*) str;
846 const unsigned char *limit = ptr + len;
850 int ch = UTF8_GET (ptr, limit);
851 /* Updated specification from
852 http://www.javasoft.com/docs/books/jls/clarify.html. */
853 hash = (31 * hash) + ch;
858 static GTY(()) tree utf8_decl_list = NULL_TREE;
861 build_utf8_ref (tree name)
863 const char * name_ptr = IDENTIFIER_POINTER(name);
864 int name_len = IDENTIFIER_LENGTH(name);
866 tree ctype, field = NULL_TREE, str_type, cinit, string;
867 static int utf8_count = 0;
869 tree ref = IDENTIFIER_UTF8_REF (name);
871 if (ref != NULL_TREE)
874 ctype = make_node (RECORD_TYPE);
875 str_type = build_prim_array_type (unsigned_byte_type_node,
876 name_len + 1); /* Allow for final '\0'. */
877 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
878 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
879 PUSH_FIELD (ctype, field, "data", str_type);
880 FINISH_RECORD (ctype);
881 START_RECORD_CONSTRUCTOR (cinit, ctype);
882 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
883 PUSH_FIELD_VALUE (cinit, "hash", build_int_2 (name_hash, 0));
884 PUSH_FIELD_VALUE (cinit, "length", build_int_2 (name_len, 0));
885 string = build_string (name_len, name_ptr);
886 TREE_TYPE (string) = str_type;
887 PUSH_FIELD_VALUE (cinit, "data", string);
888 FINISH_RECORD_CONSTRUCTOR (cinit);
889 TREE_CONSTANT (cinit) = 1;
890 TREE_INVARIANT (cinit) = 1;
892 /* Generate a unique-enough identifier. */
893 sprintf(buf, "_Utf%d", ++utf8_count);
895 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
896 TREE_STATIC (decl) = 1;
897 DECL_ARTIFICIAL (decl) = 1;
898 DECL_IGNORED_P (decl) = 1;
899 TREE_READONLY (decl) = 1;
900 TREE_THIS_VOLATILE (decl) = 0;
901 DECL_INITIAL (decl) = cinit;
903 if (HAVE_GAS_SHF_MERGE)
906 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
907 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
908 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
909 if (flag_merge_constants && decl_size < 256)
912 int flags = (SECTION_OVERRIDE
913 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
914 sprintf (buf, ".rodata.jutf8.%d", decl_size);
915 named_section_flags (buf, flags);
916 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
920 TREE_CHAIN (decl) = utf8_decl_list;
921 layout_decl (decl, 0);
923 rest_of_decl_compilation (decl, global_bindings_p (), 0);
924 utf8_decl_list = decl;
925 make_decl_rtl (decl);
926 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
927 IDENTIFIER_UTF8_REF (name) = ref;
931 /* Like build_class_ref, but instead of a direct reference generate a
932 pointer into the constant pool. */
935 build_indirect_class_ref (tree type)
939 index = alloc_class_constant (type);
940 cl = build_ref_from_constant_pool (index);
941 return convert (promote_type (class_ptr_type), cl);
944 /* Build a reference to the class TYPE.
945 Also handles primitive types and array types. */
948 build_class_ref (tree type)
950 int is_compiled = is_compiled_class (type);
953 tree ref, decl_name, decl;
954 if (TREE_CODE (type) == POINTER_TYPE)
955 type = TREE_TYPE (type);
957 /* FIXME: we really want an indirect reference to our
958 superclass. However, libgcj assumes that a superclass
959 pointer always points directly to a class. As a workaround
960 we always emit this hard superclass reference. */
961 if (flag_indirect_dispatch
962 && type != output_class
963 && type != CLASSTYPE_SUPER (output_class)
964 && TREE_CODE (type) == RECORD_TYPE)
965 return build_indirect_class_ref (type);
967 if (TREE_CODE (type) == RECORD_TYPE)
969 if (TYPE_SIZE (type) == error_mark_node)
970 return null_pointer_node;
971 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
972 "", '/', '/', ".class");
973 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
974 if (decl == NULL_TREE)
976 decl = build_decl (VAR_DECL, decl_name, class_type_node);
977 DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
978 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
979 TREE_STATIC (decl) = 1;
980 TREE_PUBLIC (decl) = 1;
981 DECL_IGNORED_P (decl) = 1;
982 DECL_ARTIFICIAL (decl) = 1;
983 if (is_compiled == 1)
984 DECL_EXTERNAL (decl) = 1;
985 SET_DECL_ASSEMBLER_NAME (decl,
986 java_mangle_class_field
987 (&temporary_obstack, type));
988 make_decl_rtl (decl);
989 pushdecl_top_level (decl);
996 if (flag_emit_class_files)
998 const char *prim_class_name;
1000 if (type == char_type_node)
1001 prim_class_name = "java.lang.Character";
1002 else if (type == boolean_type_node)
1003 prim_class_name = "java.lang.Boolean";
1004 else if (type == byte_type_node)
1005 prim_class_name = "java.lang.Byte";
1006 else if (type == short_type_node)
1007 prim_class_name = "java.lang.Short";
1008 else if (type == int_type_node)
1009 prim_class_name = "java.lang.Integer";
1010 else if (type == long_type_node)
1011 prim_class_name = "java.lang.Long";
1012 else if (type == float_type_node)
1013 prim_class_name = "java.lang.Float";
1014 else if (type == double_type_node)
1015 prim_class_name = "java.lang.Double";
1016 else if (type == void_type_node)
1017 prim_class_name = "java.lang.Void";
1021 prim_class = lookup_class (get_identifier (prim_class_name));
1022 return build3 (COMPONENT_REF, NULL_TREE,
1023 prim_class, TYPE_identifier_node, NULL_TREE);
1025 decl_name = TYPE_NAME (type);
1026 if (TREE_CODE (decl_name) == TYPE_DECL)
1027 decl_name = DECL_NAME (decl_name);
1028 name = IDENTIFIER_POINTER (decl_name);
1029 if (strncmp (name, "promoted_", 9) == 0)
1031 sprintf (buffer, "_Jv_%sClass", name);
1032 decl_name = get_identifier (buffer);
1033 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1034 if (decl == NULL_TREE)
1036 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1037 TREE_STATIC (decl) = 1;
1038 TREE_PUBLIC (decl) = 1;
1039 DECL_EXTERNAL (decl) = 1;
1040 make_decl_rtl (decl);
1041 pushdecl_top_level (decl);
1045 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1049 return build_indirect_class_ref (type);
1053 build_static_field_ref (tree fdecl)
1055 tree fclass = DECL_CONTEXT (fdecl);
1056 int is_compiled = is_compiled_class (fclass);
1058 /* Allow static final fields to fold to a constant. When using
1059 -fno-assume-compiled, gcj will sometimes try to fold a field from
1060 an uncompiled class. This is required when the field in question
1061 meets the appropriate criteria for a compile-time constant.
1062 However, currently sometimes gcj is too eager and will end up
1063 returning the field itself, leading to an incorrect external
1064 reference being generated. */
1066 && (! flag_indirect_dispatch || current_class == fclass))
1067 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1068 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1069 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1070 && TREE_CONSTANT (DECL_INITIAL (fdecl))))
1072 if (!DECL_RTL_SET_P (fdecl))
1074 if (is_compiled == 1)
1075 DECL_EXTERNAL (fdecl) = 1;
1076 make_decl_rtl (fdecl);
1081 if (flag_indirect_dispatch)
1084 = build_int_2 (get_symbol_table_index
1085 (fdecl, &TYPE_ATABLE_METHODS (output_class)), 0);
1087 = build4 (ARRAY_REF, build_pointer_type (TREE_TYPE (fdecl)),
1088 TYPE_ATABLE_DECL (output_class), table_index,
1089 NULL_TREE, NULL_TREE);
1090 return fold (build1 (INDIRECT_REF, TREE_TYPE (fdecl),
1096 * *(FTYPE*)build_class_ref(FCLASS)->fields[INDEX].info.addr */
1097 tree ref = build_class_ref (fclass);
1099 int field_index = 0;
1100 ref = build1 (INDIRECT_REF, class_type_node, ref);
1101 ref = build3 (COMPONENT_REF, field_ptr_type_node, ref,
1102 lookup_field (&class_type_node, fields_ident),
1105 for (fld = TYPE_FIELDS (fclass); ; fld = TREE_CHAIN (fld))
1109 if (fld == NULL_TREE)
1110 fatal_error ("field '%s' not found in class",
1111 IDENTIFIER_POINTER (DECL_NAME (fdecl)));
1112 if (FIELD_STATIC (fld))
1115 field_index *= int_size_in_bytes (field_type_node);
1116 ref = fold (build2 (PLUS_EXPR, field_ptr_type_node,
1117 ref, build_int_2 (field_index, 0)));
1118 ref = build1 (INDIRECT_REF, field_type_node, ref);
1119 ref = build3 (COMPONENT_REF, field_info_union_node,
1120 ref, lookup_field (&field_type_node, info_ident),
1122 ref = build3 (COMPONENT_REF, ptr_type_node,
1123 ref, TREE_CHAIN (TYPE_FIELDS (field_info_union_node)),
1125 ref = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (fdecl)), ref);
1126 return fold (build1 (INDIRECT_REF, TREE_TYPE(fdecl), ref));
1131 get_access_flags_from_decl (tree decl)
1133 int access_flags = 0;
1134 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1136 if (FIELD_STATIC (decl))
1137 access_flags |= ACC_STATIC;
1138 if (FIELD_PUBLIC (decl))
1139 access_flags |= ACC_PUBLIC;
1140 if (FIELD_PROTECTED (decl))
1141 access_flags |= ACC_PROTECTED;
1142 if (FIELD_PRIVATE (decl))
1143 access_flags |= ACC_PRIVATE;
1144 if (FIELD_FINAL (decl))
1145 access_flags |= ACC_FINAL;
1146 if (FIELD_VOLATILE (decl))
1147 access_flags |= ACC_VOLATILE;
1148 if (FIELD_TRANSIENT (decl))
1149 access_flags |= ACC_TRANSIENT;
1150 return access_flags;
1152 if (TREE_CODE (decl) == TYPE_DECL)
1154 if (CLASS_PUBLIC (decl))
1155 access_flags |= ACC_PUBLIC;
1156 if (CLASS_FINAL (decl))
1157 access_flags |= ACC_FINAL;
1158 if (CLASS_SUPER (decl))
1159 access_flags |= ACC_SUPER;
1160 if (CLASS_INTERFACE (decl))
1161 access_flags |= ACC_INTERFACE;
1162 if (CLASS_ABSTRACT (decl))
1163 access_flags |= ACC_ABSTRACT;
1164 if (CLASS_STATIC (decl))
1165 access_flags |= ACC_STATIC;
1166 if (CLASS_PRIVATE (decl))
1167 access_flags |= ACC_PRIVATE;
1168 if (CLASS_PROTECTED (decl))
1169 access_flags |= ACC_PROTECTED;
1170 if (CLASS_STRICTFP (decl))
1171 access_flags |= ACC_STRICT;
1172 return access_flags;
1174 if (TREE_CODE (decl) == FUNCTION_DECL)
1176 if (METHOD_PUBLIC (decl))
1177 access_flags |= ACC_PUBLIC;
1178 if (METHOD_PRIVATE (decl))
1179 access_flags |= ACC_PRIVATE;
1180 if (METHOD_PROTECTED (decl))
1181 access_flags |= ACC_PROTECTED;
1182 if (METHOD_STATIC (decl))
1183 access_flags |= ACC_STATIC;
1184 if (METHOD_FINAL (decl))
1185 access_flags |= ACC_FINAL;
1186 if (METHOD_SYNCHRONIZED (decl))
1187 access_flags |= ACC_SYNCHRONIZED;
1188 if (METHOD_NATIVE (decl))
1189 access_flags |= ACC_NATIVE;
1190 if (METHOD_ABSTRACT (decl))
1191 access_flags |= ACC_ABSTRACT;
1192 if (METHOD_STRICTFP (decl))
1193 access_flags |= ACC_STRICT;
1194 if (METHOD_INVISIBLE (decl))
1195 access_flags |= ACC_INVISIBLE;
1196 return access_flags;
1202 make_field_value (tree fdecl)
1206 tree type = TREE_TYPE (fdecl);
1207 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1209 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1210 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1212 type = build_class_ref (type);
1215 tree signature = build_java_signature (type);
1217 type = build_utf8_ref (unmangle_classname
1218 (IDENTIFIER_POINTER (signature),
1219 IDENTIFIER_LENGTH (signature)));
1221 PUSH_FIELD_VALUE (finit, "type", type);
1223 flags = get_access_flags_from_decl (fdecl);
1225 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1227 PUSH_FIELD_VALUE (finit, "accflags", build_int_2 (flags, 0));
1228 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1232 build_constructor (field_info_union_node,
1234 ((FIELD_STATIC (fdecl)
1235 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1236 : TYPE_FIELDS (field_info_union_node)),
1237 (FIELD_STATIC (fdecl)
1238 ? build_address_of (build_static_field_ref (fdecl))
1239 : byte_position (fdecl)))));
1241 FINISH_RECORD_CONSTRUCTOR (finit);
1246 make_method_value (tree mdecl)
1248 static int method_name_count = 0;
1253 #define ACC_TRANSLATED 0x4000
1254 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1256 class_decl = DECL_CONTEXT (mdecl);
1257 /* For interfaces, the index field contains the dispatch index. */
1258 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1259 index = build_int_2 (get_interface_method_index (mdecl, class_decl), 0);
1260 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1261 index = get_method_index (mdecl);
1263 index = integer_minus_one_node;
1265 code = null_pointer_node;
1266 if (DECL_RTL_SET_P (mdecl))
1267 code = build1 (ADDR_EXPR, nativecode_ptr_type_node, mdecl);
1268 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1269 PUSH_FIELD_VALUE (minit, "name",
1270 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1271 init_identifier_node
1272 : DECL_NAME (mdecl)));
1274 tree signature = build_java_signature (TREE_TYPE (mdecl));
1275 PUSH_FIELD_VALUE (minit, "signature",
1278 (IDENTIFIER_POINTER(signature),
1279 IDENTIFIER_LENGTH(signature)))));
1281 PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0));
1282 PUSH_FIELD_VALUE (minit, "index", index);
1283 PUSH_FIELD_VALUE (minit, "ncode", code);
1286 /* Compute the `throws' information for the method. */
1287 tree table = null_pointer_node;
1288 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1290 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1291 tree iter, type, array;
1294 table = tree_cons (NULL_TREE, table, NULL_TREE);
1295 for (iter = DECL_FUNCTION_THROWS (mdecl);
1297 iter = TREE_CHAIN (iter))
1299 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1301 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1302 IDENTIFIER_LENGTH (sig)));
1303 table = tree_cons (NULL_TREE, utf8, table);
1305 type = build_prim_array_type (ptr_type_node, length);
1306 table = build_constructor (type, table);
1307 /* Compute something unique enough. */
1308 sprintf (buf, "_methods%d", method_name_count++);
1309 array = build_decl (VAR_DECL, get_identifier (buf), type);
1310 DECL_INITIAL (array) = table;
1311 TREE_STATIC (array) = 1;
1312 DECL_ARTIFICIAL (array) = 1;
1313 DECL_IGNORED_P (array) = 1;
1314 rest_of_decl_compilation (array, 1, 0);
1316 table = build1 (ADDR_EXPR, ptr_type_node, array);
1319 PUSH_FIELD_VALUE (minit, "throws", table);
1322 FINISH_RECORD_CONSTRUCTOR (minit);
1327 get_dispatch_vector (tree type)
1329 tree vtable = TYPE_VTABLE (type);
1331 if (vtable == NULL_TREE)
1335 tree super = CLASSTYPE_SUPER (type);
1336 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1337 vtable = make_tree_vec (nvirtuals);
1338 TYPE_VTABLE (type) = vtable;
1339 if (super != NULL_TREE)
1341 tree super_vtable = get_dispatch_vector (super);
1343 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1344 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1347 for (method = TYPE_METHODS (type); method != NULL_TREE;
1348 method = TREE_CHAIN (method))
1350 tree method_index = get_method_index (method);
1351 if (method_index != NULL_TREE
1352 && host_integerp (method_index, 0))
1353 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1361 get_dispatch_table (tree type, tree this_class_addr)
1363 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1364 tree vtable = get_dispatch_vector (type);
1366 tree list = NULL_TREE;
1367 int nvirtuals = TREE_VEC_LENGTH (vtable);
1371 for (i = nvirtuals; --i >= 0; )
1373 tree method = TREE_VEC_ELT (vtable, i);
1374 if (METHOD_ABSTRACT (method))
1377 warning ("%Jabstract method in non-abstract class", method);
1379 if (TARGET_VTABLE_USES_DESCRIPTORS)
1380 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1381 list = tree_cons (NULL_TREE, null_pointer_node, list);
1383 list = tree_cons (NULL_TREE, null_pointer_node, list);
1387 if (!DECL_RTL_SET_P (method))
1388 make_decl_rtl (method);
1390 if (TARGET_VTABLE_USES_DESCRIPTORS)
1391 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1393 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1394 method, build_int_2 (j, 0));
1395 TREE_CONSTANT (fdesc) = 1;
1396 TREE_INVARIANT (fdesc) = 1;
1397 list = tree_cons (NULL_TREE, fdesc, list);
1400 list = tree_cons (NULL_TREE,
1401 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1407 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1408 using the Boehm GC we sometimes stash a GC type descriptor
1409 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1410 the emitted byte count during the output to the assembly file. */
1411 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1412 fake "function descriptor". It's first word is the is the class
1413 pointer, and subsequent words (usually one) contain the GC descriptor.
1414 In all other cases, we reserve two extra vtable slots. */
1415 gc_descr = get_boehm_type_descriptor (type);
1416 list = tree_cons (NULL_TREE, gc_descr, list);
1417 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1418 list = tree_cons (NULL_TREE, gc_descr, list);
1419 list = tree_cons (NULL_TREE, this_class_addr, list);
1421 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1422 list = tree_cons (NULL_TREE, null_pointer_node, list);
1423 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1424 list = tree_cons (integer_zero_node, null_pointer_node, list);
1426 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1427 if (TARGET_VTABLE_USES_DESCRIPTORS)
1428 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1430 return build_constructor (build_prim_array_type (nativecode_ptr_type_node,
1435 /* Set the method_index for a method decl. */
1437 set_method_index (tree decl, tree method_index)
1439 method_index = fold (convert (sizetype, method_index));
1441 if (TARGET_VTABLE_USES_DESCRIPTORS)
1442 /* Add one to skip bogus descriptor for class and GC descriptor. */
1443 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1445 /* Add 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1446 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1448 DECL_VINDEX (decl) = method_index;
1451 /* Get the method_index for a method decl. */
1453 get_method_index (tree decl)
1455 tree method_index = DECL_VINDEX (decl);
1460 if (TARGET_VTABLE_USES_DESCRIPTORS)
1461 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1462 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1464 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1465 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1467 return method_index;
1471 supers_all_compiled (tree type)
1473 while (type != NULL_TREE)
1475 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1477 type = CLASSTYPE_SUPER (type);
1483 make_class_data (tree type)
1485 tree decl, cons, temp;
1486 tree field, fields_decl;
1487 tree static_fields = NULL_TREE;
1488 tree instance_fields = NULL_TREE;
1489 HOST_WIDE_INT static_field_count = 0;
1490 HOST_WIDE_INT instance_field_count = 0;
1491 HOST_WIDE_INT field_count;
1492 tree field_array_type;
1494 tree methods = NULL_TREE;
1495 tree dtable_decl = NULL_TREE;
1496 HOST_WIDE_INT method_count = 0;
1497 tree method_array_type;
1500 tree this_class_addr;
1501 tree constant_pool_constructor;
1502 tree interfaces = null_pointer_node;
1503 int interface_len = 0;
1504 tree type_decl = TYPE_NAME (type);
1505 /** Offset from start of virtual function table declaration
1506 to where objects actually point at, following new g++ ABI. */
1507 tree dtable_start_offset = build_int_2 (2 * POINTER_SIZE / BITS_PER_UNIT, 0);
1509 this_class_addr = build_class_ref (type);
1510 decl = TREE_OPERAND (this_class_addr, 0);
1512 /* Build Field array. */
1513 field = TYPE_FIELDS (type);
1514 if (DECL_NAME (field) == NULL_TREE)
1515 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1516 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1518 if (! DECL_ARTIFICIAL (field))
1520 tree init = make_field_value (field);
1521 if (FIELD_STATIC (field))
1523 tree initial = DECL_INITIAL (field);
1524 static_field_count++;
1525 static_fields = tree_cons (NULL_TREE, init, static_fields);
1526 /* If the initial value is a string constant,
1527 prevent output_constant from trying to assemble the value. */
1528 if (initial != NULL_TREE
1529 && TREE_TYPE (initial) == string_ptr_type_node)
1530 DECL_INITIAL (field) = NULL_TREE;
1531 rest_of_decl_compilation (field, 1, 1);
1532 DECL_INITIAL (field) = initial;
1536 instance_field_count++;
1537 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1541 field_count = static_field_count + instance_field_count;
1542 if (field_count > 0)
1544 static_fields = nreverse (static_fields);
1545 instance_fields = nreverse (instance_fields);
1546 static_fields = chainon (static_fields, instance_fields);
1547 field_array_type = build_prim_array_type (field_type_node, field_count);
1548 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1550 DECL_INITIAL (fields_decl) = build_constructor (field_array_type,
1552 TREE_STATIC (fields_decl) = 1;
1553 DECL_ARTIFICIAL (fields_decl) = 1;
1554 DECL_IGNORED_P (fields_decl) = 1;
1555 rest_of_decl_compilation (fields_decl, 1, 0);
1558 fields_decl = NULL_TREE;
1560 /* Build Method array. */
1561 for (method = TYPE_METHODS (type);
1562 method != NULL_TREE; method = TREE_CHAIN (method))
1565 if (METHOD_PRIVATE (method)
1566 && ! flag_keep_inline_functions
1567 && (flag_inline_functions || optimize))
1569 init = make_method_value (method);
1571 methods = tree_cons (NULL_TREE, init, methods);
1573 method_array_type = build_prim_array_type (method_type_node, method_count);
1574 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1576 DECL_INITIAL (methods_decl) = build_constructor (method_array_type,
1577 nreverse (methods));
1578 TREE_STATIC (methods_decl) = 1;
1579 DECL_ARTIFICIAL (methods_decl) = 1;
1580 DECL_IGNORED_P (methods_decl) = 1;
1581 rest_of_decl_compilation (methods_decl, 1, 0);
1583 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1584 && !flag_indirect_dispatch)
1586 tree dtable = get_dispatch_table (type, this_class_addr);
1587 dtable_decl = build_dtable_decl (type);
1588 DECL_INITIAL (dtable_decl) = dtable;
1589 TREE_STATIC (dtable_decl) = 1;
1590 DECL_ARTIFICIAL (dtable_decl) = 1;
1591 DECL_IGNORED_P (dtable_decl) = 1;
1592 TREE_PUBLIC (dtable_decl) = 1;
1593 rest_of_decl_compilation (dtable_decl, 1, 0);
1594 if (type == class_type_node)
1595 class_dtable_decl = dtable_decl;
1598 if (class_dtable_decl == NULL_TREE)
1600 class_dtable_decl = build_dtable_decl (class_type_node);
1601 TREE_STATIC (class_dtable_decl) = 1;
1602 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1603 DECL_IGNORED_P (class_dtable_decl) = 1;
1604 if (is_compiled_class (class_type_node) != 2)
1605 DECL_EXTERNAL (class_dtable_decl) = 1;
1606 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1609 super = CLASSTYPE_SUPER (type);
1610 if (super == NULL_TREE)
1611 super = null_pointer_node;
1612 else if (/* FIXME: we should also test for (!
1613 flag_indirect_dispatch) here, but libgcj can't cope with
1614 a symbolic reference a superclass in the class data. */
1615 assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1616 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1617 super = build_class_ref (super);
1620 int super_index = alloc_class_constant (super);
1621 super = build_int_2 (super_index, 0);
1622 TREE_TYPE (super) = ptr_type_node;
1625 /* Build and emit the array of implemented interfaces. */
1626 if (type != object_type_node)
1627 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1629 if (interface_len > 0)
1631 tree init = NULL_TREE;
1633 tree interface_array_type, idecl;
1634 interface_array_type
1635 = build_prim_array_type (class_ptr_type, interface_len);
1636 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1637 interface_array_type);
1639 for (i = interface_len; i > 0; i--)
1641 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1642 tree iclass = BINFO_TYPE (child);
1644 if (! flag_indirect_dispatch
1646 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1647 index = build_class_ref (iclass);
1650 int int_index = alloc_class_constant (iclass);
1651 index = build_int_2 (int_index, 0);
1652 TREE_TYPE (index) = ptr_type_node;
1654 init = tree_cons (NULL_TREE, index, init);
1656 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
1657 TREE_STATIC (idecl) = 1;
1658 DECL_ARTIFICIAL (idecl) = 1;
1659 DECL_IGNORED_P (idecl) = 1;
1660 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1661 rest_of_decl_compilation (idecl, 1, 0);
1664 constant_pool_constructor = build_constants_constructor ();
1666 if (flag_indirect_dispatch)
1668 TYPE_OTABLE_DECL (type)
1670 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1671 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1672 TYPE_OTABLE_SYMS_DECL (type), integer_type_node);
1674 TYPE_ATABLE_DECL (type)
1676 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1677 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1678 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node);
1681 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1683 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1684 PUSH_FIELD_VALUE (temp, "vtable",
1685 build2 (PLUS_EXPR, dtable_ptr_type,
1686 build1 (ADDR_EXPR, dtable_ptr_type,
1688 dtable_start_offset));
1689 if (! flag_hash_synchronization)
1690 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1691 FINISH_RECORD_CONSTRUCTOR (temp);
1692 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1693 PUSH_SUPER_VALUE (cons, temp);
1694 PUSH_FIELD_VALUE (cons, "next", null_pointer_node);
1695 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1696 PUSH_FIELD_VALUE (cons, "accflags",
1697 build_int_2 (get_access_flags_from_decl (type_decl), 0));
1699 PUSH_FIELD_VALUE (cons, "superclass",
1700 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1701 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1702 PUSH_FIELD_VALUE (cons, "methods",
1703 build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1704 PUSH_FIELD_VALUE (cons, "method_count", build_int_2 (method_count, 0));
1706 if (flag_indirect_dispatch)
1707 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1709 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1711 PUSH_FIELD_VALUE (cons, "fields",
1712 fields_decl == NULL_TREE ? null_pointer_node
1713 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1714 PUSH_FIELD_VALUE (cons, "size_in_bytes", size_in_bytes (type));
1715 PUSH_FIELD_VALUE (cons, "field_count", build_int_2 (field_count, 0));
1716 PUSH_FIELD_VALUE (cons, "static_field_count",
1717 build_int_2 (static_field_count, 0));
1719 if (flag_indirect_dispatch)
1720 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
1722 PUSH_FIELD_VALUE (cons, "vtable",
1723 dtable_decl == NULL_TREE ? null_pointer_node
1724 : build2 (PLUS_EXPR, dtable_ptr_type,
1725 build1 (ADDR_EXPR, dtable_ptr_type,
1727 dtable_start_offset));
1728 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
1730 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
1731 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
1735 PUSH_FIELD_VALUE (cons, "otable",
1736 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
1737 PUSH_FIELD_VALUE (cons, "otable_syms",
1738 build1 (ADDR_EXPR, symbols_array_ptr_type,
1739 TYPE_OTABLE_SYMS_DECL (type)));
1740 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
1741 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
1743 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
1745 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
1746 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
1750 PUSH_FIELD_VALUE (cons, "atable",
1751 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
1752 PUSH_FIELD_VALUE (cons, "atable_syms",
1753 build1 (ADDR_EXPR, symbols_array_ptr_type,
1754 TYPE_ATABLE_SYMS_DECL (type)));
1755 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
1756 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
1759 PUSH_FIELD_VALUE (cons, "catch_classes",
1760 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
1761 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
1762 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
1763 PUSH_FIELD_VALUE (cons, "interface_count", build_int_2 (interface_len, 0));
1764 PUSH_FIELD_VALUE (cons, "state", integer_zero_node);
1766 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
1767 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
1768 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
1769 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
1770 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
1771 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
1772 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
1773 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
1774 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
1776 FINISH_RECORD_CONSTRUCTOR (cons);
1778 DECL_INITIAL (decl) = cons;
1780 /* Hash synchronization requires at least 64-bit alignment. */
1781 if (flag_hash_synchronization && POINTER_SIZE < 64)
1782 DECL_ALIGN (decl) = 64;
1784 rest_of_decl_compilation (decl, 1, 0);
1790 java_expand_catch_classes (current_class);
1792 current_function_decl = NULL_TREE;
1793 make_class_data (current_class);
1795 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
1798 /* Return 2 if CLASS is compiled by this compilation job;
1799 return 1 if CLASS can otherwise be assumed to be compiled;
1800 return 0 if we cannot assume that CLASS is compiled.
1801 Returns 1 for primitive and 0 for array types. */
1803 is_compiled_class (tree class)
1806 if (TREE_CODE (class) == POINTER_TYPE)
1807 class = TREE_TYPE (class);
1808 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
1810 if (TYPE_ARRAY_P (class))
1812 if (class == current_class)
1815 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
1816 if (CLASS_FROM_CURRENTLY_COMPILED_P (class) || seen_in_zip)
1818 /* The class was seen in the current ZIP file and will be
1819 available as a compiled class in the future but may not have
1820 been loaded already. Load it if necessary. This prevent
1821 build_class_ref () from crashing. */
1823 if (seen_in_zip && !CLASS_LOADED_P (class))
1824 load_class (class, 1);
1826 /* We return 2 for class seen in ZIP and class from files
1827 belonging to the same compilation unit */
1831 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
1833 if (!CLASS_LOADED_P (class))
1835 if (CLASS_FROM_SOURCE_P (class))
1836 safe_layout_class (class);
1838 load_class (class, 1);
1846 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
1849 build_dtable_decl (tree type)
1853 /* We need to build a new dtable type so that its size is uniquely
1854 computed when we're dealing with the class for real and not just
1855 faking it (like java.lang.Class during the initialization of the
1856 compiler.) We know we're not faking a class when CURRENT_CLASS is
1858 if (current_class == type)
1860 tree dummy = NULL_TREE;
1863 dtype = make_node (RECORD_TYPE);
1865 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
1866 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
1868 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
1869 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1871 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1872 TREE_CHAIN (dummy) = tmp_field;
1873 DECL_CONTEXT (tmp_field) = dtype;
1874 DECL_ARTIFICIAL (tmp_field) = 1;
1878 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
1879 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1881 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1882 TREE_CHAIN (dummy) = tmp_field;
1883 DECL_CONTEXT (tmp_field) = dtype;
1884 DECL_ARTIFICIAL (tmp_field) = 1;
1888 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
1889 if (TARGET_VTABLE_USES_DESCRIPTORS)
1890 n *= TARGET_VTABLE_USES_DESCRIPTORS;
1892 PUSH_FIELD (dtype, dummy, "methods",
1893 build_prim_array_type (nativecode_ptr_type_node, n));
1894 layout_type (dtype);
1897 dtype = dtable_type;
1899 return build_decl (VAR_DECL,
1900 java_mangle_vtable (&temporary_obstack, type), dtype);
1903 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
1904 fields inherited from SUPER_CLASS. */
1907 push_super_field (tree this_class, tree super_class)
1910 /* Don't insert the field if we're just re-laying the class out. */
1911 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
1913 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
1914 DECL_IGNORED_P (base_decl) = 1;
1915 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
1916 TYPE_FIELDS (this_class) = base_decl;
1917 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
1918 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
1921 /* Handle the different manners we may have to lay out a super class. */
1924 maybe_layout_super_class (tree super_class, tree this_class)
1926 if (TREE_CODE (super_class) == RECORD_TYPE)
1928 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
1929 safe_layout_class (super_class);
1930 if (!CLASS_LOADED_P (super_class))
1931 load_class (super_class, 1);
1933 /* We might have to layout the class before its dependency on
1934 the super class gets resolved by java_complete_class */
1935 else if (TREE_CODE (super_class) == POINTER_TYPE)
1937 if (TREE_TYPE (super_class) != NULL_TREE)
1938 super_class = TREE_TYPE (super_class);
1941 /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
1943 tree this_wrap = NULL_TREE;
1947 tree this_decl = TYPE_NAME (this_class);
1948 this_wrap = build_expr_wfl (this_class,
1949 DECL_SOURCE_FILE (this_decl),
1950 DECL_SOURCE_LINE (this_decl), 0);
1952 super_class = do_resolve_class (NULL_TREE, /* FIXME? */
1953 super_class, NULL_TREE, this_wrap);
1955 return NULL_TREE; /* FIXME, NULL_TREE not checked by caller. */
1956 super_class = TREE_TYPE (super_class);
1959 if (!TYPE_SIZE (super_class))
1960 safe_layout_class (super_class);
1966 layout_class (tree this_class)
1968 tree super_class = CLASSTYPE_SUPER (this_class);
1971 class_list = tree_cons (this_class, NULL_TREE, class_list);
1972 if (CLASS_BEING_LAIDOUT (this_class))
1978 sprintf (buffer, " with `%s'",
1979 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
1980 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1982 for (current = TREE_CHAIN (class_list); current;
1983 current = TREE_CHAIN (current))
1985 tree decl = TYPE_NAME (TREE_PURPOSE (current));
1986 sprintf (buffer, "\n which inherits from `%s' (%s:%d)",
1987 IDENTIFIER_POINTER (DECL_NAME (decl)),
1988 DECL_SOURCE_FILE (decl),
1989 DECL_SOURCE_LINE (decl));
1990 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1992 obstack_1grow (&temporary_obstack, '\0');
1993 report = obstack_finish (&temporary_obstack);
1994 cyclic_inheritance_report = ggc_strdup (report);
1995 obstack_free (&temporary_obstack, report);
1996 TYPE_SIZE (this_class) = error_mark_node;
1999 CLASS_BEING_LAIDOUT (this_class) = 1;
2001 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2003 tree maybe_super_class
2004 = maybe_layout_super_class (super_class, this_class);
2005 if (maybe_super_class == NULL
2006 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2008 TYPE_SIZE (this_class) = error_mark_node;
2009 CLASS_BEING_LAIDOUT (this_class) = 0;
2010 class_list = TREE_CHAIN (class_list);
2013 if (TYPE_SIZE (this_class) == NULL_TREE)
2014 push_super_field (this_class, maybe_super_class);
2017 for (field = TYPE_FIELDS (this_class);
2018 field != NULL_TREE; field = TREE_CHAIN (field))
2020 if (FIELD_STATIC (field))
2022 /* Set DECL_ASSEMBLER_NAME to something suitably mangled. */
2023 SET_DECL_ASSEMBLER_NAME (field,
2025 (&temporary_obstack, field));
2029 layout_type (this_class);
2031 /* Also recursively load/layout any superinterfaces, but only if
2032 class was loaded from bytecode. The source parser will take care
2034 if (!CLASS_FROM_SOURCE_P (this_class))
2038 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2040 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2041 tree super_interface = BINFO_TYPE (binfo);
2042 tree maybe_super_interface
2043 = maybe_layout_super_class (super_interface, NULL_TREE);
2044 if (maybe_super_interface == NULL
2045 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2047 TYPE_SIZE (this_class) = error_mark_node;
2048 CLASS_BEING_LAIDOUT (this_class) = 0;
2049 class_list = TREE_CHAIN (class_list);
2055 /* Convert the size back to an SI integer value. */
2056 TYPE_SIZE_UNIT (this_class) =
2057 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2059 CLASS_BEING_LAIDOUT (this_class) = 0;
2060 class_list = TREE_CHAIN (class_list);
2064 add_miranda_methods (tree base_class, tree search_class)
2066 tree binfo, base_binfo;
2069 for (binfo = TYPE_BINFO (search_class), i = 1;
2070 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2073 tree elt = BINFO_TYPE (base_binfo);
2075 /* Ensure that interface methods are seen in declared order. */
2076 layout_class_methods (elt);
2078 /* All base classes will have been laid out at this point, so the order
2079 will be correct. This code must match similar layout code in the
2081 for (method_decl = TYPE_METHODS (elt);
2082 method_decl; method_decl = TREE_CHAIN (method_decl))
2086 /* An interface can have <clinit>. */
2087 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2090 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2091 override = lookup_argument_method (base_class,
2092 DECL_NAME (method_decl), sig);
2093 if (override == NULL_TREE)
2095 /* Found a Miranda method. Add it. */
2097 sig = build_java_signature (TREE_TYPE (method_decl));
2099 = add_method (base_class,
2100 get_access_flags_from_decl (method_decl),
2101 DECL_NAME (method_decl), sig);
2102 METHOD_INVISIBLE (new_method) = 1;
2106 /* Try superinterfaces. */
2107 add_miranda_methods (base_class, elt);
2112 layout_class_methods (tree this_class)
2114 tree method_decl, dtable_count;
2115 tree super_class, type_name;
2117 if (TYPE_NVIRTUALS (this_class))
2120 super_class = CLASSTYPE_SUPER (this_class);
2124 super_class = maybe_layout_super_class (super_class, this_class);
2125 if (!TYPE_NVIRTUALS (super_class))
2126 layout_class_methods (super_class);
2127 dtable_count = TYPE_NVIRTUALS (super_class);
2130 dtable_count = integer_zero_node;
2132 type_name = TYPE_NAME (this_class);
2133 if (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name))
2135 /* An abstract class can have methods which are declared only in
2136 an implemented interface. These are called "Miranda
2137 methods". We make a dummy method entry for such methods
2139 add_miranda_methods (this_class, this_class);
2142 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2144 for (method_decl = TYPE_METHODS (this_class);
2145 method_decl; method_decl = TREE_CHAIN (method_decl))
2146 dtable_count = layout_class_method (this_class, super_class,
2147 method_decl, dtable_count);
2149 TYPE_NVIRTUALS (this_class) = dtable_count;
2152 /* Return the index of METHOD in INTERFACE. This index begins at 1 and is used as an
2153 argument for _Jv_LookupInterfaceMethodIdx(). */
2155 get_interface_method_index (tree method, tree interface)
2160 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++)
2164 if (meth == NULL_TREE)
2169 /* Lay METHOD_DECL out, returning a possibly new value of
2170 DTABLE_COUNT. Also mangle the method's name. */
2173 layout_class_method (tree this_class, tree super_class,
2174 tree method_decl, tree dtable_count)
2176 tree method_name = DECL_NAME (method_decl);
2178 TREE_PUBLIC (method_decl) = 1;
2179 /* Considered external until we know what classes are being
2180 compiled into this object file. */
2181 DECL_EXTERNAL (method_decl) = 1;
2183 /* This is a good occasion to mangle the method's name */
2184 SET_DECL_ASSEMBLER_NAME (method_decl,
2185 java_mangle_decl (&temporary_obstack,
2187 /* We don't generate a RTL for the method if it's abstract, or if
2188 it's an interface method that isn't clinit. */
2189 if (! METHOD_ABSTRACT (method_decl)
2190 || (CLASS_INTERFACE (TYPE_NAME (this_class))
2191 && (DECL_CLINIT_P (method_decl))))
2192 make_decl_rtl (method_decl);
2194 if (ID_INIT_P (method_name))
2196 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2198 for (ptr = p; *ptr; )
2203 DECL_CONSTRUCTOR_P (method_decl) = 1;
2204 build_java_argument_signature (TREE_TYPE (method_decl));
2206 else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl))
2209 build_java_argument_signature (TREE_TYPE (method_decl));
2210 bool method_override = false;
2211 tree super_method = lookup_argument_method (super_class, method_name,
2213 if (super_method != NULL_TREE)
2215 method_override = true;
2216 if (! METHOD_PUBLIC (super_method) &&
2217 ! METHOD_PROTECTED (super_method))
2219 /* Don't override private method, or default-access method in
2221 if (METHOD_PRIVATE (super_method) ||
2222 ! in_same_package (TYPE_NAME (this_class),
2223 TYPE_NAME (super_class)))
2224 method_override = false;
2227 if (method_override)
2229 tree method_index = get_method_index (super_method);
2230 set_method_index (method_decl, method_index);
2231 if (method_index == NULL_TREE
2232 && !CLASS_FROM_SOURCE_P (this_class))
2233 error ("%Jnon-static method '%D' overrides static method",
2234 method_decl, method_decl);
2236 else if (! METHOD_FINAL (method_decl)
2237 && ! METHOD_PRIVATE (method_decl)
2238 && ! CLASS_FINAL (TYPE_NAME (this_class))
2241 set_method_index (method_decl, dtable_count);
2242 dtable_count = fold (build2 (PLUS_EXPR, integer_type_node,
2243 dtable_count, integer_one_node));
2247 return dtable_count;
2251 register_class (void)
2253 /* END does not need to be registered with the garbage collector
2254 because it always points into the list given by REGISTERED_CLASS,
2255 and that variable is registered with the collector. */
2257 tree node = TREE_OPERAND (build_class_ref (current_class), 0);
2258 tree current = copy_node (node);
2260 XEXP (DECL_RTL (current), 0) = copy_rtx (XEXP (DECL_RTL(node), 0));
2261 if (!registered_class)
2262 registered_class = current;
2264 TREE_CHAIN (end) = current;
2269 /* Emit something to register classes at start-up time.
2271 The preferred mechanism is through the .jcr section, which contain
2272 a list of pointers to classes which get registered during constructor
2275 The fallback mechanism is to add statements to *LIST_P to call
2276 _Jv_RegisterClass for each class in this file. These statements will
2277 be added to a static constructor function for this translation unit. */
2280 emit_register_classes (tree *list_p)
2282 if (registered_class == NULL)
2285 /* ??? This isn't quite the correct test. We also have to know
2286 that the target is using gcc's crtbegin/crtend objects rather
2287 than the ones that come with the operating system. */
2288 if (SUPPORTS_WEAK && targetm.have_named_sections)
2290 #ifdef JCR_SECTION_NAME
2292 named_section_flags (JCR_SECTION_NAME, SECTION_WRITE);
2293 assemble_align (POINTER_SIZE);
2294 for (t = registered_class; t; t = TREE_CHAIN (t))
2295 assemble_integer (XEXP (DECL_RTL (t), 0),
2296 POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2303 tree klass, t, register_class_fn;
2305 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2306 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2307 TREE_PUBLIC (t) = 1;
2308 DECL_EXTERNAL (t) = 1;
2309 register_class_fn = t;
2311 for (klass = registered_class; klass; klass = TREE_CHAIN (klass))
2313 t = build_fold_addr_expr (klass);
2314 t = tree_cons (NULL, t, NULL);
2315 t = build_function_call_expr (register_class_fn, t);
2316 append_to_statement_list (t, list_p);
2321 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2324 build_symbol_entry (tree decl)
2326 tree clname, name, signature, sym;
2328 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2329 name = build_utf8_ref (DECL_NAME (decl));
2330 signature = build_java_signature (TREE_TYPE (decl));
2331 signature = build_utf8_ref (unmangle_classname
2332 (IDENTIFIER_POINTER (signature),
2333 IDENTIFIER_LENGTH (signature)));
2335 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2336 PUSH_FIELD_VALUE (sym, "clname", clname);
2337 PUSH_FIELD_VALUE (sym, "name", name);
2338 PUSH_FIELD_VALUE (sym, "signature", signature);
2339 FINISH_RECORD_CONSTRUCTOR (sym);
2340 TREE_CONSTANT (sym) = 1;
2341 TREE_INVARIANT (sym) = 1;
2346 /* Emit a symbol table: used by -findirect-dispatch. */
2349 emit_symbol_table (tree name, tree the_table, tree decl_list,
2350 tree the_syms_decl, tree the_array_element_type)
2352 tree method_list, method, table, list, null_symbol;
2353 tree table_size, the_array_type;
2356 /* Only emit a table if this translation unit actually made any
2357 references via it. */
2358 if (decl_list == NULL_TREE)
2361 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2363 method_list = decl_list;
2365 while (method_list != NULL_TREE)
2367 method = TREE_VALUE (method_list);
2368 list = tree_cons (NULL_TREE, build_symbol_entry (method), list);
2369 method_list = TREE_CHAIN (method_list);
2373 /* Terminate the list with a "null" entry. */
2374 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2375 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2376 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2377 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2378 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2379 TREE_CONSTANT (null_symbol) = 1;
2380 TREE_INVARIANT (null_symbol) = 1;
2381 list = tree_cons (NULL_TREE, null_symbol, list);
2383 /* Put the list in the right order and make it a constructor. */
2384 list = nreverse (list);
2385 table = build_constructor (symbols_array_type, list);
2387 /* Make it the initial value for otable_syms and emit the decl. */
2388 DECL_INITIAL (the_syms_decl) = table;
2389 DECL_ARTIFICIAL (the_syms_decl) = 1;
2390 DECL_IGNORED_P (the_syms_decl) = 1;
2391 rest_of_decl_compilation (the_syms_decl, 1, 0);
2393 /* Now that its size is known, redefine the table as an
2394 uninitialized static array of INDEX + 1 elements. The extra entry
2395 is used by the runtime to track whether the table has been
2397 table_size = build_index_type (build_int_2 (index, 0));
2398 the_array_type = build_array_type (the_array_element_type, table_size);
2399 the_table = build_decl (VAR_DECL, name, the_array_type);
2400 TREE_STATIC (the_table) = 1;
2401 TREE_READONLY (the_table) = 1;
2402 rest_of_decl_compilation (the_table, 1, 0);
2407 /* make an entry for the catch_classes list. */
2409 make_catch_class_record (tree catch_class, tree classname)
2412 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2413 START_RECORD_CONSTRUCTOR (entry, type);
2414 PUSH_FIELD_VALUE (entry, "address", catch_class);
2415 PUSH_FIELD_VALUE (entry, "classname", classname);
2416 FINISH_RECORD_CONSTRUCTOR (entry);
2421 /* Generate the list of Throwable classes that are caught by exception
2422 handlers in this class. */
2424 emit_catch_table (tree this_class)
2426 tree table, table_size, array_type;
2427 TYPE_CATCH_CLASSES (this_class) =
2429 make_catch_class_record (null_pointer_node, null_pointer_node),
2430 TYPE_CATCH_CLASSES (this_class));
2431 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2432 TYPE_CATCH_CLASSES (this_class) =
2434 make_catch_class_record (null_pointer_node, null_pointer_node),
2435 TYPE_CATCH_CLASSES (this_class));
2437 build_index_type (build_int_2
2438 (list_length (TYPE_CATCH_CLASSES (this_class)), 0));
2440 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2443 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2444 DECL_INITIAL (table) =
2445 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
2446 TREE_STATIC (table) = 1;
2447 TREE_READONLY (table) = 1;
2448 DECL_IGNORED_P (table) = 1;
2449 rest_of_decl_compilation (table, 1, 0);
2455 init_class_processing (void)
2457 fields_ident = get_identifier ("fields");
2458 info_ident = get_identifier ("info");
2460 gcc_obstack_init (&temporary_obstack);
2463 static hashval_t java_treetreehash_hash (const void *);
2464 static int java_treetreehash_compare (const void *, const void *);
2466 /* A hash table mapping trees to trees. Used generally. */
2468 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
2471 java_treetreehash_hash (const void *k_p)
2473 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
2474 return JAVA_TREEHASHHASH_H (k->key);
2478 java_treetreehash_compare (const void * k1_p, const void * k2_p)
2480 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
2481 tree k2 = (tree) k2_p;
2482 return (k1->key == k2);
2486 java_treetreehash_find (htab_t ht, tree t)
2488 struct treetreehash_entry *e;
2489 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2490 e = htab_find_with_hash (ht, t, hv);
2498 java_treetreehash_new (htab_t ht, tree t)
2501 struct treetreehash_entry *tthe;
2502 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2504 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
2507 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
2512 tthe = (struct treetreehash_entry *) *e;
2513 return &tthe->value;
2517 java_treetreehash_create (size_t size, int gc)
2520 return htab_create_ggc (size, java_treetreehash_hash,
2521 java_treetreehash_compare, NULL);
2523 return htab_create_alloc (size, java_treetreehash_hash,
2524 java_treetreehash_compare, free, xcalloc, free);
2527 /* Break down qualified IDENTIFIER into package and class-name components.
2528 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
2529 "pkg.foo", and RIGHT to "Bar". */
2532 split_qualified_name (tree *left, tree *right, tree source)
2535 int l = IDENTIFIER_LENGTH (source);
2537 base = alloca (l + 1);
2538 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
2540 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
2542 while (*p != '.' && p != base)
2545 /* We didn't find a '.'. Return an error. */
2551 *right = get_identifier (p+1);
2552 *left = get_identifier (base);
2557 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
2558 if the classes are from the same package. */
2561 in_same_package (tree name1, tree name2)
2567 if (TREE_CODE (name1) == TYPE_DECL)
2568 name1 = DECL_NAME (name1);
2569 if (TREE_CODE (name2) == TYPE_DECL)
2570 name2 = DECL_NAME (name2);
2572 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
2573 /* One in empty package. */
2576 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
2577 /* Both in empty package. */
2580 split_qualified_name (&pkg1, &tmp, name1);
2581 split_qualified_name (&pkg2, &tmp, name2);
2583 return (pkg1 == pkg2);
2586 #include "gt-java-class.h"