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, 2008, 2010 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"
32 #include "java-tree.h"
42 #include "tree-iterator.h"
44 #include "tm.h" /* FIXME: For gcc_obstack_init from defaults.h. */
46 /* DOS brain-damage */
48 #define O_BINARY 0 /* MS-DOS brain-damage */
51 static tree make_method_value (tree);
52 static tree build_java_method_type (tree, tree, int);
53 static int32 hashUtf8String (const char *, int);
54 static tree make_field_value (tree);
55 static tree get_dispatch_vector (tree);
56 static tree get_dispatch_table (tree, tree);
57 static int supers_all_compiled (tree type);
58 static tree maybe_layout_super_class (tree, tree);
59 static void add_miranda_methods (tree, tree);
60 static int assume_compiled (const char *);
61 static tree build_symbol_entry (tree, tree);
62 static tree emit_assertion_table (tree);
63 static void register_class (void);
65 struct obstack temporary_obstack;
67 static const char *cyclic_inheritance_report;
69 /* The compiler generates different code depending on whether or not
70 it can assume certain classes have been compiled down to native
71 code or not. The compiler options -fassume-compiled= and
72 -fno-assume-compiled= are used to create a tree of
73 class_flag_node objects. This tree is queried to determine if
74 a class is assume to be compiled or not. Each node in the tree
75 represents either a package or a specific class. */
77 typedef struct class_flag_node_struct
79 /* The class or package name. */
82 /* Nonzero if this represents an exclusion. */
85 /* Pointers to other nodes in the tree. */
86 struct class_flag_node_struct *parent;
87 struct class_flag_node_struct *sibling;
88 struct class_flag_node_struct *child;
91 static class_flag_node *find_class_flag_node (class_flag_node *, const char *);
92 static void add_class_flag (class_flag_node **, const char *, int);
94 /* This is the root of the include/exclude tree. */
96 static class_flag_node *assume_compiled_tree;
98 static class_flag_node *enable_assert_tree;
100 static GTY(()) tree class_roots[4];
101 #define fields_ident class_roots[0] /* get_identifier ("fields") */
102 #define info_ident class_roots[1] /* get_identifier ("info") */
103 #define class_list class_roots[2]
104 #define class_dtable_decl class_roots[3]
106 static GTY(()) VEC(tree,gc) *registered_class;
108 /* A tree that returns the address of the class$ of the class
109 currently being compiled. */
110 static GTY(()) tree this_classdollar;
112 /* A list of static class fields. This is to emit proper debug
114 VEC(tree,gc) *pending_static_fields;
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 = (char *) 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)
318 tree ident = TYPE_NAME (type);
319 if (TREE_CODE (ident) != IDENTIFIER_NODE)
320 ident = DECL_NAME (ident);
321 result = identifier_subst (ident, prefix, '.', '_', "");
323 /* Replace any characters that aren't in the set [0-9a-zA-Z_$] with
324 "_0xXX". Class names containing such chracters are uncommon, but
325 they do sometimes occur in class files. Without this check,
326 these names cause assembly errors.
328 There is a possibility that a real class name could conflict with
329 the identifier we generate, but it is unlikely and will
330 immediately be detected as an assembler error. At some point we
331 should do something more elaborate (perhaps using the full
332 unicode mangling scheme) in order to prevent such a conflict. */
335 const int len = IDENTIFIER_LENGTH (result);
336 const char *p = IDENTIFIER_POINTER (result);
337 int illegal_chars = 0;
339 /* Make two passes over the identifier. The first pass is merely
340 to count illegal characters; we need to do this in order to
341 allocate a buffer. */
342 for (i = 0; i < len; i++)
345 illegal_chars += (! ISALNUM (c) && c != '_' && c != '$');
348 /* And the second pass, which is rarely executed, does the
350 if (illegal_chars != 0)
352 char *buffer = (char *) alloca (illegal_chars * 4 + len + 1);
355 for (i = 0, j = 0; i < len; i++)
358 if (! ISALNUM (c) && c != '_' && c != '$')
361 sprintf (&buffer[j], "0x%02x", c);
369 result = get_identifier (buffer);
380 type = make_node (RECORD_TYPE);
381 /* Unfortunately we must create the binfo here, so that class
383 TYPE_BINFO (type) = make_tree_binfo (0);
384 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
389 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
390 and where each of the constituents is separated by '/',
391 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
394 unmangle_classname (const char *name, int name_length)
396 tree to_return = ident_subst (name, name_length, "", '/', '.', "");
397 /* It's not sufficient to compare to_return and get_identifier
398 (name) to determine whether to_return is qualified. There are
399 cases in signature analysis where name will be stripped of a
401 name = IDENTIFIER_POINTER (to_return);
405 QUALIFIED_P (to_return) = 1;
412 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
415 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
416 char *buf = (char *) alloca (strlen (type_name) \
417 + strlen (#NAME "_syms_") + 1); \
420 sprintf (buf, #NAME "_%s", type_name); \
421 TYPE_## TABLE ##_DECL (type) = decl = \
422 build_decl (input_location, VAR_DECL, get_identifier (buf), TABLE_TYPE); \
423 DECL_EXTERNAL (decl) = 1; \
424 TREE_STATIC (decl) = 1; \
425 TREE_READONLY (decl) = 1; \
426 TREE_CONSTANT (decl) = 1; \
427 DECL_IGNORED_P (decl) = 1; \
428 /* Mark the table as belonging to this class. */ \
430 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
431 DECL_OWNER (decl) = TYPE; \
432 sprintf (buf, #NAME "_syms_%s", type_name); \
433 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
434 build_decl (input_location, VAR_DECL, get_identifier (buf), symbols_array_type); \
435 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
436 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
437 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
441 /* Given a class, create the DECLs for all its associated indirect
444 gen_indirect_dispatch_tables (tree type)
446 const char *type_name = IDENTIFIER_POINTER (mangled_classname ("", type));
449 char *buf = (char *) alloca (strlen (type_name)
450 + strlen ("_catch_classes_") + 1);
451 tree catch_class_type = make_node (RECORD_TYPE);
453 sprintf (buf, "_catch_classes_%s", type_name);
454 PUSH_FIELD (input_location,
455 catch_class_type, field, "address", utf8const_ptr_type);
456 PUSH_FIELD (input_location,
457 catch_class_type, field, "classname", ptr_type_node);
458 FINISH_RECORD (catch_class_type);
460 TYPE_CTABLE_DECL (type)
461 = build_decl (input_location, VAR_DECL, get_identifier (buf),
462 build_array_type (catch_class_type, 0));
463 DECL_EXTERNAL (TYPE_CTABLE_DECL (type)) = 1;
464 TREE_STATIC (TYPE_CTABLE_DECL (type)) = 1;
465 TREE_READONLY (TYPE_CTABLE_DECL (type)) = 1;
466 TREE_CONSTANT (TYPE_CTABLE_DECL (type)) = 1;
467 DECL_IGNORED_P (TYPE_CTABLE_DECL (type)) = 1;
468 pushdecl (TYPE_CTABLE_DECL (type));
471 if (flag_indirect_dispatch)
473 GEN_TABLE (ATABLE, _atable, atable_type, type);
474 GEN_TABLE (OTABLE, _otable, otable_type, type);
475 GEN_TABLE (ITABLE, _itable, itable_type, type);
482 push_class (tree class_type, tree class_name)
484 tree decl, signature;
485 location_t saved_loc = input_location;
486 CLASS_P (class_type) = 1;
487 decl = build_decl (input_location, TYPE_DECL, class_name, class_type);
488 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
490 /* dbxout needs a DECL_SIZE if in gstabs mode */
491 DECL_SIZE (decl) = integer_zero_node;
493 input_location = saved_loc;
494 signature = identifier_subst (class_name, "L", '.', '/', ";");
495 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
497 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
498 both a typedef and in the struct name-space. We may want to re-visit
499 this later, but for now it reduces the changes needed for gdb. */
500 DECL_ARTIFICIAL (decl) = 1;
502 pushdecl_top_level (decl);
507 /* Finds the (global) class named NAME. Creates the class if not found.
508 Also creates associated TYPE_DECL.
509 Does not check if the class actually exists, load the class,
510 fill in field or methods, or do layout_type. */
513 lookup_class (tree name)
515 tree decl = IDENTIFIER_CLASS_VALUE (name);
516 if (decl == NULL_TREE)
517 decl = push_class (make_class (), name);
518 return TREE_TYPE (decl);
522 set_super_info (int access_flags, tree this_class,
523 tree super_class, int interfaces_count)
525 int total_supers = interfaces_count;
526 tree class_decl = TYPE_NAME (this_class);
532 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
533 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
536 tree super_binfo = make_tree_binfo (0);
537 BINFO_TYPE (super_binfo) = super_class;
538 BINFO_OFFSET (super_binfo) = integer_zero_node;
539 BINFO_BASE_APPEND (TYPE_BINFO (this_class), super_binfo);
540 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class)) = 1;
543 set_class_decl_access_flags (access_flags, class_decl);
547 set_class_decl_access_flags (int access_flags, tree class_decl)
549 if (access_flags & ACC_PUBLIC) CLASS_PUBLIC (class_decl) = 1;
550 if (access_flags & ACC_FINAL) CLASS_FINAL (class_decl) = 1;
551 if (access_flags & ACC_SUPER) CLASS_SUPER (class_decl) = 1;
552 if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
553 if (access_flags & ACC_ABSTRACT) CLASS_ABSTRACT (class_decl) = 1;
554 if (access_flags & ACC_STATIC) CLASS_STATIC (class_decl) = 1;
555 if (access_flags & ACC_PRIVATE) CLASS_PRIVATE (class_decl) = 1;
556 if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
557 if (access_flags & ACC_STRICT) CLASS_STRICTFP (class_decl) = 1;
558 if (access_flags & ACC_ENUM) CLASS_ENUM (class_decl) = 1;
559 if (access_flags & ACC_SYNTHETIC) CLASS_SYNTHETIC (class_decl) = 1;
560 if (access_flags & ACC_ANNOTATION) CLASS_ANNOTATION (class_decl) = 1;
563 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
564 direct sub-classes of Object are 1, and so on. */
567 class_depth (tree clas)
570 if (! CLASS_LOADED_P (clas))
571 load_class (clas, 1);
572 if (TYPE_SIZE (clas) == error_mark_node)
574 while (clas != object_type_node)
577 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
582 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
585 interface_of_p (tree type1, tree type2)
588 tree binfo, base_binfo;
590 if (! TYPE_BINFO (type2))
593 for (binfo = TYPE_BINFO (type2), i = 0;
594 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
595 if (BINFO_TYPE (base_binfo) == type1)
598 for (binfo = TYPE_BINFO (type2), i = 0;
599 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) /* */
600 if (BINFO_TYPE (base_binfo)
601 && interface_of_p (type1, BINFO_TYPE (base_binfo)))
607 /* Return true iff TYPE1 inherits from TYPE2. */
610 inherits_from_p (tree type1, tree type2)
612 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
617 if (! CLASS_LOADED_P (type1))
618 load_class (type1, 1);
620 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
625 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
628 enclosing_context_p (tree type1, tree type2)
630 if (!INNER_CLASS_TYPE_P (type2))
633 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
635 type2 = (INNER_CLASS_TYPE_P (type2) ?
636 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
646 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
650 common_enclosing_context_p (tree type1, tree type2)
655 for (current = type2; current;
656 current = (INNER_CLASS_TYPE_P (current) ?
657 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
659 if (type1 == current)
662 if (INNER_CLASS_TYPE_P (type1))
663 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
670 /* Return 1 iff there exists a common enclosing "this" between TYPE1
671 and TYPE2, without crossing any static context. */
674 common_enclosing_instance_p (tree type1, tree type2)
676 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
679 for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1;
680 type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
681 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
684 for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
685 current = (PURE_INNER_CLASS_TYPE_P (current) ?
686 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
688 if (type1 == current)
694 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
695 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
696 if attempt is made to add it twice. */
699 maybe_add_interface (tree this_class, tree interface_class)
701 tree binfo, base_binfo;
704 for (binfo = TYPE_BINFO (this_class), i = 0;
705 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
706 if (BINFO_TYPE (base_binfo) == interface_class)
707 return interface_class;
708 add_interface (this_class, interface_class);
712 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
715 add_interface (tree this_class, tree interface_class)
717 tree interface_binfo = make_tree_binfo (0);
719 BINFO_TYPE (interface_binfo) = interface_class;
720 BINFO_OFFSET (interface_binfo) = integer_zero_node;
721 BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
722 BINFO_VIRTUAL_P (interface_binfo) = 1;
724 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
728 build_java_method_type (tree fntype, tree this_class, int access_flags)
730 if (access_flags & ACC_STATIC)
732 fntype = build_method_type (this_class, fntype);
734 /* We know that arg 1 of every nonstatic method is non-null; tell
736 TYPE_ATTRIBUTES (fntype) = (tree_cons
737 (get_identifier ("nonnull"),
738 tree_cons (NULL_TREE,
739 build_int_cst (NULL_TREE, 1),
741 TYPE_ATTRIBUTES (fntype)));
746 java_hide_decl (tree decl ATTRIBUTE_UNUSED)
748 #ifdef HAVE_GAS_HIDDEN
749 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
750 DECL_VISIBILITY_SPECIFIED (decl) = 1;
755 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
757 tree method_type, fndecl;
759 method_type = build_java_method_type (function_type,
760 this_class, access_flags);
762 fndecl = build_decl (input_location, FUNCTION_DECL, name, method_type);
763 DECL_CONTEXT (fndecl) = this_class;
765 DECL_LANG_SPECIFIC (fndecl)
766 = GGC_CNEW (struct lang_decl);
767 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
769 /* Initialize the static initializer test table. */
771 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
772 java_treetreehash_create (10, 1);
774 /* Initialize the initialized (static) class table. */
775 if (access_flags & ACC_STATIC)
776 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
777 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
779 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
780 TYPE_METHODS (this_class) = fndecl;
782 /* If pointers to member functions use the least significant bit to
783 indicate whether a function is virtual, ensure a pointer
784 to this function will have that bit clear. */
785 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
786 && !(access_flags & ACC_STATIC)
787 && DECL_ALIGN (fndecl) < 2 * BITS_PER_UNIT)
788 DECL_ALIGN (fndecl) = 2 * BITS_PER_UNIT;
790 /* Notice that this is a finalizer and update the class type
791 accordingly. This is used to optimize instance allocation. */
792 if (name == finalize_identifier_node
793 && TREE_TYPE (function_type) == void_type_node
794 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
795 HAS_FINALIZER_P (this_class) = 1;
797 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
798 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
799 if (access_flags & ACC_PRIVATE)
800 METHOD_PRIVATE (fndecl) = 1;
801 if (access_flags & ACC_NATIVE)
803 METHOD_NATIVE (fndecl) = 1;
804 DECL_EXTERNAL (fndecl) = 1;
807 /* FNDECL is external unless we are compiling it into this object
809 DECL_EXTERNAL (fndecl) = CLASS_FROM_CURRENTLY_COMPILED_P (this_class) == 0;
810 if (access_flags & ACC_STATIC)
811 METHOD_STATIC (fndecl) = 1;
812 if (access_flags & ACC_FINAL)
813 METHOD_FINAL (fndecl) = 1;
814 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
815 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
816 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
817 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
818 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
819 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
823 /* Add a method to THIS_CLASS.
824 The method's name is NAME.
825 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
828 add_method (tree this_class, int access_flags, tree name, tree method_sig)
830 tree function_type, fndecl;
831 const unsigned char *sig
832 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
835 fatal_error ("bad method signature");
837 function_type = get_type_from_signature (method_sig);
838 fndecl = add_method_1 (this_class, access_flags, name, function_type);
839 set_java_signature (TREE_TYPE (fndecl), method_sig);
844 add_field (tree klass, tree name, tree field_type, int flags)
846 int is_static = (flags & ACC_STATIC) != 0;
848 field = build_decl (input_location,
849 is_static ? VAR_DECL : FIELD_DECL, name, field_type);
850 TREE_CHAIN (field) = TYPE_FIELDS (klass);
851 TYPE_FIELDS (klass) = field;
852 DECL_CONTEXT (field) = klass;
853 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
855 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
856 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
857 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
858 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
859 if (flags & ACC_VOLATILE)
861 FIELD_VOLATILE (field) = 1;
862 TREE_THIS_VOLATILE (field) = 1;
864 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
865 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
866 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
869 FIELD_STATIC (field) = 1;
870 /* Always make field externally visible. This is required so
871 that native methods can always access the field. */
872 TREE_PUBLIC (field) = 1;
873 /* Hide everything that shouldn't be visible outside a DSO. */
874 if (flag_indirect_classes
875 || (FIELD_PRIVATE (field)))
876 java_hide_decl (field);
877 /* Considered external unless we are compiling it into this
879 DECL_EXTERNAL (field) = (is_compiled_class (klass) != 2);
880 if (!DECL_EXTERNAL (field))
881 VEC_safe_push (tree, gc, pending_static_fields, field);
887 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
890 set_constant_value (tree field, tree constant)
892 if (field == NULL_TREE)
893 warning (OPT_Wattributes,
894 "misplaced ConstantValue attribute (not in any field)");
895 else if (DECL_INITIAL (field) != NULL_TREE)
896 warning (OPT_Wattributes,
897 "duplicate ConstantValue attribute for field '%s'",
898 IDENTIFIER_POINTER (DECL_NAME (field)));
901 DECL_INITIAL (field) = constant;
902 if (TREE_TYPE (constant) != TREE_TYPE (field)
903 && ! (TREE_TYPE (constant) == int_type_node
904 && INTEGRAL_TYPE_P (TREE_TYPE (field))
905 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
906 && ! (TREE_TYPE (constant) == utf8const_ptr_type
907 && TREE_TYPE (field) == string_ptr_type_node))
908 error ("ConstantValue attribute of field '%s' has wrong type",
909 IDENTIFIER_POINTER (DECL_NAME (field)));
913 /* Calculate a hash value for a string encoded in Utf8 format.
914 * This returns the same hash value as specified for java.lang.String.hashCode.
918 hashUtf8String (const char *str, int len)
920 const unsigned char* ptr = (const unsigned char*) str;
921 const unsigned char *limit = ptr + len;
925 int ch = UTF8_GET (ptr, limit);
926 /* Updated specification from
927 http://www.javasoft.com/docs/books/jls/clarify.html. */
928 hash = (31 * hash) + ch;
933 static GTY(()) tree utf8_decl_list = NULL_TREE;
936 build_utf8_ref (tree name)
938 const char * name_ptr = IDENTIFIER_POINTER (name);
939 int name_len = IDENTIFIER_LENGTH (name), name_pad;
941 tree ctype, field = NULL_TREE, str_type, cinit, string;
942 static int utf8_count = 0;
944 tree ref = IDENTIFIER_UTF8_REF (name);
946 VEC(constructor_elt,gc) *v = NULL;
947 if (ref != NULL_TREE)
950 ctype = make_node (RECORD_TYPE);
951 /* '\0' byte plus padding to utf8const_type's alignment. */
952 name_pad = TYPE_ALIGN_UNIT (utf8const_type)
953 - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
954 str_type = build_prim_array_type (unsigned_byte_type_node,
955 name_len + name_pad);
956 PUSH_FIELD (input_location, ctype, field, "hash", unsigned_short_type_node);
957 PUSH_FIELD (input_location,
958 ctype, field, "length", unsigned_short_type_node);
959 PUSH_FIELD (input_location, ctype, field, "data", str_type);
960 FINISH_RECORD (ctype);
961 START_RECORD_CONSTRUCTOR (v, ctype);
962 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
963 PUSH_FIELD_VALUE (v, "hash", build_int_cst (NULL_TREE, name_hash));
964 PUSH_FIELD_VALUE (v, "length", build_int_cst (NULL_TREE, name_len));
965 string = build_string (name_len, name_ptr);
966 TREE_TYPE (string) = str_type;
967 PUSH_FIELD_VALUE (v, "data", string);
968 FINISH_RECORD_CONSTRUCTOR (cinit, v, ctype);
969 TREE_CONSTANT (cinit) = 1;
971 /* Generate a unique-enough identifier. */
972 sprintf(buf, "_Utf%d", ++utf8_count);
974 decl = build_decl (input_location,
975 VAR_DECL, get_identifier (buf), utf8const_type);
976 TREE_STATIC (decl) = 1;
977 DECL_ARTIFICIAL (decl) = 1;
978 DECL_IGNORED_P (decl) = 1;
979 TREE_READONLY (decl) = 1;
980 TREE_THIS_VOLATILE (decl) = 0;
981 DECL_INITIAL (decl) = cinit;
983 if (HAVE_GAS_SHF_MERGE)
986 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
987 decl_size = name_len + 4 + name_pad;
988 if (flag_merge_constants && decl_size < 256)
991 int flags = (SECTION_OVERRIDE
992 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
993 sprintf (buf, ".rodata.jutf8.%d", decl_size);
994 switch_to_section (get_section (buf, flags, NULL));
995 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
999 TREE_CHAIN (decl) = utf8_decl_list;
1000 layout_decl (decl, 0);
1001 DECL_SIZE (decl) = TYPE_SIZE (ctype);
1002 DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (ctype);
1004 rest_of_decl_compilation (decl, global_bindings_p (), 0);
1005 varpool_mark_needed_node (varpool_node (decl));
1006 utf8_decl_list = decl;
1007 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
1008 IDENTIFIER_UTF8_REF (name) = ref;
1012 /* Like build_class_ref, but instead of a direct reference generate a
1013 pointer into the constant pool. */
1016 build_indirect_class_ref (tree type)
1020 index = alloc_class_constant (type);
1021 cl = build_ref_from_constant_pool (index);
1022 return convert (promote_type (class_ptr_type), cl);
1026 build_static_class_ref (tree type)
1028 tree decl_name, decl, ref;
1030 if (TYPE_SIZE (type) == error_mark_node)
1031 return null_pointer_node;
1032 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1033 "", '/', '/', ".class$$");
1034 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1035 if (decl == NULL_TREE)
1037 decl = build_decl (input_location, VAR_DECL, decl_name, class_type_node);
1038 TREE_STATIC (decl) = 1;
1039 if (! flag_indirect_classes)
1041 TREE_PUBLIC (decl) = 1;
1042 if (CLASS_PRIVATE (TYPE_NAME (type)))
1043 java_hide_decl (decl);
1045 DECL_IGNORED_P (decl) = 1;
1046 DECL_ARTIFICIAL (decl) = 1;
1047 if (is_compiled_class (type) == 1)
1048 DECL_EXTERNAL (decl) = 1;
1049 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1050 DECL_CLASS_FIELD_P (decl) = 1;
1051 DECL_CONTEXT (decl) = type;
1053 /* ??? We want to preserve the DECL_CONTEXT we set just above,
1054 that that means not calling pushdecl_top_level. */
1055 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1058 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1063 build_classdollar_field (tree type)
1065 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1066 "", '/', '/', ".class$");
1067 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1069 if (decl == NULL_TREE)
1072 = build_decl (input_location,
1073 VAR_DECL, decl_name,
1076 (build_type_variant (class_type_node,
1078 /* const */ 1, 0)));
1079 TREE_STATIC (decl) = 1;
1080 TREE_CONSTANT (decl) = 1;
1081 TREE_READONLY (decl) = 1;
1082 TREE_PUBLIC (decl) = 1;
1083 java_hide_decl (decl);
1084 DECL_IGNORED_P (decl) = 1;
1085 DECL_ARTIFICIAL (decl) = 1;
1086 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1087 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1088 DECL_CLASS_FIELD_P (decl) = 1;
1089 DECL_CONTEXT (decl) = type;
1095 /* Create a local variable that holds the current class$. */
1098 cache_this_class_ref (tree fndecl)
1102 tree classdollar_field;
1103 if (flag_indirect_classes)
1104 classdollar_field = build_classdollar_field (output_class);
1106 classdollar_field = build_static_class_ref (output_class);
1108 this_classdollar = build_decl (input_location,
1109 VAR_DECL, NULL_TREE,
1110 TREE_TYPE (classdollar_field));
1112 java_add_local_var (this_classdollar);
1113 java_add_stmt (build2 (MODIFY_EXPR, TREE_TYPE (this_classdollar),
1114 this_classdollar, classdollar_field));
1117 this_classdollar = build_classdollar_field (output_class);
1119 /* Prepend class initialization for static methods reachable from
1121 if (METHOD_STATIC (fndecl)
1122 && (! METHOD_PRIVATE (fndecl)
1123 || INNER_CLASS_P (DECL_CONTEXT (fndecl)))
1124 && ! DECL_CLINIT_P (fndecl)
1125 && ! CLASS_INTERFACE (TYPE_NAME (DECL_CONTEXT (fndecl))))
1127 tree init = build_call_expr (soft_initclass_node, 1,
1129 java_add_stmt (init);
1133 /* Remove the reference to the local variable that holds the current
1137 uncache_this_class_ref (tree fndecl ATTRIBUTE_UNUSED)
1139 this_classdollar = build_classdollar_field (output_class);
1142 /* Build a reference to the class TYPE.
1143 Also handles primitive types and array types. */
1146 build_class_ref (tree type)
1148 int is_compiled = is_compiled_class (type);
1152 if (TREE_CODE (type) == POINTER_TYPE)
1153 type = TREE_TYPE (type);
1155 if (flag_indirect_dispatch
1156 && type != output_class
1157 && TREE_CODE (type) == RECORD_TYPE)
1158 return build_indirect_class_ref (type);
1160 if (type == output_class && flag_indirect_classes)
1162 /* This can be NULL if we see a JNI stub before we see any
1164 if (! this_classdollar)
1165 this_classdollar = build_classdollar_field (output_class);
1166 return this_classdollar;
1169 if (TREE_CODE (type) == RECORD_TYPE)
1170 return build_static_class_ref (type);
1176 decl_name = TYPE_NAME (type);
1177 if (TREE_CODE (decl_name) == TYPE_DECL)
1178 decl_name = DECL_NAME (decl_name);
1179 name = IDENTIFIER_POINTER (decl_name);
1180 if (strncmp (name, "promoted_", 9) == 0)
1182 sprintf (buffer, "_Jv_%sClass", name);
1183 decl_name = get_identifier (buffer);
1184 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1185 if (decl == NULL_TREE)
1187 decl = build_decl (input_location,
1188 VAR_DECL, decl_name, class_type_node);
1189 TREE_STATIC (decl) = 1;
1190 TREE_PUBLIC (decl) = 1;
1191 DECL_EXTERNAL (decl) = 1;
1192 DECL_ARTIFICIAL (decl) = 1;
1193 pushdecl_top_level (decl);
1197 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1201 return build_indirect_class_ref (type);
1204 /* Create a local statically allocated variable that will hold a
1205 pointer to a static field. */
1208 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1210 tree decl, decl_name;
1211 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1212 char *buf = (char *) alloca (strlen (name) + 20);
1213 sprintf (buf, "%s_%d_ref", name, index);
1214 decl_name = get_identifier (buf);
1215 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1216 if (decl == NULL_TREE)
1218 decl = build_decl (input_location,
1219 VAR_DECL, decl_name, ptr_type_node);
1220 TREE_STATIC (decl) = 1;
1221 TREE_PUBLIC (decl) = 0;
1222 DECL_EXTERNAL (decl) = 0;
1223 DECL_ARTIFICIAL (decl) = 1;
1224 DECL_IGNORED_P (decl) = 1;
1225 pushdecl_top_level (decl);
1231 build_static_field_ref (tree fdecl)
1233 tree fclass = DECL_CONTEXT (fdecl);
1234 int is_compiled = is_compiled_class (fclass);
1236 /* Allow static final fields to fold to a constant. When using
1237 -findirect-dispatch, we simply never do this folding if compiling
1238 from .class; in the .class file constants will be referred to via
1239 the constant pool. */
1240 if (!flag_indirect_dispatch
1242 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1243 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1244 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1245 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1247 if (is_compiled == 1)
1248 DECL_EXTERNAL (fdecl) = 1;
1252 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1253 and a class local static variable CACHE_ENTRY, then
1255 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1256 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1259 This can mostly be optimized away, so that the usual path is a
1260 load followed by a test and branch. _Jv_ResolvePoolEntry is
1261 only called once for each constant pool entry.
1263 There is an optimization that we don't do: at the start of a
1264 method, create a local copy of CACHE_ENTRY and use that instead.
1268 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1269 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1271 = build_call_expr (built_in_decls[BUILT_IN_EXPECT], 2,
1272 build2 (EQ_EXPR, boolean_type_node,
1273 cache_entry, null_pointer_node),
1274 boolean_false_node);
1275 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1277 = build_call_expr (soft_resolvepoolentry_node, 2,
1278 build_class_ref (output_class),
1280 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1281 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1282 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1283 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1289 get_access_flags_from_decl (tree decl)
1291 int access_flags = 0;
1292 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1294 if (FIELD_STATIC (decl))
1295 access_flags |= ACC_STATIC;
1296 if (FIELD_PUBLIC (decl))
1297 access_flags |= ACC_PUBLIC;
1298 if (FIELD_PROTECTED (decl))
1299 access_flags |= ACC_PROTECTED;
1300 if (FIELD_PRIVATE (decl))
1301 access_flags |= ACC_PRIVATE;
1302 if (FIELD_FINAL (decl))
1303 access_flags |= ACC_FINAL;
1304 if (FIELD_VOLATILE (decl))
1305 access_flags |= ACC_VOLATILE;
1306 if (FIELD_TRANSIENT (decl))
1307 access_flags |= ACC_TRANSIENT;
1308 if (FIELD_ENUM (decl))
1309 access_flags |= ACC_ENUM;
1310 if (FIELD_SYNTHETIC (decl))
1311 access_flags |= ACC_SYNTHETIC;
1312 return access_flags;
1314 if (TREE_CODE (decl) == TYPE_DECL)
1316 if (CLASS_PUBLIC (decl))
1317 access_flags |= ACC_PUBLIC;
1318 if (CLASS_FINAL (decl))
1319 access_flags |= ACC_FINAL;
1320 if (CLASS_SUPER (decl))
1321 access_flags |= ACC_SUPER;
1322 if (CLASS_INTERFACE (decl))
1323 access_flags |= ACC_INTERFACE;
1324 if (CLASS_ABSTRACT (decl))
1325 access_flags |= ACC_ABSTRACT;
1326 if (CLASS_STATIC (decl))
1327 access_flags |= ACC_STATIC;
1328 if (CLASS_PRIVATE (decl))
1329 access_flags |= ACC_PRIVATE;
1330 if (CLASS_PROTECTED (decl))
1331 access_flags |= ACC_PROTECTED;
1332 if (CLASS_STRICTFP (decl))
1333 access_flags |= ACC_STRICT;
1334 if (CLASS_ENUM (decl))
1335 access_flags |= ACC_ENUM;
1336 if (CLASS_SYNTHETIC (decl))
1337 access_flags |= ACC_SYNTHETIC;
1338 if (CLASS_ANNOTATION (decl))
1339 access_flags |= ACC_ANNOTATION;
1340 return access_flags;
1342 if (TREE_CODE (decl) == FUNCTION_DECL)
1344 if (METHOD_PUBLIC (decl))
1345 access_flags |= ACC_PUBLIC;
1346 if (METHOD_PRIVATE (decl))
1347 access_flags |= ACC_PRIVATE;
1348 if (METHOD_PROTECTED (decl))
1349 access_flags |= ACC_PROTECTED;
1350 if (METHOD_STATIC (decl))
1351 access_flags |= ACC_STATIC;
1352 if (METHOD_FINAL (decl))
1353 access_flags |= ACC_FINAL;
1354 if (METHOD_SYNCHRONIZED (decl))
1355 access_flags |= ACC_SYNCHRONIZED;
1356 if (METHOD_NATIVE (decl))
1357 access_flags |= ACC_NATIVE;
1358 if (METHOD_ABSTRACT (decl))
1359 access_flags |= ACC_ABSTRACT;
1360 if (METHOD_STRICTFP (decl))
1361 access_flags |= ACC_STRICT;
1362 if (METHOD_INVISIBLE (decl))
1363 access_flags |= ACC_INVISIBLE;
1364 if (DECL_ARTIFICIAL (decl))
1365 access_flags |= ACC_SYNTHETIC;
1366 if (METHOD_BRIDGE (decl))
1367 access_flags |= ACC_BRIDGE;
1368 if (METHOD_VARARGS (decl))
1369 access_flags |= ACC_VARARGS;
1370 return access_flags;
1375 static GTY (()) int alias_labelno = 0;
1377 /* Create a private alias for METHOD. Using this alias instead of the method
1378 decl ensures that ncode entries in the method table point to the real function
1379 at runtime, not a PLT entry. */
1382 make_local_function_alias (tree method)
1384 #ifdef ASM_OUTPUT_DEF
1387 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1388 char *name = (char *) alloca (strlen (method_name) + 2);
1389 char *buf = (char *) alloca (strlen (method_name) + 128);
1391 /* Only create aliases for local functions. */
1392 if (DECL_EXTERNAL (method))
1395 /* Prefix method_name with 'L' for the alias label. */
1397 strcpy (name + 1, method_name);
1399 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1400 alias = build_decl (input_location,
1401 FUNCTION_DECL, get_identifier (buf),
1402 TREE_TYPE (method));
1403 DECL_CONTEXT (alias) = NULL;
1404 TREE_READONLY (alias) = TREE_READONLY (method);
1405 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1406 TREE_PUBLIC (alias) = 0;
1407 DECL_EXTERNAL (alias) = 0;
1408 DECL_ARTIFICIAL (alias) = 1;
1409 DECL_INITIAL (alias) = error_mark_node;
1410 TREE_ADDRESSABLE (alias) = 1;
1411 TREE_USED (alias) = 1;
1412 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1413 if (!flag_syntax_only)
1414 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1421 /** Make reflection data (_Jv_Field) for field FDECL. */
1424 make_field_value (tree fdecl)
1428 tree type = TREE_TYPE (fdecl);
1429 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1430 VEC(constructor_elt,gc) *v = NULL;
1432 START_RECORD_CONSTRUCTOR (v, field_type_node);
1433 PUSH_FIELD_VALUE (v, "name", build_utf8_ref (DECL_NAME (fdecl)));
1435 type = build_class_ref (type);
1438 tree signature = build_java_signature (type);
1440 type = build_utf8_ref (unmangle_classname
1441 (IDENTIFIER_POINTER (signature),
1442 IDENTIFIER_LENGTH (signature)));
1444 PUSH_FIELD_VALUE (v, "type", type);
1446 flags = get_access_flags_from_decl (fdecl);
1448 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1450 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, flags));
1451 PUSH_FIELD_VALUE (v, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1454 tree field_address = integer_zero_node;
1455 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1456 && FIELD_STATIC (fdecl))
1457 field_address = build_address_of (fdecl);
1461 build_constructor_from_list (field_info_union_node,
1463 ((FIELD_STATIC (fdecl)
1464 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1465 : TYPE_FIELDS (field_info_union_node)),
1466 (FIELD_STATIC (fdecl)
1468 : byte_position (fdecl)))));
1471 FINISH_RECORD_CONSTRUCTOR (finit, v, field_type_node);
1475 /** Make reflection data (_Jv_Method) for method MDECL. */
1478 make_method_value (tree mdecl)
1480 static int method_name_count = 0;
1485 #define ACC_TRANSLATED 0x4000
1486 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1487 VEC(constructor_elt,gc) *v = NULL;
1489 class_decl = DECL_CONTEXT (mdecl);
1490 /* For interfaces, the index field contains the dispatch index. */
1491 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1492 index = build_int_cst (NULL_TREE,
1493 get_interface_method_index (mdecl, class_decl));
1494 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1495 index = get_method_index (mdecl);
1497 index = integer_minus_one_node;
1499 code = null_pointer_node;
1500 if (METHOD_ABSTRACT (mdecl))
1501 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1502 soft_abstractmethod_node);
1504 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1505 make_local_function_alias (mdecl));
1506 START_RECORD_CONSTRUCTOR (v, method_type_node);
1507 PUSH_FIELD_VALUE (v, "name",
1508 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1509 init_identifier_node
1510 : DECL_NAME (mdecl)));
1512 tree signature = build_java_signature (TREE_TYPE (mdecl));
1513 PUSH_FIELD_VALUE (v, "signature",
1516 (IDENTIFIER_POINTER(signature),
1517 IDENTIFIER_LENGTH(signature)))));
1519 PUSH_FIELD_VALUE (v, "accflags", build_int_cst (NULL_TREE, accflags));
1520 PUSH_FIELD_VALUE (v, "index", index);
1521 PUSH_FIELD_VALUE (v, "ncode", code);
1524 /* Compute the `throws' information for the method. */
1525 tree table = null_pointer_node;
1526 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1528 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1529 tree iter, type, array;
1532 table = tree_cons (NULL_TREE, table, NULL_TREE);
1533 for (iter = DECL_FUNCTION_THROWS (mdecl);
1535 iter = TREE_CHAIN (iter))
1537 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1539 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1540 IDENTIFIER_LENGTH (sig)));
1541 table = tree_cons (NULL_TREE, utf8, table);
1543 type = build_prim_array_type (ptr_type_node, length);
1544 table = build_constructor_from_list (type, table);
1545 /* Compute something unique enough. */
1546 sprintf (buf, "_methods%d", method_name_count++);
1547 array = build_decl (input_location,
1548 VAR_DECL, get_identifier (buf), type);
1549 DECL_INITIAL (array) = table;
1550 TREE_STATIC (array) = 1;
1551 DECL_ARTIFICIAL (array) = 1;
1552 DECL_IGNORED_P (array) = 1;
1553 rest_of_decl_compilation (array, 1, 0);
1555 table = build1 (ADDR_EXPR, ptr_type_node, array);
1558 PUSH_FIELD_VALUE (v, "throws", table);
1561 FINISH_RECORD_CONSTRUCTOR (minit, v, method_type_node);
1566 get_dispatch_vector (tree type)
1568 tree vtable = TYPE_VTABLE (type);
1570 if (vtable == NULL_TREE)
1574 tree super = CLASSTYPE_SUPER (type);
1575 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1576 vtable = make_tree_vec (nvirtuals);
1577 TYPE_VTABLE (type) = vtable;
1578 if (super != NULL_TREE)
1580 tree super_vtable = get_dispatch_vector (super);
1582 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1583 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1586 for (method = TYPE_METHODS (type); method != NULL_TREE;
1587 method = TREE_CHAIN (method))
1589 tree method_index = get_method_index (method);
1590 if (method_index != NULL_TREE
1591 && host_integerp (method_index, 0))
1592 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1600 get_dispatch_table (tree type, tree this_class_addr)
1602 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1603 tree vtable = get_dispatch_vector (type);
1605 tree list = NULL_TREE;
1606 int nvirtuals = TREE_VEC_LENGTH (vtable);
1610 for (i = nvirtuals; --i >= 0; )
1612 tree method = TREE_VEC_ELT (vtable, i);
1613 if (METHOD_ABSTRACT (method))
1616 warning_at (DECL_SOURCE_LOCATION (method), 0,
1617 "abstract method in non-abstract class");
1619 if (TARGET_VTABLE_USES_DESCRIPTORS)
1620 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1621 list = tree_cons (NULL_TREE, null_pointer_node, list);
1623 list = tree_cons (NULL_TREE, null_pointer_node, list);
1627 if (TARGET_VTABLE_USES_DESCRIPTORS)
1628 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1630 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1631 method, build_int_cst (NULL_TREE, j));
1632 TREE_CONSTANT (fdesc) = 1;
1633 list = tree_cons (NULL_TREE, fdesc, list);
1636 list = tree_cons (NULL_TREE,
1637 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1643 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1644 using the Boehm GC we sometimes stash a GC type descriptor
1645 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1646 the emitted byte count during the output to the assembly file. */
1647 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1648 fake "function descriptor". It's first word is the is the class
1649 pointer, and subsequent words (usually one) contain the GC descriptor.
1650 In all other cases, we reserve two extra vtable slots. */
1651 gc_descr = get_boehm_type_descriptor (type);
1652 list = tree_cons (NULL_TREE, gc_descr, list);
1653 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1654 list = tree_cons (NULL_TREE, gc_descr, list);
1655 list = tree_cons (NULL_TREE, this_class_addr, list);
1657 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1658 list = tree_cons (NULL_TREE, null_pointer_node, list);
1659 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1660 list = tree_cons (integer_zero_node, null_pointer_node, list);
1662 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1663 if (TARGET_VTABLE_USES_DESCRIPTORS)
1664 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1666 return build_constructor_from_list
1667 (build_prim_array_type (nativecode_ptr_type_node,
1672 /* Set the method_index for a method decl. */
1674 set_method_index (tree decl, tree method_index)
1676 if (method_index != NULL_TREE)
1678 /* method_index is null if we're using indirect dispatch. */
1679 method_index = fold (convert (sizetype, method_index));
1681 if (TARGET_VTABLE_USES_DESCRIPTORS)
1682 /* Add one to skip bogus descriptor for class and GC descriptor. */
1683 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1685 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1687 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1690 DECL_VINDEX (decl) = method_index;
1693 /* Get the method_index for a method decl. */
1695 get_method_index (tree decl)
1697 tree method_index = DECL_VINDEX (decl);
1702 if (TARGET_VTABLE_USES_DESCRIPTORS)
1703 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1704 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1706 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1707 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1709 return method_index;
1713 supers_all_compiled (tree type)
1715 while (type != NULL_TREE)
1717 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1719 type = CLASSTYPE_SUPER (type);
1725 add_table_and_syms (VEC(constructor_elt,gc) **v,
1727 const char *table_name, tree table_slot, tree table_type,
1728 const char *syms_name, tree syms_slot)
1730 if (method_slot == NULL_TREE)
1732 PUSH_FIELD_VALUE (*v, table_name, null_pointer_node);
1733 PUSH_FIELD_VALUE (*v, syms_name, null_pointer_node);
1737 pushdecl_top_level (syms_slot);
1738 PUSH_FIELD_VALUE (*v, table_name,
1739 build1 (ADDR_EXPR, table_type, table_slot));
1740 PUSH_FIELD_VALUE (*v, syms_name,
1741 build1 (ADDR_EXPR, symbols_array_ptr_type,
1743 TREE_CONSTANT (table_slot) = 1;
1748 make_class_data (tree type)
1750 tree decl, cons, temp;
1751 tree field, fields_decl;
1752 tree static_fields = NULL_TREE;
1753 tree instance_fields = NULL_TREE;
1754 HOST_WIDE_INT static_field_count = 0;
1755 HOST_WIDE_INT instance_field_count = 0;
1756 HOST_WIDE_INT field_count;
1757 tree field_array_type;
1759 tree methods = NULL_TREE;
1760 tree dtable_decl = NULL_TREE;
1761 HOST_WIDE_INT method_count = 0;
1762 tree method_array_type;
1765 tree this_class_addr;
1766 tree constant_pool_constructor;
1767 tree interfaces = null_pointer_node;
1768 int interface_len = 0;
1769 int uses_jv_markobj = 0;
1770 tree type_decl = TYPE_NAME (type);
1771 tree id_main = get_identifier("main");
1772 tree id_class = get_identifier("java.lang.Class");
1773 /** Offset from start of virtual function table declaration
1774 to where objects actually point at, following new g++ ABI. */
1775 tree dtable_start_offset = size_int (2 * POINTER_SIZE / BITS_PER_UNIT);
1776 VEC(int, heap) *field_indexes;
1777 tree first_real_field;
1778 VEC(constructor_elt,gc) *v1 = NULL, *v2 = NULL;
1779 tree reflection_data;
1781 this_class_addr = build_static_class_ref (type);
1782 decl = TREE_OPERAND (this_class_addr, 0);
1784 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1785 && !flag_indirect_dispatch)
1787 tree dtable = get_dispatch_table (type, this_class_addr);
1788 uses_jv_markobj = uses_jv_markobj_p (dtable);
1789 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1791 /* We've already created some other class, and consequently
1792 we made class_dtable_decl. Now we just want to fill it
1794 dtable_decl = class_dtable_decl;
1798 dtable_decl = build_dtable_decl (type);
1799 TREE_STATIC (dtable_decl) = 1;
1800 DECL_ARTIFICIAL (dtable_decl) = 1;
1801 DECL_IGNORED_P (dtable_decl) = 1;
1804 TREE_PUBLIC (dtable_decl) = 1;
1805 DECL_INITIAL (dtable_decl) = dtable;
1806 /* The only dispatch table exported from a DSO is the dispatch
1807 table for java.lang.Class. */
1808 if (DECL_NAME (type_decl) != id_class)
1809 java_hide_decl (dtable_decl);
1810 if (! flag_indirect_classes)
1811 rest_of_decl_compilation (dtable_decl, 1, 0);
1812 /* Maybe we're compiling Class as the first class. If so, set
1813 class_dtable_decl to the decl we just made. */
1814 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1815 class_dtable_decl = dtable_decl;
1818 /* Build Field array. */
1819 field = TYPE_FIELDS (type);
1820 while (field && DECL_ARTIFICIAL (field))
1821 field = TREE_CHAIN (field); /* Skip dummy fields. */
1822 if (field && DECL_NAME (field) == NULL_TREE)
1823 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1824 first_real_field = field;
1826 /* First count static and instance fields. */
1827 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1829 if (! DECL_ARTIFICIAL (field))
1831 if (FIELD_STATIC (field))
1832 static_field_count++;
1833 else if (uses_jv_markobj || !flag_reduced_reflection)
1834 instance_field_count++;
1837 field_count = static_field_count + instance_field_count;
1838 field_indexes = VEC_alloc (int, heap, field_count);
1840 /* gcj sorts fields so that static fields come first, followed by
1841 instance fields. Unfortunately, by the time this takes place we
1842 have already generated the reflection_data for this class, and
1843 that data contains indexes into the fields. So, we generate a
1844 permutation that maps each original field index to its final
1845 position. Then we pass this permutation to
1846 rewrite_reflection_indexes(), which fixes up the reflection
1850 int static_count = 0;
1851 int instance_count = static_field_count;
1854 for (i = 0, field = first_real_field;
1856 field = TREE_CHAIN (field), i++)
1858 if (! DECL_ARTIFICIAL (field))
1861 if (FIELD_STATIC (field))
1862 field_index = static_count++;
1863 else if (uses_jv_markobj || !flag_reduced_reflection)
1864 field_index = instance_count++;
1867 VEC_quick_push (int, field_indexes, field_index);
1872 for (field = first_real_field; field != NULL_TREE;
1873 field = TREE_CHAIN (field))
1875 if (! DECL_ARTIFICIAL (field))
1877 if (FIELD_STATIC (field))
1879 /* We must always create reflection data for static fields
1880 as it is used in the creation of the field itself. */
1881 tree init = make_field_value (field);
1882 tree initial = DECL_INITIAL (field);
1883 static_fields = tree_cons (NULL_TREE, init, static_fields);
1884 /* If the initial value is a string constant,
1885 prevent output_constant from trying to assemble the value. */
1886 if (initial != NULL_TREE
1887 && TREE_TYPE (initial) == string_ptr_type_node)
1888 DECL_INITIAL (field) = NULL_TREE;
1889 rest_of_decl_compilation (field, 1, 1);
1890 DECL_INITIAL (field) = initial;
1892 else if (uses_jv_markobj || !flag_reduced_reflection)
1894 tree init = make_field_value (field);
1895 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1900 if (field_count > 0)
1902 static_fields = nreverse (static_fields);
1903 instance_fields = nreverse (instance_fields);
1904 static_fields = chainon (static_fields, instance_fields);
1905 field_array_type = build_prim_array_type (field_type_node, field_count);
1906 fields_decl = build_decl (input_location,
1907 VAR_DECL, mangled_classname ("_FL_", type),
1909 DECL_INITIAL (fields_decl) = build_constructor_from_list
1910 (field_array_type, static_fields);
1911 TREE_STATIC (fields_decl) = 1;
1912 DECL_ARTIFICIAL (fields_decl) = 1;
1913 DECL_IGNORED_P (fields_decl) = 1;
1914 rest_of_decl_compilation (fields_decl, 1, 0);
1917 fields_decl = NULL_TREE;
1919 /* Build Method array. */
1920 for (method = TYPE_METHODS (type);
1921 method != NULL_TREE; method = TREE_CHAIN (method))
1924 if (METHOD_PRIVATE (method)
1925 && ! flag_keep_inline_functions
1928 /* Even if we have a decl, we don't necessarily have the code.
1929 This can happen if we inherit a method from a superclass for
1930 which we don't have a .class file. */
1931 if (METHOD_DUMMY (method))
1934 /* Generate method reflection data if:
1936 - !flag_reduced_reflection.
1938 - <clinit> -- The runtime uses reflection to initialize the
1941 - Any method in class java.lang.Class -- Class.forName() and
1942 perhaps other things require it.
1944 - class$ -- It does not work if reflection data missing.
1946 - main -- Reflection is used to find main(String[]) methods.
1948 - public not static -- It is potentially part of an
1949 interface. The runtime uses reflection data to build
1950 interface dispatch tables. */
1951 if (!flag_reduced_reflection
1952 || DECL_CLINIT_P (method)
1953 || DECL_NAME (type_decl) == id_class
1954 || DECL_NAME (method) == id_main
1955 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method)))
1957 init = make_method_value (method);
1959 methods = tree_cons (NULL_TREE, init, methods);
1962 method_array_type = build_prim_array_type (method_type_node, method_count);
1963 methods_decl = build_decl (input_location,
1964 VAR_DECL, mangled_classname ("_MT_", type),
1966 DECL_INITIAL (methods_decl) = build_constructor_from_list
1967 (method_array_type, nreverse (methods));
1968 TREE_STATIC (methods_decl) = 1;
1969 DECL_ARTIFICIAL (methods_decl) = 1;
1970 DECL_IGNORED_P (methods_decl) = 1;
1971 rest_of_decl_compilation (methods_decl, 1, 0);
1973 if (class_dtable_decl == NULL_TREE)
1975 class_dtable_decl = build_dtable_decl (class_type_node);
1976 TREE_STATIC (class_dtable_decl) = 1;
1977 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1978 DECL_IGNORED_P (class_dtable_decl) = 1;
1979 if (is_compiled_class (class_type_node) != 2)
1981 DECL_EXTERNAL (class_dtable_decl) = 1;
1982 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1986 super = CLASSTYPE_SUPER (type);
1987 if (super == NULL_TREE)
1988 super = null_pointer_node;
1989 else if (! flag_indirect_dispatch
1990 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1991 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1992 super = build_class_ref (super);
1995 int super_index = alloc_class_constant (super);
1996 super = build_int_cst (ptr_type_node, super_index);
1999 /* Build and emit the array of implemented interfaces. */
2000 if (type != object_type_node)
2001 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
2003 if (interface_len > 0)
2005 tree init = NULL_TREE;
2007 tree interface_array_type, idecl;
2008 interface_array_type
2009 = build_prim_array_type (class_ptr_type, interface_len);
2010 idecl = build_decl (input_location,
2011 VAR_DECL, mangled_classname ("_IF_", type),
2012 interface_array_type);
2014 for (i = interface_len; i > 0; i--)
2016 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
2017 tree iclass = BINFO_TYPE (child);
2019 if (! flag_indirect_dispatch
2021 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
2022 index = build_class_ref (iclass);
2025 int int_index = alloc_class_constant (iclass);
2026 index = build_int_cst (ptr_type_node, int_index);
2028 init = tree_cons (NULL_TREE, index, init);
2030 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
2032 TREE_STATIC (idecl) = 1;
2033 DECL_ARTIFICIAL (idecl) = 1;
2034 DECL_IGNORED_P (idecl) = 1;
2035 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
2036 rest_of_decl_compilation (idecl, 1, 0);
2039 constant_pool_constructor = build_constants_constructor ();
2041 if (flag_indirect_dispatch)
2043 TYPE_OTABLE_DECL (type)
2045 (DECL_NAME (TYPE_OTABLE_DECL (type)),
2046 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
2047 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
2049 TYPE_ATABLE_DECL (type)
2051 (DECL_NAME (TYPE_ATABLE_DECL (type)),
2052 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
2053 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
2055 TYPE_ITABLE_DECL (type)
2057 (DECL_NAME (TYPE_ITABLE_DECL (type)),
2058 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
2059 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
2062 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
2064 START_RECORD_CONSTRUCTOR (v1, object_type_node);
2065 PUSH_FIELD_VALUE (v1, "vtable",
2066 (flag_indirect_classes
2068 : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
2069 build1 (ADDR_EXPR, dtable_ptr_type,
2071 dtable_start_offset)));
2072 if (! flag_hash_synchronization)
2073 PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
2074 FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
2075 START_RECORD_CONSTRUCTOR (v2, class_type_node);
2076 PUSH_SUPER_VALUE (v2, temp);
2077 PUSH_FIELD_VALUE (v2, "next_or_version", gcj_abi_version);
2078 PUSH_FIELD_VALUE (v2, "name", build_utf8_ref (DECL_NAME (type_decl)));
2079 PUSH_FIELD_VALUE (v2, "accflags",
2080 build_int_cst (NULL_TREE,
2081 get_access_flags_from_decl (type_decl)));
2083 PUSH_FIELD_VALUE (v2, "superclass",
2084 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
2085 PUSH_FIELD_VALUE (v2, "constants", constant_pool_constructor);
2086 PUSH_FIELD_VALUE (v2, "methods",
2087 methods_decl == NULL_TREE ? null_pointer_node
2088 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
2089 PUSH_FIELD_VALUE (v2, "method_count",
2090 build_int_cst (NULL_TREE, method_count));
2092 PUSH_FIELD_VALUE (v2, "vtable_method_count",
2093 (flag_indirect_dispatch
2094 ? integer_minus_one_node
2095 : TYPE_NVIRTUALS (type)));
2097 PUSH_FIELD_VALUE (v2, "fields",
2098 fields_decl == NULL_TREE ? null_pointer_node
2099 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
2100 /* If we're using the binary compatibility ABI we don't know the
2101 size until load time. */
2102 PUSH_FIELD_VALUE (v2, "size_in_bytes",
2103 (flag_indirect_dispatch
2104 ? integer_minus_one_node
2105 : size_in_bytes (type)));
2106 PUSH_FIELD_VALUE (v2, "field_count",
2107 build_int_cst (NULL_TREE, field_count));
2108 PUSH_FIELD_VALUE (v2, "static_field_count",
2109 build_int_cst (NULL_TREE, static_field_count));
2111 PUSH_FIELD_VALUE (v2, "vtable",
2112 (flag_indirect_dispatch || dtable_decl == NULL_TREE
2114 : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
2115 build1 (ADDR_EXPR, dtable_ptr_type,
2117 dtable_start_offset)));
2118 add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
2119 "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
2120 "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
2121 add_table_and_syms (&v2, TYPE_ATABLE_METHODS (type),
2122 "atable", TYPE_ATABLE_DECL (type), atable_ptr_type,
2123 "atable_syms", TYPE_ATABLE_SYMS_DECL (type));
2124 add_table_and_syms (&v2, TYPE_ITABLE_METHODS (type),
2125 "itable", TYPE_ITABLE_DECL (type), itable_ptr_type,
2126 "itable_syms", TYPE_ITABLE_SYMS_DECL (type));
2128 PUSH_FIELD_VALUE (v2, "catch_classes",
2129 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2130 PUSH_FIELD_VALUE (v2, "interfaces", interfaces);
2131 PUSH_FIELD_VALUE (v2, "loader", null_pointer_node);
2132 PUSH_FIELD_VALUE (v2, "interface_count",
2133 build_int_cst (NULL_TREE, interface_len));
2134 PUSH_FIELD_VALUE (v2, "state",
2135 convert (byte_type_node,
2136 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2138 PUSH_FIELD_VALUE (v2, "thread", null_pointer_node);
2139 PUSH_FIELD_VALUE (v2, "depth", integer_zero_node);
2140 PUSH_FIELD_VALUE (v2, "ancestors", null_pointer_node);
2141 PUSH_FIELD_VALUE (v2, "idt", null_pointer_node);
2142 PUSH_FIELD_VALUE (v2, "arrayclass", null_pointer_node);
2143 PUSH_FIELD_VALUE (v2, "protectionDomain", null_pointer_node);
2146 tree assertion_table_ref;
2147 if (TYPE_ASSERTIONS (type) == NULL)
2148 assertion_table_ref = null_pointer_node;
2150 assertion_table_ref = build1 (ADDR_EXPR,
2151 build_pointer_type (assertion_table_type),
2152 emit_assertion_table (type));
2154 PUSH_FIELD_VALUE (v2, "assertion_table", assertion_table_ref);
2157 PUSH_FIELD_VALUE (v2, "hack_signers", null_pointer_node);
2158 PUSH_FIELD_VALUE (v2, "chain", null_pointer_node);
2159 PUSH_FIELD_VALUE (v2, "aux_info", null_pointer_node);
2160 PUSH_FIELD_VALUE (v2, "engine", null_pointer_node);
2162 if (TYPE_REFLECTION_DATA (current_class))
2165 int count = TYPE_REFLECTION_DATASIZE (current_class);
2166 VEC (constructor_elt, gc) *v
2167 = VEC_alloc (constructor_elt, gc, count);
2168 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2169 tree max_index = build_int_cst (sizetype, count);
2170 tree index = build_index_type (max_index);
2171 tree type = build_array_type (unsigned_byte_type_node, index);
2174 static int reflection_data_count;
2176 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2177 array = build_decl (input_location,
2178 VAR_DECL, get_identifier (buf), type);
2180 rewrite_reflection_indexes (field_indexes);
2182 for (i = 0; i < count; i++)
2184 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2185 elt->index = build_int_cst (sizetype, i);
2186 elt->value = build_int_cstu (byte_type_node, data[i]);
2189 DECL_INITIAL (array) = build_constructor (type, v);
2190 TREE_STATIC (array) = 1;
2191 DECL_ARTIFICIAL (array) = 1;
2192 DECL_IGNORED_P (array) = 1;
2193 TREE_READONLY (array) = 1;
2194 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2195 rest_of_decl_compilation (array, 1, 0);
2197 reflection_data = build_address_of (array);
2200 TYPE_REFLECTION_DATA (current_class) = NULL;
2203 reflection_data = null_pointer_node;
2205 PUSH_FIELD_VALUE (v2, "reflection_data", reflection_data);
2206 FINISH_RECORD_CONSTRUCTOR (cons, v2, class_type_node);
2208 DECL_INITIAL (decl) = cons;
2210 /* Hash synchronization requires at least 64-bit alignment. */
2211 if (flag_hash_synchronization && POINTER_SIZE < 64)
2212 DECL_ALIGN (decl) = 64;
2214 if (flag_indirect_classes)
2216 TREE_READONLY (decl) = 1;
2217 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2220 rest_of_decl_compilation (decl, 1, 0);
2223 tree classdollar_field = build_classdollar_field (type);
2224 if (!flag_indirect_classes)
2225 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2226 rest_of_decl_compilation (classdollar_field, 1, 0);
2229 TYPE_OTABLE_DECL (type) = NULL_TREE;
2230 TYPE_ATABLE_DECL (type) = NULL_TREE;
2231 TYPE_CTABLE_DECL (type) = NULL_TREE;
2237 java_expand_catch_classes (current_class);
2239 current_function_decl = NULL_TREE;
2240 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2241 make_class_data (current_class);
2243 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2246 /* Return 2 if KLASS is compiled by this compilation job;
2247 return 1 if KLASS can otherwise be assumed to be compiled;
2248 return 0 if we cannot assume that KLASS is compiled.
2249 Returns 1 for primitive and 0 for array types. */
2251 is_compiled_class (tree klass)
2254 if (TREE_CODE (klass) == POINTER_TYPE)
2255 klass = TREE_TYPE (klass);
2256 if (TREE_CODE (klass) != RECORD_TYPE) /* Primitive types are static. */
2258 if (TYPE_ARRAY_P (klass))
2261 seen_in_zip = (TYPE_JCF (klass) && JCF_SEEN_IN_ZIP (TYPE_JCF (klass)));
2262 if (CLASS_FROM_CURRENTLY_COMPILED_P (klass))
2264 /* The class was seen in the current ZIP file and will be
2265 available as a compiled class in the future but may not have
2266 been loaded already. Load it if necessary. This prevent
2267 build_class_ref () from crashing. */
2269 if (seen_in_zip && !CLASS_LOADED_P (klass) && (klass != current_class))
2270 load_class (klass, 1);
2272 /* We return 2 for class seen in ZIP and class from files
2273 belonging to the same compilation unit */
2277 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (klass)))))
2279 if (!CLASS_LOADED_P (klass))
2281 if (klass != current_class)
2282 load_class (klass, 1);
2290 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2293 build_dtable_decl (tree type)
2297 /* We need to build a new dtable type so that its size is uniquely
2298 computed when we're dealing with the class for real and not just
2299 faking it (like java.lang.Class during the initialization of the
2300 compiler.) We know we're not faking a class when CURRENT_CLASS is
2302 if (current_class == type)
2304 tree dummy = NULL_TREE;
2307 dtype = make_node (RECORD_TYPE);
2309 PUSH_FIELD (input_location, dtype, dummy, "top_offset", ptr_type_node);
2310 PUSH_FIELD (input_location, dtype, dummy, "type_info", ptr_type_node);
2312 PUSH_FIELD (input_location, dtype, dummy, "class", class_ptr_type);
2313 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2315 tree tmp_field = build_decl (input_location,
2316 FIELD_DECL, NULL_TREE, ptr_type_node);
2317 TREE_CHAIN (dummy) = tmp_field;
2318 DECL_CONTEXT (tmp_field) = dtype;
2319 DECL_ARTIFICIAL (tmp_field) = 1;
2323 PUSH_FIELD (input_location, dtype, dummy, "gc_descr", ptr_type_node);
2324 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2326 tree tmp_field = build_decl (input_location,
2327 FIELD_DECL, NULL_TREE, ptr_type_node);
2328 TREE_CHAIN (dummy) = tmp_field;
2329 DECL_CONTEXT (tmp_field) = dtype;
2330 DECL_ARTIFICIAL (tmp_field) = 1;
2334 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2335 if (TARGET_VTABLE_USES_DESCRIPTORS)
2336 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2338 PUSH_FIELD (input_location, dtype, dummy, "methods",
2339 build_prim_array_type (nativecode_ptr_type_node, n));
2340 layout_type (dtype);
2343 dtype = dtable_type;
2345 decl = build_decl (input_location,
2346 VAR_DECL, get_identifier ("vt$"), dtype);
2347 DECL_CONTEXT (decl) = type;
2348 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2349 DECL_VTABLE_P (decl) = 1;
2354 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2355 fields inherited from SUPER_CLASS. */
2358 push_super_field (tree this_class, tree super_class)
2361 /* Don't insert the field if we're just re-laying the class out. */
2362 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2364 base_decl = build_decl (input_location,
2365 FIELD_DECL, NULL_TREE, super_class);
2366 DECL_IGNORED_P (base_decl) = 1;
2367 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2368 TYPE_FIELDS (this_class) = base_decl;
2369 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2370 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2373 /* Handle the different manners we may have to lay out a super class. */
2376 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2380 else if (TREE_CODE (super_class) == RECORD_TYPE)
2382 if (!CLASS_LOADED_P (super_class))
2383 load_class (super_class, 1);
2385 /* We might have to layout the class before its dependency on
2386 the super class gets resolved by java_complete_class */
2387 else if (TREE_CODE (super_class) == POINTER_TYPE)
2389 if (TREE_TYPE (super_class) != NULL_TREE)
2390 super_class = TREE_TYPE (super_class);
2394 if (!TYPE_SIZE (super_class))
2395 safe_layout_class (super_class);
2400 /* safe_layout_class just makes sure that we can load a class without
2401 disrupting the current_class, input_file, input_line, etc, information
2402 about the class processed currently. */
2405 safe_layout_class (tree klass)
2407 tree save_current_class = current_class;
2408 location_t save_location = input_location;
2410 layout_class (klass);
2412 current_class = save_current_class;
2413 input_location = save_location;
2417 layout_class (tree this_class)
2420 tree super_class = CLASSTYPE_SUPER (this_class);
2422 class_list = tree_cons (this_class, NULL_TREE, class_list);
2423 if (CLASS_BEING_LAIDOUT (this_class))
2429 sprintf (buffer, " with '%s'",
2430 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2431 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2433 for (current = TREE_CHAIN (class_list); current;
2434 current = TREE_CHAIN (current))
2436 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2437 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2438 IDENTIFIER_POINTER (DECL_NAME (decl)),
2439 DECL_SOURCE_FILE (decl),
2440 DECL_SOURCE_LINE (decl));
2441 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2443 obstack_1grow (&temporary_obstack, '\0');
2444 report = XOBFINISH (&temporary_obstack, char *);
2445 cyclic_inheritance_report = ggc_strdup (report);
2446 obstack_free (&temporary_obstack, report);
2447 TYPE_SIZE (this_class) = error_mark_node;
2450 CLASS_BEING_LAIDOUT (this_class) = 1;
2452 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2454 tree maybe_super_class
2455 = maybe_layout_super_class (super_class, this_class);
2456 if (maybe_super_class == NULL
2457 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2459 TYPE_SIZE (this_class) = error_mark_node;
2460 CLASS_BEING_LAIDOUT (this_class) = 0;
2461 class_list = TREE_CHAIN (class_list);
2464 if (TYPE_SIZE (this_class) == NULL_TREE)
2465 push_super_field (this_class, maybe_super_class);
2468 layout_type (this_class);
2470 /* Also recursively load/layout any superinterfaces. */
2471 if (TYPE_BINFO (this_class))
2473 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2475 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2476 tree super_interface = BINFO_TYPE (binfo);
2477 tree maybe_super_interface
2478 = maybe_layout_super_class (super_interface, NULL_TREE);
2479 if (maybe_super_interface == NULL
2480 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2482 TYPE_SIZE (this_class) = error_mark_node;
2483 CLASS_BEING_LAIDOUT (this_class) = 0;
2484 class_list = TREE_CHAIN (class_list);
2490 /* Convert the size back to an SI integer value. */
2491 TYPE_SIZE_UNIT (this_class) =
2492 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2494 CLASS_BEING_LAIDOUT (this_class) = 0;
2495 class_list = TREE_CHAIN (class_list);
2499 add_miranda_methods (tree base_class, tree search_class)
2502 tree binfo, base_binfo;
2504 if (!CLASS_PARSED_P (search_class))
2505 load_class (search_class, 1);
2507 for (binfo = TYPE_BINFO (search_class), i = 1;
2508 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2511 tree elt = BINFO_TYPE (base_binfo);
2513 /* FIXME: This is totally bogus. We should not be handling
2514 Miranda methods at all if we're using the BC ABI. */
2515 if (TYPE_DUMMY (elt))
2518 /* Ensure that interface methods are seen in declared order. */
2519 if (!CLASS_LOADED_P (elt))
2520 load_class (elt, 1);
2521 layout_class_methods (elt);
2523 /* All base classes will have been laid out at this point, so the order
2524 will be correct. This code must match similar layout code in the
2526 for (method_decl = TYPE_METHODS (elt);
2527 method_decl; method_decl = TREE_CHAIN (method_decl))
2531 /* An interface can have <clinit>. */
2532 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2535 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2536 override = lookup_argument_method (base_class,
2537 DECL_NAME (method_decl), sig);
2538 if (override == NULL_TREE)
2540 /* Found a Miranda method. Add it. */
2542 sig = build_java_signature (TREE_TYPE (method_decl));
2544 = add_method (base_class,
2545 get_access_flags_from_decl (method_decl),
2546 DECL_NAME (method_decl), sig);
2547 METHOD_INVISIBLE (new_method) = 1;
2551 /* Try superinterfaces. */
2552 add_miranda_methods (base_class, elt);
2557 layout_class_methods (tree this_class)
2559 tree method_decl, dtable_count;
2560 tree super_class, type_name;
2562 if (TYPE_NVIRTUALS (this_class))
2565 super_class = CLASSTYPE_SUPER (this_class);
2569 super_class = maybe_layout_super_class (super_class, this_class);
2570 if (!TYPE_NVIRTUALS (super_class))
2571 layout_class_methods (super_class);
2572 dtable_count = TYPE_NVIRTUALS (super_class);
2575 dtable_count = integer_zero_node;
2577 type_name = TYPE_NAME (this_class);
2578 if (!flag_indirect_dispatch
2579 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2581 /* An abstract class can have methods which are declared only in
2582 an implemented interface. These are called "Miranda
2583 methods". We make a dummy method entry for such methods
2585 add_miranda_methods (this_class, this_class);
2588 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2590 for (method_decl = TYPE_METHODS (this_class);
2591 method_decl; method_decl = TREE_CHAIN (method_decl))
2592 dtable_count = layout_class_method (this_class, super_class,
2593 method_decl, dtable_count);
2595 TYPE_NVIRTUALS (this_class) = dtable_count;
2598 /* Return the index of METHOD in INTERFACE. This index begins at 1
2599 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2601 get_interface_method_index (tree method, tree interface)
2606 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2610 /* We don't want to put <clinit> into the interface table. */
2611 if (! ID_CLINIT_P (DECL_NAME (meth)))
2613 gcc_assert (meth != NULL_TREE);
2617 /* Lay METHOD_DECL out, returning a possibly new value of
2618 DTABLE_COUNT. Also mangle the method's name. */
2621 layout_class_method (tree this_class, tree super_class,
2622 tree method_decl, tree dtable_count)
2624 tree method_name = DECL_NAME (method_decl);
2626 TREE_PUBLIC (method_decl) = 1;
2628 if (flag_indirect_classes
2629 || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
2630 && ! METHOD_NATIVE (method_decl)
2631 && ! special_method_p (method_decl)))
2632 java_hide_decl (method_decl);
2634 /* Considered external unless it is being compiled into this object
2635 file, or it was already flagged as external. */
2636 if (!DECL_EXTERNAL (method_decl))
2637 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2638 || METHOD_NATIVE (method_decl));
2640 if (ID_INIT_P (method_name))
2642 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2644 for (ptr = p; *ptr; )
2649 DECL_CONSTRUCTOR_P (method_decl) = 1;
2650 build_java_signature (TREE_TYPE (method_decl));
2652 else if (! METHOD_STATIC (method_decl))
2655 build_java_signature (TREE_TYPE (method_decl));
2656 bool method_override = false;
2657 tree super_method = lookup_java_method (super_class, method_name,
2659 if (super_method != NULL_TREE
2660 && ! METHOD_DUMMY (super_method))
2662 method_override = true;
2663 if (! METHOD_PUBLIC (super_method) &&
2664 ! METHOD_PROTECTED (super_method))
2666 /* Don't override private method, or default-access method in
2668 if (METHOD_PRIVATE (super_method) ||
2669 ! in_same_package (TYPE_NAME (this_class),
2670 TYPE_NAME (super_class)))
2671 method_override = false;
2674 if (method_override)
2676 tree method_index = get_method_index (super_method);
2677 set_method_index (method_decl, method_index);
2678 if (method_index == NULL_TREE
2679 && ! flag_indirect_dispatch
2680 && ! DECL_ARTIFICIAL (super_method))
2681 error ("non-static method %q+D overrides static method",
2684 else if (this_class == object_type_node
2685 && (METHOD_FINAL (method_decl)
2686 || METHOD_PRIVATE (method_decl)))
2688 /* We don't generate vtable entries for final Object
2689 methods. This is simply to save space, since every
2690 object would otherwise have to define them. */
2692 else if (! METHOD_PRIVATE (method_decl)
2695 /* We generate vtable entries for final methods because they
2696 may one day be changed to non-final. */
2697 set_method_index (method_decl, dtable_count);
2698 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2699 dtable_count, integer_one_node);
2703 return dtable_count;
2707 register_class (void)
2711 if (!registered_class)
2712 registered_class = VEC_alloc (tree, gc, 8);
2714 if (flag_indirect_classes)
2715 node = current_class;
2717 node = TREE_OPERAND (build_class_ref (current_class), 0);
2718 VEC_safe_push (tree, gc, registered_class, node);
2721 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2722 all the classes we have emitted. */
2725 emit_indirect_register_classes (tree *list_p)
2727 tree klass, t, register_class_fn;
2730 tree init = NULL_TREE;
2731 int size = VEC_length (tree, registered_class) * 2 + 1;
2732 tree class_array_type
2733 = build_prim_array_type (ptr_type_node, size);
2734 tree cdecl = build_decl (input_location,
2735 VAR_DECL, get_identifier ("_Jv_CLS"),
2737 tree reg_class_list;
2738 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2740 init = tree_cons (NULL_TREE,
2741 fold_convert (ptr_type_node,
2742 build_static_class_ref (klass)), init);
2745 fold_convert (ptr_type_node,
2746 build_address_of (build_classdollar_field (klass))),
2749 init = tree_cons (NULL_TREE, integer_zero_node, init);
2750 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2752 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2753 TREE_STATIC (cdecl) = 1;
2754 DECL_ARTIFICIAL (cdecl) = 1;
2755 DECL_IGNORED_P (cdecl) = 1;
2756 TREE_READONLY (cdecl) = 1;
2757 TREE_CONSTANT (cdecl) = 1;
2758 rest_of_decl_compilation (cdecl, 1, 0);
2759 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2761 t = build_function_type_list (void_type_node,
2762 build_pointer_type (ptr_type_node), NULL);
2763 t = build_decl (input_location,
2765 get_identifier ("_Jv_RegisterNewClasses"), t);
2766 TREE_PUBLIC (t) = 1;
2767 DECL_EXTERNAL (t) = 1;
2768 register_class_fn = t;
2769 t = build_call_expr (register_class_fn, 1, reg_class_list);
2770 append_to_statement_list (t, list_p);
2774 /* Emit something to register classes at start-up time.
2776 The preferred mechanism is through the .jcr section, which contain
2777 a list of pointers to classes which get registered during constructor
2780 The fallback mechanism is to add statements to *LIST_P to call
2781 _Jv_RegisterClass for each class in this file. These statements will
2782 be added to a static constructor function for this translation unit. */
2785 emit_register_classes (tree *list_p)
2787 if (registered_class == NULL)
2790 if (flag_indirect_classes)
2792 emit_indirect_register_classes (list_p);
2796 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2797 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2798 but lack suitable crtbegin/end objects or linker support. These
2799 targets can override the default in tm.h to use the fallback mechanism. */
2800 if (TARGET_USE_JCR_SECTION)
2805 #ifdef JCR_SECTION_NAME
2806 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2808 /* A target has defined TARGET_USE_JCR_SECTION,
2809 but doesn't have a JCR_SECTION_NAME. */
2812 assemble_align (POINTER_SIZE);
2814 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2816 t = build_fold_addr_expr (klass);
2817 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2822 tree klass, t, register_class_fn;
2825 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2826 t = build_decl (input_location,
2827 FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2828 TREE_PUBLIC (t) = 1;
2829 DECL_EXTERNAL (t) = 1;
2830 register_class_fn = t;
2832 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2834 t = build_fold_addr_expr (klass);
2835 t = build_call_expr (register_class_fn, 1, t);
2836 append_to_statement_list (t, list_p);
2841 /* Build a constructor for an entry in the symbol table. */
2844 build_symbol_table_entry (tree clname, tree name, tree signature)
2847 VEC(constructor_elt,gc) *v = NULL;
2849 START_RECORD_CONSTRUCTOR (v, symbol_type);
2850 PUSH_FIELD_VALUE (v, "clname", clname);
2851 PUSH_FIELD_VALUE (v, "name", name);
2852 PUSH_FIELD_VALUE (v, "signature", signature);
2853 FINISH_RECORD_CONSTRUCTOR (symbol, v, symbol_type);
2854 TREE_CONSTANT (symbol) = 1;
2859 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2862 build_symbol_entry (tree decl, tree special)
2864 tree clname, name, signature;
2865 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2866 /* ??? Constructors are given the name foo.foo all the way through
2867 the compiler, but in the method table they're all renamed
2868 foo.<init>. So, we have to do the same here unless we want an
2869 unresolved reference at runtime. */
2870 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2871 && DECL_CONSTRUCTOR_P (decl))
2872 ? init_identifier_node
2873 : DECL_NAME (decl));
2874 signature = build_java_signature (TREE_TYPE (decl));
2875 signature = build_utf8_ref (unmangle_classname
2876 (IDENTIFIER_POINTER (signature),
2877 IDENTIFIER_LENGTH (signature)));
2878 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2879 signature addr+1 if SPECIAL, and this indicates to the runtime
2880 system that this is a "special" symbol, i.e. one that should
2881 bypass access controls. */
2882 if (special != NULL_TREE)
2883 signature = build2 (POINTER_PLUS_EXPR, TREE_TYPE (signature), signature,
2884 fold_convert (sizetype, special));
2886 return build_symbol_table_entry (clname, name, signature);
2889 /* Emit a symbol table: used by -findirect-dispatch. */
2892 emit_symbol_table (tree name, tree the_table, tree decl_list,
2893 tree the_syms_decl, tree the_array_element_type,
2896 tree method_list, method, table, list, null_symbol;
2897 tree table_size, the_array_type;
2900 /* Only emit a table if this translation unit actually made any
2901 references via it. */
2902 if (decl_list == NULL_TREE)
2905 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2907 method_list = decl_list;
2909 while (method_list != NULL_TREE)
2911 tree special = TREE_PURPOSE (method_list);
2912 method = TREE_VALUE (method_list);
2913 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2914 method_list = TREE_CHAIN (method_list);
2918 /* Terminate the list with a "null" entry. */
2919 null_symbol = build_symbol_table_entry (null_pointer_node,
2922 list = tree_cons (NULL_TREE, null_symbol, list);
2924 /* Put the list in the right order and make it a constructor. */
2925 list = nreverse (list);
2926 table = build_constructor_from_list (symbols_array_type, list);
2928 /* Make it the initial value for otable_syms and emit the decl. */
2929 DECL_INITIAL (the_syms_decl) = table;
2930 DECL_ARTIFICIAL (the_syms_decl) = 1;
2931 DECL_IGNORED_P (the_syms_decl) = 1;
2932 rest_of_decl_compilation (the_syms_decl, 1, 0);
2934 /* Now that its size is known, redefine the table as an
2935 uninitialized static array of INDEX + 1 elements. The extra entry
2936 is used by the runtime to track whether the table has been
2939 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2940 the_array_type = build_array_type (the_array_element_type, table_size);
2941 the_table = build_decl (input_location,
2942 VAR_DECL, name, the_array_type);
2943 TREE_STATIC (the_table) = 1;
2944 TREE_READONLY (the_table) = 1;
2945 rest_of_decl_compilation (the_table, 1, 0);
2950 /* Make an entry for the catch_classes list. */
2952 make_catch_class_record (tree catch_class, tree classname)
2955 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2956 VEC(constructor_elt,gc) *v = NULL;
2957 START_RECORD_CONSTRUCTOR (v, type);
2958 PUSH_FIELD_VALUE (v, "address", catch_class);
2959 PUSH_FIELD_VALUE (v, "classname", classname);
2960 FINISH_RECORD_CONSTRUCTOR (entry, v, type);
2965 /* Generate the list of Throwable classes that are caught by exception
2966 handlers in this class. */
2968 emit_catch_table (tree this_class)
2970 tree table, table_size, array_type;
2971 TYPE_CATCH_CLASSES (this_class) =
2973 make_catch_class_record (null_pointer_node, null_pointer_node),
2974 TYPE_CATCH_CLASSES (this_class));
2975 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2976 TYPE_CATCH_CLASSES (this_class) =
2978 make_catch_class_record (null_pointer_node, null_pointer_node),
2979 TYPE_CATCH_CLASSES (this_class));
2980 table_size = build_index_type
2981 (build_int_cst (NULL_TREE,
2982 list_length (TYPE_CATCH_CLASSES (this_class))));
2984 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2987 build_decl (input_location,
2988 VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2989 DECL_INITIAL (table) =
2990 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2991 TREE_STATIC (table) = 1;
2992 TREE_READONLY (table) = 1;
2993 DECL_IGNORED_P (table) = 1;
2994 rest_of_decl_compilation (table, 1, 0);
2998 /* Given a type, return the signature used by
2999 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
3000 same as build_java_signature() because we want the canonical array
3004 build_signature_for_libgcj (tree type)
3008 sig = build_java_signature (type);
3009 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
3010 IDENTIFIER_LENGTH (sig)));
3014 /* Build an entry in the type assertion table. */
3017 build_assertion_table_entry (tree code, tree op1, tree op2)
3019 VEC(constructor_elt,gc) *v = NULL;
3022 START_RECORD_CONSTRUCTOR (v, assertion_entry_type);
3023 PUSH_FIELD_VALUE (v, "assertion_code", code);
3024 PUSH_FIELD_VALUE (v, "op1", op1);
3025 PUSH_FIELD_VALUE (v, "op2", op2);
3026 FINISH_RECORD_CONSTRUCTOR (entry, v, assertion_entry_type);
3031 /* Add an entry to the type assertion table. Callback used during hashtable
3035 add_assertion_table_entry (void **htab_entry, void *ptr)
3038 tree code_val, op1_utf8, op2_utf8;
3039 tree *list = (tree *) ptr;
3040 type_assertion *as = (type_assertion *) *htab_entry;
3042 code_val = build_int_cst (NULL_TREE, as->assertion_code);
3044 if (as->op1 == NULL_TREE)
3045 op1_utf8 = null_pointer_node;
3047 op1_utf8 = build_signature_for_libgcj (as->op1);
3049 if (as->op2 == NULL_TREE)
3050 op2_utf8 = null_pointer_node;
3052 op2_utf8 = build_signature_for_libgcj (as->op2);
3054 entry = build_assertion_table_entry (code_val, op1_utf8, op2_utf8);
3056 *list = tree_cons (NULL_TREE, entry, *list);
3060 /* Generate the type assertion table for KLASS, and return its DECL. */
3063 emit_assertion_table (tree klass)
3065 tree null_entry, ctor, table_decl;
3066 tree list = NULL_TREE;
3067 htab_t assertions_htab = TYPE_ASSERTIONS (klass);
3069 /* Iterate through the hash table. */
3070 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
3072 /* Finish with a null entry. */
3073 null_entry = build_assertion_table_entry (integer_zero_node,
3077 list = tree_cons (NULL_TREE, null_entry, list);
3079 /* Put the list in the right order and make it a constructor. */
3080 list = nreverse (list);
3081 ctor = build_constructor_from_list (assertion_table_type, list);
3083 table_decl = build_decl (input_location,
3084 VAR_DECL, mangled_classname ("_type_assert_", klass),
3085 assertion_table_type);
3087 TREE_STATIC (table_decl) = 1;
3088 TREE_READONLY (table_decl) = 1;
3089 TREE_CONSTANT (table_decl) = 1;
3090 DECL_IGNORED_P (table_decl) = 1;
3092 DECL_INITIAL (table_decl) = ctor;
3093 DECL_ARTIFICIAL (table_decl) = 1;
3094 rest_of_decl_compilation (table_decl, 1, 0);
3100 init_class_processing (void)
3102 fields_ident = get_identifier ("fields");
3103 info_ident = get_identifier ("info");
3105 gcc_obstack_init (&temporary_obstack);
3108 static hashval_t java_treetreehash_hash (const void *);
3109 static int java_treetreehash_compare (const void *, const void *);
3111 /* A hash table mapping trees to trees. Used generally. */
3113 #define JAVA_TREEHASHHASH_H(t) ((hashval_t)TYPE_UID (t))
3116 java_treetreehash_hash (const void *k_p)
3118 const struct treetreehash_entry *const k
3119 = (const struct treetreehash_entry *) k_p;
3120 return JAVA_TREEHASHHASH_H (k->key);
3124 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3126 const struct treetreehash_entry *const k1
3127 = (const struct treetreehash_entry *) k1_p;
3128 const_tree const k2 = (const_tree) k2_p;
3129 return (k1->key == k2);
3133 java_treetreehash_find (htab_t ht, tree t)
3135 struct treetreehash_entry *e;
3136 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3137 e = (struct treetreehash_entry *) htab_find_with_hash (ht, t, hv);
3145 java_treetreehash_new (htab_t ht, tree t)
3148 struct treetreehash_entry *tthe;
3149 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3151 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3154 tthe = (struct treetreehash_entry *) (*ht->alloc_f) (1, sizeof (*tthe));
3159 tthe = (struct treetreehash_entry *) *e;
3160 return &tthe->value;
3164 java_treetreehash_create (size_t size, int gc)
3167 return htab_create_ggc (size, java_treetreehash_hash,
3168 java_treetreehash_compare, NULL);
3170 return htab_create_alloc (size, java_treetreehash_hash,
3171 java_treetreehash_compare, free, xcalloc, free);
3174 /* Break down qualified IDENTIFIER into package and class-name components.
3175 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3176 "pkg.foo", and RIGHT to "Bar". */
3179 split_qualified_name (tree *left, tree *right, tree source)
3182 int l = IDENTIFIER_LENGTH (source);
3184 base = (char *) alloca (l + 1);
3185 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3187 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3189 while (*p != '.' && p != base)
3192 /* We didn't find a '.'. Return an error. */
3198 *right = get_identifier (p+1);
3199 *left = get_identifier (base);
3204 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3205 if the classes are from the same package. */
3208 in_same_package (tree name1, tree name2)
3214 if (TREE_CODE (name1) == TYPE_DECL)
3215 name1 = DECL_NAME (name1);
3216 if (TREE_CODE (name2) == TYPE_DECL)
3217 name2 = DECL_NAME (name2);
3219 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3220 /* One in empty package. */
3223 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3224 /* Both in empty package. */
3227 split_qualified_name (&pkg1, &tmp, name1);
3228 split_qualified_name (&pkg2, &tmp, name2);
3230 return (pkg1 == pkg2);
3233 /* lang_hooks.decls.final_write_globals: perform final processing on
3234 global variables. */
3237 java_write_globals (void)
3239 tree *vec = VEC_address (tree, pending_static_fields);
3240 int len = VEC_length (tree, pending_static_fields);
3241 write_global_declarations ();
3242 emit_debug_global_declarations (vec, len);
3243 VEC_free (tree, gc, pending_static_fields);
3246 #include "gt-java-class.h"