1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>.
21 Java and all Java-based marks are trademarks or registered trademarks
22 of Sun Microsystems, Inc. in the United States and other countries.
23 The Free Software Foundation is independent of Sun Microsystems, Inc. */
25 /* Written by Per Bothner <bothner@cygnus.com> */
29 #include "coretypes.h"
34 #include "java-tree.h"
46 #include "tree-iterator.h"
50 /* DOS brain-damage */
52 #define O_BINARY 0 /* MS-DOS brain-damage */
55 static tree make_method_value (tree);
56 static tree build_java_method_type (tree, tree, int);
57 static int32 hashUtf8String (const char *, int);
58 static tree make_field_value (tree);
59 static tree get_dispatch_vector (tree);
60 static tree get_dispatch_table (tree, tree);
61 static int supers_all_compiled (tree type);
62 static tree maybe_layout_super_class (tree, tree);
63 static void add_miranda_methods (tree, tree);
64 static int assume_compiled (const char *);
65 static tree build_symbol_entry (tree, tree);
66 static tree emit_assertion_table (tree);
67 static void register_class (void);
69 struct obstack temporary_obstack;
71 static const char *cyclic_inheritance_report;
73 /* The compiler generates different code depending on whether or not
74 it can assume certain classes have been compiled down to native
75 code or not. The compiler options -fassume-compiled= and
76 -fno-assume-compiled= are used to create a tree of
77 class_flag_node objects. This tree is queried to determine if
78 a class is assume to be compiled or not. Each node in the tree
79 represents either a package or a specific class. */
81 typedef struct class_flag_node_struct
83 /* The class or package name. */
86 /* Nonzero if this represents an exclusion. */
89 /* Pointers to other nodes in the tree. */
90 struct class_flag_node_struct *parent;
91 struct class_flag_node_struct *sibling;
92 struct class_flag_node_struct *child;
95 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
96 static void add_class_flag (class_flag_node **, const char *, int);
98 /* This is the root of the include/exclude tree. */
100 static class_flag_node *assume_compiled_tree;
102 static class_flag_node *enable_assert_tree;
104 static GTY(()) tree class_roots[4];
105 #define fields_ident class_roots[0] /* get_identifier ("fields") */
106 #define info_ident class_roots[1] /* get_identifier ("info") */
107 #define class_list class_roots[2]
108 #define class_dtable_decl class_roots[3]
110 static GTY(()) VEC(tree,gc) *registered_class;
112 /* A tree that returns the address of the class$ of the class
113 currently being compiled. */
114 static GTY(()) tree this_classdollar;
116 /* Return the node that most closely represents the class whose name
117 is IDENT. Start the search from NODE (followed by its siblings).
118 Return NULL if an appropriate node does not exist. */
120 static class_flag_node *
121 find_class_flag_node (class_flag_node *node, const char *ident)
125 size_t node_ident_length = strlen (node->ident);
127 /* node_ident_length is zero at the root of the tree. If the
128 identifiers are the same length, then we have matching
129 classes. Otherwise check if we've matched an enclosing
132 if (node_ident_length == 0
133 || (strncmp (ident, node->ident, node_ident_length) == 0
134 && (ident[node_ident_length] == '\0'
135 || ident[node_ident_length] == '.')))
137 /* We've found a match, however, there might be a more
140 class_flag_node *found = find_class_flag_node (node->child, ident);
147 /* No match yet. Continue through the sibling list. */
148 node = node->sibling;
151 /* No match at all in this tree. */
156 add_class_flag (class_flag_node **rootp, const char *ident, int value)
158 class_flag_node *root = *rootp;
159 class_flag_node *parent, *node;
161 /* Create the root of the tree if it doesn't exist yet. */
165 root = XNEW (class_flag_node);
168 root->sibling = NULL;
174 /* Calling the function with the empty string means we're setting
175 value for the root of the hierarchy. */
183 /* Find the parent node for this new node. PARENT will either be a
184 class or a package name. Adjust PARENT accordingly. */
186 parent = find_class_flag_node (root, ident);
187 if (strcmp (ident, parent->ident) == 0)
188 parent->value = value;
191 /* Insert new node into the tree. */
192 node = XNEW (class_flag_node);
194 node->ident = xstrdup (ident);
198 node->parent = parent;
199 node->sibling = parent->child;
200 parent->child = node;
204 /* Add a new IDENT to the include/exclude tree. It's an exclusion
205 if EXCLUDEP is nonzero. */
208 add_assume_compiled (const char *ident, int excludep)
210 add_class_flag (&assume_compiled_tree, ident, excludep);
213 /* The default value returned by enable_assertions. */
215 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
217 /* Enter IDENT (a class or package name) into the enable-assertions table.
218 VALUE is true to enable and false to disable. */
221 add_enable_assert (const char *ident, int value)
223 if (enable_assert_tree == NULL)
224 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
225 add_class_flag (&enable_assert_tree, ident, value);
228 /* Returns nonzero if IDENT is the name of a class that the compiler
229 should assume has been compiled to object code. */
232 assume_compiled (const char *ident)
237 if (NULL == assume_compiled_tree)
240 i = find_class_flag_node (assume_compiled_tree, ident);
247 /* Return true if we should generate code to check assertions within KLASS. */
250 enable_assertions (tree klass)
252 /* Check if command-line specifies whether we should check assertions. */
254 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
256 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
257 class_flag_node *node
258 = find_class_flag_node (enable_assert_tree, ident);
262 /* The default is to enable assertions if generating class files,
263 or not optimizing. */
264 return DEFAULT_ENABLE_ASSERT;
267 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
268 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
269 Also, PREFIX is prepended, and SUFFIX is appended. */
272 ident_subst (const char* old_name,
279 int prefix_len = strlen (prefix);
280 int suffix_len = strlen (suffix);
281 int i = prefix_len + old_length + suffix_len + 1;
282 char *buffer = alloca (i);
284 strcpy (buffer, prefix);
285 for (i = 0; i < old_length; i++)
287 char ch = old_name[i];
290 buffer[prefix_len + i] = ch;
292 strcpy (buffer + prefix_len + old_length, suffix);
293 return get_identifier (buffer);
296 /* Return an IDENTIFIER_NODE the same as OLD_ID,
297 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
298 Also, PREFIX is prepended, and SUFFIX is appended. */
301 identifier_subst (const tree old_id,
307 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
308 prefix, old_char, new_char, suffix);
311 /* Generate a valid C identifier from the name of the class TYPE,
312 prefixed by PREFIX. */
315 mangled_classname (const char *prefix, tree type)
317 tree ident = TYPE_NAME (type);
318 if (TREE_CODE (ident) != IDENTIFIER_NODE)
319 ident = DECL_NAME (ident);
320 return identifier_subst (ident, prefix, '.', '_', "");
327 type = make_node (RECORD_TYPE);
328 /* Unfortunately we must create the binfo here, so that class
330 TYPE_BINFO (type) = make_tree_binfo (0);
331 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
336 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
337 and where each of the constituents is separated by '/',
338 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
341 unmangle_classname (const char *name, int name_length)
343 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
344 /* It's not sufficient to compare to_return and get_identifier
345 (name) to determine whether to_return is qualified. There are
346 cases in signature analysis where name will be stripped of a
348 name = IDENTIFIER_POINTER (to_return);
352 QUALIFIED_P (to_return) = 1;
359 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
362 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
363 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
366 sprintf (buf, #NAME "_%s", typename); \
367 TYPE_## TABLE ##_DECL (type) = decl = \
368 build_decl (VAR_DECL, get_identifier (buf), TABLE_TYPE); \
369 DECL_EXTERNAL (decl) = 1; \
370 TREE_STATIC (decl) = 1; \
371 TREE_READONLY (decl) = 1; \
372 TREE_CONSTANT (decl) = 1; \
373 DECL_IGNORED_P (decl) = 1; \
374 /* Mark the table as belonging to this class. */ \
376 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
377 DECL_OWNER (decl) = TYPE; \
378 sprintf (buf, #NAME "_syms_%s", typename); \
379 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
380 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type); \
381 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
382 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
383 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
387 /* Given a class, create the DECLs for all its associated indirect
390 gen_indirect_dispatch_tables (tree type)
392 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
395 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
396 tree catch_class_type = make_node (RECORD_TYPE);
398 sprintf (buf, "_catch_classes_%s", typename);
399 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
400 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
401 FINISH_RECORD (catch_class_type);
403 TYPE_CTABLE_DECL (type)
404 = build_decl (VAR_DECL, get_identifier (buf),
405 build_array_type (catch_class_type, 0));
406 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
407 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
408 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
409 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
410 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
411 pushdecl (TYPE_CTABLE_DECL (type));
414 if (flag_indirect_dispatch)
416 GEN_TABLE (ATABLE, _atable, atable_type, type);
417 GEN_TABLE (OTABLE, _otable, otable_type, type);
418 GEN_TABLE (ITABLE, _itable, itable_type, type);
425 push_class (tree class_type, tree class_name)
427 tree decl, signature;
428 location_t saved_loc = input_location;
429 #ifndef USE_MAPPED_LOCATION
430 input_filename = "<unknown>";
433 CLASS_P (class_type) = 1;
434 decl = build_decl (TYPE_DECL, class_name, class_type);
435 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
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);
479 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
480 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
483 tree super_binfo = make_tree_binfo (0);
484 BINFO_TYPE (super_binfo) = super_class;
485 BINFO_OFFSET (super_binfo) = integer_zero_node;
486 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
487 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
490 set_class_decl_access_flags (access_flags, class_decl);
494 set_class_decl_access_flags (int access_flags, tree class_decl)
496 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
497 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
498 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
499 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
500 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
501 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
502 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
503 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
504 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
505 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
506 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
507 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
510 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
511 direct sub-classes of Object are 1, and so on. */
514 class_depth (tree clas)
517 if (! CLASS_LOADED_P (clas))
518 load_class (clas, 1);
519 if (TYPE_SIZE (clas) == error_mark_node)
521 while (clas != object_type_node)
524 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
529 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
532 interface_of_p (tree type1, tree type2)
535 tree binfo, base_binfo;
537 if (! TYPE_BINFO (type2))
540 for (binfo = TYPE_BINFO (type2), i = 0;
541 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
542 if (BINFO_TYPE (base_binfo) == type1)
545 for (binfo = TYPE_BINFO (type2), i = 0;
546 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
547 if (BINFO_TYPE (base_binfo)
548 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
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)
564 if (! CLASS_LOADED_P (type1))
565 load_class (type1, 1);
567 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
572 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
575 enclosing_context_p (tree type1, tree type2)
577 if (!INNER_CLASS_TYPE_P (type2))
580 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
582 type2 = (INNER_CLASS_TYPE_P (type2) ?
583 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
593 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
597 common_enclosing_context_p (tree type1, tree type2)
602 for (current = type2; current;
603 current = (INNER_CLASS_TYPE_P (current) ?
604 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
606 if (type1 == current)
609 if (INNER_CLASS_TYPE_P (type1))
610 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
617 /* Return 1 iff there exists a common enclosing "this" between TYPE1
618 and TYPE2, without crossing any static context. */
621 common_enclosing_instance_p (tree type1, tree type2)
623 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
626 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
627 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
628 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
631 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
632 current = (PURE_INNER_CLASS_TYPE_P (current) ?
633 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
635 if (type1 == current)
641 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
642 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
643 if attempt is made to add it twice. */
646 maybe_add_interface (tree this_class, tree interface_class)
648 tree binfo, base_binfo;
651 for (binfo = TYPE_BINFO (this_class), i = 0;
652 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
653 if (BINFO_TYPE (base_binfo) == interface_class)
654 return interface_class;
655 add_interface (this_class, interface_class);
659 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
662 add_interface (tree this_class, tree interface_class)
664 tree interface_binfo = make_tree_binfo (0);
666 BINFO_TYPE (interface_binfo) = interface_class;
667 BINFO_OFFSET (interface_binfo) = integer_zero_node;
668 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
669 BINFO_VIRTUAL_P (interface_binfo) = 1;
671 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
675 build_java_method_type (tree fntype, tree this_class, int access_flags)
677 if (access_flags & ACC_STATIC)
679 fntype = build_method_type (this_class, fntype);
681 /* We know that arg 1 of every nonstatic method is non-null; tell
683 TYPE_ATTRIBUTES (fntype) = (tree_cons
684 (get_identifier ("nonnull"),
685 tree_cons (NULL_TREE,
686 build_int_cst (NULL_TREE, 1),
688 TYPE_ATTRIBUTES (fntype)));
693 hide (tree decl ATTRIBUTE_UNUSED)
695 #ifdef HAVE_GAS_HIDDEN
696 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
697 DECL_VISIBILITY_SPECIFIED (decl) = 1;
702 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
704 tree method_type, fndecl;
706 method_type = build_java_method_type (function_type,
707 this_class, access_flags);
709 fndecl = build_decl (FUNCTION_DECL, name, method_type);
710 DECL_CONTEXT (fndecl) = this_class;
712 DECL_LANG_SPECIFIC (fndecl)
713 = ggc_alloc_cleared (sizeof (struct lang_decl));
714 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
716 /* Initialize the static initializer test table. */
718 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
719 java_treetreehash_create (10, 1);
721 /* Initialize the initialized (static) class table. */
722 if (access_flags & ACC_STATIC)
723 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
724 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
726 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
727 TYPE_METHODS (this_class) = fndecl;
729 /* If pointers to member functions use the least significant bit to
730 indicate whether a function is virtual, ensure a pointer
731 to this function will have that bit clear. */
732 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
733 && !(access_flags & ACC_STATIC)
734 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
735 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
737 /* Notice that this is a finalizer and update the class type
738 accordingly. This is used to optimize instance allocation. */
739 if (name == finalize_identifier_node
740 && TREE_TYPE (function_type) == void_type_node
741 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
742 HAS_FINALIZER_P (this_class) = 1;
744 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
745 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
746 if (access_flags & ACC_PRIVATE)
747 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
748 if (access_flags & ACC_NATIVE)
750 METHOD_NATIVE (fndecl) = 1;
751 DECL_EXTERNAL (fndecl) = 1;
754 /* FNDECL is external unless we are compiling it into this object
756 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
757 if (access_flags & ACC_STATIC)
758 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
759 if (access_flags & ACC_FINAL)
760 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
761 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
762 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
763 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
764 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
765 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
766 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
770 /* Add a method to THIS_CLASS.
771 The method's name is NAME.
772 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
775 add_method (tree this_class, int access_flags, tree name, tree method_sig)
777 tree function_type, fndecl;
778 const unsigned char *sig
779 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
782 fatal_error ("bad method signature");
784 function_type = get_type_from_signature (method_sig);
785 fndecl = add_method_1 (this_class, access_flags, name, function_type);
786 set_java_signature (TREE_TYPE (fndecl), method_sig);
791 add_field (tree class, tree name, tree field_type, int flags)
793 int is_static = (flags & ACC_STATIC) != 0;
795 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
796 TREE_CHAIN (field) = TYPE_FIELDS (class);
797 TYPE_FIELDS (class) = field;
798 DECL_CONTEXT (field) = class;
799 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
801 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
802 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
803 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
804 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
805 if (flags & ACC_VOLATILE)
807 FIELD_VOLATILE (field) = 1;
808 TREE_THIS_VOLATILE (field) = 1;
810 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
811 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
812 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
815 FIELD_STATIC (field) = 1;
816 /* Always make field externally visible. This is required so
817 that native methods can always access the field. */
818 TREE_PUBLIC (field) = 1;
819 /* Hide everything that shouldn't be visible outside a DSO. */
820 if (flag_indirect_classes
821 || (FIELD_PRIVATE (field)))
823 /* Considered external unless we are compiling it into this
825 DECL_EXTERNAL (field) = (is_compiled_class (class) != 2);
831 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
834 set_constant_value (tree field, tree constant)
836 if (field == NULL_TREE)
837 warning (OPT_Wattributes,
838 "misplaced ConstantValue attribute (not in any field)");
839 else if (DECL_INITIAL (field) != NULL_TREE)
840 warning (OPT_Wattributes,
841 "duplicate ConstantValue attribute for field '%s'",
842 IDENTIFIER_POINTER (DECL_NAME (field)));
845 DECL_INITIAL (field) = constant;
846 if (TREE_TYPE (constant) != TREE_TYPE (field)
847 && ! (TREE_TYPE (constant) == int_type_node
848 && INTEGRAL_TYPE_P (TREE_TYPE (field))
849 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
850 && ! (TREE_TYPE (constant) == utf8const_ptr_type
851 && TREE_TYPE (field) == string_ptr_type_node))
852 error ("ConstantValue attribute of field '%s' has wrong type",
853 IDENTIFIER_POINTER (DECL_NAME (field)));
854 if (FIELD_FINAL (field))
855 DECL_FIELD_FINAL_IUD (field) = 1;
859 /* Calculate a hash value for a string encoded in Utf8 format.
860 * This returns the same hash value as specified for java.lang.String.hashCode.
864 hashUtf8String (const char *str, int len)
866 const unsigned char* ptr = (const unsigned char*) str;
867 const unsigned char *limit = ptr + len;
871 int ch = UTF8_GET (ptr, limit);
872 /* Updated specification from
873 http://www.javasoft.com/docs/books/jls/clarify.html. */
874 hash = (31 * hash) + ch;
879 static GTY(()) tree utf8_decl_list = NULL_TREE;
882 build_utf8_ref (tree name)
884 const char * name_ptr = IDENTIFIER_POINTER(name);
885 int name_len = IDENTIFIER_LENGTH(name);
887 tree ctype, field = NULL_TREE, str_type, cinit, string;
888 static int utf8_count = 0;
890 tree ref = IDENTIFIER_UTF8_REF (name);
892 if (ref != NULL_TREE)
895 ctype = make_node (RECORD_TYPE);
896 str_type = build_prim_array_type (unsigned_byte_type_node,
897 name_len + 1); /* Allow for final '\0'. */
898 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
899 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
900 PUSH_FIELD (ctype, field, "data", str_type);
901 FINISH_RECORD (ctype);
902 START_RECORD_CONSTRUCTOR (cinit, ctype);
903 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
904 PUSH_FIELD_VALUE (cinit, "hash", build_int_cst (NULL_TREE, name_hash));
905 PUSH_FIELD_VALUE (cinit, "length", build_int_cst (NULL_TREE, name_len));
906 string = build_string (name_len, name_ptr);
907 TREE_TYPE (string) = str_type;
908 PUSH_FIELD_VALUE (cinit, "data", string);
909 FINISH_RECORD_CONSTRUCTOR (cinit);
910 TREE_CONSTANT (cinit) = 1;
911 TREE_INVARIANT (cinit) = 1;
913 /* Generate a unique-enough identifier. */
914 sprintf(buf, "_Utf%d", ++utf8_count);
916 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
917 TREE_STATIC (decl) = 1;
918 DECL_ARTIFICIAL (decl) = 1;
919 DECL_IGNORED_P (decl) = 1;
920 TREE_READONLY (decl) = 1;
921 TREE_THIS_VOLATILE (decl) = 0;
922 DECL_INITIAL (decl) = cinit;
924 if (HAVE_GAS_SHF_MERGE)
927 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
928 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
929 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
930 if (flag_merge_constants && decl_size < 256)
933 int flags = (SECTION_OVERRIDE
934 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
935 sprintf (buf, ".rodata.jutf8.%d", decl_size);
936 switch_to_section (get_section (buf, flags, NULL));
937 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
941 TREE_CHAIN (decl) = utf8_decl_list;
942 layout_decl (decl, 0);
944 rest_of_decl_compilation (decl, global_bindings_p (), 0);
945 varpool_mark_needed_node (varpool_node (decl));
946 utf8_decl_list = decl;
947 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
948 IDENTIFIER_UTF8_REF (name) = ref;
952 /* Like build_class_ref, but instead of a direct reference generate a
953 pointer into the constant pool. */
956 build_indirect_class_ref (tree type)
960 index = alloc_class_constant (type);
961 cl = build_ref_from_constant_pool (index);
962 return convert (promote_type (class_ptr_type), cl);
966 build_static_class_ref (tree type)
968 tree decl_name, decl, ref;
970 if (TYPE_SIZE (type) == error_mark_node)
971 return null_pointer_node;
972 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
973 "", '/', '/', ".class$$");
974 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
975 if (decl == NULL_TREE)
977 decl = build_decl (VAR_DECL, decl_name, class_type_node);
978 TREE_STATIC (decl) = 1;
979 if (! flag_indirect_classes)
981 TREE_PUBLIC (decl) = 1;
982 if (CLASS_PRIVATE (TYPE_NAME (type)))
985 DECL_IGNORED_P (decl) = 1;
986 DECL_ARTIFICIAL (decl) = 1;
987 if (is_compiled_class (type) == 1)
988 DECL_EXTERNAL (decl) = 1;
989 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
990 DECL_CLASS_FIELD_P (decl) = 1;
991 DECL_CONTEXT (decl) = type;
993 /* ??? We want to preserve the DECL_CONTEXT we set just above,
994 that that means not calling pushdecl_top_level. */
995 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
998 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1003 build_classdollar_field (tree type)
1005 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1006 "", '/', '/', ".class$");
1007 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1009 if (decl == NULL_TREE)
1012 = build_decl (VAR_DECL, decl_name,
1015 (build_type_variant (class_type_node,
1017 /* const */ 1, 0)));
1018 TREE_STATIC (decl) = 1;
1019 TREE_INVARIANT (decl) = 1;
1020 TREE_CONSTANT (decl) = 1;
1021 TREE_READONLY (decl) = 1;
1022 TREE_PUBLIC (decl) = 1;
1024 DECL_IGNORED_P (decl) = 1;
1025 DECL_ARTIFICIAL (decl) = 1;
1026 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1027 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1028 DECL_CLASS_FIELD_P (decl) = 1;
1029 DECL_CONTEXT (decl) = type;
1035 /* Create a local variable that holds the current class$. */
1038 cache_this_class_ref (tree fndecl)
1042 tree classdollar_field;
1043 if (flag_indirect_classes)
1044 classdollar_field = build_classdollar_field (output_class);
1046 classdollar_field = build_static_class_ref (output_class);
1048 this_classdollar = build_decl (VAR_DECL, NULL_TREE,
1049 TREE_TYPE (classdollar_field));
1051 java_add_local_var (this_classdollar);
1052 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1053 this_classdollar, classdollar_field));
1056 this_classdollar = build_classdollar_field (output_class);
1058 /* Prepend class initialization for static methods reachable from
1060 if (METHOD_STATIC (fndecl)
1061 && (! METHOD_PRIVATE (fndecl)
1062 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1063 && ! DECL_CLINIT_P (fndecl)
1064 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1066 tree init = build_call_expr (soft_initclass_node, 1,
1068 java_add_stmt (init);
1072 /* Remove the reference to the local variable that holds the current
1076 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1078 this_classdollar = build_classdollar_field (output_class);
1081 /* Build a reference to the class TYPE.
1082 Also handles primitive types and array types. */
1085 build_class_ref (tree type)
1087 int is_compiled = is_compiled_class (type);
1091 if (TREE_CODE (type) == POINTER_TYPE)
1092 type = TREE_TYPE (type);
1094 if (flag_indirect_dispatch
1095 && type != output_class
1096 && TREE_CODE (type) == RECORD_TYPE)
1097 return build_indirect_class_ref (type);
1099 if (type == output_class && flag_indirect_classes)
1100 return this_classdollar;
1102 if (TREE_CODE (type) == RECORD_TYPE)
1103 return build_static_class_ref (type);
1109 decl_name = TYPE_NAME (type);
1110 if (TREE_CODE (decl_name) == TYPE_DECL)
1111 decl_name = DECL_NAME (decl_name);
1112 name = IDENTIFIER_POINTER (decl_name);
1113 if (strncmp (name, "promoted_", 9) == 0)
1115 sprintf (buffer, "_Jv_%sClass", name);
1116 decl_name = get_identifier (buffer);
1117 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1118 if (decl == NULL_TREE)
1120 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1121 TREE_STATIC (decl) = 1;
1122 TREE_PUBLIC (decl) = 1;
1123 DECL_EXTERNAL (decl) = 1;
1124 DECL_ARTIFICIAL (decl) = 1;
1125 pushdecl_top_level (decl);
1129 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1133 return build_indirect_class_ref (type);
1136 /* Create a local statically allocated variable that will hold a
1137 pointer to a static field. */
1140 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1142 tree decl, decl_name;
1143 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1144 char *buf = alloca (strlen (name) + 20);
1145 sprintf (buf, "%s_%d_ref", name, index);
1146 decl_name = get_identifier (buf);
1147 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1148 if (decl == NULL_TREE)
1150 decl = build_decl (VAR_DECL, decl_name, ptr_type_node);
1151 TREE_STATIC (decl) = 1;
1152 TREE_PUBLIC (decl) = 0;
1153 DECL_EXTERNAL (decl) = 0;
1154 DECL_ARTIFICIAL (decl) = 1;
1155 DECL_IGNORED_P (decl) = 1;
1156 pushdecl_top_level (decl);
1162 build_static_field_ref (tree fdecl)
1164 tree fclass = DECL_CONTEXT (fdecl);
1165 int is_compiled = is_compiled_class (fclass);
1166 int from_class = ! CLASS_FROM_SOURCE_P (current_class);
1168 /* Allow static final fields to fold to a constant. When using
1169 -findirect-dispatch, we simply never do this folding if compiling
1170 from .class; in the .class file constants will be referred to via
1171 the constant pool. */
1172 if ((!flag_indirect_dispatch || !from_class)
1174 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1175 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1176 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1177 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1179 if (is_compiled == 1)
1180 DECL_EXTERNAL (fdecl) = 1;
1184 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1185 and a class local static variable CACHE_ENTRY, then
1187 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1188 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1191 This can mostly be optimized away, so that the usual path is a
1192 load followed by a test and branch. _Jv_ResolvePoolEntry is
1193 only called once for each constant pool entry.
1195 There is an optimization that we don't do: at the start of a
1196 method, create a local copy of CACHE_ENTRY and use that instead.
1200 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1201 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1203 = build_call_expr (built_in_decls[BUILT_IN_EXPECT], 2,
1204 build2 (EQ_EXPR, boolean_type_node,
1205 cache_entry, null_pointer_node),
1206 boolean_false_node);
1207 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1209 = build_call_expr (soft_resolvepoolentry_node, 2,
1210 build_class_ref (output_class),
1212 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1213 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1214 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1215 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1221 get_access_flags_from_decl (tree decl)
1223 int access_flags = 0;
1224 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1226 if (FIELD_STATIC (decl))
1227 access_flags |= ACC_STATIC;
1228 if (FIELD_PUBLIC (decl))
1229 access_flags |= ACC_PUBLIC;
1230 if (FIELD_PROTECTED (decl))
1231 access_flags |= ACC_PROTECTED;
1232 if (FIELD_PRIVATE (decl))
1233 access_flags |= ACC_PRIVATE;
1234 if (FIELD_FINAL (decl))
1235 access_flags |= ACC_FINAL;
1236 if (FIELD_VOLATILE (decl))
1237 access_flags |= ACC_VOLATILE;
1238 if (FIELD_TRANSIENT (decl))
1239 access_flags |= ACC_TRANSIENT;
1240 if (FIELD_ENUM (decl))
1241 access_flags |= ACC_ENUM;
1242 if (FIELD_SYNTHETIC (decl))
1243 access_flags |= ACC_SYNTHETIC;
1244 return access_flags;
1246 if (TREE_CODE (decl) == TYPE_DECL)
1248 if (CLASS_PUBLIC (decl))
1249 access_flags |= ACC_PUBLIC;
1250 if (CLASS_FINAL (decl))
1251 access_flags |= ACC_FINAL;
1252 if (CLASS_SUPER (decl))
1253 access_flags |= ACC_SUPER;
1254 if (CLASS_INTERFACE (decl))
1255 access_flags |= ACC_INTERFACE;
1256 if (CLASS_ABSTRACT (decl))
1257 access_flags |= ACC_ABSTRACT;
1258 if (CLASS_STATIC (decl))
1259 access_flags |= ACC_STATIC;
1260 if (CLASS_PRIVATE (decl))
1261 access_flags |= ACC_PRIVATE;
1262 if (CLASS_PROTECTED (decl))
1263 access_flags |= ACC_PROTECTED;
1264 if (CLASS_STRICTFP (decl))
1265 access_flags |= ACC_STRICT;
1266 if (CLASS_ENUM (decl))
1267 access_flags |= ACC_ENUM;
1268 if (CLASS_SYNTHETIC (decl))
1269 access_flags |= ACC_SYNTHETIC;
1270 if (CLASS_ANNOTATION (decl))
1271 access_flags |= ACC_ANNOTATION;
1272 return access_flags;
1274 if (TREE_CODE (decl) == FUNCTION_DECL)
1276 if (METHOD_PUBLIC (decl))
1277 access_flags |= ACC_PUBLIC;
1278 if (METHOD_PRIVATE (decl))
1279 access_flags |= ACC_PRIVATE;
1280 if (METHOD_PROTECTED (decl))
1281 access_flags |= ACC_PROTECTED;
1282 if (METHOD_STATIC (decl))
1283 access_flags |= ACC_STATIC;
1284 if (METHOD_FINAL (decl))
1285 access_flags |= ACC_FINAL;
1286 if (METHOD_SYNCHRONIZED (decl))
1287 access_flags |= ACC_SYNCHRONIZED;
1288 if (METHOD_NATIVE (decl))
1289 access_flags |= ACC_NATIVE;
1290 if (METHOD_ABSTRACT (decl))
1291 access_flags |= ACC_ABSTRACT;
1292 if (METHOD_STRICTFP (decl))
1293 access_flags |= ACC_STRICT;
1294 if (METHOD_INVISIBLE (decl))
1295 access_flags |= ACC_INVISIBLE;
1296 if (DECL_ARTIFICIAL (decl))
1297 access_flags |= ACC_SYNTHETIC;
1298 if (METHOD_BRIDGE (decl))
1299 access_flags |= ACC_BRIDGE;
1300 if (METHOD_VARARGS (decl))
1301 access_flags |= ACC_VARARGS;
1302 return access_flags;
1307 static GTY (()) int alias_labelno = 0;
1309 /* Create a private alias for METHOD. Using this alias instead of the method
1310 decl ensures that ncode entries in the method table point to the real function
1311 at runtime, not a PLT entry. */
1314 make_local_function_alias (tree method)
1316 #ifdef ASM_OUTPUT_DEF
1319 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1320 char *name = alloca (strlen (method_name) + 2);
1321 char *buf = alloca (strlen (method_name) + 128);
1323 /* Only create aliases for local functions. */
1324 if (DECL_EXTERNAL (method))
1327 /* Prefix method_name with 'L' for the alias label. */
1329 strcpy (name + 1, method_name);
1331 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1332 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1333 TREE_TYPE (method));
1334 DECL_CONTEXT (alias) = NULL;
1335 TREE_READONLY (alias) = TREE_READONLY (method);
1336 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1337 TREE_PUBLIC (alias) = 0;
1338 DECL_EXTERNAL (alias) = 0;
1339 DECL_ARTIFICIAL (alias) = 1;
1340 DECL_INLINE (alias) = 0;
1341 DECL_INITIAL (alias) = error_mark_node;
1342 TREE_ADDRESSABLE (alias) = 1;
1343 TREE_USED (alias) = 1;
1344 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1345 if (!flag_syntax_only)
1346 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1353 /** Make reflection data (_Jv_Field) for field FDECL. */
1356 make_field_value (tree fdecl)
1360 tree type = TREE_TYPE (fdecl);
1361 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1363 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1364 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1366 type = build_class_ref (type);
1369 tree signature = build_java_signature (type);
1371 type = build_utf8_ref (unmangle_classname
1372 (IDENTIFIER_POINTER (signature),
1373 IDENTIFIER_LENGTH (signature)));
1375 PUSH_FIELD_VALUE (finit, "type", type);
1377 flags = get_access_flags_from_decl (fdecl);
1379 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1381 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1382 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1385 tree field_address = integer_zero_node;
1386 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1387 && FIELD_STATIC (fdecl))
1388 field_address = build_address_of (fdecl);
1392 build_constructor_from_list (field_info_union_node,
1394 ((FIELD_STATIC (fdecl)
1395 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1396 : TYPE_FIELDS (field_info_union_node)),
1397 (FIELD_STATIC (fdecl)
1399 : byte_position (fdecl)))));
1402 FINISH_RECORD_CONSTRUCTOR (finit);
1406 /** Make reflection data (_Jv_Method) for method MDECL. */
1409 make_method_value (tree mdecl)
1411 static int method_name_count = 0;
1416 #define ACC_TRANSLATED 0x4000
1417 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1419 class_decl = DECL_CONTEXT (mdecl);
1420 /* For interfaces, the index field contains the dispatch index. */
1421 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1422 index = build_int_cst (NULL_TREE,
1423 get_interface_method_index (mdecl, class_decl));
1424 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1425 index = get_method_index (mdecl);
1427 index = integer_minus_one_node;
1429 code = null_pointer_node;
1430 if (METHOD_ABSTRACT (mdecl))
1431 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1432 soft_abstractmethod_node);
1434 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1435 make_local_function_alias (mdecl));
1436 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1437 PUSH_FIELD_VALUE (minit, "name",
1438 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1439 init_identifier_node
1440 : DECL_NAME (mdecl)));
1442 tree signature = build_java_signature (TREE_TYPE (mdecl));
1443 PUSH_FIELD_VALUE (minit, "signature",
1446 (IDENTIFIER_POINTER(signature),
1447 IDENTIFIER_LENGTH(signature)))));
1449 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1450 PUSH_FIELD_VALUE (minit, "index", index);
1451 PUSH_FIELD_VALUE (minit, "ncode", code);
1454 /* Compute the `throws' information for the method. */
1455 tree table = null_pointer_node;
1456 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1458 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1459 tree iter, type, array;
1462 table = tree_cons (NULL_TREE, table, NULL_TREE);
1463 for (iter = DECL_FUNCTION_THROWS (mdecl);
1465 iter = TREE_CHAIN (iter))
1467 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1469 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1470 IDENTIFIER_LENGTH (sig)));
1471 table = tree_cons (NULL_TREE, utf8, table);
1473 type = build_prim_array_type (ptr_type_node, length);
1474 table = build_constructor_from_list (type, table);
1475 /* Compute something unique enough. */
1476 sprintf (buf, "_methods%d", method_name_count++);
1477 array = build_decl (VAR_DECL, get_identifier (buf), type);
1478 DECL_INITIAL (array) = table;
1479 TREE_STATIC (array) = 1;
1480 DECL_ARTIFICIAL (array) = 1;
1481 DECL_IGNORED_P (array) = 1;
1482 rest_of_decl_compilation (array, 1, 0);
1484 table = build1 (ADDR_EXPR, ptr_type_node, array);
1487 PUSH_FIELD_VALUE (minit, "throws", table);
1490 FINISH_RECORD_CONSTRUCTOR (minit);
1495 get_dispatch_vector (tree type)
1497 tree vtable = TYPE_VTABLE (type);
1499 if (vtable == NULL_TREE)
1503 tree super = CLASSTYPE_SUPER (type);
1504 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1505 vtable = make_tree_vec (nvirtuals);
1506 TYPE_VTABLE (type) = vtable;
1507 if (super != NULL_TREE)
1509 tree super_vtable = get_dispatch_vector (super);
1511 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1512 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1515 for (method = TYPE_METHODS (type); method != NULL_TREE;
1516 method = TREE_CHAIN (method))
1518 tree method_index = get_method_index (method);
1519 if (method_index != NULL_TREE
1520 && host_integerp (method_index, 0))
1521 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1529 get_dispatch_table (tree type, tree this_class_addr)
1531 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1532 tree vtable = get_dispatch_vector (type);
1534 tree list = NULL_TREE;
1535 int nvirtuals = TREE_VEC_LENGTH (vtable);
1539 for (i = nvirtuals; --i >= 0; )
1541 tree method = TREE_VEC_ELT (vtable, i);
1542 if (METHOD_ABSTRACT (method))
1545 warning (0, "%Jabstract method in non-abstract class", method);
1547 if (TARGET_VTABLE_USES_DESCRIPTORS)
1548 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1549 list = tree_cons (NULL_TREE, null_pointer_node, list);
1551 list = tree_cons (NULL_TREE, null_pointer_node, list);
1555 if (TARGET_VTABLE_USES_DESCRIPTORS)
1556 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1558 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1559 method, build_int_cst (NULL_TREE, j));
1560 TREE_CONSTANT (fdesc) = 1;
1561 TREE_INVARIANT (fdesc) = 1;
1562 list = tree_cons (NULL_TREE, fdesc, list);
1565 list = tree_cons (NULL_TREE,
1566 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1572 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1573 using the Boehm GC we sometimes stash a GC type descriptor
1574 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1575 the emitted byte count during the output to the assembly file. */
1576 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1577 fake "function descriptor". It's first word is the is the class
1578 pointer, and subsequent words (usually one) contain the GC descriptor.
1579 In all other cases, we reserve two extra vtable slots. */
1580 gc_descr = get_boehm_type_descriptor (type);
1581 list = tree_cons (NULL_TREE, gc_descr, list);
1582 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1583 list = tree_cons (NULL_TREE, gc_descr, list);
1584 list = tree_cons (NULL_TREE, this_class_addr, list);
1586 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1587 list = tree_cons (NULL_TREE, null_pointer_node, list);
1588 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1589 list = tree_cons (integer_zero_node, null_pointer_node, list);
1591 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1592 if (TARGET_VTABLE_USES_DESCRIPTORS)
1593 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1595 return build_constructor_from_list
1596 (build_prim_array_type (nativecode_ptr_type_node,
1601 /* Set the method_index for a method decl. */
1603 set_method_index (tree decl, tree method_index)
1605 if (method_index != NULL_TREE)
1607 /* method_index is null if we're using indirect dispatch. */
1608 method_index = fold (convert (sizetype, method_index));
1610 if (TARGET_VTABLE_USES_DESCRIPTORS)
1611 /* Add one to skip bogus descriptor for class and GC descriptor. */
1612 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1614 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1616 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1619 DECL_VINDEX (decl) = method_index;
1622 /* Get the method_index for a method decl. */
1624 get_method_index (tree decl)
1626 tree method_index = DECL_VINDEX (decl);
1631 if (TARGET_VTABLE_USES_DESCRIPTORS)
1632 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1633 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1635 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1636 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1638 return method_index;
1642 supers_all_compiled (tree type)
1644 while (type != NULL_TREE)
1646 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1648 type = CLASSTYPE_SUPER (type);
1654 make_class_data (tree type)
1656 tree decl, cons, temp;
1657 tree field, fields_decl;
1658 tree static_fields = NULL_TREE;
1659 tree instance_fields = NULL_TREE;
1660 HOST_WIDE_INT static_field_count = 0;
1661 HOST_WIDE_INT instance_field_count = 0;
1662 HOST_WIDE_INT field_count;
1663 tree field_array_type;
1665 tree methods = NULL_TREE;
1666 tree dtable_decl = NULL_TREE;
1667 HOST_WIDE_INT method_count = 0;
1668 tree method_array_type;
1671 tree this_class_addr;
1672 tree constant_pool_constructor;
1673 tree interfaces = null_pointer_node;
1674 int interface_len = 0;
1675 int uses_jv_markobj = 0;
1676 tree type_decl = TYPE_NAME (type);
1677 tree id_main = get_identifier("main");
1678 tree id_class = get_identifier("java.lang.Class");
1679 /** Offset from start of virtual function table declaration
1680 to where objects actually point at, following new g++ ABI. */
1681 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1682 VEC(int, heap) *field_indexes;
1683 tree first_real_field;
1685 this_class_addr = build_static_class_ref (type);
1686 decl = TREE_OPERAND (this_class_addr, 0);
1688 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1689 && !flag_indirect_dispatch)
1691 tree dtable = get_dispatch_table (type, this_class_addr);
1692 uses_jv_markobj = uses_jv_markobj_p (dtable);
1693 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1695 /* We've already created some other class, and consequently
1696 we made class_dtable_decl. Now we just want to fill it
1698 dtable_decl = class_dtable_decl;
1702 dtable_decl = build_dtable_decl (type);
1703 TREE_STATIC (dtable_decl) = 1;
1704 DECL_ARTIFICIAL (dtable_decl) = 1;
1705 DECL_IGNORED_P (dtable_decl) = 1;
1708 TREE_PUBLIC (dtable_decl) = 1;
1709 DECL_INITIAL (dtable_decl) = dtable;
1710 /* The only dispatch table exported from a DSO is the dispatch
1711 table for java.lang.Class. */
1712 if (DECL_NAME (type_decl) != id_class)
1714 if (! flag_indirect_classes)
1715 rest_of_decl_compilation (dtable_decl, 1, 0);
1716 /* Maybe we're compiling Class as the first class. If so, set
1717 class_dtable_decl to the decl we just made. */
1718 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1719 class_dtable_decl = dtable_decl;
1722 /* Build Field array. */
1723 field = TYPE_FIELDS (type);
1724 while (field && DECL_ARTIFICIAL (field))
1725 field = TREE_CHAIN (field); /* Skip dummy fields. */
1726 if (field && DECL_NAME (field) == NULL_TREE)
1727 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1728 first_real_field = field;
1730 /* First count static and instance fields. */
1731 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1733 if (! DECL_ARTIFICIAL (field))
1735 if (FIELD_STATIC (field))
1736 static_field_count++;
1737 else if (uses_jv_markobj || !flag_reduced_reflection)
1738 instance_field_count++;
1741 field_count = static_field_count + instance_field_count;
1742 field_indexes = VEC_alloc (int, heap, field_count);
1744 /* gcj sorts fields so that static fields come first, followed by
1745 instance fields. Unfortunately, by the time this takes place we
1746 have already generated the reflection_data for this class, and
1747 that data contains indexes into the fields. So, we generate a
1748 permutation that maps each original field index to its final
1749 position. Then we pass this permutation to
1750 rewrite_reflection_indexes(), which fixes up the reflection
1754 int static_count = 0;
1755 int instance_count = static_field_count;
1758 for (i = 0, field = first_real_field;
1760 field = TREE_CHAIN (field), i++)
1762 if (! DECL_ARTIFICIAL (field))
1765 if (FIELD_STATIC (field))
1766 field_index = static_count++;
1767 else if (uses_jv_markobj || !flag_reduced_reflection)
1768 field_index = instance_count++;
1769 VEC_quick_push (int, field_indexes, field_index);
1774 for (field = first_real_field; field != NULL_TREE;
1775 field = TREE_CHAIN (field))
1777 if (! DECL_ARTIFICIAL (field))
1779 if (FIELD_STATIC (field))
1781 /* We must always create reflection data for static fields
1782 as it is used in the creation of the field itself. */
1783 tree init = make_field_value (field);
1784 tree initial = DECL_INITIAL (field);
1785 static_fields = tree_cons (NULL_TREE, init, static_fields);
1786 /* If the initial value is a string constant,
1787 prevent output_constant from trying to assemble the value. */
1788 if (initial != NULL_TREE
1789 && TREE_TYPE (initial) == string_ptr_type_node)
1790 DECL_INITIAL (field) = NULL_TREE;
1791 rest_of_decl_compilation (field, 1, 1);
1792 DECL_INITIAL (field) = initial;
1794 else if (uses_jv_markobj || !flag_reduced_reflection)
1796 tree init = make_field_value (field);
1797 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1802 if (field_count > 0)
1804 static_fields = nreverse (static_fields);
1805 instance_fields = nreverse (instance_fields);
1806 static_fields = chainon (static_fields, instance_fields);
1807 field_array_type = build_prim_array_type (field_type_node, field_count);
1808 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1810 DECL_INITIAL (fields_decl) = build_constructor_from_list
1811 (field_array_type, static_fields);
1812 TREE_STATIC (fields_decl) = 1;
1813 DECL_ARTIFICIAL (fields_decl) = 1;
1814 DECL_IGNORED_P (fields_decl) = 1;
1815 rest_of_decl_compilation (fields_decl, 1, 0);
1818 fields_decl = NULL_TREE;
1820 /* Build Method array. */
1821 for (method = TYPE_METHODS (type);
1822 method != NULL_TREE; method = TREE_CHAIN (method))
1825 if (METHOD_PRIVATE (method)
1826 && ! flag_keep_inline_functions
1829 /* Even if we have a decl, we don't necessarily have the code.
1830 This can happen if we inherit a method from a superclass for
1831 which we don't have a .class file. */
1832 if (METHOD_DUMMY (method))
1835 /* Generate method reflection data if:
1837 - !flag_reduced_reflection.
1839 - <clinit> -- The runtime uses reflection to initialize the
1842 - Any method in class java.lang.Class -- Class.forName() and
1843 perhaps other things require it.
1845 - class$ -- It does not work if reflection data missing.
1847 - main -- Reflection is used to find main(String[]) methods.
1849 - public not static -- It is potentially part of an
1850 interface. The runtime uses reflection data to build
1851 interface dispatch tables. */
1852 if (!flag_reduced_reflection
1853 || DECL_CLINIT_P (method)
1854 || DECL_NAME (type_decl) == id_class
1855 || DECL_NAME (method) == id_main
1856 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
1857 || TYPE_DOT_CLASS (type) == method)
1859 init = make_method_value (method);
1861 methods = tree_cons (NULL_TREE, init, methods);
1864 method_array_type = build_prim_array_type (method_type_node, method_count);
1865 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1867 DECL_INITIAL (methods_decl) = build_constructor_from_list
1868 (method_array_type, nreverse (methods));
1869 TREE_STATIC (methods_decl) = 1;
1870 DECL_ARTIFICIAL (methods_decl) = 1;
1871 DECL_IGNORED_P (methods_decl) = 1;
1872 rest_of_decl_compilation (methods_decl, 1, 0);
1874 if (class_dtable_decl == NULL_TREE)
1876 class_dtable_decl = build_dtable_decl (class_type_node);
1877 TREE_STATIC (class_dtable_decl) = 1;
1878 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1879 DECL_IGNORED_P (class_dtable_decl) = 1;
1880 if (is_compiled_class (class_type_node) != 2)
1882 DECL_EXTERNAL (class_dtable_decl) = 1;
1883 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1887 super = CLASSTYPE_SUPER (type);
1888 if (super == NULL_TREE)
1889 super = null_pointer_node;
1890 else if (! flag_indirect_dispatch
1891 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1892 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1893 super = build_class_ref (super);
1896 int super_index = alloc_class_constant (super);
1897 super = build_int_cst (ptr_type_node, super_index);
1900 /* Build and emit the array of implemented interfaces. */
1901 if (type != object_type_node)
1902 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1904 if (interface_len > 0)
1906 tree init = NULL_TREE;
1908 tree interface_array_type, idecl;
1909 interface_array_type
1910 = build_prim_array_type (class_ptr_type, interface_len);
1911 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1912 interface_array_type);
1914 for (i = interface_len; i > 0; i--)
1916 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1917 tree iclass = BINFO_TYPE (child);
1919 if (! flag_indirect_dispatch
1921 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1922 index = build_class_ref (iclass);
1925 int int_index = alloc_class_constant (iclass);
1926 index = build_int_cst (ptr_type_node, int_index);
1928 init = tree_cons (NULL_TREE, index, init);
1930 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
1932 TREE_STATIC (idecl) = 1;
1933 DECL_ARTIFICIAL (idecl) = 1;
1934 DECL_IGNORED_P (idecl) = 1;
1935 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1936 rest_of_decl_compilation (idecl, 1, 0);
1939 constant_pool_constructor = build_constants_constructor ();
1941 if (flag_indirect_dispatch)
1943 TYPE_OTABLE_DECL (type)
1945 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1946 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1947 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1949 TYPE_ATABLE_DECL (type)
1951 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1952 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1953 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1955 TYPE_ITABLE_DECL (type)
1957 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1958 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1959 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1962 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1964 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1965 PUSH_FIELD_VALUE (temp, "vtable",
1966 (flag_indirect_classes
1968 : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
1969 build1 (ADDR_EXPR, dtable_ptr_type,
1971 dtable_start_offset)));
1972 if (! flag_hash_synchronization)
1973 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1974 FINISH_RECORD_CONSTRUCTOR (temp);
1975 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1976 PUSH_SUPER_VALUE (cons, temp);
1977 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1978 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1979 PUSH_FIELD_VALUE (cons, "accflags",
1980 build_int_cst (NULL_TREE,
1981 get_access_flags_from_decl (type_decl)));
1983 PUSH_FIELD_VALUE (cons, "superclass",
1984 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1985 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1986 PUSH_FIELD_VALUE (cons, "methods",
1987 methods_decl == NULL_TREE ? null_pointer_node
1988 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1989 PUSH_FIELD_VALUE (cons, "method_count",
1990 build_int_cst (NULL_TREE, method_count));
1992 if (flag_indirect_dispatch)
1993 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1995 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1997 PUSH_FIELD_VALUE (cons, "fields",
1998 fields_decl == NULL_TREE ? null_pointer_node
1999 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2000 /* If we're using the binary compatibility ABI we don't know the
2001 size until load time. */
2002 PUSH_FIELD_VALUE (cons, "size_in_bytes",
2003 (flag_indirect_dispatch
2004 ? integer_minus_one_node
2005 : size_in_bytes (type)));
2006 PUSH_FIELD_VALUE (cons, "field_count",
2007 build_int_cst (NULL_TREE, field_count));
2008 PUSH_FIELD_VALUE (cons, "static_field_count",
2009 build_int_cst (NULL_TREE, static_field_count));
2011 if (flag_indirect_dispatch)
2012 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
2014 PUSH_FIELD_VALUE (cons, "vtable",
2015 dtable_decl == NULL_TREE ? null_pointer_node
2016 : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
2017 build1 (ADDR_EXPR, dtable_ptr_type,
2019 dtable_start_offset));
2020 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
2022 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
2023 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
2027 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type));
2028 PUSH_FIELD_VALUE (cons, "otable",
2029 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
2030 PUSH_FIELD_VALUE (cons, "otable_syms",
2031 build1 (ADDR_EXPR, symbols_array_ptr_type,
2032 TYPE_OTABLE_SYMS_DECL (type)));
2033 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
2034 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
2036 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
2038 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
2039 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
2043 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type));
2044 PUSH_FIELD_VALUE (cons, "atable",
2045 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
2046 PUSH_FIELD_VALUE (cons, "atable_syms",
2047 build1 (ADDR_EXPR, symbols_array_ptr_type,
2048 TYPE_ATABLE_SYMS_DECL (type)));
2049 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
2050 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
2052 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
2054 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
2055 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
2059 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type));
2060 PUSH_FIELD_VALUE (cons, "itable",
2061 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
2062 PUSH_FIELD_VALUE (cons, "itable_syms",
2063 build1 (ADDR_EXPR, symbols_array_ptr_type,
2064 TYPE_ITABLE_SYMS_DECL (type)));
2065 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
2066 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
2069 PUSH_FIELD_VALUE (cons, "catch_classes",
2070 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2071 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
2072 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
2073 PUSH_FIELD_VALUE (cons, "interface_count",
2074 build_int_cst (NULL_TREE, interface_len));
2075 PUSH_FIELD_VALUE (cons, "state",
2076 convert (byte_type_node,
2077 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2079 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
2080 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
2081 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
2082 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
2083 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
2084 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
2087 tree assertion_table_ref;
2088 if (TYPE_ASSERTIONS (type) == NULL)
2089 assertion_table_ref = null_pointer_node;
2091 assertion_table_ref = build1 (ADDR_EXPR,
2092 build_pointer_type (assertion_table_type),
2093 emit_assertion_table (type));
2095 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
2098 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
2099 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
2100 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
2101 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
2103 if (TYPE_REFLECTION_DATA (current_class))
2106 int count = TYPE_REFLECTION_DATASIZE (current_class);
2107 VEC (constructor_elt, gc) *v
2108 = VEC_alloc (constructor_elt, gc, count);
2109 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2110 tree max_index = build_int_cst (sizetype, count);
2111 tree index = build_index_type (max_index);
2112 tree type = build_array_type (unsigned_byte_type_node, index);
2115 static int reflection_data_count;
2117 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2118 array = build_decl (VAR_DECL, get_identifier (buf), type);
2120 rewrite_reflection_indexes (field_indexes);
2122 for (i = 0; i < count; i++)
2124 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2125 elt->index = build_int_cst (sizetype, i);
2126 elt->value = build_int_cstu (byte_type_node, data[i]);
2129 DECL_INITIAL (array) = build_constructor (type, v);
2130 TREE_STATIC (array) = 1;
2131 DECL_ARTIFICIAL (array) = 1;
2132 DECL_IGNORED_P (array) = 1;
2133 TREE_READONLY (array) = 1;
2134 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2135 rest_of_decl_compilation (array, 1, 0);
2137 PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
2140 TYPE_REFLECTION_DATA (current_class) = NULL;
2143 PUSH_FIELD_VALUE (cons, "reflection_data", null_pointer_node);
2145 FINISH_RECORD_CONSTRUCTOR (cons);
2147 DECL_INITIAL (decl) = cons;
2149 /* Hash synchronization requires at least 64-bit alignment. */
2150 if (flag_hash_synchronization && POINTER_SIZE < 64)
2151 DECL_ALIGN (decl) = 64;
2153 if (flag_indirect_classes)
2155 TREE_READONLY (decl) = 1;
2156 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2159 rest_of_decl_compilation (decl, 1, 0);
2162 tree classdollar_field = build_classdollar_field (type);
2163 if (!flag_indirect_classes)
2164 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2165 rest_of_decl_compilation (classdollar_field, 1, 0);
2168 TYPE_OTABLE_DECL (type) = NULL_TREE;
2169 TYPE_ATABLE_DECL (type) = NULL_TREE;
2170 TYPE_CTABLE_DECL (type) = NULL_TREE;
2176 if (TYPE_VERIFY_METHOD (output_class))
2178 tree verify_method = TYPE_VERIFY_METHOD (output_class);
2179 DECL_SAVED_TREE (verify_method)
2180 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
2181 build1 (RETURN_EXPR, void_type_node, NULL));
2182 java_genericize (verify_method);
2183 cgraph_finalize_function (verify_method, false);
2184 TYPE_ASSERTIONS (current_class) = NULL;
2187 java_expand_catch_classes (current_class);
2189 current_function_decl = NULL_TREE;
2190 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2191 make_class_data (current_class);
2193 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2196 /* Return 2 if CLASS is compiled by this compilation job;
2197 return 1 if CLASS can otherwise be assumed to be compiled;
2198 return 0 if we cannot assume that CLASS is compiled.
2199 Returns 1 for primitive and 0 for array types. */
2201 is_compiled_class (tree class)
2204 if (TREE_CODE (class) == POINTER_TYPE)
2205 class = TREE_TYPE (class);
2206 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
2208 if (TYPE_ARRAY_P (class))
2211 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2212 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2214 /* The class was seen in the current ZIP file and will be
2215 available as a compiled class in the future but may not have
2216 been loaded already. Load it if necessary. This prevent
2217 build_class_ref () from crashing. */
2219 if (seen_in_zip && !CLASS_LOADED_P (class) && (class != current_class))
2220 load_class (class, 1);
2222 /* We return 2 for class seen in ZIP and class from files
2223 belonging to the same compilation unit */
2227 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2229 if (!CLASS_LOADED_P (class))
2231 if (CLASS_FROM_SOURCE_P (class))
2232 safe_layout_class (class);
2233 else if (class != current_class)
2234 load_class (class, 1);
2242 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2245 build_dtable_decl (tree type)
2249 /* We need to build a new dtable type so that its size is uniquely
2250 computed when we're dealing with the class for real and not just
2251 faking it (like java.lang.Class during the initialization of the
2252 compiler.) We know we're not faking a class when CURRENT_CLASS is
2254 if (current_class == type)
2256 tree dummy = NULL_TREE;
2259 dtype = make_node (RECORD_TYPE);
2261 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
2262 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
2264 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
2265 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2267 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2268 TREE_CHAIN (dummy) = tmp_field;
2269 DECL_CONTEXT (tmp_field) = dtype;
2270 DECL_ARTIFICIAL (tmp_field) = 1;
2274 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
2275 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2277 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2278 TREE_CHAIN (dummy) = tmp_field;
2279 DECL_CONTEXT (tmp_field) = dtype;
2280 DECL_ARTIFICIAL (tmp_field) = 1;
2284 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2285 if (TARGET_VTABLE_USES_DESCRIPTORS)
2286 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2288 PUSH_FIELD (dtype, dummy, "methods",
2289 build_prim_array_type (nativecode_ptr_type_node, n));
2290 layout_type (dtype);
2293 dtype = dtable_type;
2295 decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
2296 DECL_CONTEXT (decl) = type;
2297 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2298 DECL_VTABLE_P (decl) = 1;
2303 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2304 fields inherited from SUPER_CLASS. */
2307 push_super_field (tree this_class, tree super_class)
2310 /* Don't insert the field if we're just re-laying the class out. */
2311 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2313 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2314 DECL_IGNORED_P (base_decl) = 1;
2315 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2316 TYPE_FIELDS (this_class) = base_decl;
2317 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2318 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2321 /* Handle the different manners we may have to lay out a super class. */
2324 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2328 else if (TREE_CODE (super_class) == RECORD_TYPE)
2330 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2331 safe_layout_class (super_class);
2332 if (!CLASS_LOADED_P (super_class))
2333 load_class (super_class, 1);
2335 /* We might have to layout the class before its dependency on
2336 the super class gets resolved by java_complete_class */
2337 else if (TREE_CODE (super_class) == POINTER_TYPE)
2339 if (TREE_TYPE (super_class) != NULL_TREE)
2340 super_class = TREE_TYPE (super_class);
2344 if (!TYPE_SIZE (super_class))
2345 safe_layout_class (super_class);
2350 /* safe_layout_class just makes sure that we can load a class without
2351 disrupting the current_class, input_file, input_line, etc, information
2352 about the class processed currently. */
2355 safe_layout_class (tree class)
2357 tree save_current_class = current_class;
2358 location_t save_location = input_location;
2360 layout_class (class);
2362 current_class = save_current_class;
2363 input_location = save_location;
2367 layout_class (tree this_class)
2369 tree super_class = CLASSTYPE_SUPER (this_class);
2371 class_list = tree_cons (this_class, NULL_TREE, class_list);
2372 if (CLASS_BEING_LAIDOUT (this_class))
2378 sprintf (buffer, " with '%s'",
2379 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2380 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2382 for (current = TREE_CHAIN (class_list); current;
2383 current = TREE_CHAIN (current))
2385 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2386 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2387 IDENTIFIER_POINTER (DECL_NAME (decl)),
2388 DECL_SOURCE_FILE (decl),
2389 DECL_SOURCE_LINE (decl));
2390 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2392 obstack_1grow (&temporary_obstack, '\0');
2393 report = obstack_finish (&temporary_obstack);
2394 cyclic_inheritance_report = ggc_strdup (report);
2395 obstack_free (&temporary_obstack, report);
2396 TYPE_SIZE (this_class) = error_mark_node;
2399 CLASS_BEING_LAIDOUT (this_class) = 1;
2401 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2403 tree maybe_super_class
2404 = maybe_layout_super_class (super_class, this_class);
2405 if (maybe_super_class == NULL
2406 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2408 TYPE_SIZE (this_class) = error_mark_node;
2409 CLASS_BEING_LAIDOUT (this_class) = 0;
2410 class_list = TREE_CHAIN (class_list);
2413 if (TYPE_SIZE (this_class) == NULL_TREE)
2414 push_super_field (this_class, maybe_super_class);
2417 layout_type (this_class);
2419 /* Also recursively load/layout any superinterfaces, but only if
2420 class was loaded from bytecode. The source parser will take care
2422 if (!CLASS_FROM_SOURCE_P (this_class))
2425 if (TYPE_BINFO (this_class))
2427 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2429 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2430 tree super_interface = BINFO_TYPE (binfo);
2431 tree maybe_super_interface
2432 = maybe_layout_super_class (super_interface, NULL_TREE);
2433 if (maybe_super_interface == NULL
2434 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2436 TYPE_SIZE (this_class) = error_mark_node;
2437 CLASS_BEING_LAIDOUT (this_class) = 0;
2438 class_list = TREE_CHAIN (class_list);
2445 /* Convert the size back to an SI integer value. */
2446 TYPE_SIZE_UNIT (this_class) =
2447 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2449 CLASS_BEING_LAIDOUT (this_class) = 0;
2450 class_list = TREE_CHAIN (class_list);
2454 add_miranda_methods (tree base_class, tree search_class)
2457 tree binfo, base_binfo;
2459 if (!CLASS_PARSED_P (search_class))
2460 load_class (search_class, 1);
2462 for (binfo = TYPE_BINFO (search_class), i = 1;
2463 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2466 tree elt = BINFO_TYPE (base_binfo);
2468 /* FIXME: This is totally bogus. We should not be handling
2469 Miranda methods at all if we're using the BC ABI. */
2470 if (TYPE_DUMMY (elt))
2473 /* Ensure that interface methods are seen in declared order. */
2474 if (!CLASS_LOADED_P (elt))
2475 load_class (elt, 1);
2476 layout_class_methods (elt);
2478 /* All base classes will have been laid out at this point, so the order
2479 will be correct. This code must match similar layout code in the
2481 for (method_decl = TYPE_METHODS (elt);
2482 method_decl; method_decl = TREE_CHAIN (method_decl))
2486 /* An interface can have <clinit>. */
2487 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2490 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2491 override = lookup_argument_method (base_class,
2492 DECL_NAME (method_decl), sig);
2493 if (override == NULL_TREE)
2495 /* Found a Miranda method. Add it. */
2497 sig = build_java_signature (TREE_TYPE (method_decl));
2499 = add_method (base_class,
2500 get_access_flags_from_decl (method_decl),
2501 DECL_NAME (method_decl), sig);
2502 METHOD_INVISIBLE (new_method) = 1;
2506 /* Try superinterfaces. */
2507 add_miranda_methods (base_class, elt);
2512 layout_class_methods (tree this_class)
2514 tree method_decl, dtable_count;
2515 tree super_class, type_name;
2517 if (TYPE_NVIRTUALS (this_class))
2520 super_class = CLASSTYPE_SUPER (this_class);
2524 super_class = maybe_layout_super_class (super_class, this_class);
2525 if (!TYPE_NVIRTUALS (super_class))
2526 layout_class_methods (super_class);
2527 dtable_count = TYPE_NVIRTUALS (super_class);
2530 dtable_count = integer_zero_node;
2532 type_name = TYPE_NAME (this_class);
2533 if (!flag_indirect_dispatch
2534 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2536 /* An abstract class can have methods which are declared only in
2537 an implemented interface. These are called "Miranda
2538 methods". We make a dummy method entry for such methods
2540 add_miranda_methods (this_class, this_class);
2543 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2545 for (method_decl = TYPE_METHODS (this_class);
2546 method_decl; method_decl = TREE_CHAIN (method_decl))
2547 dtable_count = layout_class_method (this_class, super_class,
2548 method_decl, dtable_count);
2550 TYPE_NVIRTUALS (this_class) = dtable_count;
2553 /* Return the index of METHOD in INTERFACE. This index begins at 1
2554 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2556 get_interface_method_index (tree method, tree interface)
2561 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2565 /* We don't want to put <clinit> into the interface table. */
2566 if (! ID_CLINIT_P (DECL_NAME (meth)))
2568 gcc_assert (meth != NULL_TREE);
2572 /* Lay METHOD_DECL out, returning a possibly new value of
2573 DTABLE_COUNT. Also mangle the method's name. */
2576 layout_class_method (tree this_class, tree super_class,
2577 tree method_decl, tree dtable_count)
2579 tree method_name = DECL_NAME (method_decl);
2581 TREE_PUBLIC (method_decl) = 1;
2583 if (flag_indirect_classes
2584 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2585 && ! METHOD_NATIVE (method_decl)
2586 && ! special_method_p (method_decl)))
2589 /* Considered external unless it is being compiled into this object
2590 file, or it was already flagged as external. */
2591 if (!DECL_EXTERNAL (method_decl))
2592 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2593 || METHOD_NATIVE (method_decl));
2595 if (ID_INIT_P (method_name))
2597 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2599 for (ptr = p; *ptr; )
2604 DECL_CONSTRUCTOR_P (method_decl) = 1;
2605 build_java_signature (TREE_TYPE (method_decl));
2607 else if (! METHOD_STATIC (method_decl))
2610 build_java_signature (TREE_TYPE (method_decl));
2611 bool method_override = false;
2612 tree super_method = lookup_java_method (super_class, method_name,
2614 if (super_method != NULL_TREE
2615 && ! METHOD_DUMMY (super_method))
2617 method_override = true;
2618 if (! METHOD_PUBLIC (super_method) &&
2619 ! METHOD_PROTECTED (super_method))
2621 /* Don't override private method, or default-access method in
2623 if (METHOD_PRIVATE (super_method) ||
2624 ! in_same_package (TYPE_NAME (this_class),
2625 TYPE_NAME (super_class)))
2626 method_override = false;
2629 if (method_override)
2631 tree method_index = get_method_index (super_method);
2632 set_method_index (method_decl, method_index);
2633 if (method_index == NULL_TREE
2634 && ! flag_indirect_dispatch
2635 && !CLASS_FROM_SOURCE_P (this_class)
2636 && ! DECL_ARTIFICIAL (super_method))
2637 error ("non-static method %q+D overrides static method",
2640 else if (this_class == object_type_node
2641 && (METHOD_FINAL (method_decl)
2642 || METHOD_PRIVATE (method_decl)))
2644 /* We don't generate vtable entries for final Object
2645 methods. This is simply to save space, since every
2646 object would otherwise have to define them. */
2648 else if (! METHOD_PRIVATE (method_decl)
2651 /* We generate vtable entries for final methods because they
2652 may one day be changed to non-final. */
2653 set_method_index (method_decl, dtable_count);
2654 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2655 dtable_count, integer_one_node);
2659 return dtable_count;
2663 register_class (void)
2667 if (!registered_class)
2668 registered_class = VEC_alloc (tree, gc, 8);
2670 if (flag_indirect_classes)
2671 node = current_class;
2673 node = TREE_OPERAND (build_class_ref (current_class), 0);
2674 VEC_safe_push (tree, gc, registered_class, node);
2677 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2678 all the classes we have emitted. */
2681 emit_indirect_register_classes (tree *list_p)
2683 tree klass, t, register_class_fn;
2686 tree init = NULL_TREE;
2687 int size = VEC_length (tree, registered_class) * 2 + 1;
2688 tree class_array_type
2689 = build_prim_array_type (ptr_type_node, size);
2690 tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"),
2692 tree reg_class_list;
2693 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2695 init = tree_cons (NULL_TREE,
2696 fold_convert (ptr_type_node,
2697 build_static_class_ref (klass)), init);
2700 fold_convert (ptr_type_node,
2701 build_address_of (build_classdollar_field (klass))),
2704 init = tree_cons (NULL_TREE, integer_zero_node, init);
2705 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2707 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2708 TREE_STATIC (cdecl) = 1;
2709 DECL_ARTIFICIAL (cdecl) = 1;
2710 DECL_IGNORED_P (cdecl) = 1;
2711 TREE_READONLY (cdecl) = 1;
2712 TREE_CONSTANT (cdecl) = 1;
2713 rest_of_decl_compilation (cdecl, 1, 0);
2714 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2716 t = build_function_type_list (void_type_node,
2717 build_pointer_type (ptr_type_node), NULL);
2718 t = build_decl (FUNCTION_DECL,
2719 get_identifier ("_Jv_RegisterNewClasses"), t);
2720 TREE_PUBLIC (t) = 1;
2721 DECL_EXTERNAL (t) = 1;
2722 register_class_fn = t;
2723 t = build_call_expr (register_class_fn, 1, reg_class_list);
2724 append_to_statement_list (t, list_p);
2728 /* Emit something to register classes at start-up time.
2730 The preferred mechanism is through the .jcr section, which contain
2731 a list of pointers to classes which get registered during constructor
2734 The fallback mechanism is to add statements to *LIST_P to call
2735 _Jv_RegisterClass for each class in this file. These statements will
2736 be added to a static constructor function for this translation unit. */
2739 emit_register_classes (tree *list_p)
2741 if (registered_class == NULL)
2744 if (flag_indirect_classes)
2746 emit_indirect_register_classes (list_p);
2750 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2751 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2752 but lack suitable crtbegin/end objects or linker support. These
2753 targets can override the default in tm.h to use the fallback mechanism. */
2754 if (TARGET_USE_JCR_SECTION)
2759 #ifdef JCR_SECTION_NAME
2760 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2762 /* A target has defined TARGET_USE_JCR_SECTION,
2763 but doesn't have a JCR_SECTION_NAME. */
2766 assemble_align (POINTER_SIZE);
2768 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2770 t = build_fold_addr_expr (klass);
2771 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2776 tree klass, t, register_class_fn;
2779 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2780 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2781 TREE_PUBLIC (t) = 1;
2782 DECL_EXTERNAL (t) = 1;
2783 register_class_fn = t;
2785 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2787 t = build_fold_addr_expr (klass);
2788 t = build_call_expr (register_class_fn, 1, t);
2789 append_to_statement_list (t, list_p);
2794 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2797 build_symbol_entry (tree decl, tree special)
2799 tree clname, name, signature, sym;
2800 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2801 /* ??? Constructors are given the name foo.foo all the way through
2802 the compiler, but in the method table they're all renamed
2803 foo.<init>. So, we have to do the same here unless we want an
2804 unresolved reference at runtime. */
2805 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2806 && DECL_CONSTRUCTOR_P (decl))
2807 ? init_identifier_node
2808 : DECL_NAME (decl));
2809 signature = build_java_signature (TREE_TYPE (decl));
2810 signature = build_utf8_ref (unmangle_classname
2811 (IDENTIFIER_POINTER (signature),
2812 IDENTIFIER_LENGTH (signature)));
2813 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2814 signature addr+1 if SPECIAL, and this indicates to the runtime
2815 system that this is a "special" symbol, i.e. one that should
2816 bypass access controls. */
2817 if (special != NULL_TREE)
2818 signature = build2 (POINTER_PLUS_EXPR, TREE_TYPE (signature), signature,
2819 fold_convert (sizetype, special));
2821 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2822 PUSH_FIELD_VALUE (sym, "clname", clname);
2823 PUSH_FIELD_VALUE (sym, "name", name);
2824 PUSH_FIELD_VALUE (sym, "signature", signature);
2825 FINISH_RECORD_CONSTRUCTOR (sym);
2826 TREE_CONSTANT (sym) = 1;
2827 TREE_INVARIANT (sym) = 1;
2832 /* Emit a symbol table: used by -findirect-dispatch. */
2835 emit_symbol_table (tree name, tree the_table, tree decl_list,
2836 tree the_syms_decl, tree the_array_element_type,
2839 tree method_list, method, table, list, null_symbol;
2840 tree table_size, the_array_type;
2843 /* Only emit a table if this translation unit actually made any
2844 references via it. */
2845 if (decl_list == NULL_TREE)
2848 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2850 method_list = decl_list;
2852 while (method_list != NULL_TREE)
2854 tree special = TREE_PURPOSE (method_list);
2855 method = TREE_VALUE (method_list);
2856 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2857 method_list = TREE_CHAIN (method_list);
2861 /* Terminate the list with a "null" entry. */
2862 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2863 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2864 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2865 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2866 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2867 TREE_CONSTANT (null_symbol) = 1;
2868 TREE_INVARIANT (null_symbol) = 1;
2869 list = tree_cons (NULL_TREE, null_symbol, list);
2871 /* Put the list in the right order and make it a constructor. */
2872 list = nreverse (list);
2873 table = build_constructor_from_list (symbols_array_type, list);
2875 /* Make it the initial value for otable_syms and emit the decl. */
2876 DECL_INITIAL (the_syms_decl) = table;
2877 DECL_ARTIFICIAL (the_syms_decl) = 1;
2878 DECL_IGNORED_P (the_syms_decl) = 1;
2879 rest_of_decl_compilation (the_syms_decl, 1, 0);
2881 /* Now that its size is known, redefine the table as an
2882 uninitialized static array of INDEX + 1 elements. The extra entry
2883 is used by the runtime to track whether the table has been
2886 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2887 the_array_type = build_array_type (the_array_element_type, table_size);
2888 the_table = build_decl (VAR_DECL, name, the_array_type);
2889 TREE_STATIC (the_table) = 1;
2890 TREE_READONLY (the_table) = 1;
2891 rest_of_decl_compilation (the_table, 1, 0);
2896 /* Make an entry for the catch_classes list. */
2898 make_catch_class_record (tree catch_class, tree classname)
2901 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2902 START_RECORD_CONSTRUCTOR (entry, type);
2903 PUSH_FIELD_VALUE (entry, "address", catch_class);
2904 PUSH_FIELD_VALUE (entry, "classname", classname);
2905 FINISH_RECORD_CONSTRUCTOR (entry);
2910 /* Generate the list of Throwable classes that are caught by exception
2911 handlers in this class. */
2913 emit_catch_table (tree this_class)
2915 tree table, table_size, array_type;
2916 TYPE_CATCH_CLASSES (this_class) =
2918 make_catch_class_record (null_pointer_node, null_pointer_node),
2919 TYPE_CATCH_CLASSES (this_class));
2920 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2921 TYPE_CATCH_CLASSES (this_class) =
2923 make_catch_class_record (null_pointer_node, null_pointer_node),
2924 TYPE_CATCH_CLASSES (this_class));
2925 table_size = build_index_type
2926 (build_int_cst (NULL_TREE,
2927 list_length (TYPE_CATCH_CLASSES (this_class))));
2929 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2932 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2933 DECL_INITIAL (table) =
2934 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2935 TREE_STATIC (table) = 1;
2936 TREE_READONLY (table) = 1;
2937 DECL_IGNORED_P (table) = 1;
2938 rest_of_decl_compilation (table, 1, 0);
2942 /* Given a type, return the signature used by
2943 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2944 same as build_java_signature() because we want the canonical array
2948 build_signature_for_libgcj (tree type)
2952 sig = build_java_signature (type);
2953 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2954 IDENTIFIER_LENGTH (sig)));
2958 /* Add an entry to the type assertion table. Callback used during hashtable
2962 add_assertion_table_entry (void **htab_entry, void *ptr)
2965 tree code_val, op1_utf8, op2_utf8;
2966 tree *list = (tree *) ptr;
2967 type_assertion *as = (type_assertion *) *htab_entry;
2969 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2971 if (as->op1 == NULL_TREE)
2972 op1_utf8 = null_pointer_node;
2974 op1_utf8 = build_signature_for_libgcj (as->op1);
2976 if (as->op2 == NULL_TREE)
2977 op2_utf8 = null_pointer_node;
2979 op2_utf8 = build_signature_for_libgcj (as->op2);
2981 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2982 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2983 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2984 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2985 FINISH_RECORD_CONSTRUCTOR (entry);
2987 *list = tree_cons (NULL_TREE, entry, *list);
2991 /* Generate the type assertion table for CLASS, and return its DECL. */
2994 emit_assertion_table (tree class)
2996 tree null_entry, ctor, table_decl;
2997 tree list = NULL_TREE;
2998 htab_t assertions_htab = TYPE_ASSERTIONS (class);
3000 /* Iterate through the hash table. */
3001 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
3003 /* Finish with a null entry. */
3004 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
3005 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
3006 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
3007 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
3008 FINISH_RECORD_CONSTRUCTOR (null_entry);
3010 list = tree_cons (NULL_TREE, null_entry, list);
3012 /* Put the list in the right order and make it a constructor. */
3013 list = nreverse (list);
3014 ctor = build_constructor_from_list (assertion_table_type, list);
3016 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
3017 assertion_table_type);
3019 TREE_STATIC (table_decl) = 1;
3020 TREE_READONLY (table_decl) = 1;
3021 TREE_CONSTANT (table_decl) = 1;
3022 DECL_IGNORED_P (table_decl) = 1;
3024 DECL_INITIAL (table_decl) = ctor;
3025 DECL_ARTIFICIAL (table_decl) = 1;
3026 rest_of_decl_compilation (table_decl, 1, 0);
3032 init_class_processing (void)
3034 fields_ident = get_identifier ("fields");
3035 info_ident = get_identifier ("info");
3037 gcc_obstack_init (&temporary_obstack);
3040 static hashval_t java_treetreehash_hash (const void *);
3041 static int java_treetreehash_compare (const void *, const void *);
3043 /* A hash table mapping trees to trees. Used generally. */
3045 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
3048 java_treetreehash_hash (const void *k_p)
3050 const struct treetreehash_entry *const k
3051 = (const struct treetreehash_entry *) k_p;
3052 return JAVA_TREEHASHHASH_H (k->key);
3056 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3058 const struct treetreehash_entry *const k1
3059 = (const struct treetreehash_entry *) k1_p;
3060 const_tree const k2 = (const_tree) k2_p;
3061 return (k1->key == k2);
3065 java_treetreehash_find (htab_t ht, tree t)
3067 struct treetreehash_entry *e;
3068 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3069 e = htab_find_with_hash (ht, t, hv);
3077 java_treetreehash_new (htab_t ht, tree t)
3080 struct treetreehash_entry *tthe;
3081 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3083 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3086 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
3091 tthe = (struct treetreehash_entry *) *e;
3092 return &tthe->value;
3096 java_treetreehash_create (size_t size, int gc)
3099 return htab_create_ggc (size, java_treetreehash_hash,
3100 java_treetreehash_compare, NULL);
3102 return htab_create_alloc (size, java_treetreehash_hash,
3103 java_treetreehash_compare, free, xcalloc, free);
3106 /* Break down qualified IDENTIFIER into package and class-name components.
3107 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3108 "pkg.foo", and RIGHT to "Bar". */
3111 split_qualified_name (tree *left, tree *right, tree source)
3114 int l = IDENTIFIER_LENGTH (source);
3116 base = alloca (l + 1);
3117 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3119 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3121 while (*p != '.' && p != base)
3124 /* We didn't find a '.'. Return an error. */
3130 *right = get_identifier (p+1);
3131 *left = get_identifier (base);
3136 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3137 if the classes are from the same package. */
3140 in_same_package (tree name1, tree name2)
3146 if (TREE_CODE (name1) == TYPE_DECL)
3147 name1 = DECL_NAME (name1);
3148 if (TREE_CODE (name2) == TYPE_DECL)
3149 name2 = DECL_NAME (name2);
3151 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3152 /* One in empty package. */
3155 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3156 /* Both in empty package. */
3159 split_qualified_name (&pkg1, &tmp, name1);
3160 split_qualified_name (&pkg2, &tmp, name2);
3162 return (pkg1 == pkg2);
3165 #include "gt-java-class.h"