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 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, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Written by Per Bothner <bothner@cygnus.com> */
30 #include "coretypes.h"
35 #include "java-tree.h"
47 #include "tree-iterator.h"
51 /* DOS brain-damage */
53 #define O_BINARY 0 /* MS-DOS brain-damage */
56 static tree make_method_value (tree);
57 static tree build_java_method_type (tree, tree, int);
58 static int32 hashUtf8String (const char *, int);
59 static tree make_field_value (tree);
60 static tree get_dispatch_vector (tree);
61 static tree get_dispatch_table (tree, tree);
62 static int supers_all_compiled (tree type);
63 static tree maybe_layout_super_class (tree, tree);
64 static void add_miranda_methods (tree, tree);
65 static int assume_compiled (const char *);
66 static tree build_symbol_entry (tree, tree);
67 static tree emit_assertion_table (tree);
68 static void register_class (void);
70 struct obstack temporary_obstack;
72 static const char *cyclic_inheritance_report;
74 /* The compiler generates different code depending on whether or not
75 it can assume certain classes have been compiled down to native
76 code or not. The compiler options -fassume-compiled= and
77 -fno-assume-compiled= are used to create a tree of
78 class_flag_node objects. This tree is queried to determine if
79 a class is assume to be compiled or not. Each node in the tree
80 represents either a package or a specific class. */
82 typedef struct class_flag_node_struct
84 /* The class or package name. */
87 /* Nonzero if this represents an exclusion. */
90 /* Pointers to other nodes in the tree. */
91 struct class_flag_node_struct *parent;
92 struct class_flag_node_struct *sibling;
93 struct class_flag_node_struct *child;
96 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
97 static void add_class_flag (class_flag_node **, const char *, int);
99 /* This is the root of the include/exclude tree. */
101 static class_flag_node *assume_compiled_tree;
103 static class_flag_node *enable_assert_tree;
105 static GTY(()) tree class_roots[4];
106 #define fields_ident class_roots[0] /* get_identifier ("fields") */
107 #define info_ident class_roots[1] /* get_identifier ("info") */
108 #define class_list class_roots[2]
109 #define class_dtable_decl class_roots[3]
111 static GTY(()) VEC(tree,gc) *registered_class;
113 /* Return the node that most closely represents the class whose name
114 is IDENT. Start the search from NODE (followed by its siblings).
115 Return NULL if an appropriate node does not exist. */
117 static class_flag_node *
118 find_class_flag_node (class_flag_node *node, const char *ident)
122 size_t node_ident_length = strlen (node->ident);
124 /* node_ident_length is zero at the root of the tree. If the
125 identifiers are the same length, then we have matching
126 classes. Otherwise check if we've matched an enclosing
129 if (node_ident_length == 0
130 || (strncmp (ident, node->ident, node_ident_length) == 0
131 && (ident[node_ident_length] == '\0'
132 || ident[node_ident_length] == '.')))
134 /* We've found a match, however, there might be a more
137 class_flag_node *found = find_class_flag_node (node->child, ident);
144 /* No match yet. Continue through the sibling list. */
145 node = node->sibling;
148 /* No match at all in this tree. */
153 add_class_flag (class_flag_node **rootp, const char *ident, int value)
155 class_flag_node *root = *rootp;
156 class_flag_node *parent, *node;
158 /* Create the root of the tree if it doesn't exist yet. */
162 root = XNEW (class_flag_node);
165 root->sibling = NULL;
171 /* Calling the function with the empty string means we're setting
172 value for the root of the hierarchy. */
180 /* Find the parent node for this new node. PARENT will either be a
181 class or a package name. Adjust PARENT accordingly. */
183 parent = find_class_flag_node (root, ident);
184 if (strcmp (ident, parent->ident) == 0)
185 parent->value = value;
188 /* Insert new node into the tree. */
189 node = XNEW (class_flag_node);
191 node->ident = xstrdup (ident);
195 node->parent = parent;
196 node->sibling = parent->child;
197 parent->child = node;
201 /* Add a new IDENT to the include/exclude tree. It's an exclusion
202 if EXCLUDEP is nonzero. */
205 add_assume_compiled (const char *ident, int excludep)
207 add_class_flag (&assume_compiled_tree, ident, excludep);
210 /* The default value returned by enable_assertions. */
212 #define DEFAULT_ENABLE_ASSERT (flag_emit_class_files || optimize == 0)
214 /* Enter IDENT (a class or package name) into the enable-assertions table.
215 VALUE is true to enable and false to disable. */
218 add_enable_assert (const char *ident, int value)
220 if (enable_assert_tree == NULL)
221 add_class_flag (&enable_assert_tree, "", DEFAULT_ENABLE_ASSERT);
222 add_class_flag (&enable_assert_tree, ident, value);
225 /* Returns nonzero if IDENT is the name of a class that the compiler
226 should assume has been compiled to object code. */
229 assume_compiled (const char *ident)
234 if (NULL == assume_compiled_tree)
237 i = find_class_flag_node (assume_compiled_tree, ident);
244 /* Return true if we should generate code to check assertions within KLASS. */
247 enable_assertions (tree klass)
249 /* Check if command-line specifies whether we should check assertions. */
251 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
253 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
254 class_flag_node *node
255 = find_class_flag_node (enable_assert_tree, ident);
259 /* The default is to enable assertions if generating class files,
260 or not optimizing. */
261 return DEFAULT_ENABLE_ASSERT;
264 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
265 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
266 Also, PREFIX is prepended, and SUFFIX is appended. */
269 ident_subst (const char* old_name,
276 int prefix_len = strlen (prefix);
277 int suffix_len = strlen (suffix);
278 int i = prefix_len + old_length + suffix_len + 1;
279 char *buffer = alloca (i);
281 strcpy (buffer, prefix);
282 for (i = 0; i < old_length; i++)
284 char ch = old_name[i];
287 buffer[prefix_len + i] = ch;
289 strcpy (buffer + prefix_len + old_length, suffix);
290 return get_identifier (buffer);
293 /* Return an IDENTIFIER_NODE the same as OLD_ID,
294 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
295 Also, PREFIX is prepended, and SUFFIX is appended. */
298 identifier_subst (const tree old_id,
304 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
305 prefix, old_char, new_char, suffix);
308 /* Generate a valid C identifier from the name of the class TYPE,
309 prefixed by PREFIX. */
312 mangled_classname (const char *prefix, tree type)
314 tree ident = TYPE_NAME (type);
315 if (TREE_CODE (ident) != IDENTIFIER_NODE)
316 ident = DECL_NAME (ident);
317 return identifier_subst (ident, prefix, '.', '_', "");
324 type = make_node (RECORD_TYPE);
325 /* Unfortunately we must create the binfo here, so that class
327 TYPE_BINFO (type) = make_tree_binfo (0);
328 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
333 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
334 and where each of the constituents is separated by '/',
335 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
338 unmangle_classname (const char *name, int name_length)
340 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
341 /* It's not sufficient to compare to_return and get_identifier
342 (name) to determine whether to_return is qualified. There are
343 cases in signature analysis where name will be stripped of a
345 name = IDENTIFIER_POINTER (to_return);
349 QUALIFIED_P (to_return) = 1;
356 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
359 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
360 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
363 sprintf (buf, #NAME "_%s", typename); \
364 TYPE_## TABLE ##_DECL (type) = decl = \
365 build_decl (VAR_DECL, get_identifier (buf), TABLE_TYPE); \
366 DECL_EXTERNAL (decl) = 1; \
367 TREE_STATIC (decl) = 1; \
368 TREE_READONLY (decl) = 1; \
369 TREE_CONSTANT (decl) = 1; \
370 DECL_IGNORED_P (decl) = 1; \
371 /* Mark the table as belonging to this class. */ \
373 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
374 DECL_OWNER (decl) = TYPE; \
375 sprintf (buf, #NAME "_syms_%s", typename); \
376 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
377 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type); \
378 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
379 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
380 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
384 /* Given a class, create the DECLs for all its associated indirect
387 gen_indirect_dispatch_tables (tree type)
389 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
392 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
393 tree catch_class_type = make_node (RECORD_TYPE);
395 sprintf (buf, "_catch_classes_%s", typename);
396 PUSH_FIELD (catch_class_type, field, "address", utf8const_ptr_type);
397 PUSH_FIELD (catch_class_type, field, "classname", ptr_type_node);
398 FINISH_RECORD (catch_class_type);
400 TYPE_CTABLE_DECL (type)
401 = build_decl (VAR_DECL, get_identifier (buf),
402 build_array_type (catch_class_type, 0));
403 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
404 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
405 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
406 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
407 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
408 pushdecl (TYPE_CTABLE_DECL (type));
411 if (flag_indirect_dispatch)
413 GEN_TABLE (ATABLE, _atable, atable_type, type);
414 GEN_TABLE (OTABLE, _otable, otable_type, type);
415 GEN_TABLE (ITABLE, _itable, itable_type, type);
422 push_class (tree class_type, tree class_name)
424 tree decl, signature;
425 location_t saved_loc = input_location;
426 #ifndef USE_MAPPED_LOCATION
427 tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
428 input_filename = IDENTIFIER_POINTER (source_name);
431 CLASS_P (class_type) = 1;
432 decl = build_decl (TYPE_DECL, class_name, class_type);
433 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
435 /* dbxout needs a DECL_SIZE if in gstabs mode */
436 DECL_SIZE (decl) = integer_zero_node;
438 input_location = saved_loc;
439 signature = identifier_subst (class_name, "L", '.', '/', ";");
440 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
442 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
443 both a typedef and in the struct name-space. We may want to re-visit
444 this later, but for now it reduces the changes needed for gdb. */
445 DECL_ARTIFICIAL (decl) = 1;
447 pushdecl_top_level (decl);
452 /* Finds the (global) class named NAME. Creates the class if not found.
453 Also creates associated TYPE_DECL.
454 Does not check if the class actually exists, load the class,
455 fill in field or methods, or do layout_type. */
458 lookup_class (tree name)
460 tree decl = IDENTIFIER_CLASS_VALUE (name);
461 if (decl == NULL_TREE)
462 decl = push_class (make_class (), name);
463 return TREE_TYPE (decl);
467 set_super_info (int access_flags, tree this_class,
468 tree super_class, int interfaces_count)
470 int total_supers = interfaces_count;
471 tree class_decl = TYPE_NAME (this_class);
477 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
478 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
481 tree super_binfo = make_tree_binfo (0);
482 BINFO_TYPE (super_binfo) = super_class;
483 BINFO_OFFSET (super_binfo) = integer_zero_node;
484 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
485 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
488 set_class_decl_access_flags (access_flags, class_decl);
492 set_class_decl_access_flags (int access_flags, tree class_decl)
494 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
495 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
496 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
497 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
498 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
499 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
500 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
501 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
502 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
503 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
504 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
505 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (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)
533 tree binfo, base_binfo;
535 if (! TYPE_BINFO (type2))
538 for (binfo = TYPE_BINFO (type2), i = 0;
539 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
540 if (BINFO_TYPE (base_binfo) == type1)
543 for (binfo = TYPE_BINFO (type2), i = 0;
544 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
545 if (BINFO_TYPE (base_binfo)
546 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
552 /* Return true iff TYPE1 inherits from TYPE2. */
555 inherits_from_p (tree type1, tree type2)
557 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
562 if (! CLASS_LOADED_P (type1))
563 load_class (type1, 1);
565 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
570 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
573 enclosing_context_p (tree type1, tree type2)
575 if (!INNER_CLASS_TYPE_P (type2))
578 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
580 type2 = (INNER_CLASS_TYPE_P (type2) ?
581 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
591 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
595 common_enclosing_context_p (tree type1, tree type2)
600 for (current = type2; current;
601 current = (INNER_CLASS_TYPE_P (current) ?
602 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
604 if (type1 == current)
607 if (INNER_CLASS_TYPE_P (type1))
608 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
615 /* Return 1 iff there exists a common enclosing "this" between TYPE1
616 and TYPE2, without crossing any static context. */
619 common_enclosing_instance_p (tree type1, tree type2)
621 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
624 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
625 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
626 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
629 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
630 current = (PURE_INNER_CLASS_TYPE_P (current) ?
631 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
633 if (type1 == current)
639 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
640 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
641 if attempt is made to add it twice. */
644 maybe_add_interface (tree this_class, tree interface_class)
646 tree binfo, base_binfo;
649 for (binfo = TYPE_BINFO (this_class), i = 0;
650 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
651 if (BINFO_TYPE (base_binfo) == interface_class)
652 return interface_class;
653 add_interface (this_class, interface_class);
657 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
660 add_interface (tree this_class, tree interface_class)
662 tree interface_binfo = make_tree_binfo (0);
664 BINFO_TYPE (interface_binfo) = interface_class;
665 BINFO_OFFSET (interface_binfo) = integer_zero_node;
666 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
667 BINFO_VIRTUAL_P (interface_binfo) = 1;
669 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
673 /* Return the address of a pointer to the first FUNCTION_DECL
674 in the list (*LIST) whose DECL_NAME is NAME. */
677 find_named_method (tree *list, tree name)
679 while (*list && DECL_NAME (*list) != name)
680 list = &TREE_CHAIN (*list);
686 build_java_method_type (tree fntype, tree this_class, int access_flags)
688 if (access_flags & ACC_STATIC)
690 fntype = build_method_type (this_class, fntype);
692 /* We know that arg 1 of every nonstatic method is non-null; tell
694 TYPE_ATTRIBUTES (fntype) = (tree_cons
695 (get_identifier ("nonnull"),
696 tree_cons (NULL_TREE,
697 build_int_cst (NULL_TREE, 1),
699 TYPE_ATTRIBUTES (fntype)));
704 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
706 tree method_type, fndecl;
708 method_type = build_java_method_type (function_type,
709 this_class, access_flags);
711 fndecl = build_decl (FUNCTION_DECL, name, method_type);
712 DECL_CONTEXT (fndecl) = this_class;
714 DECL_LANG_SPECIFIC (fndecl)
715 = ggc_alloc_cleared (sizeof (struct lang_decl));
716 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
718 /* Initialize the static initializer test table. */
720 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
721 java_treetreehash_create (10, 1);
723 /* Initialize the initialized (static) class table. */
724 if (access_flags & ACC_STATIC)
725 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
726 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
728 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
729 TYPE_METHODS (this_class) = fndecl;
731 /* Notice that this is a finalizer and update the class type
732 accordingly. This is used to optimize instance allocation. */
733 if (name == finalize_identifier_node
734 && TREE_TYPE (function_type) == void_type_node
735 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
736 HAS_FINALIZER_P (this_class) = 1;
738 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
739 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
740 if (access_flags & ACC_PRIVATE)
741 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
742 if (access_flags & ACC_NATIVE)
744 METHOD_NATIVE (fndecl) = 1;
745 DECL_EXTERNAL (fndecl) = 1;
747 if (access_flags & ACC_STATIC)
748 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
749 if (access_flags & ACC_FINAL)
750 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
751 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
752 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
753 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
754 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
755 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
756 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
760 /* Add a method to THIS_CLASS.
761 The method's name is NAME.
762 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
765 add_method (tree this_class, int access_flags, tree name, tree method_sig)
767 tree function_type, fndecl;
768 const unsigned char *sig
769 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
772 fatal_error ("bad method signature");
774 function_type = get_type_from_signature (method_sig);
775 fndecl = add_method_1 (this_class, access_flags, name, function_type);
776 set_java_signature (TREE_TYPE (fndecl), method_sig);
781 add_field (tree class, tree name, tree field_type, int flags)
783 int is_static = (flags & ACC_STATIC) != 0;
785 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
786 TREE_CHAIN (field) = TYPE_FIELDS (class);
787 TYPE_FIELDS (class) = field;
788 DECL_CONTEXT (field) = class;
789 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
791 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
792 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
793 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
794 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
795 if (flags & ACC_VOLATILE)
797 FIELD_VOLATILE (field) = 1;
798 TREE_THIS_VOLATILE (field) = 1;
800 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
801 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
802 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
805 FIELD_STATIC (field) = 1;
806 /* Always make field externally visible. This is required so
807 that native methods can always access the field. */
808 TREE_PUBLIC (field) = 1;
809 /* Considered external unless we are compiling it into this
811 DECL_EXTERNAL (field) = (is_compiled_class (class) != 2);
817 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
820 set_constant_value (tree field, tree constant)
822 if (field == NULL_TREE)
823 warning (OPT_Wattributes,
824 "misplaced ConstantValue attribute (not in any field)");
825 else if (DECL_INITIAL (field) != NULL_TREE)
826 warning (OPT_Wattributes,
827 "duplicate ConstantValue attribute for field '%s'",
828 IDENTIFIER_POINTER (DECL_NAME (field)));
831 DECL_INITIAL (field) = constant;
832 if (TREE_TYPE (constant) != TREE_TYPE (field)
833 && ! (TREE_TYPE (constant) == int_type_node
834 && INTEGRAL_TYPE_P (TREE_TYPE (field))
835 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
836 && ! (TREE_TYPE (constant) == utf8const_ptr_type
837 && TREE_TYPE (field) == string_ptr_type_node))
838 error ("ConstantValue attribute of field '%s' has wrong type",
839 IDENTIFIER_POINTER (DECL_NAME (field)));
840 if (FIELD_FINAL (field))
841 DECL_FIELD_FINAL_IUD (field) = 1;
845 /* Count the number of Unicode chars encoded in a given Ut8 string. */
849 strLengthUtf8 (char *str, int len)
851 register unsigned char* ptr = (unsigned char*) str;
852 register unsigned char *limit = ptr + len;
854 for (; ptr < limit; str_length++) {
855 if (UTF8_GET (ptr, limit) < 0)
863 /* Calculate a hash value for a string encoded in Utf8 format.
864 * This returns the same hash value as specified for java.lang.String.hashCode.
868 hashUtf8String (const char *str, int len)
870 const unsigned char* ptr = (const unsigned char*) str;
871 const unsigned char *limit = ptr + len;
875 int ch = UTF8_GET (ptr, limit);
876 /* Updated specification from
877 http://www.javasoft.com/docs/books/jls/clarify.html. */
878 hash = (31 * hash) + ch;
883 static GTY(()) tree utf8_decl_list = NULL_TREE;
886 build_utf8_ref (tree name)
888 const char * name_ptr = IDENTIFIER_POINTER(name);
889 int name_len = IDENTIFIER_LENGTH(name);
891 tree ctype, field = NULL_TREE, str_type, cinit, string;
892 static int utf8_count = 0;
894 tree ref = IDENTIFIER_UTF8_REF (name);
896 if (ref != NULL_TREE)
899 ctype = make_node (RECORD_TYPE);
900 str_type = build_prim_array_type (unsigned_byte_type_node,
901 name_len + 1); /* Allow for final '\0'. */
902 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
903 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
904 PUSH_FIELD (ctype, field, "data", str_type);
905 FINISH_RECORD (ctype);
906 START_RECORD_CONSTRUCTOR (cinit, ctype);
907 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
908 PUSH_FIELD_VALUE (cinit, "hash", build_int_cst (NULL_TREE, name_hash));
909 PUSH_FIELD_VALUE (cinit, "length", build_int_cst (NULL_TREE, name_len));
910 string = build_string (name_len, name_ptr);
911 TREE_TYPE (string) = str_type;
912 PUSH_FIELD_VALUE (cinit, "data", string);
913 FINISH_RECORD_CONSTRUCTOR (cinit);
914 TREE_CONSTANT (cinit) = 1;
915 TREE_INVARIANT (cinit) = 1;
917 /* Generate a unique-enough identifier. */
918 sprintf(buf, "_Utf%d", ++utf8_count);
920 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
921 TREE_STATIC (decl) = 1;
922 DECL_ARTIFICIAL (decl) = 1;
923 DECL_IGNORED_P (decl) = 1;
924 TREE_READONLY (decl) = 1;
925 TREE_THIS_VOLATILE (decl) = 0;
926 DECL_INITIAL (decl) = cinit;
928 if (HAVE_GAS_SHF_MERGE)
931 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
932 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
933 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
934 if (flag_merge_constants && decl_size < 256)
937 int flags = (SECTION_OVERRIDE
938 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
939 sprintf (buf, ".rodata.jutf8.%d", decl_size);
940 switch_to_section (get_section (buf, flags, NULL));
941 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
945 TREE_CHAIN (decl) = utf8_decl_list;
946 layout_decl (decl, 0);
948 rest_of_decl_compilation (decl, global_bindings_p (), 0);
949 varpool_mark_needed_node (varpool_node (decl));
950 utf8_decl_list = decl;
951 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
952 IDENTIFIER_UTF8_REF (name) = ref;
956 /* Like build_class_ref, but instead of a direct reference generate a
957 pointer into the constant pool. */
960 build_indirect_class_ref (tree type)
964 index = alloc_class_constant (type);
965 cl = build_ref_from_constant_pool (index);
966 return convert (promote_type (class_ptr_type), cl);
970 build_static_class_ref (tree type)
972 tree decl_name, decl, ref;
974 if (TYPE_SIZE (type) == error_mark_node)
975 return null_pointer_node;
976 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
977 "", '/', '/', ".class$$");
978 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
979 if (decl == NULL_TREE)
981 decl = build_decl (VAR_DECL, decl_name, class_type_node);
982 TREE_STATIC (decl) = 1;
983 if (! flag_indirect_classes)
984 TREE_PUBLIC (decl) = 1;
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;
1023 DECL_IGNORED_P (decl) = 1;
1024 DECL_ARTIFICIAL (decl) = 1;
1025 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1026 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1027 DECL_CLASS_FIELD_P (decl) = 1;
1028 DECL_CONTEXT (decl) = type;
1034 /* Build a reference to the class TYPE.
1035 Also handles primitive types and array types. */
1038 build_class_ref (tree type)
1040 int is_compiled = is_compiled_class (type);
1044 if (TREE_CODE (type) == POINTER_TYPE)
1045 type = TREE_TYPE (type);
1047 if (flag_indirect_dispatch
1048 && type != output_class
1049 && TREE_CODE (type) == RECORD_TYPE)
1050 return build_indirect_class_ref (type);
1052 if (type == output_class && flag_indirect_classes)
1053 return build_classdollar_field (type);
1055 if (TREE_CODE (type) == RECORD_TYPE)
1056 return build_static_class_ref (type);
1062 if (flag_emit_class_files)
1064 const char *prim_class_name;
1066 if (type == char_type_node)
1067 prim_class_name = "java.lang.Character";
1068 else if (type == boolean_type_node)
1069 prim_class_name = "java.lang.Boolean";
1070 else if (type == byte_type_node)
1071 prim_class_name = "java.lang.Byte";
1072 else if (type == short_type_node)
1073 prim_class_name = "java.lang.Short";
1074 else if (type == int_type_node)
1075 prim_class_name = "java.lang.Integer";
1076 else if (type == long_type_node)
1077 prim_class_name = "java.lang.Long";
1078 else if (type == float_type_node)
1079 prim_class_name = "java.lang.Float";
1080 else if (type == double_type_node)
1081 prim_class_name = "java.lang.Double";
1082 else if (type == void_type_node)
1083 prim_class_name = "java.lang.Void";
1087 prim_class = lookup_class (get_identifier (prim_class_name));
1088 /* We wrap the class in a NOP_EXPR, because it is a
1089 type. We can't hold it in the COMPONENT_REF itself,
1090 as that type must remain NULL. */
1091 prim_class = build1 (NOP_EXPR, prim_class, NULL_TREE);
1093 return build3 (COMPONENT_REF, NULL_TREE,
1094 prim_class, TYPE_identifier_node, NULL_TREE);
1096 decl_name = TYPE_NAME (type);
1097 if (TREE_CODE (decl_name) == TYPE_DECL)
1098 decl_name = DECL_NAME (decl_name);
1099 name = IDENTIFIER_POINTER (decl_name);
1100 if (strncmp (name, "promoted_", 9) == 0)
1102 sprintf (buffer, "_Jv_%sClass", name);
1103 decl_name = get_identifier (buffer);
1104 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1105 if (decl == NULL_TREE)
1107 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1108 TREE_STATIC (decl) = 1;
1109 TREE_PUBLIC (decl) = 1;
1110 DECL_EXTERNAL (decl) = 1;
1111 DECL_ARTIFICIAL (decl) = 1;
1112 pushdecl_top_level (decl);
1116 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1120 return build_indirect_class_ref (type);
1123 /* Create a local statically allocated variable that will hold a
1124 pointer to a static field. */
1127 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1129 tree decl, decl_name;
1130 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1131 char *buf = alloca (strlen (name) + 20);
1132 sprintf (buf, "%s_%d_ref", name, index);
1133 decl_name = get_identifier (buf);
1134 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1135 if (decl == NULL_TREE)
1137 decl = build_decl (VAR_DECL, decl_name, ptr_type_node);
1138 TREE_STATIC (decl) = 1;
1139 TREE_PUBLIC (decl) = 0;
1140 DECL_EXTERNAL (decl) = 0;
1141 DECL_ARTIFICIAL (decl) = 1;
1142 DECL_IGNORED_P (decl) = 1;
1143 pushdecl_top_level (decl);
1149 build_static_field_ref (tree fdecl)
1151 tree fclass = DECL_CONTEXT (fdecl);
1152 int is_compiled = is_compiled_class (fclass);
1153 int from_class = ! CLASS_FROM_SOURCE_P (current_class);
1155 /* Allow static final fields to fold to a constant. When using
1156 -findirect-dispatch, we simply never do this folding if compiling
1157 from .class; in the .class file constants will be referred to via
1158 the constant pool. */
1159 if ((!flag_indirect_dispatch || !from_class)
1161 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1162 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1163 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1164 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1166 if (is_compiled == 1)
1167 DECL_EXTERNAL (fdecl) = 1;
1171 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1172 and a class local static variable CACHE_ENTRY, then
1174 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1175 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1178 This can mostly be optimized away, so that the usual path is a
1179 load followed by a test and branch. _Jv_ResolvePoolEntry is
1180 only called once for each constant pool entry.
1182 There is an optimization that we don't do: at the start of a
1183 method, create a local copy of CACHE_ENTRY and use that instead.
1187 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1188 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1190 = build3 (CALL_EXPR, boolean_type_node,
1191 build_address_of (built_in_decls[BUILT_IN_EXPECT]),
1192 tree_cons (NULL_TREE, build2 (EQ_EXPR, boolean_type_node,
1193 cache_entry, null_pointer_node),
1194 build_tree_list (NULL_TREE, boolean_false_node)),
1196 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1198 = build3 (CALL_EXPR, ptr_type_node,
1199 build_address_of (soft_resolvepoolentry_node),
1200 tree_cons (NULL_TREE, build_class_ref (output_class),
1201 build_tree_list (NULL_TREE, cpool_index_cst)),
1203 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1204 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1205 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1206 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1212 get_access_flags_from_decl (tree decl)
1214 int access_flags = 0;
1215 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1217 if (FIELD_STATIC (decl))
1218 access_flags |= ACC_STATIC;
1219 if (FIELD_PUBLIC (decl))
1220 access_flags |= ACC_PUBLIC;
1221 if (FIELD_PROTECTED (decl))
1222 access_flags |= ACC_PROTECTED;
1223 if (FIELD_PRIVATE (decl))
1224 access_flags |= ACC_PRIVATE;
1225 if (FIELD_FINAL (decl))
1226 access_flags |= ACC_FINAL;
1227 if (FIELD_VOLATILE (decl))
1228 access_flags |= ACC_VOLATILE;
1229 if (FIELD_TRANSIENT (decl))
1230 access_flags |= ACC_TRANSIENT;
1231 if (FIELD_ENUM (decl))
1232 access_flags |= ACC_ENUM;
1233 if (FIELD_SYNTHETIC (decl))
1234 access_flags |= ACC_SYNTHETIC;
1235 return access_flags;
1237 if (TREE_CODE (decl) == TYPE_DECL)
1239 if (CLASS_PUBLIC (decl))
1240 access_flags |= ACC_PUBLIC;
1241 if (CLASS_FINAL (decl))
1242 access_flags |= ACC_FINAL;
1243 if (CLASS_SUPER (decl))
1244 access_flags |= ACC_SUPER;
1245 if (CLASS_INTERFACE (decl))
1246 access_flags |= ACC_INTERFACE;
1247 if (CLASS_ABSTRACT (decl))
1248 access_flags |= ACC_ABSTRACT;
1249 if (CLASS_STATIC (decl))
1250 access_flags |= ACC_STATIC;
1251 if (CLASS_PRIVATE (decl))
1252 access_flags |= ACC_PRIVATE;
1253 if (CLASS_PROTECTED (decl))
1254 access_flags |= ACC_PROTECTED;
1255 if (CLASS_STRICTFP (decl))
1256 access_flags |= ACC_STRICT;
1257 if (CLASS_ENUM (decl))
1258 access_flags |= ACC_ENUM;
1259 if (CLASS_SYNTHETIC (decl))
1260 access_flags |= ACC_SYNTHETIC;
1261 if (CLASS_ANNOTATION (decl))
1262 access_flags |= ACC_ANNOTATION;
1263 return access_flags;
1265 if (TREE_CODE (decl) == FUNCTION_DECL)
1267 if (METHOD_PUBLIC (decl))
1268 access_flags |= ACC_PUBLIC;
1269 if (METHOD_PRIVATE (decl))
1270 access_flags |= ACC_PRIVATE;
1271 if (METHOD_PROTECTED (decl))
1272 access_flags |= ACC_PROTECTED;
1273 if (METHOD_STATIC (decl))
1274 access_flags |= ACC_STATIC;
1275 if (METHOD_FINAL (decl))
1276 access_flags |= ACC_FINAL;
1277 if (METHOD_SYNCHRONIZED (decl))
1278 access_flags |= ACC_SYNCHRONIZED;
1279 if (METHOD_NATIVE (decl))
1280 access_flags |= ACC_NATIVE;
1281 if (METHOD_ABSTRACT (decl))
1282 access_flags |= ACC_ABSTRACT;
1283 if (METHOD_STRICTFP (decl))
1284 access_flags |= ACC_STRICT;
1285 if (METHOD_INVISIBLE (decl))
1286 access_flags |= ACC_INVISIBLE;
1287 if (DECL_ARTIFICIAL (decl))
1288 access_flags |= ACC_SYNTHETIC;
1289 if (METHOD_BRIDGE (decl))
1290 access_flags |= ACC_BRIDGE;
1291 if (METHOD_VARARGS (decl))
1292 access_flags |= ACC_VARARGS;
1293 return access_flags;
1298 static GTY (()) int alias_labelno = 0;
1300 /* Create a private alias for METHOD. Using this alias instead of the method
1301 decl ensures that ncode entries in the method table point to the real function
1302 at runtime, not a PLT entry. */
1305 make_local_function_alias (tree method)
1307 #ifdef ASM_OUTPUT_DEF
1310 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1311 char *name = alloca (strlen (method_name) + 2);
1312 char *buf = alloca (strlen (method_name) + 128);
1314 /* Only create aliases for local functions. */
1315 if (DECL_EXTERNAL (method))
1318 /* Prefix method_name with 'L' for the alias label. */
1320 strcpy (name + 1, method_name);
1322 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1323 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1324 TREE_TYPE (method));
1325 DECL_CONTEXT (alias) = NULL;
1326 TREE_READONLY (alias) = TREE_READONLY (method);
1327 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1328 TREE_PUBLIC (alias) = 0;
1329 DECL_EXTERNAL (alias) = 0;
1330 DECL_ARTIFICIAL (alias) = 1;
1331 DECL_INLINE (alias) = 0;
1332 DECL_INITIAL (alias) = error_mark_node;
1333 TREE_ADDRESSABLE (alias) = 1;
1334 TREE_USED (alias) = 1;
1335 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1336 if (!flag_syntax_only)
1337 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1344 /** Make reflection data (_Jv_Field) for field FDECL. */
1347 make_field_value (tree fdecl)
1351 tree type = TREE_TYPE (fdecl);
1352 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1354 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1355 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1357 type = build_class_ref (type);
1360 tree signature = build_java_signature (type);
1362 type = build_utf8_ref (unmangle_classname
1363 (IDENTIFIER_POINTER (signature),
1364 IDENTIFIER_LENGTH (signature)));
1366 PUSH_FIELD_VALUE (finit, "type", type);
1368 flags = get_access_flags_from_decl (fdecl);
1370 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1372 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1373 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1376 tree field_address = integer_zero_node;
1377 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1378 && FIELD_STATIC (fdecl))
1379 field_address = build_address_of (fdecl);
1383 build_constructor_from_list (field_info_union_node,
1385 ((FIELD_STATIC (fdecl)
1386 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1387 : TYPE_FIELDS (field_info_union_node)),
1388 (FIELD_STATIC (fdecl)
1390 : byte_position (fdecl)))));
1393 FINISH_RECORD_CONSTRUCTOR (finit);
1397 /** Make reflection data (_Jv_Method) for method MDECL. */
1400 make_method_value (tree mdecl)
1402 static int method_name_count = 0;
1407 #define ACC_TRANSLATED 0x4000
1408 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1410 class_decl = DECL_CONTEXT (mdecl);
1411 /* For interfaces, the index field contains the dispatch index. */
1412 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1413 index = build_int_cst (NULL_TREE,
1414 get_interface_method_index (mdecl, class_decl));
1415 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1416 index = get_method_index (mdecl);
1418 index = integer_minus_one_node;
1420 code = null_pointer_node;
1421 if (METHOD_ABSTRACT (mdecl))
1422 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1423 soft_abstractmethod_node);
1425 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1426 make_local_function_alias (mdecl));
1427 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1428 PUSH_FIELD_VALUE (minit, "name",
1429 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1430 init_identifier_node
1431 : DECL_NAME (mdecl)));
1433 tree signature = build_java_signature (TREE_TYPE (mdecl));
1434 PUSH_FIELD_VALUE (minit, "signature",
1437 (IDENTIFIER_POINTER(signature),
1438 IDENTIFIER_LENGTH(signature)))));
1440 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1441 PUSH_FIELD_VALUE (minit, "index", index);
1442 PUSH_FIELD_VALUE (minit, "ncode", code);
1445 /* Compute the `throws' information for the method. */
1446 tree table = null_pointer_node;
1447 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1449 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1450 tree iter, type, array;
1453 table = tree_cons (NULL_TREE, table, NULL_TREE);
1454 for (iter = DECL_FUNCTION_THROWS (mdecl);
1456 iter = TREE_CHAIN (iter))
1458 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1460 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1461 IDENTIFIER_LENGTH (sig)));
1462 table = tree_cons (NULL_TREE, utf8, table);
1464 type = build_prim_array_type (ptr_type_node, length);
1465 table = build_constructor_from_list (type, table);
1466 /* Compute something unique enough. */
1467 sprintf (buf, "_methods%d", method_name_count++);
1468 array = build_decl (VAR_DECL, get_identifier (buf), type);
1469 DECL_INITIAL (array) = table;
1470 TREE_STATIC (array) = 1;
1471 DECL_ARTIFICIAL (array) = 1;
1472 DECL_IGNORED_P (array) = 1;
1473 rest_of_decl_compilation (array, 1, 0);
1475 table = build1 (ADDR_EXPR, ptr_type_node, array);
1478 PUSH_FIELD_VALUE (minit, "throws", table);
1481 FINISH_RECORD_CONSTRUCTOR (minit);
1486 get_dispatch_vector (tree type)
1488 tree vtable = TYPE_VTABLE (type);
1490 if (vtable == NULL_TREE)
1494 tree super = CLASSTYPE_SUPER (type);
1495 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1496 vtable = make_tree_vec (nvirtuals);
1497 TYPE_VTABLE (type) = vtable;
1498 if (super != NULL_TREE)
1500 tree super_vtable = get_dispatch_vector (super);
1502 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1503 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1506 for (method = TYPE_METHODS (type); method != NULL_TREE;
1507 method = TREE_CHAIN (method))
1509 tree method_index = get_method_index (method);
1510 if (method_index != NULL_TREE
1511 && host_integerp (method_index, 0))
1512 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1520 get_dispatch_table (tree type, tree this_class_addr)
1522 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1523 tree vtable = get_dispatch_vector (type);
1525 tree list = NULL_TREE;
1526 int nvirtuals = TREE_VEC_LENGTH (vtable);
1530 for (i = nvirtuals; --i >= 0; )
1532 tree method = TREE_VEC_ELT (vtable, i);
1533 if (METHOD_ABSTRACT (method))
1536 warning (0, "%Jabstract method in non-abstract class", method);
1538 if (TARGET_VTABLE_USES_DESCRIPTORS)
1539 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1540 list = tree_cons (NULL_TREE, null_pointer_node, list);
1542 list = tree_cons (NULL_TREE, null_pointer_node, list);
1546 if (TARGET_VTABLE_USES_DESCRIPTORS)
1547 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1549 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1550 method, build_int_cst (NULL_TREE, j));
1551 TREE_CONSTANT (fdesc) = 1;
1552 TREE_INVARIANT (fdesc) = 1;
1553 list = tree_cons (NULL_TREE, fdesc, list);
1556 list = tree_cons (NULL_TREE,
1557 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1563 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1564 using the Boehm GC we sometimes stash a GC type descriptor
1565 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1566 the emitted byte count during the output to the assembly file. */
1567 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1568 fake "function descriptor". It's first word is the is the class
1569 pointer, and subsequent words (usually one) contain the GC descriptor.
1570 In all other cases, we reserve two extra vtable slots. */
1571 gc_descr = get_boehm_type_descriptor (type);
1572 list = tree_cons (NULL_TREE, gc_descr, list);
1573 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1574 list = tree_cons (NULL_TREE, gc_descr, list);
1575 list = tree_cons (NULL_TREE, this_class_addr, list);
1577 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1578 list = tree_cons (NULL_TREE, null_pointer_node, list);
1579 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1580 list = tree_cons (integer_zero_node, null_pointer_node, list);
1582 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1583 if (TARGET_VTABLE_USES_DESCRIPTORS)
1584 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1586 return build_constructor_from_list
1587 (build_prim_array_type (nativecode_ptr_type_node,
1592 /* Set the method_index for a method decl. */
1594 set_method_index (tree decl, tree method_index)
1596 if (method_index != NULL_TREE)
1598 /* method_index is null if we're using indirect dispatch. */
1599 method_index = fold (convert (sizetype, method_index));
1601 if (TARGET_VTABLE_USES_DESCRIPTORS)
1602 /* Add one to skip bogus descriptor for class and GC descriptor. */
1603 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1605 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1607 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1610 DECL_VINDEX (decl) = method_index;
1613 /* Get the method_index for a method decl. */
1615 get_method_index (tree decl)
1617 tree method_index = DECL_VINDEX (decl);
1622 if (TARGET_VTABLE_USES_DESCRIPTORS)
1623 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1624 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1626 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1627 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1629 return method_index;
1633 supers_all_compiled (tree type)
1635 while (type != NULL_TREE)
1637 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1639 type = CLASSTYPE_SUPER (type);
1645 make_class_data (tree type)
1647 tree decl, cons, temp;
1648 tree field, fields_decl;
1649 tree static_fields = NULL_TREE;
1650 tree instance_fields = NULL_TREE;
1651 HOST_WIDE_INT static_field_count = 0;
1652 HOST_WIDE_INT instance_field_count = 0;
1653 HOST_WIDE_INT field_count;
1654 tree field_array_type;
1656 tree methods = NULL_TREE;
1657 tree dtable_decl = NULL_TREE;
1658 HOST_WIDE_INT method_count = 0;
1659 tree method_array_type;
1662 tree this_class_addr;
1663 tree constant_pool_constructor;
1664 tree interfaces = null_pointer_node;
1665 int interface_len = 0;
1666 int uses_jv_markobj = 0;
1667 tree type_decl = TYPE_NAME (type);
1668 tree id_main = get_identifier("main");
1669 tree id_class = get_identifier("java.lang.Class");
1670 /** Offset from start of virtual function table declaration
1671 to where objects actually point at, following new g++ ABI. */
1672 tree dtable_start_offset = build_int_cst (NULL_TREE,
1673 2 * POINTER_SIZE / BITS_PER_UNIT);
1674 VEC(int, heap) *field_indexes;
1675 tree first_real_field;
1677 this_class_addr = build_static_class_ref (type);
1678 decl = TREE_OPERAND (this_class_addr, 0);
1680 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1681 && !flag_indirect_dispatch)
1683 tree dtable = get_dispatch_table (type, this_class_addr);
1684 uses_jv_markobj = uses_jv_markobj_p (dtable);
1685 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1687 /* We've already created some other class, and consequently
1688 we made class_dtable_decl. Now we just want to fill it
1690 dtable_decl = class_dtable_decl;
1694 dtable_decl = build_dtable_decl (type);
1695 TREE_STATIC (dtable_decl) = 1;
1696 DECL_ARTIFICIAL (dtable_decl) = 1;
1697 DECL_IGNORED_P (dtable_decl) = 1;
1700 TREE_PUBLIC (dtable_decl) = 1;
1701 DECL_INITIAL (dtable_decl) = dtable;
1702 if (! flag_indirect_classes)
1703 rest_of_decl_compilation (dtable_decl, 1, 0);
1704 /* Maybe we're compiling Class as the first class. If so, set
1705 class_dtable_decl to the decl we just made. */
1706 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1707 class_dtable_decl = dtable_decl;
1710 /* Build Field array. */
1711 field = TYPE_FIELDS (type);
1712 while (field && DECL_ARTIFICIAL (field))
1713 field = TREE_CHAIN (field); /* Skip dummy fields. */
1714 if (field && DECL_NAME (field) == NULL_TREE)
1715 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1716 first_real_field = field;
1718 /* First count static and instance fields. */
1719 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1721 if (! DECL_ARTIFICIAL (field))
1723 if (FIELD_STATIC (field))
1724 static_field_count++;
1725 else if (uses_jv_markobj || !flag_reduced_reflection)
1726 instance_field_count++;
1729 field_count = static_field_count + instance_field_count;
1730 field_indexes = VEC_alloc (int, heap, field_count);
1732 /* gcj sorts fields so that static fields come first, followed by
1733 instance fields. Unfortunately, by the time this takes place we
1734 have already generated the reflection_data for this class, and
1735 that data contians indexes into the fields. So, we generate a
1736 permutation that maps each original field index to its final
1737 position. Then we pass this permutation to
1738 rewrite_reflection_indexes(), which fixes up the reflection
1742 int static_count = 0;
1743 int instance_count = static_field_count;
1746 for (i = 0, field = first_real_field;
1748 field = TREE_CHAIN (field), i++)
1750 if (! DECL_ARTIFICIAL (field))
1753 if (FIELD_STATIC (field))
1754 field_index = static_count++;
1755 else if (uses_jv_markobj || !flag_reduced_reflection)
1756 field_index = instance_count++;
1757 VEC_quick_push (int, field_indexes, field_index);
1762 for (field = first_real_field; field != NULL_TREE;
1763 field = TREE_CHAIN (field))
1765 if (! DECL_ARTIFICIAL (field))
1767 if (FIELD_STATIC (field))
1769 /* We must always create reflection data for static fields
1770 as it is used in the creation of the field itself. */
1771 tree init = make_field_value (field);
1772 tree initial = DECL_INITIAL (field);
1773 static_fields = tree_cons (NULL_TREE, init, static_fields);
1774 /* If the initial value is a string constant,
1775 prevent output_constant from trying to assemble the value. */
1776 if (initial != NULL_TREE
1777 && TREE_TYPE (initial) == string_ptr_type_node)
1778 DECL_INITIAL (field) = NULL_TREE;
1779 rest_of_decl_compilation (field, 1, 1);
1780 DECL_INITIAL (field) = initial;
1782 else if (uses_jv_markobj || !flag_reduced_reflection)
1784 tree init = make_field_value (field);
1785 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1790 if (field_count > 0)
1792 static_fields = nreverse (static_fields);
1793 instance_fields = nreverse (instance_fields);
1794 static_fields = chainon (static_fields, instance_fields);
1795 field_array_type = build_prim_array_type (field_type_node, field_count);
1796 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1798 DECL_INITIAL (fields_decl) = build_constructor_from_list
1799 (field_array_type, static_fields);
1800 TREE_STATIC (fields_decl) = 1;
1801 DECL_ARTIFICIAL (fields_decl) = 1;
1802 DECL_IGNORED_P (fields_decl) = 1;
1803 rest_of_decl_compilation (fields_decl, 1, 0);
1806 fields_decl = NULL_TREE;
1808 /* Build Method array. */
1809 for (method = TYPE_METHODS (type);
1810 method != NULL_TREE; method = TREE_CHAIN (method))
1813 if (METHOD_PRIVATE (method)
1814 && ! flag_keep_inline_functions
1817 /* Even if we have a decl, we don't necessarily have the code.
1818 This can happen if we inherit a method from a superclass for
1819 which we don't have a .class file. */
1820 if (METHOD_DUMMY (method))
1823 /* Generate method reflection data if:
1825 - !flag_reduced_reflection.
1827 - <clinit> -- The runtime uses reflection to initialize the
1830 - Any method in class java.lang.Class -- Class.forName() and
1831 perhaps other things require it.
1833 - class$ -- It does not work if reflection data missing.
1835 - main -- Reflection is used to find main(String[]) methods.
1837 - public not static -- It is potentially part of an
1838 interface. The runtime uses reflection data to build
1839 interface dispatch tables. */
1840 if (!flag_reduced_reflection
1841 || DECL_CLINIT_P (method)
1842 || DECL_NAME (type_decl) == id_class
1843 || DECL_NAME (method) == id_main
1844 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
1845 || TYPE_DOT_CLASS (type) == method)
1847 init = make_method_value (method);
1849 methods = tree_cons (NULL_TREE, init, methods);
1852 method_array_type = build_prim_array_type (method_type_node, method_count);
1853 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1855 DECL_INITIAL (methods_decl) = build_constructor_from_list
1856 (method_array_type, nreverse (methods));
1857 TREE_STATIC (methods_decl) = 1;
1858 DECL_ARTIFICIAL (methods_decl) = 1;
1859 DECL_IGNORED_P (methods_decl) = 1;
1860 rest_of_decl_compilation (methods_decl, 1, 0);
1862 if (class_dtable_decl == NULL_TREE)
1864 class_dtable_decl = build_dtable_decl (class_type_node);
1865 TREE_STATIC (class_dtable_decl) = 1;
1866 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1867 DECL_IGNORED_P (class_dtable_decl) = 1;
1868 if (is_compiled_class (class_type_node) != 2)
1870 DECL_EXTERNAL (class_dtable_decl) = 1;
1871 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1875 super = CLASSTYPE_SUPER (type);
1876 if (super == NULL_TREE)
1877 super = null_pointer_node;
1878 else if (! flag_indirect_dispatch
1879 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1880 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1881 super = build_class_ref (super);
1884 int super_index = alloc_class_constant (super);
1885 super = build_int_cst (ptr_type_node, super_index);
1888 /* Build and emit the array of implemented interfaces. */
1889 if (type != object_type_node)
1890 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1892 if (interface_len > 0)
1894 tree init = NULL_TREE;
1896 tree interface_array_type, idecl;
1897 interface_array_type
1898 = build_prim_array_type (class_ptr_type, interface_len);
1899 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1900 interface_array_type);
1902 for (i = interface_len; i > 0; i--)
1904 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1905 tree iclass = BINFO_TYPE (child);
1907 if (! flag_indirect_dispatch
1909 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1910 index = build_class_ref (iclass);
1913 int int_index = alloc_class_constant (iclass);
1914 index = build_int_cst (ptr_type_node, int_index);
1916 init = tree_cons (NULL_TREE, index, init);
1918 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
1920 TREE_STATIC (idecl) = 1;
1921 DECL_ARTIFICIAL (idecl) = 1;
1922 DECL_IGNORED_P (idecl) = 1;
1923 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1924 rest_of_decl_compilation (idecl, 1, 0);
1927 constant_pool_constructor = build_constants_constructor ();
1929 if (flag_indirect_dispatch)
1931 TYPE_OTABLE_DECL (type)
1933 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1934 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1935 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1937 TYPE_ATABLE_DECL (type)
1939 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1940 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1941 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1943 TYPE_ITABLE_DECL (type)
1945 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1946 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1947 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1950 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1952 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1953 PUSH_FIELD_VALUE (temp, "vtable",
1954 (flag_indirect_classes
1956 : build2 (PLUS_EXPR, dtable_ptr_type,
1957 build1 (ADDR_EXPR, dtable_ptr_type,
1959 dtable_start_offset)));
1960 if (! flag_hash_synchronization)
1961 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1962 FINISH_RECORD_CONSTRUCTOR (temp);
1963 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1964 PUSH_SUPER_VALUE (cons, temp);
1965 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1966 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1967 PUSH_FIELD_VALUE (cons, "accflags",
1968 build_int_cst (NULL_TREE,
1969 get_access_flags_from_decl (type_decl)));
1971 PUSH_FIELD_VALUE (cons, "superclass",
1972 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1973 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1974 PUSH_FIELD_VALUE (cons, "methods",
1975 methods_decl == NULL_TREE ? null_pointer_node
1976 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1977 PUSH_FIELD_VALUE (cons, "method_count",
1978 build_int_cst (NULL_TREE, method_count));
1980 if (flag_indirect_dispatch)
1981 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1983 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1985 PUSH_FIELD_VALUE (cons, "fields",
1986 fields_decl == NULL_TREE ? null_pointer_node
1987 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1988 /* If we're using the binary compatibility ABI we don't know the
1989 size until load time. */
1990 PUSH_FIELD_VALUE (cons, "size_in_bytes",
1991 (flag_indirect_dispatch
1992 ? integer_minus_one_node
1993 : size_in_bytes (type)));
1994 PUSH_FIELD_VALUE (cons, "field_count",
1995 build_int_cst (NULL_TREE, field_count));
1996 PUSH_FIELD_VALUE (cons, "static_field_count",
1997 build_int_cst (NULL_TREE, static_field_count));
1999 if (flag_indirect_dispatch)
2000 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
2002 PUSH_FIELD_VALUE (cons, "vtable",
2003 dtable_decl == NULL_TREE ? null_pointer_node
2004 : build2 (PLUS_EXPR, dtable_ptr_type,
2005 build1 (ADDR_EXPR, dtable_ptr_type,
2007 dtable_start_offset));
2008 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
2010 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
2011 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
2015 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type));
2016 PUSH_FIELD_VALUE (cons, "otable",
2017 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
2018 PUSH_FIELD_VALUE (cons, "otable_syms",
2019 build1 (ADDR_EXPR, symbols_array_ptr_type,
2020 TYPE_OTABLE_SYMS_DECL (type)));
2021 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
2022 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
2024 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
2026 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
2027 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
2031 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type));
2032 PUSH_FIELD_VALUE (cons, "atable",
2033 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
2034 PUSH_FIELD_VALUE (cons, "atable_syms",
2035 build1 (ADDR_EXPR, symbols_array_ptr_type,
2036 TYPE_ATABLE_SYMS_DECL (type)));
2037 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
2038 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
2040 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
2042 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
2043 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
2047 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type));
2048 PUSH_FIELD_VALUE (cons, "itable",
2049 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
2050 PUSH_FIELD_VALUE (cons, "itable_syms",
2051 build1 (ADDR_EXPR, symbols_array_ptr_type,
2052 TYPE_ITABLE_SYMS_DECL (type)));
2053 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
2054 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
2057 PUSH_FIELD_VALUE (cons, "catch_classes",
2058 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2059 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
2060 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
2061 PUSH_FIELD_VALUE (cons, "interface_count",
2062 build_int_cst (NULL_TREE, interface_len));
2063 PUSH_FIELD_VALUE (cons, "state",
2064 convert (byte_type_node,
2065 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2067 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
2068 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
2069 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
2070 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
2071 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
2072 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
2075 tree assertion_table_ref;
2076 if (TYPE_ASSERTIONS (type) == NULL)
2077 assertion_table_ref = null_pointer_node;
2079 assertion_table_ref = build1 (ADDR_EXPR,
2080 build_pointer_type (assertion_table_type),
2081 emit_assertion_table (type));
2083 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
2086 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
2087 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
2088 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
2089 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
2091 if (TYPE_REFLECTION_DATA (current_class))
2094 int count = TYPE_REFLECTION_DATASIZE (current_class);
2095 VEC (constructor_elt, gc) *v
2096 = VEC_alloc (constructor_elt, gc, count);
2097 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2098 tree max_index = build_int_cst (sizetype, count);
2099 tree index = build_index_type (max_index);
2100 tree type = build_array_type (unsigned_byte_type_node, index);
2103 static int reflection_data_count;
2105 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2106 array = build_decl (VAR_DECL, get_identifier (buf), type);
2108 rewrite_reflection_indexes (field_indexes);
2110 for (i = 0; i < count; i++)
2112 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2113 elt->index = build_int_cst (sizetype, i);
2114 elt->value = build_int_cstu (byte_type_node, data[i]);
2117 DECL_INITIAL (array) = build_constructor (type, v);
2118 TREE_STATIC (array) = 1;
2119 DECL_ARTIFICIAL (array) = 1;
2120 DECL_IGNORED_P (array) = 1;
2121 TREE_READONLY (array) = 1;
2122 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2123 rest_of_decl_compilation (array, 1, 0);
2125 PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
2128 TYPE_REFLECTION_DATA (current_class) = NULL;
2131 PUSH_FIELD_VALUE (cons, "reflection_data", null_pointer_node);
2133 FINISH_RECORD_CONSTRUCTOR (cons);
2135 DECL_INITIAL (decl) = cons;
2137 /* Hash synchronization requires at least 64-bit alignment. */
2138 if (flag_hash_synchronization && POINTER_SIZE < 64)
2139 DECL_ALIGN (decl) = 64;
2141 if (flag_indirect_classes)
2143 TREE_READONLY (decl) = 1;
2144 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2147 rest_of_decl_compilation (decl, 1, 0);
2150 tree classdollar_field = build_classdollar_field (type);
2151 if (!flag_indirect_classes)
2152 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2153 rest_of_decl_compilation (classdollar_field, 1, 0);
2156 TYPE_OTABLE_DECL (type) = NULL_TREE;
2157 TYPE_ATABLE_DECL (type) = NULL_TREE;
2158 TYPE_CTABLE_DECL (type) = NULL_TREE;
2164 if (TYPE_VERIFY_METHOD (output_class))
2166 tree verify_method = TYPE_VERIFY_METHOD (output_class);
2167 DECL_SAVED_TREE (verify_method)
2168 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
2169 build1 (RETURN_EXPR, void_type_node, NULL));
2170 java_genericize (verify_method);
2171 cgraph_finalize_function (verify_method, false);
2172 TYPE_ASSERTIONS (current_class) = NULL;
2175 java_expand_catch_classes (current_class);
2177 current_function_decl = NULL_TREE;
2178 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2179 make_class_data (current_class);
2181 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2184 /* Return 2 if CLASS is compiled by this compilation job;
2185 return 1 if CLASS can otherwise be assumed to be compiled;
2186 return 0 if we cannot assume that CLASS is compiled.
2187 Returns 1 for primitive and 0 for array types. */
2189 is_compiled_class (tree class)
2192 if (TREE_CODE (class) == POINTER_TYPE)
2193 class = TREE_TYPE (class);
2194 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
2196 if (TYPE_ARRAY_P (class))
2198 /* We have to check this explicitly to avoid trying to load a class
2199 that we're currently parsing. */
2200 if (class == current_class)
2203 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2204 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2206 /* The class was seen in the current ZIP file and will be
2207 available as a compiled class in the future but may not have
2208 been loaded already. Load it if necessary. This prevent
2209 build_class_ref () from crashing. */
2211 if (seen_in_zip && !CLASS_LOADED_P (class))
2212 load_class (class, 1);
2214 /* We return 2 for class seen in ZIP and class from files
2215 belonging to the same compilation unit */
2219 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2221 if (!CLASS_LOADED_P (class))
2223 if (CLASS_FROM_SOURCE_P (class))
2224 safe_layout_class (class);
2226 load_class (class, 1);
2234 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2237 build_dtable_decl (tree type)
2241 /* We need to build a new dtable type so that its size is uniquely
2242 computed when we're dealing with the class for real and not just
2243 faking it (like java.lang.Class during the initialization of the
2244 compiler.) We know we're not faking a class when CURRENT_CLASS is
2246 if (current_class == type)
2248 tree dummy = NULL_TREE;
2251 dtype = make_node (RECORD_TYPE);
2253 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
2254 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
2256 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
2257 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2259 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2260 TREE_CHAIN (dummy) = tmp_field;
2261 DECL_CONTEXT (tmp_field) = dtype;
2262 DECL_ARTIFICIAL (tmp_field) = 1;
2266 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
2267 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2269 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2270 TREE_CHAIN (dummy) = tmp_field;
2271 DECL_CONTEXT (tmp_field) = dtype;
2272 DECL_ARTIFICIAL (tmp_field) = 1;
2276 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2277 if (TARGET_VTABLE_USES_DESCRIPTORS)
2278 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2280 PUSH_FIELD (dtype, dummy, "methods",
2281 build_prim_array_type (nativecode_ptr_type_node, n));
2282 layout_type (dtype);
2285 dtype = dtable_type;
2287 decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
2288 DECL_CONTEXT (decl) = type;
2289 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2290 DECL_VTABLE_P (decl) = 1;
2295 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2296 fields inherited from SUPER_CLASS. */
2299 push_super_field (tree this_class, tree super_class)
2302 /* Don't insert the field if we're just re-laying the class out. */
2303 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2305 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2306 DECL_IGNORED_P (base_decl) = 1;
2307 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2308 TYPE_FIELDS (this_class) = base_decl;
2309 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2310 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2313 /* Handle the different manners we may have to lay out a super class. */
2316 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2320 else if (TREE_CODE (super_class) == RECORD_TYPE)
2322 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2323 safe_layout_class (super_class);
2324 if (!CLASS_LOADED_P (super_class))
2325 load_class (super_class, 1);
2327 /* We might have to layout the class before its dependency on
2328 the super class gets resolved by java_complete_class */
2329 else if (TREE_CODE (super_class) == POINTER_TYPE)
2331 if (TREE_TYPE (super_class) != NULL_TREE)
2332 super_class = TREE_TYPE (super_class);
2336 /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
2338 tree this_wrap = NULL_TREE;
2340 /* Set the correct context for class resolution. */
2341 current_class = this_class;
2345 tree this_decl = TYPE_NAME (this_class);
2346 #ifdef USE_MAPPED_LOCATION
2347 this_wrap = build_expr_wfl (this_class,
2348 DECL_SOURCE_LOCATION (this_decl));
2350 this_wrap = build_expr_wfl (this_class,
2351 DECL_SOURCE_FILE (this_decl),
2352 DECL_SOURCE_LINE (this_decl), 0);
2356 = do_resolve_class (DECL_CONTEXT (TYPE_NAME (this_class)),
2357 this_class, super_class, NULL_TREE, this_wrap);
2359 return NULL_TREE; /* FIXME, NULL_TREE not checked by caller. */
2360 super_class = TREE_TYPE (super_class);
2365 if (!TYPE_SIZE (super_class))
2366 safe_layout_class (super_class);
2371 /* safe_layout_class just makes sure that we can load a class without
2372 disrupting the current_class, input_file, input_line, etc, information
2373 about the class processed currently. */
2376 safe_layout_class (tree class)
2378 tree save_current_class = current_class;
2379 location_t save_location = input_location;
2381 layout_class (class);
2383 current_class = save_current_class;
2384 input_location = save_location;
2388 layout_class (tree this_class)
2390 tree super_class = CLASSTYPE_SUPER (this_class);
2392 class_list = tree_cons (this_class, NULL_TREE, class_list);
2393 if (CLASS_BEING_LAIDOUT (this_class))
2399 sprintf (buffer, " with '%s'",
2400 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2401 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2403 for (current = TREE_CHAIN (class_list); current;
2404 current = TREE_CHAIN (current))
2406 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2407 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2408 IDENTIFIER_POINTER (DECL_NAME (decl)),
2409 DECL_SOURCE_FILE (decl),
2410 DECL_SOURCE_LINE (decl));
2411 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2413 obstack_1grow (&temporary_obstack, '\0');
2414 report = obstack_finish (&temporary_obstack);
2415 cyclic_inheritance_report = ggc_strdup (report);
2416 obstack_free (&temporary_obstack, report);
2417 TYPE_SIZE (this_class) = error_mark_node;
2420 CLASS_BEING_LAIDOUT (this_class) = 1;
2422 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2424 tree maybe_super_class
2425 = maybe_layout_super_class (super_class, this_class);
2426 if (maybe_super_class == NULL
2427 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2429 TYPE_SIZE (this_class) = error_mark_node;
2430 CLASS_BEING_LAIDOUT (this_class) = 0;
2431 class_list = TREE_CHAIN (class_list);
2434 if (TYPE_SIZE (this_class) == NULL_TREE)
2435 push_super_field (this_class, maybe_super_class);
2438 layout_type (this_class);
2440 /* Also recursively load/layout any superinterfaces, but only if
2441 class was loaded from bytecode. The source parser will take care
2443 if (!CLASS_FROM_SOURCE_P (this_class))
2446 if (TYPE_BINFO (this_class))
2448 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2450 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2451 tree super_interface = BINFO_TYPE (binfo);
2452 tree maybe_super_interface
2453 = maybe_layout_super_class (super_interface, NULL_TREE);
2454 if (maybe_super_interface == NULL
2455 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2457 TYPE_SIZE (this_class) = error_mark_node;
2458 CLASS_BEING_LAIDOUT (this_class) = 0;
2459 class_list = TREE_CHAIN (class_list);
2466 /* Convert the size back to an SI integer value. */
2467 TYPE_SIZE_UNIT (this_class) =
2468 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2470 CLASS_BEING_LAIDOUT (this_class) = 0;
2471 class_list = TREE_CHAIN (class_list);
2475 add_miranda_methods (tree base_class, tree search_class)
2478 tree binfo, base_binfo;
2480 if (!CLASS_PARSED_P (search_class))
2481 load_class (search_class, 1);
2483 for (binfo = TYPE_BINFO (search_class), i = 1;
2484 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2487 tree elt = BINFO_TYPE (base_binfo);
2489 /* FIXME: This is totally bogus. We should not be handling
2490 Miranda methods at all if we're using the BC ABI. */
2491 if (TYPE_DUMMY (elt))
2494 /* Ensure that interface methods are seen in declared order. */
2495 if (!CLASS_LOADED_P (elt))
2496 load_class (elt, 1);
2497 layout_class_methods (elt);
2499 /* All base classes will have been laid out at this point, so the order
2500 will be correct. This code must match similar layout code in the
2502 for (method_decl = TYPE_METHODS (elt);
2503 method_decl; method_decl = TREE_CHAIN (method_decl))
2507 /* An interface can have <clinit>. */
2508 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2511 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2512 override = lookup_argument_method (base_class,
2513 DECL_NAME (method_decl), sig);
2514 if (override == NULL_TREE)
2516 /* Found a Miranda method. Add it. */
2518 sig = build_java_signature (TREE_TYPE (method_decl));
2520 = add_method (base_class,
2521 get_access_flags_from_decl (method_decl),
2522 DECL_NAME (method_decl), sig);
2523 METHOD_INVISIBLE (new_method) = 1;
2527 /* Try superinterfaces. */
2528 add_miranda_methods (base_class, elt);
2533 layout_class_methods (tree this_class)
2535 tree method_decl, dtable_count;
2536 tree super_class, type_name;
2538 if (TYPE_NVIRTUALS (this_class))
2541 super_class = CLASSTYPE_SUPER (this_class);
2545 super_class = maybe_layout_super_class (super_class, this_class);
2546 if (!TYPE_NVIRTUALS (super_class))
2547 layout_class_methods (super_class);
2548 dtable_count = TYPE_NVIRTUALS (super_class);
2551 dtable_count = integer_zero_node;
2553 type_name = TYPE_NAME (this_class);
2554 if (!flag_indirect_dispatch
2555 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2557 /* An abstract class can have methods which are declared only in
2558 an implemented interface. These are called "Miranda
2559 methods". We make a dummy method entry for such methods
2561 add_miranda_methods (this_class, this_class);
2564 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2566 for (method_decl = TYPE_METHODS (this_class);
2567 method_decl; method_decl = TREE_CHAIN (method_decl))
2568 dtable_count = layout_class_method (this_class, super_class,
2569 method_decl, dtable_count);
2571 TYPE_NVIRTUALS (this_class) = dtable_count;
2574 /* Return the index of METHOD in INTERFACE. This index begins at 1
2575 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2577 get_interface_method_index (tree method, tree interface)
2582 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2586 /* We don't want to put <clinit> into the interface table. */
2587 if (! ID_CLINIT_P (DECL_NAME (meth)))
2589 gcc_assert (meth != NULL_TREE);
2593 /* Lay METHOD_DECL out, returning a possibly new value of
2594 DTABLE_COUNT. Also mangle the method's name. */
2597 layout_class_method (tree this_class, tree super_class,
2598 tree method_decl, tree dtable_count)
2600 tree method_name = DECL_NAME (method_decl);
2602 TREE_PUBLIC (method_decl) = 1;
2603 /* Considered external unless it is being compiled into this object
2605 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2606 || METHOD_NATIVE (method_decl));
2608 if (ID_INIT_P (method_name))
2610 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2612 for (ptr = p; *ptr; )
2617 DECL_CONSTRUCTOR_P (method_decl) = 1;
2618 build_java_signature (TREE_TYPE (method_decl));
2620 else if (! METHOD_STATIC (method_decl))
2623 build_java_signature (TREE_TYPE (method_decl));
2624 bool method_override = false;
2625 tree super_method = lookup_java_method (super_class, method_name,
2627 if (super_method != NULL_TREE
2628 && ! METHOD_DUMMY (super_method))
2630 method_override = true;
2631 if (! METHOD_PUBLIC (super_method) &&
2632 ! METHOD_PROTECTED (super_method))
2634 /* Don't override private method, or default-access method in
2636 if (METHOD_PRIVATE (super_method) ||
2637 ! in_same_package (TYPE_NAME (this_class),
2638 TYPE_NAME (super_class)))
2639 method_override = false;
2642 if (method_override)
2644 tree method_index = get_method_index (super_method);
2645 set_method_index (method_decl, method_index);
2646 if (method_index == NULL_TREE
2647 && ! flag_indirect_dispatch
2648 && !CLASS_FROM_SOURCE_P (this_class)
2649 && ! DECL_ARTIFICIAL (super_method))
2650 error ("non-static method %q+D overrides static method",
2653 else if (this_class == object_type_node
2654 && (METHOD_FINAL (method_decl)
2655 || METHOD_PRIVATE (method_decl)))
2657 /* We don't generate vtable entries for final Object
2658 methods. This is simply to save space, since every
2659 object would otherwise have to define them. */
2661 else if (! METHOD_PRIVATE (method_decl)
2664 /* We generate vtable entries for final methods because they
2665 may one day be changed to non-final. */
2666 set_method_index (method_decl, dtable_count);
2667 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2668 dtable_count, integer_one_node);
2672 return dtable_count;
2676 register_class (void)
2680 if (!registered_class)
2681 registered_class = VEC_alloc (tree, gc, 8);
2683 if (flag_indirect_classes)
2684 node = current_class;
2686 node = TREE_OPERAND (build_class_ref (current_class), 0);
2687 VEC_safe_push (tree, gc, registered_class, node);
2690 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2691 all the classes we have emitted. */
2694 emit_indirect_register_classes (tree *list_p)
2696 tree klass, t, register_class_fn;
2699 tree init = NULL_TREE;
2700 int size = VEC_length (tree, registered_class) * 2 + 1;
2701 tree class_array_type
2702 = build_prim_array_type (ptr_type_node, size);
2703 tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"),
2705 tree reg_class_list;
2706 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2708 init = tree_cons (NULL_TREE,
2709 fold_convert (ptr_type_node,
2710 build_static_class_ref (klass)), init);
2713 fold_convert (ptr_type_node,
2714 build_address_of (build_classdollar_field (klass))),
2717 init = tree_cons (NULL_TREE, integer_zero_node, init);
2718 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2720 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2721 TREE_STATIC (cdecl) = 1;
2722 DECL_ARTIFICIAL (cdecl) = 1;
2723 DECL_IGNORED_P (cdecl) = 1;
2724 TREE_READONLY (cdecl) = 1;
2725 TREE_CONSTANT (cdecl) = 1;
2726 rest_of_decl_compilation (cdecl, 1, 0);
2727 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2729 t = build_function_type_list (void_type_node,
2730 build_pointer_type (ptr_type_node), NULL);
2731 t = build_decl (FUNCTION_DECL,
2732 get_identifier ("_Jv_RegisterNewClasses"), t);
2733 TREE_PUBLIC (t) = 1;
2734 DECL_EXTERNAL (t) = 1;
2735 register_class_fn = t;
2736 t = tree_cons (NULL, reg_class_list, NULL);
2737 t = build_function_call_expr (register_class_fn, t);
2738 append_to_statement_list (t, list_p);
2742 /* Emit something to register classes at start-up time.
2744 The preferred mechanism is through the .jcr section, which contain
2745 a list of pointers to classes which get registered during constructor
2748 The fallback mechanism is to add statements to *LIST_P to call
2749 _Jv_RegisterClass for each class in this file. These statements will
2750 be added to a static constructor function for this translation unit. */
2753 emit_register_classes (tree *list_p)
2755 if (registered_class == NULL)
2758 if (flag_indirect_classes)
2760 emit_indirect_register_classes (list_p);
2764 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2765 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2766 but lack suitable crtbegin/end objects or linker support. These
2767 targets can override the default in tm.h to use the fallback mechanism. */
2768 if (TARGET_USE_JCR_SECTION)
2773 #ifdef JCR_SECTION_NAME
2774 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2776 /* A target has defined TARGET_USE_JCR_SECTION,
2777 but doesn't have a JCR_SECTION_NAME. */
2780 assemble_align (POINTER_SIZE);
2782 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2784 t = build_fold_addr_expr (klass);
2785 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2790 tree klass, t, register_class_fn;
2793 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2794 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2795 TREE_PUBLIC (t) = 1;
2796 DECL_EXTERNAL (t) = 1;
2797 register_class_fn = t;
2799 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2801 t = build_fold_addr_expr (klass);
2802 t = tree_cons (NULL, t, NULL);
2803 t = build_function_call_expr (register_class_fn, t);
2804 append_to_statement_list (t, list_p);
2809 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2812 build_symbol_entry (tree decl, tree special)
2814 tree clname, name, signature, sym;
2815 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2816 /* ??? Constructors are given the name foo.foo all the way through
2817 the compiler, but in the method table they're all renamed
2818 foo.<init>. So, we have to do the same here unless we want an
2819 unresolved reference at runtime. */
2820 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2821 && DECL_CONSTRUCTOR_P (decl))
2822 ? init_identifier_node
2823 : DECL_NAME (decl));
2824 signature = build_java_signature (TREE_TYPE (decl));
2825 signature = build_utf8_ref (unmangle_classname
2826 (IDENTIFIER_POINTER (signature),
2827 IDENTIFIER_LENGTH (signature)));
2828 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2829 signature addr+1 if SPECIAL, and this indicates to the runtime
2830 system that this is a "special" symbol, i.e. one that should
2831 bypass access controls. */
2832 if (special != NULL_TREE)
2833 signature = build2 (PLUS_EXPR, TREE_TYPE (signature), signature, special);
2835 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2836 PUSH_FIELD_VALUE (sym, "clname", clname);
2837 PUSH_FIELD_VALUE (sym, "name", name);
2838 PUSH_FIELD_VALUE (sym, "signature", signature);
2839 FINISH_RECORD_CONSTRUCTOR (sym);
2840 TREE_CONSTANT (sym) = 1;
2841 TREE_INVARIANT (sym) = 1;
2846 /* Emit a symbol table: used by -findirect-dispatch. */
2849 emit_symbol_table (tree name, tree the_table, tree decl_list,
2850 tree the_syms_decl, tree the_array_element_type,
2853 tree method_list, method, table, list, null_symbol;
2854 tree table_size, the_array_type;
2857 /* Only emit a table if this translation unit actually made any
2858 references via it. */
2859 if (decl_list == NULL_TREE)
2862 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2864 method_list = decl_list;
2866 while (method_list != NULL_TREE)
2868 tree special = TREE_PURPOSE (method_list);
2869 method = TREE_VALUE (method_list);
2870 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2871 method_list = TREE_CHAIN (method_list);
2875 /* Terminate the list with a "null" entry. */
2876 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2877 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2878 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2879 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2880 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2881 TREE_CONSTANT (null_symbol) = 1;
2882 TREE_INVARIANT (null_symbol) = 1;
2883 list = tree_cons (NULL_TREE, null_symbol, list);
2885 /* Put the list in the right order and make it a constructor. */
2886 list = nreverse (list);
2887 table = build_constructor_from_list (symbols_array_type, list);
2889 /* Make it the initial value for otable_syms and emit the decl. */
2890 DECL_INITIAL (the_syms_decl) = table;
2891 DECL_ARTIFICIAL (the_syms_decl) = 1;
2892 DECL_IGNORED_P (the_syms_decl) = 1;
2893 rest_of_decl_compilation (the_syms_decl, 1, 0);
2895 /* Now that its size is known, redefine the table as an
2896 uninitialized static array of INDEX + 1 elements. The extra entry
2897 is used by the runtime to track whether the table has been
2900 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2901 the_array_type = build_array_type (the_array_element_type, table_size);
2902 the_table = build_decl (VAR_DECL, name, the_array_type);
2903 TREE_STATIC (the_table) = 1;
2904 TREE_READONLY (the_table) = 1;
2905 rest_of_decl_compilation (the_table, 1, 0);
2910 /* Make an entry for the catch_classes list. */
2912 make_catch_class_record (tree catch_class, tree classname)
2915 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2916 START_RECORD_CONSTRUCTOR (entry, type);
2917 PUSH_FIELD_VALUE (entry, "address", catch_class);
2918 PUSH_FIELD_VALUE (entry, "classname", classname);
2919 FINISH_RECORD_CONSTRUCTOR (entry);
2924 /* Generate the list of Throwable classes that are caught by exception
2925 handlers in this class. */
2927 emit_catch_table (tree this_class)
2929 tree table, table_size, array_type;
2930 TYPE_CATCH_CLASSES (this_class) =
2932 make_catch_class_record (null_pointer_node, null_pointer_node),
2933 TYPE_CATCH_CLASSES (this_class));
2934 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2935 TYPE_CATCH_CLASSES (this_class) =
2937 make_catch_class_record (null_pointer_node, null_pointer_node),
2938 TYPE_CATCH_CLASSES (this_class));
2939 table_size = build_index_type
2940 (build_int_cst (NULL_TREE,
2941 list_length (TYPE_CATCH_CLASSES (this_class))));
2943 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2946 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2947 DECL_INITIAL (table) =
2948 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2949 TREE_STATIC (table) = 1;
2950 TREE_READONLY (table) = 1;
2951 DECL_IGNORED_P (table) = 1;
2952 rest_of_decl_compilation (table, 1, 0);
2956 /* Given a type, return the signature used by
2957 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2958 same as build_java_signature() because we want the canonical array
2962 build_signature_for_libgcj (tree type)
2966 sig = build_java_signature (type);
2967 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2968 IDENTIFIER_LENGTH (sig)));
2972 /* Add an entry to the type assertion table. Callback used during hashtable
2976 add_assertion_table_entry (void **htab_entry, void *ptr)
2979 tree code_val, op1_utf8, op2_utf8;
2980 tree *list = (tree *) ptr;
2981 type_assertion *as = (type_assertion *) *htab_entry;
2983 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2985 if (as->op1 == NULL_TREE)
2986 op1_utf8 = null_pointer_node;
2988 op1_utf8 = build_signature_for_libgcj (as->op1);
2990 if (as->op2 == NULL_TREE)
2991 op2_utf8 = null_pointer_node;
2993 op2_utf8 = build_signature_for_libgcj (as->op2);
2995 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2996 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2997 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2998 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2999 FINISH_RECORD_CONSTRUCTOR (entry);
3001 *list = tree_cons (NULL_TREE, entry, *list);
3005 /* Generate the type assertion table for CLASS, and return its DECL. */
3008 emit_assertion_table (tree class)
3010 tree null_entry, ctor, table_decl;
3011 tree list = NULL_TREE;
3012 htab_t assertions_htab = TYPE_ASSERTIONS (class);
3014 /* Iterate through the hash table. */
3015 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
3017 /* Finish with a null entry. */
3018 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
3019 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
3020 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
3021 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
3022 FINISH_RECORD_CONSTRUCTOR (null_entry);
3024 list = tree_cons (NULL_TREE, null_entry, list);
3026 /* Put the list in the right order and make it a constructor. */
3027 list = nreverse (list);
3028 ctor = build_constructor_from_list (assertion_table_type, list);
3030 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
3031 assertion_table_type);
3033 TREE_STATIC (table_decl) = 1;
3034 TREE_READONLY (table_decl) = 1;
3035 TREE_CONSTANT (table_decl) = 1;
3036 DECL_IGNORED_P (table_decl) = 1;
3038 DECL_INITIAL (table_decl) = ctor;
3039 DECL_ARTIFICIAL (table_decl) = 1;
3040 rest_of_decl_compilation (table_decl, 1, 0);
3046 init_class_processing (void)
3048 fields_ident = get_identifier ("fields");
3049 info_ident = get_identifier ("info");
3051 gcc_obstack_init (&temporary_obstack);
3054 static hashval_t java_treetreehash_hash (const void *);
3055 static int java_treetreehash_compare (const void *, const void *);
3057 /* A hash table mapping trees to trees. Used generally. */
3059 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
3062 java_treetreehash_hash (const void *k_p)
3064 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
3065 return JAVA_TREEHASHHASH_H (k->key);
3069 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3071 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
3072 tree k2 = (tree) k2_p;
3073 return (k1->key == k2);
3077 java_treetreehash_find (htab_t ht, tree t)
3079 struct treetreehash_entry *e;
3080 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3081 e = htab_find_with_hash (ht, t, hv);
3089 java_treetreehash_new (htab_t ht, tree t)
3092 struct treetreehash_entry *tthe;
3093 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3095 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3098 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
3103 tthe = (struct treetreehash_entry *) *e;
3104 return &tthe->value;
3108 java_treetreehash_create (size_t size, int gc)
3111 return htab_create_ggc (size, java_treetreehash_hash,
3112 java_treetreehash_compare, NULL);
3114 return htab_create_alloc (size, java_treetreehash_hash,
3115 java_treetreehash_compare, free, xcalloc, free);
3118 /* Break down qualified IDENTIFIER into package and class-name components.
3119 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3120 "pkg.foo", and RIGHT to "Bar". */
3123 split_qualified_name (tree *left, tree *right, tree source)
3126 int l = IDENTIFIER_LENGTH (source);
3128 base = alloca (l + 1);
3129 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3131 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3133 while (*p != '.' && p != base)
3136 /* We didn't find a '.'. Return an error. */
3142 *right = get_identifier (p+1);
3143 *left = get_identifier (base);
3148 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3149 if the classes are from the same package. */
3152 in_same_package (tree name1, tree name2)
3158 if (TREE_CODE (name1) == TYPE_DECL)
3159 name1 = DECL_NAME (name1);
3160 if (TREE_CODE (name2) == TYPE_DECL)
3161 name2 = DECL_NAME (name2);
3163 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3164 /* One in empty package. */
3167 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3168 /* Both in empty package. */
3171 split_qualified_name (&pkg1, &tmp, name1);
3172 split_qualified_name (&pkg2, &tmp, name2);
3174 return (pkg1 == pkg2);
3177 #include "gt-java-class.h"