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 void add_interface_do (tree, tree, int);
61 static tree maybe_layout_super_class (tree, tree);
62 static void add_miranda_methods (tree, tree);
63 static int assume_compiled (const char *);
64 static tree build_symbol_entry (tree);
66 struct obstack temporary_obstack;
68 /* The compiler generates different code depending on whether or not
69 it can assume certain classes have been compiled down to native
70 code or not. The compiler options -fassume-compiled= and
71 -fno-assume-compiled= are used to create a tree of
72 class_flag_node objects. This tree is queried to determine if
73 a class is assume to be compiled or not. Each node in the tree
74 represents either a package or a specific class. */
76 typedef struct class_flag_node_struct
78 /* The class or package name. */
81 /* Nonzero if this represents an exclusion. */
84 /* Pointers to other nodes in the tree. */
85 struct class_flag_node_struct *parent;
86 struct class_flag_node_struct *sibling;
87 struct class_flag_node_struct *child;
90 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
91 static void add_class_flag (class_flag_node **, const char *, int);
93 /* This is the root of the include/exclude tree. */
95 static class_flag_node *assume_compiled_tree;
97 static class_flag_node *enable_assert_tree;
99 static GTY(()) tree class_roots[5];
100 #define registered_class class_roots[0]
101 #define fields_ident class_roots[1] /* get_identifier ("fields") */
102 #define info_ident class_roots[2] /* get_identifier ("info") */
103 #define class_list class_roots[3]
104 #define class_dtable_decl class_roots[4]
106 /* Return the node that most closely represents the class whose name
107 is IDENT. Start the search from NODE (followed by its siblings).
108 Return NULL if an appropriate node does not exist. */
110 static class_flag_node *
111 find_class_flag_node (class_flag_node *node, const char *ident)
115 size_t node_ident_length = strlen (node->ident);
117 /* node_ident_length is zero at the root of the tree. If the
118 identifiers are the same length, then we have matching
119 classes. Otherwise check if we've matched an enclosing
122 if (node_ident_length == 0
123 || (strncmp (ident, node->ident, node_ident_length) == 0
124 && (ident[node_ident_length] == '\0'
125 || ident[node_ident_length] == '.')))
127 /* We've found a match, however, there might be a more
130 class_flag_node *found = find_class_flag_node (node->child, ident);
137 /* No match yet. Continue through the sibling list. */
138 node = node->sibling;
141 /* No match at all in this tree. */
146 add_class_flag (class_flag_node **rootp, const char *ident, int value)
148 class_flag_node *root = *rootp;
149 class_flag_node *parent, *node;
151 /* Create the root of the tree if it doesn't exist yet. */
155 root = xmalloc (sizeof (class_flag_node));
158 root->sibling = NULL;
164 /* Calling the function with the empty string means we're setting
165 value for the root of the hierarchy. */
173 /* Find the parent node for this new node. PARENT will either be a
174 class or a package name. Adjust PARENT accordingly. */
176 parent = find_class_flag_node (root, ident);
177 if (strcmp (ident, parent->ident) == 0)
178 parent->value = value;
181 /* Insert new node into the tree. */
182 node = xmalloc (sizeof (class_flag_node));
184 node->ident = xstrdup (ident);
188 node->parent = parent;
189 node->sibling = parent->child;
190 parent->child = node;
194 /* Add a new IDENT to the include/exclude tree. It's an exclusion
195 if EXCLUDEP is nonzero. */
198 add_assume_compiled (const char *ident, int excludep)
200 add_class_flag (&assume_compiled_tree, ident, excludep);
203 /* The default value returned by enable_assertions. */
205 #define DEFAULT_ENABLE_ASSERT (flag_emit_class_files || optimize == 0)
207 /* Enter IDENT (a class or package name) into the enable-assertions table.
208 VALUE is true to enable and false to disable. */
211 add_enable_assert (const char *ident, int value)
213 if (enable_assert_tree == NULL)
214 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
215 add_class_flag (&enable_assert_tree, ident, value);
218 /* Returns nonzero if IDENT is the name of a class that the compiler
219 should assume has been compiled to object code. */
222 assume_compiled (const char *ident)
227 if (NULL == assume_compiled_tree)
230 i = find_class_flag_node (assume_compiled_tree, ident);
237 /* Return true if we should generate code to check assertions within KLASS. */
240 enable_assertions (tree klass)
242 /* Check if command-line specifies whether we should check assertions. */
244 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
246 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
247 class_flag_node *node
248 = find_class_flag_node (enable_assert_tree, ident);
252 /* The default is to enable assertions if generating class files,
253 or not optimizing. */
254 return DEFAULT_ENABLE_ASSERT;
257 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
258 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
259 Also, PREFIX is prepended, and SUFFIX is appended. */
262 ident_subst (const char* old_name,
269 int prefix_len = strlen (prefix);
270 int suffix_len = strlen (suffix);
271 int i = prefix_len + old_length + suffix_len + 1;
275 char *buffer = alloca (i);
277 strcpy (buffer, prefix);
278 for (i = 0; i < old_length; i++)
280 char ch = old_name[i];
283 buffer[prefix_len + i] = ch;
285 strcpy (buffer + prefix_len + old_length, suffix);
286 return get_identifier (buffer);
289 /* Return an IDENTIFIER_NODE the same as OLD_ID,
290 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
291 Also, PREFIX is prepended, and SUFFIX is appended. */
294 identifier_subst (const tree old_id,
300 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
301 prefix, old_char, new_char, suffix);
304 /* Generate a valid C identifier from the name of the class TYPE,
305 prefixed by PREFIX. */
308 mangled_classname (const char *prefix, tree type)
310 tree ident = TYPE_NAME (type);
311 if (TREE_CODE (ident) != IDENTIFIER_NODE)
312 ident = DECL_NAME (ident);
313 return identifier_subst (ident, prefix, '.', '_', "");
320 type = make_node (RECORD_TYPE);
321 TYPE_BINFO (type) = make_tree_binfo (0);
322 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
327 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
328 and where each of the constituents is separated by '/',
329 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
332 unmangle_classname (const char *name, int name_length)
334 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
335 /* It's not sufficient to compare to_return and get_identifier
336 (name) to determine whether to_return is qualified. There are
337 cases in signature analysis where name will be stripped of a
339 name = IDENTIFIER_POINTER (to_return);
343 QUALIFIED_P (to_return) = 1;
351 /* Given a class, create the DECLs for all its associated indirect
354 gen_indirect_dispatch_tables (tree type)
356 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
359 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
360 tree catch_class_type = make_node (RECORD_TYPE);
362 sprintf (buf, "_catch_classes_%s", typename);
363 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
364 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
365 FINISH_RECORD (catch_class_type);
367 TYPE_CTABLE_DECL (type)
368 = build_decl (VAR_DECL, get_identifier (buf),
369 build_array_type (catch_class_type, 0));
370 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
371 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
372 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
373 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
374 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
375 pushdecl (TYPE_CTABLE_DECL (type));
378 if (flag_indirect_dispatch)
381 char *buf = alloca (strlen (typename) + strlen ("_otable_syms_") + 1);
383 sprintf (buf, "_otable_%s", typename);
384 TYPE_OTABLE_DECL (type) =
385 build_decl (VAR_DECL, get_identifier (buf), otable_type);
386 DECL_EXTERNAL (TYPE_OTABLE_DECL (type)) = 1;
387 TREE_STATIC (TYPE_OTABLE_DECL (type)) = 1;
388 TREE_READONLY (TYPE_OTABLE_DECL (type)) = 1;
389 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
390 DECL_IGNORED_P (TYPE_OTABLE_DECL (type)) = 1;
391 pushdecl (TYPE_OTABLE_DECL (type));
392 sprintf (buf, "_otable_syms_%s", typename);
393 TYPE_OTABLE_SYMS_DECL (type) =
394 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type);
395 TREE_STATIC (TYPE_OTABLE_SYMS_DECL (type)) = 1;
396 TREE_CONSTANT (TYPE_OTABLE_SYMS_DECL (type)) = 1;
397 DECL_IGNORED_P(TYPE_OTABLE_SYMS_DECL (type)) = 1;
398 pushdecl (TYPE_OTABLE_SYMS_DECL (type));
402 char *buf = alloca (strlen (typename) + strlen ("_atable_syms_") + 1);
405 sprintf (buf, "_atable_%s", typename);
406 TYPE_ATABLE_DECL (type) = decl =
407 build_decl (VAR_DECL, get_identifier (buf), atable_type);
408 DECL_EXTERNAL (decl) = 1;
409 TREE_STATIC (decl) = 1;
410 TREE_READONLY (decl) = 1;
411 TREE_CONSTANT (decl) = 1;
412 DECL_IGNORED_P (decl) = 1;
413 /* Mark the atable as belonging to this class. */
415 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
416 DECL_OWNER (decl) = type;
417 sprintf (buf, "_atable_syms_%s", typename);
418 TYPE_ATABLE_SYMS_DECL (type) =
419 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type);
420 TREE_STATIC (TYPE_ATABLE_SYMS_DECL (type)) = 1;
421 TREE_CONSTANT (TYPE_ATABLE_SYMS_DECL (type)) = 1;
422 DECL_IGNORED_P (TYPE_ATABLE_SYMS_DECL (type)) = 1;
423 pushdecl (TYPE_ATABLE_SYMS_DECL (type));
429 push_class (tree class_type, tree class_name)
431 tree decl, signature;
432 location_t saved_loc = input_location;
433 tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
434 CLASS_P (class_type) = 1;
435 input_filename = IDENTIFIER_POINTER (source_name);
437 decl = build_decl (TYPE_DECL, class_name, class_type);
439 /* dbxout needs a DECL_SIZE if in gstabs mode */
440 DECL_SIZE (decl) = integer_zero_node;
442 input_location = saved_loc;
443 signature = identifier_subst (class_name, "L", '.', '/', ";");
444 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
446 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
447 both a typedef and in the struct name-space. We may want to re-visit
448 this later, but for now it reduces the changes needed for gdb. */
449 DECL_ARTIFICIAL (decl) = 1;
451 pushdecl_top_level (decl);
456 /* Finds the (global) class named NAME. Creates the class if not found.
457 Also creates associated TYPE_DECL.
458 Does not check if the class actually exists, load the class,
459 fill in field or methods, or do layout_type. */
462 lookup_class (tree name)
464 tree decl = IDENTIFIER_CLASS_VALUE (name);
465 if (decl == NULL_TREE)
466 decl = push_class (make_class (), name);
467 return TREE_TYPE (decl);
471 set_super_info (int access_flags, tree this_class,
472 tree super_class, int interfaces_count)
474 int total_supers = interfaces_count;
475 tree class_decl = TYPE_NAME (this_class);
479 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
480 BINFO_BASE_BINFOS (TYPE_BINFO (this_class)) = make_tree_vec (total_supers);
483 tree super_binfo = make_tree_binfo (0);
484 BINFO_TYPE (super_binfo) = super_class;
485 BINFO_OFFSET (super_binfo) = integer_zero_node;
486 TREE_VEC_ELT (BINFO_BASE_BINFOS (TYPE_BINFO (this_class)), 0)
488 CLASS_HAS_SUPER (this_class) = 1;
491 set_class_decl_access_flags (access_flags, class_decl);
495 set_class_decl_access_flags (int access_flags, tree class_decl)
497 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
498 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
499 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
500 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
501 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
502 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
503 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
504 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
505 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
508 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
509 direct sub-classes of Object are 1, and so on. */
512 class_depth (tree clas)
515 if (! CLASS_LOADED_P (clas))
516 load_class (clas, 1);
517 if (TYPE_SIZE (clas) == error_mark_node)
519 while (clas != object_type_node)
522 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
527 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
530 interface_of_p (tree type1, tree type2)
535 if (!(basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (type2))))
537 n = TREE_VEC_LENGTH (basetype_vec);
538 for (i = 0; i < n; i++)
540 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
541 if (vec_elt && BINFO_TYPE (vec_elt) == type1)
544 for (i = 0; i < n; i++)
546 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
547 if (vec_elt && BINFO_TYPE (vec_elt)
548 && interface_of_p (type1, BINFO_TYPE (vec_elt)))
554 /* Return true iff TYPE1 inherits from TYPE2. */
557 inherits_from_p (tree type1, tree type2)
559 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
563 type1 = CLASSTYPE_SUPER (type1);
568 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
571 enclosing_context_p (tree type1, tree type2)
573 if (!INNER_CLASS_TYPE_P (type2))
576 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
578 type2 = (INNER_CLASS_TYPE_P (type2) ?
579 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
588 /* Return 1 iff there exists a common enclosing context between TYPE1
592 common_enclosing_context_p (tree type1, tree type2)
594 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
597 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
598 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
599 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
602 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
603 current = (PURE_INNER_CLASS_TYPE_P (current) ?
604 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
606 if (type1 == current)
613 add_interface_do (tree basetype_vec, tree interface_class, int i)
615 tree interface_binfo = make_tree_binfo (0);
616 BINFO_TYPE (interface_binfo) = interface_class;
617 BINFO_OFFSET (interface_binfo) = integer_zero_node;
618 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
619 BINFO_VIRTUAL_P (interface_binfo) = 1;
620 TREE_VEC_ELT (basetype_vec, i) = interface_binfo;
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 basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (this_class));
632 int n = TREE_VEC_LENGTH (basetype_vec);
637 error ("internal error - too many interface type");
640 else if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
642 else if (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)) == interface_class)
643 return interface_class;
645 add_interface_do (basetype_vec, interface_class, i);
649 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
652 add_interface (tree this_class, tree interface_class)
654 tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (this_class));
656 int n = TREE_VEC_LENGTH (basetype_vec);
661 error ("internal error - too many interface type");
664 else if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
667 add_interface_do (basetype_vec, interface_class, i);
671 /* Return the address of a pointer to the first FUNCTION_DECL
672 in the list (*LIST) whose DECL_NAME is NAME. */
675 find_named_method (tree *list, tree name)
677 while (*list && DECL_NAME (*list) != name)
678 list = &TREE_CHAIN (*list);
684 build_java_method_type (tree fntype, tree this_class, int access_flags)
686 if (access_flags & ACC_STATIC)
688 return build_method_type (this_class, fntype);
692 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
694 tree method_type, fndecl;
696 method_type = build_java_method_type (function_type,
697 this_class, access_flags);
699 fndecl = build_decl (FUNCTION_DECL, name, method_type);
700 DECL_CONTEXT (fndecl) = this_class;
702 DECL_LANG_SPECIFIC (fndecl)
703 = ggc_alloc_cleared (sizeof (struct lang_decl));
704 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
706 /* Initialize the static initializer test table. */
708 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
709 java_treetreehash_create (10, 1);
711 /* Initialize the initialized (static) class table. */
712 if (access_flags & ACC_STATIC)
713 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
714 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
716 /* Initialize the static method invocation compound list */
717 DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = NULL_TREE;
719 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
720 TYPE_METHODS (this_class) = fndecl;
722 /* Notice that this is a finalizer and update the class type
723 accordingly. This is used to optimize instance allocation. */
724 if (name == finalize_identifier_node
725 && TREE_TYPE (function_type) == void_type_node
726 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
727 HAS_FINALIZER_P (this_class) = 1;
729 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
730 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
731 if (access_flags & ACC_PRIVATE)
732 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
733 if (access_flags & ACC_NATIVE)
735 METHOD_NATIVE (fndecl) = 1;
736 DECL_EXTERNAL (fndecl) = 1;
738 if (access_flags & ACC_STATIC)
739 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
740 if (access_flags & ACC_FINAL)
741 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
742 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
743 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
744 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
748 /* Add a method to THIS_CLASS.
749 The method's name is NAME.
750 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
753 add_method (tree this_class, int access_flags, tree name, tree method_sig)
755 tree function_type, fndecl;
756 const unsigned char *sig
757 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
760 fatal_error ("bad method signature");
762 function_type = get_type_from_signature (method_sig);
763 fndecl = add_method_1 (this_class, access_flags, name, function_type);
764 set_java_signature (TREE_TYPE (fndecl), method_sig);
769 add_field (tree class, tree name, tree field_type, int flags)
771 int is_static = (flags & ACC_STATIC) != 0;
773 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
774 TREE_CHAIN (field) = TYPE_FIELDS (class);
775 TYPE_FIELDS (class) = field;
776 DECL_CONTEXT (field) = class;
778 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
779 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
780 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
781 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
782 if (flags & ACC_VOLATILE) FIELD_VOLATILE (field) = 1;
783 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
786 FIELD_STATIC (field) = 1;
787 /* Always make field externally visible. This is required so
788 that native methods can always access the field. */
789 TREE_PUBLIC (field) = 1;
790 /* Considered external until we know what classes are being
791 compiled into this object file. */
792 DECL_EXTERNAL (field) = 1;
798 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
801 set_constant_value (tree field, tree constant)
803 if (field == NULL_TREE)
804 warning ("misplaced ConstantValue attribute (not in any field)");
805 else if (DECL_INITIAL (field) != NULL_TREE)
806 warning ("duplicate ConstantValue attribute for field '%s'",
807 IDENTIFIER_POINTER (DECL_NAME (field)));
810 DECL_INITIAL (field) = constant;
811 if (TREE_TYPE (constant) != TREE_TYPE (field)
812 && ! (TREE_TYPE (constant) == int_type_node
813 && INTEGRAL_TYPE_P (TREE_TYPE (field))
814 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
815 && ! (TREE_TYPE (constant) == utf8const_ptr_type
816 && TREE_TYPE (field) == string_ptr_type_node))
817 error ("ConstantValue attribute of field '%s' has wrong type",
818 IDENTIFIER_POINTER (DECL_NAME (field)));
819 if (FIELD_FINAL (field))
820 DECL_FIELD_FINAL_IUD (field) = 1;
824 /* Count the number of Unicode chars encoded in a given Ut8 string. */
828 strLengthUtf8 (char *str, int len)
830 register unsigned char* ptr = (unsigned char*) str;
831 register unsigned char *limit = ptr + len;
833 for (; ptr < limit; str_length++) {
834 if (UTF8_GET (ptr, limit) < 0)
842 /* Calculate a hash value for a string encoded in Utf8 format.
843 * This returns the same hash value as specified for java.lang.String.hashCode.
847 hashUtf8String (const char *str, int len)
849 const unsigned char* ptr = (const unsigned char*) str;
850 const unsigned char *limit = ptr + len;
854 int ch = UTF8_GET (ptr, limit);
855 /* Updated specification from
856 http://www.javasoft.com/docs/books/jls/clarify.html. */
857 hash = (31 * hash) + ch;
862 static GTY(()) tree utf8_decl_list = NULL_TREE;
865 build_utf8_ref (tree name)
867 const char * name_ptr = IDENTIFIER_POINTER(name);
868 int name_len = IDENTIFIER_LENGTH(name);
870 tree ctype, field = NULL_TREE, str_type, cinit, string;
871 static int utf8_count = 0;
873 tree ref = IDENTIFIER_UTF8_REF (name);
875 if (ref != NULL_TREE)
878 ctype = make_node (RECORD_TYPE);
879 str_type = build_prim_array_type (unsigned_byte_type_node,
880 name_len + 1); /* Allow for final '\0'. */
881 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
882 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
883 PUSH_FIELD (ctype, field, "data", str_type);
884 FINISH_RECORD (ctype);
885 START_RECORD_CONSTRUCTOR (cinit, ctype);
886 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
887 PUSH_FIELD_VALUE (cinit, "hash", build_int_2 (name_hash, 0));
888 PUSH_FIELD_VALUE (cinit, "length", build_int_2 (name_len, 0));
889 string = build_string (name_len, name_ptr);
890 TREE_TYPE (string) = str_type;
891 PUSH_FIELD_VALUE (cinit, "data", string);
892 FINISH_RECORD_CONSTRUCTOR (cinit);
893 TREE_CONSTANT (cinit) = 1;
894 TREE_INVARIANT (cinit) = 1;
896 /* Generate a unique-enough identifier. */
897 sprintf(buf, "_Utf%d", ++utf8_count);
899 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
900 TREE_STATIC (decl) = 1;
901 DECL_ARTIFICIAL (decl) = 1;
902 DECL_IGNORED_P (decl) = 1;
903 TREE_READONLY (decl) = 1;
904 TREE_THIS_VOLATILE (decl) = 0;
905 DECL_INITIAL (decl) = cinit;
907 if (HAVE_GAS_SHF_MERGE)
910 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
911 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
912 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
913 if (flag_merge_constants && decl_size < 256)
916 int flags = (SECTION_OVERRIDE
917 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
918 sprintf (buf, ".rodata.jutf8.%d", decl_size);
919 named_section_flags (buf, flags);
920 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
924 TREE_CHAIN (decl) = utf8_decl_list;
925 layout_decl (decl, 0);
927 rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);
928 utf8_decl_list = decl;
929 make_decl_rtl (decl, (char*) 0);
930 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
931 IDENTIFIER_UTF8_REF (name) = ref;
935 /* Like build_class_ref, but instead of a direct reference generate a
936 pointer into the constant pool. */
939 build_indirect_class_ref (tree type)
943 index = alloc_class_constant (type);
944 cl = build_ref_from_constant_pool (index);
945 return convert (promote_type (class_ptr_type), cl);
948 /* Build a reference to the class TYPE.
949 Also handles primitive types and array types. */
952 build_class_ref (tree type)
954 int is_compiled = is_compiled_class (type);
957 tree ref, decl_name, decl;
958 if (TREE_CODE (type) == POINTER_TYPE)
959 type = TREE_TYPE (type);
961 /* FIXME: we really want an indirect reference to our
962 superclass. However, libgcj assumes that a superclass
963 pointer always points directly to a class. As a workaround
964 we always emit this hard superclass reference. */
965 if (flag_indirect_dispatch
966 && type != output_class
967 && type != CLASSTYPE_SUPER (output_class)
968 && TREE_CODE (type) == RECORD_TYPE)
969 return build_indirect_class_ref (type);
971 if (TREE_CODE (type) == RECORD_TYPE)
973 if (TYPE_SIZE (type) == error_mark_node)
974 return null_pointer_node;
975 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
976 "", '/', '/', ".class");
977 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
978 if (decl == NULL_TREE)
980 decl = build_decl (VAR_DECL, decl_name, class_type_node);
981 DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
982 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
983 TREE_STATIC (decl) = 1;
984 TREE_PUBLIC (decl) = 1;
985 DECL_IGNORED_P (decl) = 1;
986 DECL_ARTIFICIAL (decl) = 1;
987 if (is_compiled == 1)
988 DECL_EXTERNAL (decl) = 1;
989 SET_DECL_ASSEMBLER_NAME (decl,
990 java_mangle_class_field
991 (&temporary_obstack, type));
992 make_decl_rtl (decl, NULL);
993 pushdecl_top_level (decl);
1000 if (flag_emit_class_files)
1002 const char *prim_class_name;
1004 if (type == char_type_node)
1005 prim_class_name = "java.lang.Character";
1006 else if (type == boolean_type_node)
1007 prim_class_name = "java.lang.Boolean";
1008 else if (type == byte_type_node)
1009 prim_class_name = "java.lang.Byte";
1010 else if (type == short_type_node)
1011 prim_class_name = "java.lang.Short";
1012 else if (type == int_type_node)
1013 prim_class_name = "java.lang.Integer";
1014 else if (type == long_type_node)
1015 prim_class_name = "java.lang.Long";
1016 else if (type == float_type_node)
1017 prim_class_name = "java.lang.Float";
1018 else if (type == double_type_node)
1019 prim_class_name = "java.lang.Double";
1020 else if (type == void_type_node)
1021 prim_class_name = "java.lang.Void";
1025 prim_class = lookup_class (get_identifier (prim_class_name));
1026 return build (COMPONENT_REF, NULL_TREE,
1027 prim_class, TYPE_identifier_node, NULL_TREE);
1029 decl_name = TYPE_NAME (type);
1030 if (TREE_CODE (decl_name) == TYPE_DECL)
1031 decl_name = DECL_NAME (decl_name);
1032 name = IDENTIFIER_POINTER (decl_name);
1033 if (strncmp (name, "promoted_", 9) == 0)
1035 sprintf (buffer, "_Jv_%sClass", name);
1036 decl_name = get_identifier (buffer);
1037 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1038 if (decl == NULL_TREE)
1040 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1041 TREE_STATIC (decl) = 1;
1042 TREE_PUBLIC (decl) = 1;
1043 DECL_EXTERNAL (decl) = 1;
1044 make_decl_rtl (decl, NULL);
1045 pushdecl_top_level (decl);
1049 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1053 return build_indirect_class_ref (type);
1057 build_static_field_ref (tree fdecl)
1059 tree fclass = DECL_CONTEXT (fdecl);
1060 int is_compiled = is_compiled_class (fclass);
1062 /* Allow static final fields to fold to a constant. When using
1063 -fno-assume-compiled, gcj will sometimes try to fold a field from
1064 an uncompiled class. This is required when the field in question
1065 meets the appropriate criteria for a compile-time constant.
1066 However, currently sometimes gcj is too eager and will end up
1067 returning the field itself, leading to an incorrect external
1068 reference being generated. */
1070 && (! flag_indirect_dispatch || current_class == fclass))
1071 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1072 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1073 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1074 && TREE_CONSTANT (DECL_INITIAL (fdecl))))
1076 if (!DECL_RTL_SET_P (fdecl))
1078 if (is_compiled == 1)
1079 DECL_EXTERNAL (fdecl) = 1;
1080 make_decl_rtl (fdecl, NULL);
1085 if (flag_indirect_dispatch)
1088 = build_int_2 (get_symbol_table_index
1089 (fdecl, &TYPE_ATABLE_METHODS (output_class)), 0);
1091 = build (ARRAY_REF, build_pointer_type (TREE_TYPE (fdecl)),
1092 TYPE_ATABLE_DECL (output_class), table_index,
1093 NULL_TREE, NULL_TREE);
1094 return fold (build1 (INDIRECT_REF, TREE_TYPE (fdecl),
1100 * *(FTYPE*)build_class_ref(FCLASS)->fields[INDEX].info.addr */
1101 tree ref = build_class_ref (fclass);
1103 int field_index = 0;
1104 ref = build1 (INDIRECT_REF, class_type_node, ref);
1105 ref = build (COMPONENT_REF, field_ptr_type_node, ref,
1106 lookup_field (&class_type_node, fields_ident),
1109 for (fld = TYPE_FIELDS (fclass); ; fld = TREE_CHAIN (fld))
1113 if (fld == NULL_TREE)
1114 fatal_error ("field '%s' not found in class",
1115 IDENTIFIER_POINTER (DECL_NAME (fdecl)));
1116 if (FIELD_STATIC (fld))
1119 field_index *= int_size_in_bytes (field_type_node);
1120 ref = fold (build (PLUS_EXPR, field_ptr_type_node,
1121 ref, build_int_2 (field_index, 0)));
1122 ref = build1 (INDIRECT_REF, field_type_node, ref);
1123 ref = build (COMPONENT_REF, field_info_union_node,
1124 ref, lookup_field (&field_type_node, info_ident),
1126 ref = build (COMPONENT_REF, ptr_type_node,
1127 ref, TREE_CHAIN (TYPE_FIELDS (field_info_union_node)),
1129 ref = build1 (NOP_EXPR, build_pointer_type (TREE_TYPE (fdecl)), ref);
1130 return fold (build1 (INDIRECT_REF, TREE_TYPE(fdecl), ref));
1135 get_access_flags_from_decl (tree decl)
1137 int access_flags = 0;
1138 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1140 if (FIELD_STATIC (decl))
1141 access_flags |= ACC_STATIC;
1142 if (FIELD_PUBLIC (decl))
1143 access_flags |= ACC_PUBLIC;
1144 if (FIELD_PROTECTED (decl))
1145 access_flags |= ACC_PROTECTED;
1146 if (FIELD_PRIVATE (decl))
1147 access_flags |= ACC_PRIVATE;
1148 if (FIELD_FINAL (decl))
1149 access_flags |= ACC_FINAL;
1150 if (FIELD_VOLATILE (decl))
1151 access_flags |= ACC_VOLATILE;
1152 if (FIELD_TRANSIENT (decl))
1153 access_flags |= ACC_TRANSIENT;
1154 return access_flags;
1156 if (TREE_CODE (decl) == TYPE_DECL)
1158 if (CLASS_PUBLIC (decl))
1159 access_flags |= ACC_PUBLIC;
1160 if (CLASS_FINAL (decl))
1161 access_flags |= ACC_FINAL;
1162 if (CLASS_SUPER (decl))
1163 access_flags |= ACC_SUPER;
1164 if (CLASS_INTERFACE (decl))
1165 access_flags |= ACC_INTERFACE;
1166 if (CLASS_ABSTRACT (decl))
1167 access_flags |= ACC_ABSTRACT;
1168 if (CLASS_STATIC (decl))
1169 access_flags |= ACC_STATIC;
1170 if (CLASS_PRIVATE (decl))
1171 access_flags |= ACC_PRIVATE;
1172 if (CLASS_PROTECTED (decl))
1173 access_flags |= ACC_PROTECTED;
1174 if (CLASS_STRICTFP (decl))
1175 access_flags |= ACC_STRICT;
1176 return access_flags;
1178 if (TREE_CODE (decl) == FUNCTION_DECL)
1180 if (METHOD_PUBLIC (decl))
1181 access_flags |= ACC_PUBLIC;
1182 if (METHOD_PRIVATE (decl))
1183 access_flags |= ACC_PRIVATE;
1184 if (METHOD_PROTECTED (decl))
1185 access_flags |= ACC_PROTECTED;
1186 if (METHOD_STATIC (decl))
1187 access_flags |= ACC_STATIC;
1188 if (METHOD_FINAL (decl))
1189 access_flags |= ACC_FINAL;
1190 if (METHOD_SYNCHRONIZED (decl))
1191 access_flags |= ACC_SYNCHRONIZED;
1192 if (METHOD_NATIVE (decl))
1193 access_flags |= ACC_NATIVE;
1194 if (METHOD_ABSTRACT (decl))
1195 access_flags |= ACC_ABSTRACT;
1196 if (METHOD_STRICTFP (decl))
1197 access_flags |= ACC_STRICT;
1198 if (METHOD_INVISIBLE (decl))
1199 access_flags |= ACC_INVISIBLE;
1200 return access_flags;
1206 make_field_value (tree fdecl)
1210 tree type = TREE_TYPE (fdecl);
1211 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1213 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1214 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1216 type = build_class_ref (type);
1219 tree signature = build_java_signature (type);
1221 type = build_utf8_ref (unmangle_classname
1222 (IDENTIFIER_POINTER (signature),
1223 IDENTIFIER_LENGTH (signature)));
1225 PUSH_FIELD_VALUE (finit, "type", type);
1227 flags = get_access_flags_from_decl (fdecl);
1229 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1231 PUSH_FIELD_VALUE (finit, "accflags", build_int_2 (flags, 0));
1232 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1236 build_constructor (field_info_union_node,
1238 ((FIELD_STATIC (fdecl)
1239 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1240 : TYPE_FIELDS (field_info_union_node)),
1241 (FIELD_STATIC (fdecl)
1242 ? build_address_of (build_static_field_ref (fdecl))
1243 : byte_position (fdecl)))));
1245 FINISH_RECORD_CONSTRUCTOR (finit);
1250 make_method_value (tree mdecl)
1252 static int method_name_count = 0;
1257 #define ACC_TRANSLATED 0x4000
1258 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1260 class_decl = DECL_CONTEXT (mdecl);
1261 /* For interfaces, the index field contains the dispatch index. */
1262 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1263 index = build_int_2 (get_interface_method_index (mdecl, class_decl), 0);
1264 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1265 index = get_method_index (mdecl);
1267 index = integer_minus_one_node;
1269 code = null_pointer_node;
1270 if (DECL_RTL_SET_P (mdecl))
1271 code = build1 (ADDR_EXPR, nativecode_ptr_type_node, mdecl);
1272 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1273 PUSH_FIELD_VALUE (minit, "name",
1274 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1275 init_identifier_node
1276 : DECL_NAME (mdecl)));
1278 tree signature = build_java_signature (TREE_TYPE (mdecl));
1279 PUSH_FIELD_VALUE (minit, "signature",
1282 (IDENTIFIER_POINTER(signature),
1283 IDENTIFIER_LENGTH(signature)))));
1285 PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0));
1286 PUSH_FIELD_VALUE (minit, "index", index);
1287 PUSH_FIELD_VALUE (minit, "ncode", code);
1290 /* Compute the `throws' information for the method. */
1291 tree table = null_pointer_node;
1292 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1294 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1295 tree iter, type, array;
1298 table = tree_cons (NULL_TREE, table, NULL_TREE);
1299 for (iter = DECL_FUNCTION_THROWS (mdecl);
1301 iter = TREE_CHAIN (iter))
1303 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1305 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1306 IDENTIFIER_LENGTH (sig)));
1307 table = tree_cons (NULL_TREE, utf8, table);
1309 type = build_prim_array_type (ptr_type_node, length);
1310 table = build_constructor (type, table);
1311 /* Compute something unique enough. */
1312 sprintf (buf, "_methods%d", method_name_count++);
1313 array = build_decl (VAR_DECL, get_identifier (buf), type);
1314 DECL_INITIAL (array) = table;
1315 TREE_STATIC (array) = 1;
1316 DECL_ARTIFICIAL (array) = 1;
1317 DECL_IGNORED_P (array) = 1;
1318 rest_of_decl_compilation (array, (char*) 0, 1, 0);
1320 table = build1 (ADDR_EXPR, ptr_type_node, array);
1323 PUSH_FIELD_VALUE (minit, "throws", table);
1326 FINISH_RECORD_CONSTRUCTOR (minit);
1331 get_dispatch_vector (tree type)
1333 tree vtable = TYPE_VTABLE (type);
1335 if (vtable == NULL_TREE)
1339 tree super = CLASSTYPE_SUPER (type);
1340 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1341 vtable = make_tree_vec (nvirtuals);
1342 TYPE_VTABLE (type) = vtable;
1343 if (super != NULL_TREE)
1345 tree super_vtable = get_dispatch_vector (super);
1347 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1348 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1351 for (method = TYPE_METHODS (type); method != NULL_TREE;
1352 method = TREE_CHAIN (method))
1354 tree method_index = get_method_index (method);
1355 if (method_index != NULL_TREE
1356 && host_integerp (method_index, 0))
1357 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1365 get_dispatch_table (tree type, tree this_class_addr)
1367 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1368 tree vtable = get_dispatch_vector (type);
1370 tree list = NULL_TREE;
1371 int nvirtuals = TREE_VEC_LENGTH (vtable);
1375 for (i = nvirtuals; --i >= 0; )
1377 tree method = TREE_VEC_ELT (vtable, i);
1378 if (METHOD_ABSTRACT (method))
1381 warning ("%Jabstract method in non-abstract class", method);
1383 if (TARGET_VTABLE_USES_DESCRIPTORS)
1384 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1385 list = tree_cons (NULL_TREE, null_pointer_node, list);
1387 list = tree_cons (NULL_TREE, null_pointer_node, list);
1391 if (!DECL_RTL_SET_P (method))
1392 make_decl_rtl (method, NULL);
1394 if (TARGET_VTABLE_USES_DESCRIPTORS)
1395 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1397 tree fdesc = build (FDESC_EXPR, nativecode_ptr_type_node,
1398 method, build_int_2 (j, 0));
1399 TREE_CONSTANT (fdesc) = 1;
1400 TREE_INVARIANT (fdesc) = 1;
1401 list = tree_cons (NULL_TREE, fdesc, list);
1404 list = tree_cons (NULL_TREE,
1405 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1411 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1412 using the Boehm GC we sometimes stash a GC type descriptor
1413 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1414 the emitted byte count during the output to the assembly file. */
1415 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1416 fake "function descriptor". It's first word is the is the class
1417 pointer, and subsequent words (usually one) contain the GC descriptor.
1418 In all other cases, we reserve two extra vtable slots. */
1419 gc_descr = get_boehm_type_descriptor (type);
1420 list = tree_cons (NULL_TREE, gc_descr, list);
1421 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1422 list = tree_cons (NULL_TREE, gc_descr, list);
1423 list = tree_cons (NULL_TREE, this_class_addr, list);
1425 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1426 list = tree_cons (NULL_TREE, null_pointer_node, list);
1427 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1428 list = tree_cons (integer_zero_node, null_pointer_node, list);
1430 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1431 if (TARGET_VTABLE_USES_DESCRIPTORS)
1432 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1434 return build_constructor (build_prim_array_type (nativecode_ptr_type_node,
1439 /* Set the method_index for a method decl. */
1441 set_method_index (tree decl, tree method_index)
1443 method_index = fold (convert (sizetype, method_index));
1445 if (TARGET_VTABLE_USES_DESCRIPTORS)
1446 /* Add one to skip bogus descriptor for class and GC descriptor. */
1447 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1449 /* Add 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1450 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1452 DECL_VINDEX (decl) = method_index;
1455 /* Get the method_index for a method decl. */
1457 get_method_index (tree decl)
1459 tree method_index = DECL_VINDEX (decl);
1464 if (TARGET_VTABLE_USES_DESCRIPTORS)
1465 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1466 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1468 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1469 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1471 return method_index;
1475 supers_all_compiled (tree type)
1477 while (type != NULL_TREE)
1479 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1481 type = CLASSTYPE_SUPER (type);
1487 make_class_data (tree type)
1489 tree decl, cons, temp;
1490 tree field, fields_decl;
1491 tree static_fields = NULL_TREE;
1492 tree instance_fields = NULL_TREE;
1493 HOST_WIDE_INT static_field_count = 0;
1494 HOST_WIDE_INT instance_field_count = 0;
1495 HOST_WIDE_INT field_count;
1496 tree field_array_type;
1498 tree methods = NULL_TREE;
1499 tree dtable_decl = NULL_TREE;
1500 HOST_WIDE_INT method_count = 0;
1501 tree method_array_type;
1504 tree this_class_addr;
1505 tree constant_pool_constructor;
1506 tree interfaces = null_pointer_node;
1507 int interface_len = 0;
1508 tree type_decl = TYPE_NAME (type);
1509 /** Offset from start of virtual function table declaration
1510 to where objects actually point at, following new g++ ABI. */
1511 tree dtable_start_offset = build_int_2 (2 * POINTER_SIZE / BITS_PER_UNIT, 0);
1513 this_class_addr = build_class_ref (type);
1514 decl = TREE_OPERAND (this_class_addr, 0);
1516 /* Build Field array. */
1517 field = TYPE_FIELDS (type);
1518 if (DECL_NAME (field) == NULL_TREE)
1519 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1520 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1522 if (! DECL_ARTIFICIAL (field))
1524 tree init = make_field_value (field);
1525 if (FIELD_STATIC (field))
1527 tree initial = DECL_INITIAL (field);
1528 static_field_count++;
1529 static_fields = tree_cons (NULL_TREE, init, static_fields);
1530 /* If the initial value is a string constant,
1531 prevent output_constant from trying to assemble the value. */
1532 if (initial != NULL_TREE
1533 && TREE_TYPE (initial) == string_ptr_type_node)
1534 DECL_INITIAL (field) = NULL_TREE;
1535 rest_of_decl_compilation (field, (char*) 0, 1, 1);
1536 DECL_INITIAL (field) = initial;
1540 instance_field_count++;
1541 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1545 field_count = static_field_count + instance_field_count;
1546 if (field_count > 0)
1548 static_fields = nreverse (static_fields);
1549 instance_fields = nreverse (instance_fields);
1550 static_fields = chainon (static_fields, instance_fields);
1551 field_array_type = build_prim_array_type (field_type_node, field_count);
1552 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1554 DECL_INITIAL (fields_decl) = build_constructor (field_array_type,
1556 TREE_STATIC (fields_decl) = 1;
1557 DECL_ARTIFICIAL (fields_decl) = 1;
1558 DECL_IGNORED_P (fields_decl) = 1;
1559 rest_of_decl_compilation (fields_decl, (char*) 0, 1, 0);
1562 fields_decl = NULL_TREE;
1564 /* Build Method array. */
1565 for (method = TYPE_METHODS (type);
1566 method != NULL_TREE; method = TREE_CHAIN (method))
1569 if (METHOD_PRIVATE (method)
1570 && ! flag_keep_inline_functions
1571 && (flag_inline_functions || optimize))
1573 init = make_method_value (method);
1575 methods = tree_cons (NULL_TREE, init, methods);
1577 method_array_type = build_prim_array_type (method_type_node, method_count);
1578 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1580 DECL_INITIAL (methods_decl) = build_constructor (method_array_type,
1581 nreverse (methods));
1582 TREE_STATIC (methods_decl) = 1;
1583 DECL_ARTIFICIAL (methods_decl) = 1;
1584 DECL_IGNORED_P (methods_decl) = 1;
1585 rest_of_decl_compilation (methods_decl, (char*) 0, 1, 0);
1587 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1588 && !flag_indirect_dispatch)
1590 tree dtable = get_dispatch_table (type, this_class_addr);
1591 dtable_decl = build_dtable_decl (type);
1592 DECL_INITIAL (dtable_decl) = dtable;
1593 TREE_STATIC (dtable_decl) = 1;
1594 DECL_ARTIFICIAL (dtable_decl) = 1;
1595 DECL_IGNORED_P (dtable_decl) = 1;
1596 TREE_PUBLIC (dtable_decl) = 1;
1597 rest_of_decl_compilation (dtable_decl, (char*) 0, 1, 0);
1598 if (type == class_type_node)
1599 class_dtable_decl = dtable_decl;
1602 if (class_dtable_decl == NULL_TREE)
1604 class_dtable_decl = build_dtable_decl (class_type_node);
1605 TREE_STATIC (class_dtable_decl) = 1;
1606 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1607 DECL_IGNORED_P (class_dtable_decl) = 1;
1608 if (is_compiled_class (class_type_node) != 2)
1609 DECL_EXTERNAL (class_dtable_decl) = 1;
1610 rest_of_decl_compilation (class_dtable_decl, (char*) 0, 1, 0);
1613 super = CLASSTYPE_SUPER (type);
1614 if (super == NULL_TREE)
1615 super = null_pointer_node;
1616 else if (/* FIXME: we should also test for (!
1617 flag_indirect_dispatch) here, but libgcj can't cope with
1618 a symbolic reference a superclass in the class data. */
1619 assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1620 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1621 super = build_class_ref (super);
1624 int super_index = alloc_class_constant (super);
1625 super = build_int_2 (super_index, 0);
1626 TREE_TYPE (super) = ptr_type_node;
1629 /* Build and emit the array of implemented interfaces. */
1630 if (type != object_type_node)
1631 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1633 if (interface_len > 0)
1635 tree init = NULL_TREE;
1637 tree interface_array_type, idecl;
1638 interface_array_type
1639 = build_prim_array_type (class_ptr_type, interface_len);
1640 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1641 interface_array_type);
1642 for (i = interface_len; i > 0; i--)
1644 tree child = TREE_VEC_ELT (BINFO_BASE_BINFOS (TYPE_BINFO (type)), i);
1645 tree iclass = BINFO_TYPE (child);
1647 if (! flag_indirect_dispatch
1649 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1650 index = build_class_ref (iclass);
1653 int int_index = alloc_class_constant (iclass);
1654 index = build_int_2 (int_index, 0);
1655 TREE_TYPE (index) = ptr_type_node;
1657 init = tree_cons (NULL_TREE, index, init);
1659 DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
1660 TREE_STATIC (idecl) = 1;
1661 DECL_ARTIFICIAL (idecl) = 1;
1662 DECL_IGNORED_P (idecl) = 1;
1663 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1664 rest_of_decl_compilation (idecl, (char*) 0, 1, 0);
1667 constant_pool_constructor = build_constants_constructor ();
1669 if (flag_indirect_dispatch)
1671 TYPE_OTABLE_DECL (type)
1673 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1674 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1675 TYPE_OTABLE_SYMS_DECL (type), integer_type_node);
1677 TYPE_ATABLE_DECL (type)
1679 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1680 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1681 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node);
1684 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1686 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1687 PUSH_FIELD_VALUE (temp, "vtable",
1688 build (PLUS_EXPR, dtable_ptr_type,
1689 build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl),
1690 dtable_start_offset));
1691 if (! flag_hash_synchronization)
1692 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1693 FINISH_RECORD_CONSTRUCTOR (temp);
1694 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1695 PUSH_SUPER_VALUE (cons, temp);
1696 PUSH_FIELD_VALUE (cons, "next", null_pointer_node);
1697 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1698 PUSH_FIELD_VALUE (cons, "accflags",
1699 build_int_2 (get_access_flags_from_decl (type_decl), 0));
1701 PUSH_FIELD_VALUE (cons, "superclass",
1702 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1703 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1704 PUSH_FIELD_VALUE (cons, "methods",
1705 build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1706 PUSH_FIELD_VALUE (cons, "method_count", build_int_2 (method_count, 0));
1708 if (flag_indirect_dispatch)
1709 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1711 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1713 PUSH_FIELD_VALUE (cons, "fields",
1714 fields_decl == NULL_TREE ? null_pointer_node
1715 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1716 PUSH_FIELD_VALUE (cons, "size_in_bytes", size_in_bytes (type));
1717 PUSH_FIELD_VALUE (cons, "field_count", build_int_2 (field_count, 0));
1718 PUSH_FIELD_VALUE (cons, "static_field_count",
1719 build_int_2 (static_field_count, 0));
1721 if (flag_indirect_dispatch)
1722 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
1724 PUSH_FIELD_VALUE (cons, "vtable",
1725 dtable_decl == NULL_TREE ? null_pointer_node
1726 : build (PLUS_EXPR, dtable_ptr_type,
1727 build1 (ADDR_EXPR, dtable_ptr_type, dtable_decl),
1728 dtable_start_offset));
1729 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
1731 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
1732 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
1736 PUSH_FIELD_VALUE (cons, "otable",
1737 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
1738 PUSH_FIELD_VALUE (cons, "otable_syms",
1739 build1 (ADDR_EXPR, symbols_array_ptr_type,
1740 TYPE_OTABLE_SYMS_DECL (type)));
1741 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
1742 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
1744 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
1746 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
1747 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
1751 PUSH_FIELD_VALUE (cons, "atable",
1752 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
1753 PUSH_FIELD_VALUE (cons, "atable_syms",
1754 build1 (ADDR_EXPR, symbols_array_ptr_type,
1755 TYPE_ATABLE_SYMS_DECL (type)));
1756 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
1757 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
1760 PUSH_FIELD_VALUE (cons, "catch_classes",
1761 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
1762 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
1763 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
1764 PUSH_FIELD_VALUE (cons, "interface_count", build_int_2 (interface_len, 0));
1765 PUSH_FIELD_VALUE (cons, "state", integer_zero_node);
1767 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
1768 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
1769 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
1770 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
1771 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
1772 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
1773 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
1774 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
1775 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
1777 FINISH_RECORD_CONSTRUCTOR (cons);
1779 DECL_INITIAL (decl) = cons;
1781 /* Hash synchronization requires at least 64-bit alignment. */
1782 if (flag_hash_synchronization && POINTER_SIZE < 64)
1783 DECL_ALIGN (decl) = 64;
1785 rest_of_decl_compilation (decl, (char*) 0, 1, 0);
1791 java_expand_catch_classes (current_class);
1793 current_function_decl = NULL_TREE;
1794 make_class_data (current_class);
1796 rest_of_decl_compilation (TYPE_NAME (current_class), (char*) 0, 1, 0);
1799 /* Return 2 if CLASS is compiled by this compilation job;
1800 return 1 if CLASS can otherwise be assumed to be compiled;
1801 return 0 if we cannot assume that CLASS is compiled.
1802 Returns 1 for primitive and 0 for array types. */
1804 is_compiled_class (tree class)
1807 if (TREE_CODE (class) == POINTER_TYPE)
1808 class = TREE_TYPE (class);
1809 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
1811 if (TYPE_ARRAY_P (class))
1813 if (class == current_class)
1816 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
1817 if (CLASS_FROM_CURRENTLY_COMPILED_P (class) || seen_in_zip)
1819 /* The class was seen in the current ZIP file and will be
1820 available as a compiled class in the future but may not have
1821 been loaded already. Load it if necessary. This prevent
1822 build_class_ref () from crashing. */
1824 if (seen_in_zip && !CLASS_LOADED_P (class))
1825 load_class (class, 1);
1827 /* We return 2 for class seen in ZIP and class from files
1828 belonging to the same compilation unit */
1832 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
1834 if (!CLASS_LOADED_P (class))
1836 if (CLASS_FROM_SOURCE_P (class))
1837 safe_layout_class (class);
1839 load_class (class, 1);
1847 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
1850 build_dtable_decl (tree type)
1854 /* We need to build a new dtable type so that its size is uniquely
1855 computed when we're dealing with the class for real and not just
1856 faking it (like java.lang.Class during the initialization of the
1857 compiler.) We know we're not faking a class when CURRENT_CLASS is
1859 if (current_class == type)
1861 tree dummy = NULL_TREE;
1864 dtype = make_node (RECORD_TYPE);
1866 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
1867 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
1869 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
1870 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1872 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1873 TREE_CHAIN (dummy) = tmp_field;
1874 DECL_CONTEXT (tmp_field) = dtype;
1875 DECL_ARTIFICIAL (tmp_field) = 1;
1879 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
1880 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1882 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1883 TREE_CHAIN (dummy) = tmp_field;
1884 DECL_CONTEXT (tmp_field) = dtype;
1885 DECL_ARTIFICIAL (tmp_field) = 1;
1889 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
1890 if (TARGET_VTABLE_USES_DESCRIPTORS)
1891 n *= TARGET_VTABLE_USES_DESCRIPTORS;
1893 PUSH_FIELD (dtype, dummy, "methods",
1894 build_prim_array_type (nativecode_ptr_type_node, n));
1895 layout_type (dtype);
1898 dtype = dtable_type;
1900 return build_decl (VAR_DECL,
1901 java_mangle_vtable (&temporary_obstack, type), dtype);
1904 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
1905 fields inherited from SUPER_CLASS. */
1908 push_super_field (tree this_class, tree super_class)
1911 /* Don't insert the field if we're just re-laying the class out. */
1912 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
1914 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
1915 DECL_IGNORED_P (base_decl) = 1;
1916 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
1917 TYPE_FIELDS (this_class) = base_decl;
1918 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
1919 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
1922 /* Handle the different manners we may have to lay out a super class. */
1925 maybe_layout_super_class (tree super_class, tree this_class)
1927 if (TREE_CODE (super_class) == RECORD_TYPE)
1929 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
1930 safe_layout_class (super_class);
1931 if (!CLASS_LOADED_P (super_class))
1932 load_class (super_class, 1);
1934 /* We might have to layout the class before its dependency on
1935 the super class gets resolved by java_complete_class */
1936 else if (TREE_CODE (super_class) == POINTER_TYPE)
1938 if (TREE_TYPE (super_class) != NULL_TREE)
1939 super_class = TREE_TYPE (super_class);
1942 /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
1944 tree this_wrap = NULL_TREE;
1948 tree this_decl = TYPE_NAME (this_class);
1949 this_wrap = build_expr_wfl (this_class,
1950 DECL_SOURCE_FILE (this_decl),
1951 DECL_SOURCE_LINE (this_decl), 0);
1953 super_class = do_resolve_class (NULL_TREE, /* FIXME? */
1954 super_class, NULL_TREE, this_wrap);
1956 return NULL_TREE; /* FIXME, NULL_TREE not checked by caller. */
1957 super_class = TREE_TYPE (super_class);
1960 if (!TYPE_SIZE (super_class))
1961 safe_layout_class (super_class);
1967 layout_class (tree this_class)
1969 tree super_class = CLASSTYPE_SUPER (this_class);
1972 class_list = tree_cons (this_class, NULL_TREE, class_list);
1973 if (CLASS_BEING_LAIDOUT (this_class))
1979 sprintf (buffer, " with `%s'",
1980 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
1981 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1983 for (current = TREE_CHAIN (class_list); current;
1984 current = TREE_CHAIN (current))
1986 tree decl = TYPE_NAME (TREE_PURPOSE (current));
1987 sprintf (buffer, "\n which inherits from `%s' (%s:%d)",
1988 IDENTIFIER_POINTER (DECL_NAME (decl)),
1989 DECL_SOURCE_FILE (decl),
1990 DECL_SOURCE_LINE (decl));
1991 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1993 obstack_1grow (&temporary_obstack, '\0');
1994 report = obstack_finish (&temporary_obstack);
1995 cyclic_inheritance_report = ggc_strdup (report);
1996 obstack_free (&temporary_obstack, report);
1997 TYPE_SIZE (this_class) = error_mark_node;
2000 CLASS_BEING_LAIDOUT (this_class) = 1;
2002 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2004 tree maybe_super_class
2005 = maybe_layout_super_class (super_class, this_class);
2006 if (maybe_super_class == NULL
2007 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2009 TYPE_SIZE (this_class) = error_mark_node;
2010 CLASS_BEING_LAIDOUT (this_class) = 0;
2011 class_list = TREE_CHAIN (class_list);
2014 if (TYPE_SIZE (this_class) == NULL_TREE)
2015 push_super_field (this_class, maybe_super_class);
2018 for (field = TYPE_FIELDS (this_class);
2019 field != NULL_TREE; field = TREE_CHAIN (field))
2021 if (FIELD_STATIC (field))
2023 /* Set DECL_ASSEMBLER_NAME to something suitably mangled. */
2024 SET_DECL_ASSEMBLER_NAME (field,
2026 (&temporary_obstack, field));
2030 layout_type (this_class);
2032 /* Also recursively load/layout any superinterfaces, but only if
2033 class was loaded from bytecode. The source parser will take care
2035 if (!CLASS_FROM_SOURCE_P (this_class))
2037 tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (this_class));
2041 int n = TREE_VEC_LENGTH (basetype_vec) - 1;
2043 for (i = n; i > 0; i--)
2045 tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
2046 tree super_interface = BINFO_TYPE (vec_elt);
2048 tree maybe_super_interface
2049 = maybe_layout_super_class (super_interface, NULL_TREE);
2050 if (maybe_super_interface == NULL
2051 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2053 TYPE_SIZE (this_class) = error_mark_node;
2054 CLASS_BEING_LAIDOUT (this_class) = 0;
2055 class_list = TREE_CHAIN (class_list);
2062 /* Convert the size back to an SI integer value. */
2063 TYPE_SIZE_UNIT (this_class) =
2064 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2066 CLASS_BEING_LAIDOUT (this_class) = 0;
2067 class_list = TREE_CHAIN (class_list);
2071 add_miranda_methods (tree base_class, tree search_class)
2073 tree basetype_vec = BINFO_BASE_BINFOS (TYPE_BINFO (search_class));
2074 int i, n = TREE_VEC_LENGTH (basetype_vec);
2075 for (i = 1; i < n; ++i)
2078 tree elt = TREE_VEC_ELT (basetype_vec, i);
2079 if (elt == NULL_TREE)
2081 elt = BINFO_TYPE (elt);
2083 /* Ensure that interface methods are seen in declared order. */
2084 layout_class_methods (elt);
2086 /* All base classes will have been laid out at this point, so the order
2087 will be correct. This code must match similar layout code in the
2089 for (method_decl = TYPE_METHODS (elt);
2090 method_decl; method_decl = TREE_CHAIN (method_decl))
2094 /* An interface can have <clinit>. */
2095 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2098 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2099 override = lookup_argument_method (base_class,
2100 DECL_NAME (method_decl), sig);
2101 if (override == NULL_TREE)
2103 /* Found a Miranda method. Add it. */
2105 sig = build_java_signature (TREE_TYPE (method_decl));
2107 = add_method (base_class,
2108 get_access_flags_from_decl (method_decl),
2109 DECL_NAME (method_decl), sig);
2110 METHOD_INVISIBLE (new_method) = 1;
2114 /* Try superinterfaces. */
2115 add_miranda_methods (base_class, elt);
2120 layout_class_methods (tree this_class)
2122 tree method_decl, dtable_count;
2123 tree super_class, type_name;
2125 if (TYPE_NVIRTUALS (this_class))
2128 super_class = CLASSTYPE_SUPER (this_class);
2132 super_class = maybe_layout_super_class (super_class, this_class);
2133 if (!TYPE_NVIRTUALS (super_class))
2134 layout_class_methods (super_class);
2135 dtable_count = TYPE_NVIRTUALS (super_class);
2138 dtable_count = integer_zero_node;
2140 type_name = TYPE_NAME (this_class);
2141 if (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name))
2143 /* An abstract class can have methods which are declared only in
2144 an implemented interface. These are called "Miranda
2145 methods". We make a dummy method entry for such methods
2147 add_miranda_methods (this_class, this_class);
2150 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2152 for (method_decl = TYPE_METHODS (this_class);
2153 method_decl; method_decl = TREE_CHAIN (method_decl))
2154 dtable_count = layout_class_method (this_class, super_class,
2155 method_decl, dtable_count);
2157 TYPE_NVIRTUALS (this_class) = dtable_count;
2160 /* Return the index of METHOD in INTERFACE. This index begins at 1 and is used as an
2161 argument for _Jv_LookupInterfaceMethodIdx(). */
2163 get_interface_method_index (tree method, tree interface)
2168 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth), i++)
2172 if (meth == NULL_TREE)
2177 /* Lay METHOD_DECL out, returning a possibly new value of
2178 DTABLE_COUNT. Also mangle the method's name. */
2181 layout_class_method (tree this_class, tree super_class,
2182 tree method_decl, tree dtable_count)
2184 tree method_name = DECL_NAME (method_decl);
2186 TREE_PUBLIC (method_decl) = 1;
2187 /* Considered external until we know what classes are being
2188 compiled into this object file. */
2189 DECL_EXTERNAL (method_decl) = 1;
2191 /* This is a good occasion to mangle the method's name */
2192 SET_DECL_ASSEMBLER_NAME (method_decl,
2193 java_mangle_decl (&temporary_obstack,
2195 /* We don't generate a RTL for the method if it's abstract, or if
2196 it's an interface method that isn't clinit. */
2197 if (! METHOD_ABSTRACT (method_decl)
2198 || (CLASS_INTERFACE (TYPE_NAME (this_class))
2199 && (DECL_CLINIT_P (method_decl))))
2200 make_decl_rtl (method_decl, NULL);
2202 if (ID_INIT_P (method_name))
2204 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2206 for (ptr = p; *ptr; )
2211 DECL_CONSTRUCTOR_P (method_decl) = 1;
2212 build_java_argument_signature (TREE_TYPE (method_decl));
2214 else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl))
2217 build_java_argument_signature (TREE_TYPE (method_decl));
2218 bool method_override = false;
2219 tree super_method = lookup_argument_method (super_class, method_name,
2221 if (super_method != NULL_TREE)
2223 method_override = true;
2224 if (! METHOD_PUBLIC (super_method) &&
2225 ! METHOD_PROTECTED (super_method))
2227 /* Don't override private method, or default-access method in
2229 if (METHOD_PRIVATE (super_method) ||
2230 ! in_same_package (TYPE_NAME (this_class),
2231 TYPE_NAME (super_class)))
2232 method_override = false;
2235 if (method_override)
2237 tree method_index = get_method_index (super_method);
2238 set_method_index (method_decl, method_index);
2239 if (method_index == NULL_TREE
2240 && !CLASS_FROM_SOURCE_P (this_class))
2241 error ("%Jnon-static method '%D' overrides static method",
2242 method_decl, method_decl);
2244 else if (! METHOD_FINAL (method_decl)
2245 && ! METHOD_PRIVATE (method_decl)
2246 && ! CLASS_FINAL (TYPE_NAME (this_class))
2249 set_method_index (method_decl, dtable_count);
2250 dtable_count = fold (build (PLUS_EXPR, integer_type_node,
2251 dtable_count, integer_one_node));
2255 return dtable_count;
2259 register_class (void)
2261 /* END does not need to be registered with the garbage collector
2262 because it always points into the list given by REGISTERED_CLASS,
2263 and that variable is registered with the collector. */
2265 tree node = TREE_OPERAND (build_class_ref (current_class), 0);
2266 tree current = copy_node (node);
2268 XEXP (DECL_RTL (current), 0) = copy_rtx (XEXP (DECL_RTL(node), 0));
2269 if (!registered_class)
2270 registered_class = current;
2272 TREE_CHAIN (end) = current;
2277 /* Emit something to register classes at start-up time.
2279 The preferred mechanism is through the .jcr section, which contain
2280 a list of pointers to classes which get registered during constructor
2283 The fallback mechanism is to add statements to *LIST_P to call
2284 _Jv_RegisterClass for each class in this file. These statements will
2285 be added to a static constructor function for this translation unit. */
2288 emit_register_classes (tree *list_p)
2290 if (registered_class == NULL)
2293 /* ??? This isn't quite the correct test. We also have to know
2294 that the target is using gcc's crtbegin/crtend objects rather
2295 than the ones that come with the operating system. */
2296 if (SUPPORTS_WEAK && targetm.have_named_sections)
2298 #ifdef JCR_SECTION_NAME
2300 named_section_flags (JCR_SECTION_NAME, SECTION_WRITE);
2301 assemble_align (POINTER_SIZE);
2302 for (t = registered_class; t; t = TREE_CHAIN (t))
2303 assemble_integer (XEXP (DECL_RTL (t), 0),
2304 POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
2311 tree klass, t, register_class_fn;
2313 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2314 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2315 TREE_PUBLIC (t) = 1;
2316 DECL_EXTERNAL (t) = 1;
2317 register_class_fn = t;
2319 for (klass = registered_class; klass; klass = TREE_CHAIN (klass))
2321 t = build_fold_addr_expr (klass);
2322 t = tree_cons (NULL, t, NULL);
2323 t = build_function_call_expr (register_class_fn, t);
2324 append_to_statement_list (t, list_p);
2329 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2332 build_symbol_entry (tree decl)
2334 tree clname, name, signature, sym;
2336 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2337 name = build_utf8_ref (DECL_NAME (decl));
2338 signature = build_java_signature (TREE_TYPE (decl));
2339 signature = build_utf8_ref (unmangle_classname
2340 (IDENTIFIER_POINTER (signature),
2341 IDENTIFIER_LENGTH (signature)));
2343 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2344 PUSH_FIELD_VALUE (sym, "clname", clname);
2345 PUSH_FIELD_VALUE (sym, "name", name);
2346 PUSH_FIELD_VALUE (sym, "signature", signature);
2347 FINISH_RECORD_CONSTRUCTOR (sym);
2348 TREE_CONSTANT (sym) = 1;
2349 TREE_INVARIANT (sym) = 1;
2354 /* Emit a symbol table: used by -findirect-dispatch. */
2357 emit_symbol_table (tree name, tree the_table, tree decl_list,
2358 tree the_syms_decl, tree the_array_element_type)
2360 tree method_list, method, table, list, null_symbol;
2361 tree table_size, the_array_type;
2364 /* Only emit a table if this translation unit actually made any
2365 references via it. */
2366 if (decl_list == NULL_TREE)
2369 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2371 method_list = decl_list;
2373 while (method_list != NULL_TREE)
2375 method = TREE_VALUE (method_list);
2376 list = tree_cons (NULL_TREE, build_symbol_entry (method), list);
2377 method_list = TREE_CHAIN (method_list);
2381 /* Terminate the list with a "null" entry. */
2382 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2383 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2384 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2385 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2386 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2387 TREE_CONSTANT (null_symbol) = 1;
2388 TREE_INVARIANT (null_symbol) = 1;
2389 list = tree_cons (NULL_TREE, null_symbol, list);
2391 /* Put the list in the right order and make it a constructor. */
2392 list = nreverse (list);
2393 table = build_constructor (symbols_array_type, list);
2395 /* Make it the initial value for otable_syms and emit the decl. */
2396 DECL_INITIAL (the_syms_decl) = table;
2397 DECL_ARTIFICIAL (the_syms_decl) = 1;
2398 DECL_IGNORED_P (the_syms_decl) = 1;
2399 rest_of_decl_compilation (the_syms_decl, NULL, 1, 0);
2401 /* Now that its size is known, redefine the table as an
2402 uninitialized static array of INDEX + 1 elements. The extra entry
2403 is used by the runtime to track whether the table has been
2405 table_size = build_index_type (build_int_2 (index, 0));
2406 the_array_type = build_array_type (the_array_element_type, table_size);
2407 the_table = build_decl (VAR_DECL, name, the_array_type);
2408 TREE_STATIC (the_table) = 1;
2409 TREE_READONLY (the_table) = 1;
2410 rest_of_decl_compilation (the_table, NULL, 1, 0);
2415 /* make an entry for the catch_classes list. */
2417 make_catch_class_record (tree catch_class, tree classname)
2420 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2421 START_RECORD_CONSTRUCTOR (entry, type);
2422 PUSH_FIELD_VALUE (entry, "address", catch_class);
2423 PUSH_FIELD_VALUE (entry, "classname", classname);
2424 FINISH_RECORD_CONSTRUCTOR (entry);
2429 /* Generate the list of Throwable classes that are caught by exception
2430 handlers in this class. */
2432 emit_catch_table (tree this_class)
2434 tree table, table_size, array_type;
2435 TYPE_CATCH_CLASSES (this_class) =
2437 make_catch_class_record (null_pointer_node, null_pointer_node),
2438 TYPE_CATCH_CLASSES (this_class));
2439 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2440 TYPE_CATCH_CLASSES (this_class) =
2442 make_catch_class_record (null_pointer_node, null_pointer_node),
2443 TYPE_CATCH_CLASSES (this_class));
2445 build_index_type (build_int_2
2446 (list_length (TYPE_CATCH_CLASSES (this_class)), 0));
2448 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2451 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2452 DECL_INITIAL (table) =
2453 build_constructor (array_type, TYPE_CATCH_CLASSES (this_class));
2454 TREE_STATIC (table) = 1;
2455 TREE_READONLY (table) = 1;
2456 DECL_IGNORED_P (table) = 1;
2457 rest_of_decl_compilation (table, NULL, 1, 0);
2463 init_class_processing (void)
2465 fields_ident = get_identifier ("fields");
2466 info_ident = get_identifier ("info");
2468 gcc_obstack_init (&temporary_obstack);
2471 static hashval_t java_treetreehash_hash (const void *);
2472 static int java_treetreehash_compare (const void *, const void *);
2474 /* A hash table mapping trees to trees. Used generally. */
2476 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
2479 java_treetreehash_hash (const void *k_p)
2481 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
2482 return JAVA_TREEHASHHASH_H (k->key);
2486 java_treetreehash_compare (const void * k1_p, const void * k2_p)
2488 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
2489 tree k2 = (tree) k2_p;
2490 return (k1->key == k2);
2494 java_treetreehash_find (htab_t ht, tree t)
2496 struct treetreehash_entry *e;
2497 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2498 e = htab_find_with_hash (ht, t, hv);
2506 java_treetreehash_new (htab_t ht, tree t)
2509 struct treetreehash_entry *tthe;
2510 hashval_t hv = JAVA_TREEHASHHASH_H (t);
2512 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
2515 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
2520 tthe = (struct treetreehash_entry *) *e;
2521 return &tthe->value;
2525 java_treetreehash_create (size_t size, int gc)
2528 return htab_create_ggc (size, java_treetreehash_hash,
2529 java_treetreehash_compare, NULL);
2531 return htab_create_alloc (size, java_treetreehash_hash,
2532 java_treetreehash_compare, free, xcalloc, free);
2535 /* Break down qualified IDENTIFIER into package and class-name components.
2536 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
2537 "pkg.foo", and RIGHT to "Bar". */
2540 split_qualified_name (tree *left, tree *right, tree source)
2543 int l = IDENTIFIER_LENGTH (source);
2545 base = alloca (l + 1);
2546 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
2548 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
2550 while (*p != '.' && p != base)
2553 /* We didn't find a '.'. Return an error. */
2559 *right = get_identifier (p+1);
2560 *left = get_identifier (base);
2565 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
2566 if the classes are from the same package. */
2569 in_same_package (tree name1, tree name2)
2575 if (TREE_CODE (name1) == TYPE_DECL)
2576 name1 = DECL_NAME (name1);
2577 if (TREE_CODE (name2) == TYPE_DECL)
2578 name2 = DECL_NAME (name2);
2580 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
2581 /* One in empty package. */
2584 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
2585 /* Both in empty package. */
2588 split_qualified_name (&pkg1, &tmp, name1);
2589 split_qualified_name (&pkg2, &tmp, name2);
2591 return (pkg1 == pkg2);
2594 #include "gt-java-class.h"