1 /* Functions related to building classes and their related objects.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, USA.
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
26 /* Written by Per Bothner <bothner@cygnus.com> */
30 #include "coretypes.h"
35 #include "java-tree.h"
47 #include "tree-iterator.h"
51 /* DOS brain-damage */
53 #define O_BINARY 0 /* MS-DOS brain-damage */
56 static tree
make_method_value (tree
);
57 static tree
build_java_method_type (tree
, tree
, int);
58 static int32
hashUtf8String (const char *, int);
59 static tree
make_field_value (tree
);
60 static tree
get_dispatch_vector (tree
);
61 static tree
get_dispatch_table (tree
, tree
);
62 static int supers_all_compiled (tree type
);
63 static tree
maybe_layout_super_class (tree
, tree
);
64 static void add_miranda_methods (tree
, tree
);
65 static int assume_compiled (const char *);
66 static tree
build_symbol_entry (tree
, tree
);
67 static tree
emit_assertion_table (tree
);
68 static void register_class (void);
70 struct obstack temporary_obstack
;
72 static const char *cyclic_inheritance_report
;
74 /* The compiler generates different code depending on whether or not
75 it can assume certain classes have been compiled down to native
76 code or not. The compiler options -fassume-compiled= and
77 -fno-assume-compiled= are used to create a tree of
78 class_flag_node objects. This tree is queried to determine if
79 a class is assume to be compiled or not. Each node in the tree
80 represents either a package or a specific class. */
82 typedef struct class_flag_node_struct
84 /* The class or package name. */
87 /* Nonzero if this represents an exclusion. */
90 /* Pointers to other nodes in the tree. */
91 struct class_flag_node_struct
*parent
;
92 struct class_flag_node_struct
*sibling
;
93 struct class_flag_node_struct
*child
;
96 static class_flag_node
*find_class_flag_node (class_flag_node
*, const char *);
97 static void add_class_flag (class_flag_node
**, const char *, int);
99 /* This is the root of the include/exclude tree. */
101 static class_flag_node
*assume_compiled_tree
;
103 static class_flag_node
*enable_assert_tree
;
105 static GTY(()) tree class_roots
[4];
106 #define fields_ident class_roots[0] /* get_identifier ("fields") */
107 #define info_ident class_roots[1] /* get_identifier ("info") */
108 #define class_list class_roots[2]
109 #define class_dtable_decl class_roots[3]
111 static GTY(()) VEC(tree
,gc
) *registered_class
;
113 /* Return the node that most closely represents the class whose name
114 is IDENT. Start the search from NODE (followed by its siblings).
115 Return NULL if an appropriate node does not exist. */
117 static class_flag_node
*
118 find_class_flag_node (class_flag_node
*node
, const char *ident
)
122 size_t node_ident_length
= strlen (node
->ident
);
124 /* node_ident_length is zero at the root of the tree. If the
125 identifiers are the same length, then we have matching
126 classes. Otherwise check if we've matched an enclosing
129 if (node_ident_length
== 0
130 || (strncmp (ident
, node
->ident
, node_ident_length
) == 0
131 && (ident
[node_ident_length
] == '\0'
132 || ident
[node_ident_length
] == '.')))
134 /* We've found a match, however, there might be a more
137 class_flag_node
*found
= find_class_flag_node (node
->child
, ident
);
144 /* No match yet. Continue through the sibling list. */
145 node
= node
->sibling
;
148 /* No match at all in this tree. */
153 add_class_flag (class_flag_node
**rootp
, const char *ident
, int value
)
155 class_flag_node
*root
= *rootp
;
156 class_flag_node
*parent
, *node
;
158 /* Create the root of the tree if it doesn't exist yet. */
162 root
= XNEW (class_flag_node
);
165 root
->sibling
= NULL
;
171 /* Calling the function with the empty string means we're setting
172 value for the root of the hierarchy. */
180 /* Find the parent node for this new node. PARENT will either be a
181 class or a package name. Adjust PARENT accordingly. */
183 parent
= find_class_flag_node (root
, ident
);
184 if (strcmp (ident
, parent
->ident
) == 0)
185 parent
->value
= value
;
188 /* Insert new node into the tree. */
189 node
= XNEW (class_flag_node
);
191 node
->ident
= xstrdup (ident
);
195 node
->parent
= parent
;
196 node
->sibling
= parent
->child
;
197 parent
->child
= node
;
201 /* Add a new IDENT to the include/exclude tree. It's an exclusion
202 if EXCLUDEP is nonzero. */
205 add_assume_compiled (const char *ident
, int excludep
)
207 add_class_flag (&assume_compiled_tree
, ident
, excludep
);
210 /* The default value returned by enable_assertions. */
212 #define DEFAULT_ENABLE_ASSERT (optimize == 0)
214 /* Enter IDENT (a class or package name) into the enable-assertions table.
215 VALUE is true to enable and false to disable. */
218 add_enable_assert (const char *ident
, int value
)
220 if (enable_assert_tree
== NULL
)
221 add_class_flag (&enable_assert_tree
, "", DEFAULT_ENABLE_ASSERT
);
222 add_class_flag (&enable_assert_tree
, ident
, value
);
225 /* Returns nonzero if IDENT is the name of a class that the compiler
226 should assume has been compiled to object code. */
229 assume_compiled (const char *ident
)
234 if (NULL
== assume_compiled_tree
)
237 i
= find_class_flag_node (assume_compiled_tree
, ident
);
244 /* Return true if we should generate code to check assertions within KLASS. */
247 enable_assertions (tree klass
)
249 /* Check if command-line specifies whether we should check assertions. */
251 if (klass
!= NULL_TREE
&& DECL_NAME (klass
) && enable_assert_tree
!= NULL
)
253 const char *ident
= IDENTIFIER_POINTER (DECL_NAME (klass
));
254 class_flag_node
*node
255 = find_class_flag_node (enable_assert_tree
, ident
);
259 /* The default is to enable assertions if generating class files,
260 or not optimizing. */
261 return DEFAULT_ENABLE_ASSERT
;
264 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
265 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
266 Also, PREFIX is prepended, and SUFFIX is appended. */
269 ident_subst (const char* old_name
,
276 int prefix_len
= strlen (prefix
);
277 int suffix_len
= strlen (suffix
);
278 int i
= prefix_len
+ old_length
+ suffix_len
+ 1;
279 char *buffer
= alloca (i
);
281 strcpy (buffer
, prefix
);
282 for (i
= 0; i
< old_length
; i
++)
284 char ch
= old_name
[i
];
287 buffer
[prefix_len
+ i
] = ch
;
289 strcpy (buffer
+ prefix_len
+ old_length
, suffix
);
290 return get_identifier (buffer
);
293 /* Return an IDENTIFIER_NODE the same as OLD_ID,
294 except that characters matching OLD_CHAR are substituted by NEW_CHAR.
295 Also, PREFIX is prepended, and SUFFIX is appended. */
298 identifier_subst (const tree old_id
,
304 return ident_subst (IDENTIFIER_POINTER (old_id
), IDENTIFIER_LENGTH (old_id
),
305 prefix
, old_char
, new_char
, suffix
);
308 /* Generate a valid C identifier from the name of the class TYPE,
309 prefixed by PREFIX. */
312 mangled_classname (const char *prefix
, tree type
)
314 tree ident
= TYPE_NAME (type
);
315 if (TREE_CODE (ident
) != IDENTIFIER_NODE
)
316 ident
= DECL_NAME (ident
);
317 return identifier_subst (ident
, prefix
, '.', '_', "");
324 type
= make_node (RECORD_TYPE
);
325 /* Unfortunately we must create the binfo here, so that class
327 TYPE_BINFO (type
) = make_tree_binfo (0);
328 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type
);
333 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
334 and where each of the constituents is separated by '/',
335 return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
338 unmangle_classname (const char *name
, int name_length
)
340 tree to_return
= ident_subst (name
, name_length
, "", '/', '.', "");
341 /* It's not sufficient to compare to_return and get_identifier
342 (name) to determine whether to_return is qualified. There are
343 cases in signature analysis where name will be stripped of a
345 name
= IDENTIFIER_POINTER (to_return
);
349 QUALIFIED_P (to_return
) = 1;
356 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
359 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
360 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
363 sprintf (buf, #NAME "_%s", typename); \
364 TYPE_## TABLE ##_DECL (type) = decl = \
365 build_decl (VAR_DECL, get_identifier (buf), TABLE_TYPE); \
366 DECL_EXTERNAL (decl) = 1; \
367 TREE_STATIC (decl) = 1; \
368 TREE_READONLY (decl) = 1; \
369 TREE_CONSTANT (decl) = 1; \
370 DECL_IGNORED_P (decl) = 1; \
371 /* Mark the table as belonging to this class. */ \
373 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl); \
374 DECL_OWNER (decl) = TYPE; \
375 sprintf (buf, #NAME "_syms_%s", typename); \
376 TYPE_## TABLE ##_SYMS_DECL (TYPE) = \
377 build_decl (VAR_DECL, get_identifier (buf), symbols_array_type); \
378 TREE_STATIC (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
379 TREE_CONSTANT (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
380 DECL_IGNORED_P (TYPE_## TABLE ##_SYMS_DECL (TYPE)) = 1; \
384 /* Given a class, create the DECLs for all its associated indirect
387 gen_indirect_dispatch_tables (tree type
)
389 const char *typename
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)));
392 char *buf
= alloca (strlen (typename
) + strlen ("_catch_classes_") + 1);
393 tree catch_class_type
= make_node (RECORD_TYPE
);
395 sprintf (buf
, "_catch_classes_%s", typename
);
396 PUSH_FIELD (catch_class_type
, field
, "address", utf8const_ptr_type
);
397 PUSH_FIELD (catch_class_type
, field
, "classname", ptr_type_node
);
398 FINISH_RECORD (catch_class_type
);
400 TYPE_CTABLE_DECL (type
)
401 = build_decl (VAR_DECL
, get_identifier (buf
),
402 build_array_type (catch_class_type
, 0));
403 DECL_EXTERNAL (TYPE_CTABLE_DECL (type
)) = 1;
404 TREE_STATIC (TYPE_CTABLE_DECL (type
)) = 1;
405 TREE_READONLY (TYPE_CTABLE_DECL (type
)) = 1;
406 TREE_CONSTANT (TYPE_CTABLE_DECL (type
)) = 1;
407 DECL_IGNORED_P (TYPE_CTABLE_DECL (type
)) = 1;
408 pushdecl (TYPE_CTABLE_DECL (type
));
411 if (flag_indirect_dispatch
)
413 GEN_TABLE (ATABLE
, _atable
, atable_type
, type
);
414 GEN_TABLE (OTABLE
, _otable
, otable_type
, type
);
415 GEN_TABLE (ITABLE
, _itable
, itable_type
, type
);
422 push_class (tree class_type
, tree class_name
)
424 tree decl
, signature
;
425 location_t saved_loc
= input_location
;
426 #ifndef USE_MAPPED_LOCATION
427 tree source_name
= identifier_subst (class_name
, "", '.', '/', ".java");
428 input_filename
= IDENTIFIER_POINTER (source_name
);
431 CLASS_P (class_type
) = 1;
432 decl
= build_decl (TYPE_DECL
, class_name
, class_type
);
433 TYPE_DECL_SUPPRESS_DEBUG (decl
) = 1;
435 /* dbxout needs a DECL_SIZE if in gstabs mode */
436 DECL_SIZE (decl
) = integer_zero_node
;
438 input_location
= saved_loc
;
439 signature
= identifier_subst (class_name
, "L", '.', '/', ";");
440 IDENTIFIER_SIGNATURE_TYPE (signature
) = build_pointer_type (class_type
);
442 /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
443 both a typedef and in the struct name-space. We may want to re-visit
444 this later, but for now it reduces the changes needed for gdb. */
445 DECL_ARTIFICIAL (decl
) = 1;
447 pushdecl_top_level (decl
);
452 /* Finds the (global) class named NAME. Creates the class if not found.
453 Also creates associated TYPE_DECL.
454 Does not check if the class actually exists, load the class,
455 fill in field or methods, or do layout_type. */
458 lookup_class (tree name
)
460 tree decl
= IDENTIFIER_CLASS_VALUE (name
);
461 if (decl
== NULL_TREE
)
462 decl
= push_class (make_class (), name
);
463 return TREE_TYPE (decl
);
467 set_super_info (int access_flags
, tree this_class
,
468 tree super_class
, int interfaces_count
)
470 int total_supers
= interfaces_count
;
471 tree class_decl
= TYPE_NAME (this_class
);
477 TYPE_BINFO (this_class
) = make_tree_binfo (total_supers
);
478 TYPE_VFIELD (this_class
) = TYPE_VFIELD (object_type_node
);
481 tree super_binfo
= make_tree_binfo (0);
482 BINFO_TYPE (super_binfo
) = super_class
;
483 BINFO_OFFSET (super_binfo
) = integer_zero_node
;
484 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), super_binfo
);
485 CLASS_HAS_SUPER_FLAG (TYPE_BINFO (this_class
)) = 1;
488 set_class_decl_access_flags (access_flags
, class_decl
);
492 set_class_decl_access_flags (int access_flags
, tree class_decl
)
494 if (access_flags
& ACC_PUBLIC
) CLASS_PUBLIC (class_decl
) = 1;
495 if (access_flags
& ACC_FINAL
) CLASS_FINAL (class_decl
) = 1;
496 if (access_flags
& ACC_SUPER
) CLASS_SUPER (class_decl
) = 1;
497 if (access_flags
& ACC_INTERFACE
) CLASS_INTERFACE (class_decl
) = 1;
498 if (access_flags
& ACC_ABSTRACT
) CLASS_ABSTRACT (class_decl
) = 1;
499 if (access_flags
& ACC_STATIC
) CLASS_STATIC (class_decl
) = 1;
500 if (access_flags
& ACC_PRIVATE
) CLASS_PRIVATE (class_decl
) = 1;
501 if (access_flags
& ACC_PROTECTED
) CLASS_PROTECTED (class_decl
) = 1;
502 if (access_flags
& ACC_STRICT
) CLASS_STRICTFP (class_decl
) = 1;
503 if (access_flags
& ACC_ENUM
) CLASS_ENUM (class_decl
) = 1;
504 if (access_flags
& ACC_SYNTHETIC
) CLASS_SYNTHETIC (class_decl
) = 1;
505 if (access_flags
& ACC_ANNOTATION
) CLASS_ANNOTATION (class_decl
) = 1;
508 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
509 direct sub-classes of Object are 1, and so on. */
512 class_depth (tree clas
)
515 if (! CLASS_LOADED_P (clas
))
516 load_class (clas
, 1);
517 if (TYPE_SIZE (clas
) == error_mark_node
)
519 while (clas
!= object_type_node
)
522 clas
= BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas
), 0));
527 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
530 interface_of_p (tree type1
, tree type2
)
533 tree binfo
, base_binfo
;
535 if (! TYPE_BINFO (type2
))
538 for (binfo
= TYPE_BINFO (type2
), i
= 0;
539 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
540 if (BINFO_TYPE (base_binfo
) == type1
)
543 for (binfo
= TYPE_BINFO (type2
), i
= 0;
544 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++) /* */
545 if (BINFO_TYPE (base_binfo
)
546 && interface_of_p (type1
, BINFO_TYPE (base_binfo
)))
552 /* Return true iff TYPE1 inherits from TYPE2. */
555 inherits_from_p (tree type1
, tree type2
)
557 while (type1
!= NULL_TREE
&& TREE_CODE (type1
) == RECORD_TYPE
)
562 if (! CLASS_LOADED_P (type1
))
563 load_class (type1
, 1);
565 type1
= maybe_layout_super_class (CLASSTYPE_SUPER (type1
), type1
);
570 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
573 enclosing_context_p (tree type1
, tree type2
)
575 if (!INNER_CLASS_TYPE_P (type2
))
578 for (type2
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
)));
580 type2
= (INNER_CLASS_TYPE_P (type2
) ?
581 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))) : NULL_TREE
))
591 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
595 common_enclosing_context_p (tree type1
, tree type2
)
600 for (current
= type2
; current
;
601 current
= (INNER_CLASS_TYPE_P (current
) ?
602 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
604 if (type1
== current
)
607 if (INNER_CLASS_TYPE_P (type1
))
608 type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
)));
615 /* Return 1 iff there exists a common enclosing "this" between TYPE1
616 and TYPE2, without crossing any static context. */
619 common_enclosing_instance_p (tree type1
, tree type2
)
621 if (!PURE_INNER_CLASS_TYPE_P (type1
) || !PURE_INNER_CLASS_TYPE_P (type2
))
624 for (type1
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))); type1
;
625 type1
= (PURE_INNER_CLASS_TYPE_P (type1
) ?
626 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1
))) : NULL_TREE
))
629 for (current
= TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2
))); current
;
630 current
= (PURE_INNER_CLASS_TYPE_P (current
) ?
631 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current
))) :
633 if (type1
== current
)
639 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
640 found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
641 if attempt is made to add it twice. */
644 maybe_add_interface (tree this_class
, tree interface_class
)
646 tree binfo
, base_binfo
;
649 for (binfo
= TYPE_BINFO (this_class
), i
= 0;
650 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
651 if (BINFO_TYPE (base_binfo
) == interface_class
)
652 return interface_class
;
653 add_interface (this_class
, interface_class
);
657 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
660 add_interface (tree this_class
, tree interface_class
)
662 tree interface_binfo
= make_tree_binfo (0);
664 BINFO_TYPE (interface_binfo
) = interface_class
;
665 BINFO_OFFSET (interface_binfo
) = integer_zero_node
;
666 BINFO_VPTR_FIELD (interface_binfo
) = integer_zero_node
;
667 BINFO_VIRTUAL_P (interface_binfo
) = 1;
669 BINFO_BASE_APPEND (TYPE_BINFO (this_class
), interface_binfo
);
673 build_java_method_type (tree fntype
, tree this_class
, int access_flags
)
675 if (access_flags
& ACC_STATIC
)
677 fntype
= build_method_type (this_class
, fntype
);
679 /* We know that arg 1 of every nonstatic method is non-null; tell
681 TYPE_ATTRIBUTES (fntype
) = (tree_cons
682 (get_identifier ("nonnull"),
683 tree_cons (NULL_TREE
,
684 build_int_cst (NULL_TREE
, 1),
686 TYPE_ATTRIBUTES (fntype
)));
691 add_method_1 (tree this_class
, int access_flags
, tree name
, tree function_type
)
693 tree method_type
, fndecl
;
695 method_type
= build_java_method_type (function_type
,
696 this_class
, access_flags
);
698 fndecl
= build_decl (FUNCTION_DECL
, name
, method_type
);
699 DECL_CONTEXT (fndecl
) = this_class
;
701 DECL_LANG_SPECIFIC (fndecl
)
702 = ggc_alloc_cleared (sizeof (struct lang_decl
));
703 DECL_LANG_SPECIFIC (fndecl
)->desc
= LANG_DECL_FUNC
;
705 /* Initialize the static initializer test table. */
707 DECL_FUNCTION_INIT_TEST_TABLE (fndecl
) =
708 java_treetreehash_create (10, 1);
710 /* Initialize the initialized (static) class table. */
711 if (access_flags
& ACC_STATIC
)
712 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl
) =
713 htab_create_ggc (50, htab_hash_pointer
, htab_eq_pointer
, NULL
);
715 TREE_CHAIN (fndecl
) = TYPE_METHODS (this_class
);
716 TYPE_METHODS (this_class
) = fndecl
;
718 /* Notice that this is a finalizer and update the class type
719 accordingly. This is used to optimize instance allocation. */
720 if (name
== finalize_identifier_node
721 && TREE_TYPE (function_type
) == void_type_node
722 && TREE_VALUE (TYPE_ARG_TYPES (function_type
)) == void_type_node
)
723 HAS_FINALIZER_P (this_class
) = 1;
725 if (access_flags
& ACC_PUBLIC
) METHOD_PUBLIC (fndecl
) = 1;
726 if (access_flags
& ACC_PROTECTED
) METHOD_PROTECTED (fndecl
) = 1;
727 if (access_flags
& ACC_PRIVATE
)
728 METHOD_PRIVATE (fndecl
) = DECL_INLINE (fndecl
) = 1;
729 if (access_flags
& ACC_NATIVE
)
731 METHOD_NATIVE (fndecl
) = 1;
732 DECL_EXTERNAL (fndecl
) = 1;
734 if (access_flags
& ACC_STATIC
)
735 METHOD_STATIC (fndecl
) = DECL_INLINE (fndecl
) = 1;
736 if (access_flags
& ACC_FINAL
)
737 METHOD_FINAL (fndecl
) = DECL_INLINE (fndecl
) = 1;
738 if (access_flags
& ACC_SYNCHRONIZED
) METHOD_SYNCHRONIZED (fndecl
) = 1;
739 if (access_flags
& ACC_ABSTRACT
) METHOD_ABSTRACT (fndecl
) = 1;
740 if (access_flags
& ACC_STRICT
) METHOD_STRICTFP (fndecl
) = 1;
741 if (access_flags
& ACC_SYNTHETIC
) DECL_ARTIFICIAL (fndecl
) = 1;
742 if (access_flags
& ACC_BRIDGE
) METHOD_BRIDGE (fndecl
) = 1;
743 if (access_flags
& ACC_VARARGS
) METHOD_VARARGS (fndecl
) = 1;
747 /* Add a method to THIS_CLASS.
748 The method's name is NAME.
749 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
752 add_method (tree this_class
, int access_flags
, tree name
, tree method_sig
)
754 tree function_type
, fndecl
;
755 const unsigned char *sig
756 = (const unsigned char *) IDENTIFIER_POINTER (method_sig
);
759 fatal_error ("bad method signature");
761 function_type
= get_type_from_signature (method_sig
);
762 fndecl
= add_method_1 (this_class
, access_flags
, name
, function_type
);
763 set_java_signature (TREE_TYPE (fndecl
), method_sig
);
768 add_field (tree
class, tree name
, tree field_type
, int flags
)
770 int is_static
= (flags
& ACC_STATIC
) != 0;
772 field
= build_decl (is_static
? VAR_DECL
: FIELD_DECL
, name
, field_type
);
773 TREE_CHAIN (field
) = TYPE_FIELDS (class);
774 TYPE_FIELDS (class) = field
;
775 DECL_CONTEXT (field
) = class;
776 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field
);
778 if (flags
& ACC_PUBLIC
) FIELD_PUBLIC (field
) = 1;
779 if (flags
& ACC_PROTECTED
) FIELD_PROTECTED (field
) = 1;
780 if (flags
& ACC_PRIVATE
) FIELD_PRIVATE (field
) = 1;
781 if (flags
& ACC_FINAL
) FIELD_FINAL (field
) = 1;
782 if (flags
& ACC_VOLATILE
)
784 FIELD_VOLATILE (field
) = 1;
785 TREE_THIS_VOLATILE (field
) = 1;
787 if (flags
& ACC_TRANSIENT
) FIELD_TRANSIENT (field
) = 1;
788 if (flags
& ACC_ENUM
) FIELD_ENUM (field
) = 1;
789 if (flags
& ACC_SYNTHETIC
) FIELD_SYNTHETIC (field
) = 1;
792 FIELD_STATIC (field
) = 1;
793 /* Always make field externally visible. This is required so
794 that native methods can always access the field. */
795 TREE_PUBLIC (field
) = 1;
796 /* Considered external unless we are compiling it into this
798 DECL_EXTERNAL (field
) = (is_compiled_class (class) != 2);
804 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
807 set_constant_value (tree field
, tree constant
)
809 if (field
== NULL_TREE
)
810 warning (OPT_Wattributes
,
811 "misplaced ConstantValue attribute (not in any field)");
812 else if (DECL_INITIAL (field
) != NULL_TREE
)
813 warning (OPT_Wattributes
,
814 "duplicate ConstantValue attribute for field '%s'",
815 IDENTIFIER_POINTER (DECL_NAME (field
)));
818 DECL_INITIAL (field
) = constant
;
819 if (TREE_TYPE (constant
) != TREE_TYPE (field
)
820 && ! (TREE_TYPE (constant
) == int_type_node
821 && INTEGRAL_TYPE_P (TREE_TYPE (field
))
822 && TYPE_PRECISION (TREE_TYPE (field
)) <= 32)
823 && ! (TREE_TYPE (constant
) == utf8const_ptr_type
824 && TREE_TYPE (field
) == string_ptr_type_node
))
825 error ("ConstantValue attribute of field '%s' has wrong type",
826 IDENTIFIER_POINTER (DECL_NAME (field
)));
827 if (FIELD_FINAL (field
))
828 DECL_FIELD_FINAL_IUD (field
) = 1;
832 /* Calculate a hash value for a string encoded in Utf8 format.
833 * This returns the same hash value as specified for java.lang.String.hashCode.
837 hashUtf8String (const char *str
, int len
)
839 const unsigned char* ptr
= (const unsigned char*) str
;
840 const unsigned char *limit
= ptr
+ len
;
844 int ch
= UTF8_GET (ptr
, limit
);
845 /* Updated specification from
846 http://www.javasoft.com/docs/books/jls/clarify.html. */
847 hash
= (31 * hash
) + ch
;
852 static GTY(()) tree utf8_decl_list
= NULL_TREE
;
855 build_utf8_ref (tree name
)
857 const char * name_ptr
= IDENTIFIER_POINTER(name
);
858 int name_len
= IDENTIFIER_LENGTH(name
);
860 tree ctype
, field
= NULL_TREE
, str_type
, cinit
, string
;
861 static int utf8_count
= 0;
863 tree ref
= IDENTIFIER_UTF8_REF (name
);
865 if (ref
!= NULL_TREE
)
868 ctype
= make_node (RECORD_TYPE
);
869 str_type
= build_prim_array_type (unsigned_byte_type_node
,
870 name_len
+ 1); /* Allow for final '\0'. */
871 PUSH_FIELD (ctype
, field
, "hash", unsigned_short_type_node
);
872 PUSH_FIELD (ctype
, field
, "length", unsigned_short_type_node
);
873 PUSH_FIELD (ctype
, field
, "data", str_type
);
874 FINISH_RECORD (ctype
);
875 START_RECORD_CONSTRUCTOR (cinit
, ctype
);
876 name_hash
= hashUtf8String (name_ptr
, name_len
) & 0xFFFF;
877 PUSH_FIELD_VALUE (cinit
, "hash", build_int_cst (NULL_TREE
, name_hash
));
878 PUSH_FIELD_VALUE (cinit
, "length", build_int_cst (NULL_TREE
, name_len
));
879 string
= build_string (name_len
, name_ptr
);
880 TREE_TYPE (string
) = str_type
;
881 PUSH_FIELD_VALUE (cinit
, "data", string
);
882 FINISH_RECORD_CONSTRUCTOR (cinit
);
883 TREE_CONSTANT (cinit
) = 1;
884 TREE_INVARIANT (cinit
) = 1;
886 /* Generate a unique-enough identifier. */
887 sprintf(buf
, "_Utf%d", ++utf8_count
);
889 decl
= build_decl (VAR_DECL
, get_identifier (buf
), utf8const_type
);
890 TREE_STATIC (decl
) = 1;
891 DECL_ARTIFICIAL (decl
) = 1;
892 DECL_IGNORED_P (decl
) = 1;
893 TREE_READONLY (decl
) = 1;
894 TREE_THIS_VOLATILE (decl
) = 0;
895 DECL_INITIAL (decl
) = cinit
;
897 if (HAVE_GAS_SHF_MERGE
)
900 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
901 decl_size
= (name_len
+ 5 + TYPE_ALIGN_UNIT (utf8const_type
) - 1)
902 & ~(TYPE_ALIGN_UNIT (utf8const_type
) - 1);
903 if (flag_merge_constants
&& decl_size
< 256)
906 int flags
= (SECTION_OVERRIDE
907 | SECTION_MERGE
| (SECTION_ENTSIZE
& decl_size
));
908 sprintf (buf
, ".rodata.jutf8.%d", decl_size
);
909 switch_to_section (get_section (buf
, flags
, NULL
));
910 DECL_SECTION_NAME (decl
) = build_string (strlen (buf
), buf
);
914 TREE_CHAIN (decl
) = utf8_decl_list
;
915 layout_decl (decl
, 0);
917 rest_of_decl_compilation (decl
, global_bindings_p (), 0);
918 varpool_mark_needed_node (varpool_node (decl
));
919 utf8_decl_list
= decl
;
920 ref
= build1 (ADDR_EXPR
, utf8const_ptr_type
, decl
);
921 IDENTIFIER_UTF8_REF (name
) = ref
;
925 /* Like build_class_ref, but instead of a direct reference generate a
926 pointer into the constant pool. */
929 build_indirect_class_ref (tree type
)
933 index
= alloc_class_constant (type
);
934 cl
= build_ref_from_constant_pool (index
);
935 return convert (promote_type (class_ptr_type
), cl
);
939 build_static_class_ref (tree type
)
941 tree decl_name
, decl
, ref
;
943 if (TYPE_SIZE (type
) == error_mark_node
)
944 return null_pointer_node
;
945 decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
946 "", '/', '/', ".class$$");
947 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
948 if (decl
== NULL_TREE
)
950 decl
= build_decl (VAR_DECL
, decl_name
, class_type_node
);
951 TREE_STATIC (decl
) = 1;
952 if (! flag_indirect_classes
)
953 TREE_PUBLIC (decl
) = 1;
954 DECL_IGNORED_P (decl
) = 1;
955 DECL_ARTIFICIAL (decl
) = 1;
956 if (is_compiled_class (type
) == 1)
957 DECL_EXTERNAL (decl
) = 1;
958 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
959 DECL_CLASS_FIELD_P (decl
) = 1;
960 DECL_CONTEXT (decl
) = type
;
962 /* ??? We want to preserve the DECL_CONTEXT we set just above,
963 that that means not calling pushdecl_top_level. */
964 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
967 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
972 build_classdollar_field (tree type
)
974 tree decl_name
= identifier_subst (DECL_NAME (TYPE_NAME (type
)),
975 "", '/', '/', ".class$");
976 tree decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
978 if (decl
== NULL_TREE
)
981 = build_decl (VAR_DECL
, decl_name
,
984 (build_type_variant (class_type_node
,
987 TREE_STATIC (decl
) = 1;
988 TREE_INVARIANT (decl
) = 1;
989 TREE_CONSTANT (decl
) = 1;
990 TREE_READONLY (decl
) = 1;
991 TREE_PUBLIC (decl
) = 1;
992 DECL_IGNORED_P (decl
) = 1;
993 DECL_ARTIFICIAL (decl
) = 1;
994 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
995 IDENTIFIER_GLOBAL_VALUE (decl_name
) = decl
;
996 DECL_CLASS_FIELD_P (decl
) = 1;
997 DECL_CONTEXT (decl
) = type
;
1003 /* Build a reference to the class TYPE.
1004 Also handles primitive types and array types. */
1007 build_class_ref (tree type
)
1009 int is_compiled
= is_compiled_class (type
);
1013 if (TREE_CODE (type
) == POINTER_TYPE
)
1014 type
= TREE_TYPE (type
);
1016 if (flag_indirect_dispatch
1017 && type
!= output_class
1018 && TREE_CODE (type
) == RECORD_TYPE
)
1019 return build_indirect_class_ref (type
);
1021 if (type
== output_class
&& flag_indirect_classes
)
1022 return build_classdollar_field (type
);
1024 if (TREE_CODE (type
) == RECORD_TYPE
)
1025 return build_static_class_ref (type
);
1031 decl_name
= TYPE_NAME (type
);
1032 if (TREE_CODE (decl_name
) == TYPE_DECL
)
1033 decl_name
= DECL_NAME (decl_name
);
1034 name
= IDENTIFIER_POINTER (decl_name
);
1035 if (strncmp (name
, "promoted_", 9) == 0)
1037 sprintf (buffer
, "_Jv_%sClass", name
);
1038 decl_name
= get_identifier (buffer
);
1039 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1040 if (decl
== NULL_TREE
)
1042 decl
= build_decl (VAR_DECL
, decl_name
, class_type_node
);
1043 TREE_STATIC (decl
) = 1;
1044 TREE_PUBLIC (decl
) = 1;
1045 DECL_EXTERNAL (decl
) = 1;
1046 DECL_ARTIFICIAL (decl
) = 1;
1047 pushdecl_top_level (decl
);
1051 ref
= build1 (ADDR_EXPR
, class_ptr_type
, decl
);
1055 return build_indirect_class_ref (type
);
1058 /* Create a local statically allocated variable that will hold a
1059 pointer to a static field. */
1062 build_fieldref_cache_entry (int index
, tree fdecl ATTRIBUTE_UNUSED
)
1064 tree decl
, decl_name
;
1065 const char *name
= IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class
));
1066 char *buf
= alloca (strlen (name
) + 20);
1067 sprintf (buf
, "%s_%d_ref", name
, index
);
1068 decl_name
= get_identifier (buf
);
1069 decl
= IDENTIFIER_GLOBAL_VALUE (decl_name
);
1070 if (decl
== NULL_TREE
)
1072 decl
= build_decl (VAR_DECL
, decl_name
, ptr_type_node
);
1073 TREE_STATIC (decl
) = 1;
1074 TREE_PUBLIC (decl
) = 0;
1075 DECL_EXTERNAL (decl
) = 0;
1076 DECL_ARTIFICIAL (decl
) = 1;
1077 DECL_IGNORED_P (decl
) = 1;
1078 pushdecl_top_level (decl
);
1084 build_static_field_ref (tree fdecl
)
1086 tree fclass
= DECL_CONTEXT (fdecl
);
1087 int is_compiled
= is_compiled_class (fclass
);
1088 int from_class
= ! CLASS_FROM_SOURCE_P (current_class
);
1090 /* Allow static final fields to fold to a constant. When using
1091 -findirect-dispatch, we simply never do this folding if compiling
1092 from .class; in the .class file constants will be referred to via
1093 the constant pool. */
1094 if ((!flag_indirect_dispatch
|| !from_class
)
1096 || (FIELD_FINAL (fdecl
) && DECL_INITIAL (fdecl
) != NULL_TREE
1097 && (JSTRING_TYPE_P (TREE_TYPE (fdecl
))
1098 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl
)))
1099 && TREE_CONSTANT (DECL_INITIAL (fdecl
)))))
1101 if (is_compiled
== 1)
1102 DECL_EXTERNAL (fdecl
) = 1;
1106 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1107 and a class local static variable CACHE_ENTRY, then
1109 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1110 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1113 This can mostly be optimized away, so that the usual path is a
1114 load followed by a test and branch. _Jv_ResolvePoolEntry is
1115 only called once for each constant pool entry.
1117 There is an optimization that we don't do: at the start of a
1118 method, create a local copy of CACHE_ENTRY and use that instead.
1122 int cpool_index
= alloc_constant_fieldref (output_class
, fdecl
);
1123 tree cache_entry
= build_fieldref_cache_entry (cpool_index
, fdecl
);
1125 = build3 (CALL_EXPR
, boolean_type_node
,
1126 build_address_of (built_in_decls
[BUILT_IN_EXPECT
]),
1127 tree_cons (NULL_TREE
, build2 (EQ_EXPR
, boolean_type_node
,
1128 cache_entry
, null_pointer_node
),
1129 build_tree_list (NULL_TREE
, boolean_false_node
)),
1131 tree cpool_index_cst
= build_int_cst (NULL_TREE
, cpool_index
);
1133 = build3 (CALL_EXPR
, ptr_type_node
,
1134 build_address_of (soft_resolvepoolentry_node
),
1135 tree_cons (NULL_TREE
, build_class_ref (output_class
),
1136 build_tree_list (NULL_TREE
, cpool_index_cst
)),
1138 init
= build2 (MODIFY_EXPR
, ptr_type_node
, cache_entry
, init
);
1139 init
= build3 (COND_EXPR
, ptr_type_node
, test
, init
, cache_entry
);
1140 init
= fold_convert (build_pointer_type (TREE_TYPE (fdecl
)), init
);
1141 fdecl
= build1 (INDIRECT_REF
, TREE_TYPE (fdecl
), init
);
1147 get_access_flags_from_decl (tree decl
)
1149 int access_flags
= 0;
1150 if (TREE_CODE (decl
) == FIELD_DECL
|| TREE_CODE (decl
) == VAR_DECL
)
1152 if (FIELD_STATIC (decl
))
1153 access_flags
|= ACC_STATIC
;
1154 if (FIELD_PUBLIC (decl
))
1155 access_flags
|= ACC_PUBLIC
;
1156 if (FIELD_PROTECTED (decl
))
1157 access_flags
|= ACC_PROTECTED
;
1158 if (FIELD_PRIVATE (decl
))
1159 access_flags
|= ACC_PRIVATE
;
1160 if (FIELD_FINAL (decl
))
1161 access_flags
|= ACC_FINAL
;
1162 if (FIELD_VOLATILE (decl
))
1163 access_flags
|= ACC_VOLATILE
;
1164 if (FIELD_TRANSIENT (decl
))
1165 access_flags
|= ACC_TRANSIENT
;
1166 if (FIELD_ENUM (decl
))
1167 access_flags
|= ACC_ENUM
;
1168 if (FIELD_SYNTHETIC (decl
))
1169 access_flags
|= ACC_SYNTHETIC
;
1170 return access_flags
;
1172 if (TREE_CODE (decl
) == TYPE_DECL
)
1174 if (CLASS_PUBLIC (decl
))
1175 access_flags
|= ACC_PUBLIC
;
1176 if (CLASS_FINAL (decl
))
1177 access_flags
|= ACC_FINAL
;
1178 if (CLASS_SUPER (decl
))
1179 access_flags
|= ACC_SUPER
;
1180 if (CLASS_INTERFACE (decl
))
1181 access_flags
|= ACC_INTERFACE
;
1182 if (CLASS_ABSTRACT (decl
))
1183 access_flags
|= ACC_ABSTRACT
;
1184 if (CLASS_STATIC (decl
))
1185 access_flags
|= ACC_STATIC
;
1186 if (CLASS_PRIVATE (decl
))
1187 access_flags
|= ACC_PRIVATE
;
1188 if (CLASS_PROTECTED (decl
))
1189 access_flags
|= ACC_PROTECTED
;
1190 if (CLASS_STRICTFP (decl
))
1191 access_flags
|= ACC_STRICT
;
1192 if (CLASS_ENUM (decl
))
1193 access_flags
|= ACC_ENUM
;
1194 if (CLASS_SYNTHETIC (decl
))
1195 access_flags
|= ACC_SYNTHETIC
;
1196 if (CLASS_ANNOTATION (decl
))
1197 access_flags
|= ACC_ANNOTATION
;
1198 return access_flags
;
1200 if (TREE_CODE (decl
) == FUNCTION_DECL
)
1202 if (METHOD_PUBLIC (decl
))
1203 access_flags
|= ACC_PUBLIC
;
1204 if (METHOD_PRIVATE (decl
))
1205 access_flags
|= ACC_PRIVATE
;
1206 if (METHOD_PROTECTED (decl
))
1207 access_flags
|= ACC_PROTECTED
;
1208 if (METHOD_STATIC (decl
))
1209 access_flags
|= ACC_STATIC
;
1210 if (METHOD_FINAL (decl
))
1211 access_flags
|= ACC_FINAL
;
1212 if (METHOD_SYNCHRONIZED (decl
))
1213 access_flags
|= ACC_SYNCHRONIZED
;
1214 if (METHOD_NATIVE (decl
))
1215 access_flags
|= ACC_NATIVE
;
1216 if (METHOD_ABSTRACT (decl
))
1217 access_flags
|= ACC_ABSTRACT
;
1218 if (METHOD_STRICTFP (decl
))
1219 access_flags
|= ACC_STRICT
;
1220 if (METHOD_INVISIBLE (decl
))
1221 access_flags
|= ACC_INVISIBLE
;
1222 if (DECL_ARTIFICIAL (decl
))
1223 access_flags
|= ACC_SYNTHETIC
;
1224 if (METHOD_BRIDGE (decl
))
1225 access_flags
|= ACC_BRIDGE
;
1226 if (METHOD_VARARGS (decl
))
1227 access_flags
|= ACC_VARARGS
;
1228 return access_flags
;
1233 static GTY (()) int alias_labelno
= 0;
1235 /* Create a private alias for METHOD. Using this alias instead of the method
1236 decl ensures that ncode entries in the method table point to the real function
1237 at runtime, not a PLT entry. */
1240 make_local_function_alias (tree method
)
1242 #ifdef ASM_OUTPUT_DEF
1245 const char *method_name
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method
));
1246 char *name
= alloca (strlen (method_name
) + 2);
1247 char *buf
= alloca (strlen (method_name
) + 128);
1249 /* Only create aliases for local functions. */
1250 if (DECL_EXTERNAL (method
))
1253 /* Prefix method_name with 'L' for the alias label. */
1255 strcpy (name
+ 1, method_name
);
1257 ASM_GENERATE_INTERNAL_LABEL (buf
, name
, alias_labelno
++);
1258 alias
= build_decl (FUNCTION_DECL
, get_identifier (buf
),
1259 TREE_TYPE (method
));
1260 DECL_CONTEXT (alias
) = NULL
;
1261 TREE_READONLY (alias
) = TREE_READONLY (method
);
1262 TREE_THIS_VOLATILE (alias
) = TREE_THIS_VOLATILE (method
);
1263 TREE_PUBLIC (alias
) = 0;
1264 DECL_EXTERNAL (alias
) = 0;
1265 DECL_ARTIFICIAL (alias
) = 1;
1266 DECL_INLINE (alias
) = 0;
1267 DECL_INITIAL (alias
) = error_mark_node
;
1268 TREE_ADDRESSABLE (alias
) = 1;
1269 TREE_USED (alias
) = 1;
1270 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias
)) = 1;
1271 if (!flag_syntax_only
)
1272 assemble_alias (alias
, DECL_ASSEMBLER_NAME (method
));
1279 /** Make reflection data (_Jv_Field) for field FDECL. */
1282 make_field_value (tree fdecl
)
1286 tree type
= TREE_TYPE (fdecl
);
1287 int resolved
= is_compiled_class (type
) && ! flag_indirect_dispatch
;
1289 START_RECORD_CONSTRUCTOR (finit
, field_type_node
);
1290 PUSH_FIELD_VALUE (finit
, "name", build_utf8_ref (DECL_NAME (fdecl
)));
1292 type
= build_class_ref (type
);
1295 tree signature
= build_java_signature (type
);
1297 type
= build_utf8_ref (unmangle_classname
1298 (IDENTIFIER_POINTER (signature
),
1299 IDENTIFIER_LENGTH (signature
)));
1301 PUSH_FIELD_VALUE (finit
, "type", type
);
1303 flags
= get_access_flags_from_decl (fdecl
);
1305 flags
|= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1307 PUSH_FIELD_VALUE (finit
, "accflags", build_int_cst (NULL_TREE
, flags
));
1308 PUSH_FIELD_VALUE (finit
, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl
)));
1311 tree field_address
= integer_zero_node
;
1312 if ((DECL_INITIAL (fdecl
) || ! flag_indirect_classes
)
1313 && FIELD_STATIC (fdecl
))
1314 field_address
= build_address_of (fdecl
);
1318 build_constructor_from_list (field_info_union_node
,
1320 ((FIELD_STATIC (fdecl
)
1321 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node
))
1322 : TYPE_FIELDS (field_info_union_node
)),
1323 (FIELD_STATIC (fdecl
)
1325 : byte_position (fdecl
)))));
1328 FINISH_RECORD_CONSTRUCTOR (finit
);
1332 /** Make reflection data (_Jv_Method) for method MDECL. */
1335 make_method_value (tree mdecl
)
1337 static int method_name_count
= 0;
1342 #define ACC_TRANSLATED 0x4000
1343 int accflags
= get_access_flags_from_decl (mdecl
) | ACC_TRANSLATED
;
1345 class_decl
= DECL_CONTEXT (mdecl
);
1346 /* For interfaces, the index field contains the dispatch index. */
1347 if (CLASS_INTERFACE (TYPE_NAME (class_decl
)))
1348 index
= build_int_cst (NULL_TREE
,
1349 get_interface_method_index (mdecl
, class_decl
));
1350 else if (!flag_indirect_dispatch
&& get_method_index (mdecl
) != NULL_TREE
)
1351 index
= get_method_index (mdecl
);
1353 index
= integer_minus_one_node
;
1355 code
= null_pointer_node
;
1356 if (METHOD_ABSTRACT (mdecl
))
1357 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1358 soft_abstractmethod_node
);
1360 code
= build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1361 make_local_function_alias (mdecl
));
1362 START_RECORD_CONSTRUCTOR (minit
, method_type_node
);
1363 PUSH_FIELD_VALUE (minit
, "name",
1364 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl
) ?
1365 init_identifier_node
1366 : DECL_NAME (mdecl
)));
1368 tree signature
= build_java_signature (TREE_TYPE (mdecl
));
1369 PUSH_FIELD_VALUE (minit
, "signature",
1372 (IDENTIFIER_POINTER(signature
),
1373 IDENTIFIER_LENGTH(signature
)))));
1375 PUSH_FIELD_VALUE (minit
, "accflags", build_int_cst (NULL_TREE
, accflags
));
1376 PUSH_FIELD_VALUE (minit
, "index", index
);
1377 PUSH_FIELD_VALUE (minit
, "ncode", code
);
1380 /* Compute the `throws' information for the method. */
1381 tree table
= null_pointer_node
;
1382 if (DECL_FUNCTION_THROWS (mdecl
) != NULL_TREE
)
1384 int length
= 1 + list_length (DECL_FUNCTION_THROWS (mdecl
));
1385 tree iter
, type
, array
;
1388 table
= tree_cons (NULL_TREE
, table
, NULL_TREE
);
1389 for (iter
= DECL_FUNCTION_THROWS (mdecl
);
1391 iter
= TREE_CHAIN (iter
))
1393 tree sig
= DECL_NAME (TYPE_NAME (TREE_VALUE (iter
)));
1395 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
1396 IDENTIFIER_LENGTH (sig
)));
1397 table
= tree_cons (NULL_TREE
, utf8
, table
);
1399 type
= build_prim_array_type (ptr_type_node
, length
);
1400 table
= build_constructor_from_list (type
, table
);
1401 /* Compute something unique enough. */
1402 sprintf (buf
, "_methods%d", method_name_count
++);
1403 array
= build_decl (VAR_DECL
, get_identifier (buf
), type
);
1404 DECL_INITIAL (array
) = table
;
1405 TREE_STATIC (array
) = 1;
1406 DECL_ARTIFICIAL (array
) = 1;
1407 DECL_IGNORED_P (array
) = 1;
1408 rest_of_decl_compilation (array
, 1, 0);
1410 table
= build1 (ADDR_EXPR
, ptr_type_node
, array
);
1413 PUSH_FIELD_VALUE (minit
, "throws", table
);
1416 FINISH_RECORD_CONSTRUCTOR (minit
);
1421 get_dispatch_vector (tree type
)
1423 tree vtable
= TYPE_VTABLE (type
);
1425 if (vtable
== NULL_TREE
)
1429 tree super
= CLASSTYPE_SUPER (type
);
1430 HOST_WIDE_INT nvirtuals
= tree_low_cst (TYPE_NVIRTUALS (type
), 0);
1431 vtable
= make_tree_vec (nvirtuals
);
1432 TYPE_VTABLE (type
) = vtable
;
1433 if (super
!= NULL_TREE
)
1435 tree super_vtable
= get_dispatch_vector (super
);
1437 for (i
= tree_low_cst (TYPE_NVIRTUALS (super
), 0); --i
>= 0; )
1438 TREE_VEC_ELT (vtable
, i
) = TREE_VEC_ELT (super_vtable
, i
);
1441 for (method
= TYPE_METHODS (type
); method
!= NULL_TREE
;
1442 method
= TREE_CHAIN (method
))
1444 tree method_index
= get_method_index (method
);
1445 if (method_index
!= NULL_TREE
1446 && host_integerp (method_index
, 0))
1447 TREE_VEC_ELT (vtable
, tree_low_cst (method_index
, 0)) = method
;
1455 get_dispatch_table (tree type
, tree this_class_addr
)
1457 int abstract_p
= CLASS_ABSTRACT (TYPE_NAME (type
));
1458 tree vtable
= get_dispatch_vector (type
);
1460 tree list
= NULL_TREE
;
1461 int nvirtuals
= TREE_VEC_LENGTH (vtable
);
1465 for (i
= nvirtuals
; --i
>= 0; )
1467 tree method
= TREE_VEC_ELT (vtable
, i
);
1468 if (METHOD_ABSTRACT (method
))
1471 warning (0, "%Jabstract method in non-abstract class", method
);
1473 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1474 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1475 list
= tree_cons (NULL_TREE
, null_pointer_node
, list
);
1477 list
= tree_cons (NULL_TREE
, null_pointer_node
, list
);
1481 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1482 for (j
= 0; j
< TARGET_VTABLE_USES_DESCRIPTORS
; ++j
)
1484 tree fdesc
= build2 (FDESC_EXPR
, nativecode_ptr_type_node
,
1485 method
, build_int_cst (NULL_TREE
, j
));
1486 TREE_CONSTANT (fdesc
) = 1;
1487 TREE_INVARIANT (fdesc
) = 1;
1488 list
= tree_cons (NULL_TREE
, fdesc
, list
);
1491 list
= tree_cons (NULL_TREE
,
1492 build1 (ADDR_EXPR
, nativecode_ptr_type_node
,
1498 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1499 using the Boehm GC we sometimes stash a GC type descriptor
1500 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1501 the emitted byte count during the output to the assembly file. */
1502 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1503 fake "function descriptor". It's first word is the is the class
1504 pointer, and subsequent words (usually one) contain the GC descriptor.
1505 In all other cases, we reserve two extra vtable slots. */
1506 gc_descr
= get_boehm_type_descriptor (type
);
1507 list
= tree_cons (NULL_TREE
, gc_descr
, list
);
1508 for (j
= 1; j
< TARGET_VTABLE_USES_DESCRIPTORS
-1; ++j
)
1509 list
= tree_cons (NULL_TREE
, gc_descr
, list
);
1510 list
= tree_cons (NULL_TREE
, this_class_addr
, list
);
1512 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1513 list
= tree_cons (NULL_TREE
, null_pointer_node
, list
);
1514 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1515 list
= tree_cons (integer_zero_node
, null_pointer_node
, list
);
1517 arraysize
= (TARGET_VTABLE_USES_DESCRIPTORS
? nvirtuals
+ 1 : nvirtuals
+ 2);
1518 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1519 arraysize
*= TARGET_VTABLE_USES_DESCRIPTORS
;
1521 return build_constructor_from_list
1522 (build_prim_array_type (nativecode_ptr_type_node
,
1527 /* Set the method_index for a method decl. */
1529 set_method_index (tree decl
, tree method_index
)
1531 if (method_index
!= NULL_TREE
)
1533 /* method_index is null if we're using indirect dispatch. */
1534 method_index
= fold (convert (sizetype
, method_index
));
1536 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1537 /* Add one to skip bogus descriptor for class and GC descriptor. */
1538 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (1));
1540 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1542 method_index
= size_binop (PLUS_EXPR
, method_index
, size_int (2));
1545 DECL_VINDEX (decl
) = method_index
;
1548 /* Get the method_index for a method decl. */
1550 get_method_index (tree decl
)
1552 tree method_index
= DECL_VINDEX (decl
);
1557 if (TARGET_VTABLE_USES_DESCRIPTORS
)
1558 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1559 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (1));
1561 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1562 method_index
= size_binop (MINUS_EXPR
, method_index
, size_int (2));
1564 return method_index
;
1568 supers_all_compiled (tree type
)
1570 while (type
!= NULL_TREE
)
1572 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type
)))))
1574 type
= CLASSTYPE_SUPER (type
);
1580 make_class_data (tree type
)
1582 tree decl
, cons
, temp
;
1583 tree field
, fields_decl
;
1584 tree static_fields
= NULL_TREE
;
1585 tree instance_fields
= NULL_TREE
;
1586 HOST_WIDE_INT static_field_count
= 0;
1587 HOST_WIDE_INT instance_field_count
= 0;
1588 HOST_WIDE_INT field_count
;
1589 tree field_array_type
;
1591 tree methods
= NULL_TREE
;
1592 tree dtable_decl
= NULL_TREE
;
1593 HOST_WIDE_INT method_count
= 0;
1594 tree method_array_type
;
1597 tree this_class_addr
;
1598 tree constant_pool_constructor
;
1599 tree interfaces
= null_pointer_node
;
1600 int interface_len
= 0;
1601 int uses_jv_markobj
= 0;
1602 tree type_decl
= TYPE_NAME (type
);
1603 tree id_main
= get_identifier("main");
1604 tree id_class
= get_identifier("java.lang.Class");
1605 /** Offset from start of virtual function table declaration
1606 to where objects actually point at, following new g++ ABI. */
1607 tree dtable_start_offset
= build_int_cst (NULL_TREE
,
1608 2 * POINTER_SIZE
/ BITS_PER_UNIT
);
1609 VEC(int, heap
) *field_indexes
;
1610 tree first_real_field
;
1612 this_class_addr
= build_static_class_ref (type
);
1613 decl
= TREE_OPERAND (this_class_addr
, 0);
1615 if (supers_all_compiled (type
) && ! CLASS_INTERFACE (type_decl
)
1616 && !flag_indirect_dispatch
)
1618 tree dtable
= get_dispatch_table (type
, this_class_addr
);
1619 uses_jv_markobj
= uses_jv_markobj_p (dtable
);
1620 if (type
== class_type_node
&& class_dtable_decl
!= NULL_TREE
)
1622 /* We've already created some other class, and consequently
1623 we made class_dtable_decl. Now we just want to fill it
1625 dtable_decl
= class_dtable_decl
;
1629 dtable_decl
= build_dtable_decl (type
);
1630 TREE_STATIC (dtable_decl
) = 1;
1631 DECL_ARTIFICIAL (dtable_decl
) = 1;
1632 DECL_IGNORED_P (dtable_decl
) = 1;
1635 TREE_PUBLIC (dtable_decl
) = 1;
1636 DECL_INITIAL (dtable_decl
) = dtable
;
1637 if (! flag_indirect_classes
)
1638 rest_of_decl_compilation (dtable_decl
, 1, 0);
1639 /* Maybe we're compiling Class as the first class. If so, set
1640 class_dtable_decl to the decl we just made. */
1641 if (type
== class_type_node
&& class_dtable_decl
== NULL_TREE
)
1642 class_dtable_decl
= dtable_decl
;
1645 /* Build Field array. */
1646 field
= TYPE_FIELDS (type
);
1647 while (field
&& DECL_ARTIFICIAL (field
))
1648 field
= TREE_CHAIN (field
); /* Skip dummy fields. */
1649 if (field
&& DECL_NAME (field
) == NULL_TREE
)
1650 field
= TREE_CHAIN (field
); /* Skip dummy field for inherited data. */
1651 first_real_field
= field
;
1653 /* First count static and instance fields. */
1654 for ( ; field
!= NULL_TREE
; field
= TREE_CHAIN (field
))
1656 if (! DECL_ARTIFICIAL (field
))
1658 if (FIELD_STATIC (field
))
1659 static_field_count
++;
1660 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1661 instance_field_count
++;
1664 field_count
= static_field_count
+ instance_field_count
;
1665 field_indexes
= VEC_alloc (int, heap
, field_count
);
1667 /* gcj sorts fields so that static fields come first, followed by
1668 instance fields. Unfortunately, by the time this takes place we
1669 have already generated the reflection_data for this class, and
1670 that data contians indexes into the fields. So, we generate a
1671 permutation that maps each original field index to its final
1672 position. Then we pass this permutation to
1673 rewrite_reflection_indexes(), which fixes up the reflection
1677 int static_count
= 0;
1678 int instance_count
= static_field_count
;
1681 for (i
= 0, field
= first_real_field
;
1683 field
= TREE_CHAIN (field
), i
++)
1685 if (! DECL_ARTIFICIAL (field
))
1688 if (FIELD_STATIC (field
))
1689 field_index
= static_count
++;
1690 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1691 field_index
= instance_count
++;
1692 VEC_quick_push (int, field_indexes
, field_index
);
1697 for (field
= first_real_field
; field
!= NULL_TREE
;
1698 field
= TREE_CHAIN (field
))
1700 if (! DECL_ARTIFICIAL (field
))
1702 if (FIELD_STATIC (field
))
1704 /* We must always create reflection data for static fields
1705 as it is used in the creation of the field itself. */
1706 tree init
= make_field_value (field
);
1707 tree initial
= DECL_INITIAL (field
);
1708 static_fields
= tree_cons (NULL_TREE
, init
, static_fields
);
1709 /* If the initial value is a string constant,
1710 prevent output_constant from trying to assemble the value. */
1711 if (initial
!= NULL_TREE
1712 && TREE_TYPE (initial
) == string_ptr_type_node
)
1713 DECL_INITIAL (field
) = NULL_TREE
;
1714 rest_of_decl_compilation (field
, 1, 1);
1715 DECL_INITIAL (field
) = initial
;
1717 else if (uses_jv_markobj
|| !flag_reduced_reflection
)
1719 tree init
= make_field_value (field
);
1720 instance_fields
= tree_cons (NULL_TREE
, init
, instance_fields
);
1725 if (field_count
> 0)
1727 static_fields
= nreverse (static_fields
);
1728 instance_fields
= nreverse (instance_fields
);
1729 static_fields
= chainon (static_fields
, instance_fields
);
1730 field_array_type
= build_prim_array_type (field_type_node
, field_count
);
1731 fields_decl
= build_decl (VAR_DECL
, mangled_classname ("_FL_", type
),
1733 DECL_INITIAL (fields_decl
) = build_constructor_from_list
1734 (field_array_type
, static_fields
);
1735 TREE_STATIC (fields_decl
) = 1;
1736 DECL_ARTIFICIAL (fields_decl
) = 1;
1737 DECL_IGNORED_P (fields_decl
) = 1;
1738 rest_of_decl_compilation (fields_decl
, 1, 0);
1741 fields_decl
= NULL_TREE
;
1743 /* Build Method array. */
1744 for (method
= TYPE_METHODS (type
);
1745 method
!= NULL_TREE
; method
= TREE_CHAIN (method
))
1748 if (METHOD_PRIVATE (method
)
1749 && ! flag_keep_inline_functions
1752 /* Even if we have a decl, we don't necessarily have the code.
1753 This can happen if we inherit a method from a superclass for
1754 which we don't have a .class file. */
1755 if (METHOD_DUMMY (method
))
1758 /* Generate method reflection data if:
1760 - !flag_reduced_reflection.
1762 - <clinit> -- The runtime uses reflection to initialize the
1765 - Any method in class java.lang.Class -- Class.forName() and
1766 perhaps other things require it.
1768 - class$ -- It does not work if reflection data missing.
1770 - main -- Reflection is used to find main(String[]) methods.
1772 - public not static -- It is potentially part of an
1773 interface. The runtime uses reflection data to build
1774 interface dispatch tables. */
1775 if (!flag_reduced_reflection
1776 || DECL_CLINIT_P (method
)
1777 || DECL_NAME (type_decl
) == id_class
1778 || DECL_NAME (method
) == id_main
1779 || (METHOD_PUBLIC (method
) && !METHOD_STATIC (method
))
1780 || TYPE_DOT_CLASS (type
) == method
)
1782 init
= make_method_value (method
);
1784 methods
= tree_cons (NULL_TREE
, init
, methods
);
1787 method_array_type
= build_prim_array_type (method_type_node
, method_count
);
1788 methods_decl
= build_decl (VAR_DECL
, mangled_classname ("_MT_", type
),
1790 DECL_INITIAL (methods_decl
) = build_constructor_from_list
1791 (method_array_type
, nreverse (methods
));
1792 TREE_STATIC (methods_decl
) = 1;
1793 DECL_ARTIFICIAL (methods_decl
) = 1;
1794 DECL_IGNORED_P (methods_decl
) = 1;
1795 rest_of_decl_compilation (methods_decl
, 1, 0);
1797 if (class_dtable_decl
== NULL_TREE
)
1799 class_dtable_decl
= build_dtable_decl (class_type_node
);
1800 TREE_STATIC (class_dtable_decl
) = 1;
1801 DECL_ARTIFICIAL (class_dtable_decl
) = 1;
1802 DECL_IGNORED_P (class_dtable_decl
) = 1;
1803 if (is_compiled_class (class_type_node
) != 2)
1805 DECL_EXTERNAL (class_dtable_decl
) = 1;
1806 rest_of_decl_compilation (class_dtable_decl
, 1, 0);
1810 super
= CLASSTYPE_SUPER (type
);
1811 if (super
== NULL_TREE
)
1812 super
= null_pointer_node
;
1813 else if (! flag_indirect_dispatch
1814 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl
)))
1815 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super
)))))
1816 super
= build_class_ref (super
);
1819 int super_index
= alloc_class_constant (super
);
1820 super
= build_int_cst (ptr_type_node
, super_index
);
1823 /* Build and emit the array of implemented interfaces. */
1824 if (type
!= object_type_node
)
1825 interface_len
= BINFO_N_BASE_BINFOS (TYPE_BINFO (type
)) - 1;
1827 if (interface_len
> 0)
1829 tree init
= NULL_TREE
;
1831 tree interface_array_type
, idecl
;
1832 interface_array_type
1833 = build_prim_array_type (class_ptr_type
, interface_len
);
1834 idecl
= build_decl (VAR_DECL
, mangled_classname ("_IF_", type
),
1835 interface_array_type
);
1837 for (i
= interface_len
; i
> 0; i
--)
1839 tree child
= BINFO_BASE_BINFO (TYPE_BINFO (type
), i
);
1840 tree iclass
= BINFO_TYPE (child
);
1842 if (! flag_indirect_dispatch
1844 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass
))))))
1845 index
= build_class_ref (iclass
);
1848 int int_index
= alloc_class_constant (iclass
);
1849 index
= build_int_cst (ptr_type_node
, int_index
);
1851 init
= tree_cons (NULL_TREE
, index
, init
);
1853 DECL_INITIAL (idecl
) = build_constructor_from_list (interface_array_type
,
1855 TREE_STATIC (idecl
) = 1;
1856 DECL_ARTIFICIAL (idecl
) = 1;
1857 DECL_IGNORED_P (idecl
) = 1;
1858 interfaces
= build1 (ADDR_EXPR
, ptr_type_node
, idecl
);
1859 rest_of_decl_compilation (idecl
, 1, 0);
1862 constant_pool_constructor
= build_constants_constructor ();
1864 if (flag_indirect_dispatch
)
1866 TYPE_OTABLE_DECL (type
)
1868 (DECL_NAME (TYPE_OTABLE_DECL (type
)),
1869 TYPE_OTABLE_DECL (type
), TYPE_OTABLE_METHODS (type
),
1870 TYPE_OTABLE_SYMS_DECL (type
), integer_type_node
, 1);
1872 TYPE_ATABLE_DECL (type
)
1874 (DECL_NAME (TYPE_ATABLE_DECL (type
)),
1875 TYPE_ATABLE_DECL (type
), TYPE_ATABLE_METHODS (type
),
1876 TYPE_ATABLE_SYMS_DECL (type
), ptr_type_node
, 1);
1878 TYPE_ITABLE_DECL (type
)
1880 (DECL_NAME (TYPE_ITABLE_DECL (type
)),
1881 TYPE_ITABLE_DECL (type
), TYPE_ITABLE_METHODS (type
),
1882 TYPE_ITABLE_SYMS_DECL (type
), ptr_type_node
, 2);
1885 TYPE_CTABLE_DECL (type
) = emit_catch_table (type
);
1887 START_RECORD_CONSTRUCTOR (temp
, object_type_node
);
1888 PUSH_FIELD_VALUE (temp
, "vtable",
1889 (flag_indirect_classes
1891 : build2 (PLUS_EXPR
, dtable_ptr_type
,
1892 build1 (ADDR_EXPR
, dtable_ptr_type
,
1894 dtable_start_offset
)));
1895 if (! flag_hash_synchronization
)
1896 PUSH_FIELD_VALUE (temp
, "sync_info", null_pointer_node
);
1897 FINISH_RECORD_CONSTRUCTOR (temp
);
1898 START_RECORD_CONSTRUCTOR (cons
, class_type_node
);
1899 PUSH_SUPER_VALUE (cons
, temp
);
1900 PUSH_FIELD_VALUE (cons
, "next_or_version", gcj_abi_version
);
1901 PUSH_FIELD_VALUE (cons
, "name", build_utf8_ref (DECL_NAME (type_decl
)));
1902 PUSH_FIELD_VALUE (cons
, "accflags",
1903 build_int_cst (NULL_TREE
,
1904 get_access_flags_from_decl (type_decl
)));
1906 PUSH_FIELD_VALUE (cons
, "superclass",
1907 CLASS_INTERFACE (type_decl
) ? null_pointer_node
: super
);
1908 PUSH_FIELD_VALUE (cons
, "constants", constant_pool_constructor
);
1909 PUSH_FIELD_VALUE (cons
, "methods",
1910 methods_decl
== NULL_TREE
? null_pointer_node
1911 : build1 (ADDR_EXPR
, method_ptr_type_node
, methods_decl
));
1912 PUSH_FIELD_VALUE (cons
, "method_count",
1913 build_int_cst (NULL_TREE
, method_count
));
1915 if (flag_indirect_dispatch
)
1916 PUSH_FIELD_VALUE (cons
, "vtable_method_count", integer_minus_one_node
);
1918 PUSH_FIELD_VALUE (cons
, "vtable_method_count", TYPE_NVIRTUALS (type
));
1920 PUSH_FIELD_VALUE (cons
, "fields",
1921 fields_decl
== NULL_TREE
? null_pointer_node
1922 : build1 (ADDR_EXPR
, field_ptr_type_node
, fields_decl
));
1923 /* If we're using the binary compatibility ABI we don't know the
1924 size until load time. */
1925 PUSH_FIELD_VALUE (cons
, "size_in_bytes",
1926 (flag_indirect_dispatch
1927 ? integer_minus_one_node
1928 : size_in_bytes (type
)));
1929 PUSH_FIELD_VALUE (cons
, "field_count",
1930 build_int_cst (NULL_TREE
, field_count
));
1931 PUSH_FIELD_VALUE (cons
, "static_field_count",
1932 build_int_cst (NULL_TREE
, static_field_count
));
1934 if (flag_indirect_dispatch
)
1935 PUSH_FIELD_VALUE (cons
, "vtable", null_pointer_node
);
1937 PUSH_FIELD_VALUE (cons
, "vtable",
1938 dtable_decl
== NULL_TREE
? null_pointer_node
1939 : build2 (PLUS_EXPR
, dtable_ptr_type
,
1940 build1 (ADDR_EXPR
, dtable_ptr_type
,
1942 dtable_start_offset
));
1943 if (TYPE_OTABLE_METHODS (type
) == NULL_TREE
)
1945 PUSH_FIELD_VALUE (cons
, "otable", null_pointer_node
);
1946 PUSH_FIELD_VALUE (cons
, "otable_syms", null_pointer_node
);
1950 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type
));
1951 PUSH_FIELD_VALUE (cons
, "otable",
1952 build1 (ADDR_EXPR
, otable_ptr_type
, TYPE_OTABLE_DECL (type
)));
1953 PUSH_FIELD_VALUE (cons
, "otable_syms",
1954 build1 (ADDR_EXPR
, symbols_array_ptr_type
,
1955 TYPE_OTABLE_SYMS_DECL (type
)));
1956 TREE_CONSTANT (TYPE_OTABLE_DECL (type
)) = 1;
1957 TREE_INVARIANT (TYPE_OTABLE_DECL (type
)) = 1;
1959 if (TYPE_ATABLE_METHODS(type
) == NULL_TREE
)
1961 PUSH_FIELD_VALUE (cons
, "atable", null_pointer_node
);
1962 PUSH_FIELD_VALUE (cons
, "atable_syms", null_pointer_node
);
1966 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type
));
1967 PUSH_FIELD_VALUE (cons
, "atable",
1968 build1 (ADDR_EXPR
, atable_ptr_type
, TYPE_ATABLE_DECL (type
)));
1969 PUSH_FIELD_VALUE (cons
, "atable_syms",
1970 build1 (ADDR_EXPR
, symbols_array_ptr_type
,
1971 TYPE_ATABLE_SYMS_DECL (type
)));
1972 TREE_CONSTANT (TYPE_ATABLE_DECL (type
)) = 1;
1973 TREE_INVARIANT (TYPE_ATABLE_DECL (type
)) = 1;
1975 if (TYPE_ITABLE_METHODS(type
) == NULL_TREE
)
1977 PUSH_FIELD_VALUE (cons
, "itable", null_pointer_node
);
1978 PUSH_FIELD_VALUE (cons
, "itable_syms", null_pointer_node
);
1982 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type
));
1983 PUSH_FIELD_VALUE (cons
, "itable",
1984 build1 (ADDR_EXPR
, itable_ptr_type
, TYPE_ITABLE_DECL (type
)));
1985 PUSH_FIELD_VALUE (cons
, "itable_syms",
1986 build1 (ADDR_EXPR
, symbols_array_ptr_type
,
1987 TYPE_ITABLE_SYMS_DECL (type
)));
1988 TREE_CONSTANT (TYPE_ITABLE_DECL (type
)) = 1;
1989 TREE_INVARIANT (TYPE_ITABLE_DECL (type
)) = 1;
1992 PUSH_FIELD_VALUE (cons
, "catch_classes",
1993 build1 (ADDR_EXPR
, ptr_type_node
, TYPE_CTABLE_DECL (type
)));
1994 PUSH_FIELD_VALUE (cons
, "interfaces", interfaces
);
1995 PUSH_FIELD_VALUE (cons
, "loader", null_pointer_node
);
1996 PUSH_FIELD_VALUE (cons
, "interface_count",
1997 build_int_cst (NULL_TREE
, interface_len
));
1998 PUSH_FIELD_VALUE (cons
, "state",
1999 convert (byte_type_node
,
2000 build_int_cst (NULL_TREE
, JV_STATE_PRELOADING
)));
2002 PUSH_FIELD_VALUE (cons
, "thread", null_pointer_node
);
2003 PUSH_FIELD_VALUE (cons
, "depth", integer_zero_node
);
2004 PUSH_FIELD_VALUE (cons
, "ancestors", null_pointer_node
);
2005 PUSH_FIELD_VALUE (cons
, "idt", null_pointer_node
);
2006 PUSH_FIELD_VALUE (cons
, "arrayclass", null_pointer_node
);
2007 PUSH_FIELD_VALUE (cons
, "protectionDomain", null_pointer_node
);
2010 tree assertion_table_ref
;
2011 if (TYPE_ASSERTIONS (type
) == NULL
)
2012 assertion_table_ref
= null_pointer_node
;
2014 assertion_table_ref
= build1 (ADDR_EXPR
,
2015 build_pointer_type (assertion_table_type
),
2016 emit_assertion_table (type
));
2018 PUSH_FIELD_VALUE (cons
, "assertion_table", assertion_table_ref
);
2021 PUSH_FIELD_VALUE (cons
, "hack_signers", null_pointer_node
);
2022 PUSH_FIELD_VALUE (cons
, "chain", null_pointer_node
);
2023 PUSH_FIELD_VALUE (cons
, "aux_info", null_pointer_node
);
2024 PUSH_FIELD_VALUE (cons
, "engine", null_pointer_node
);
2026 if (TYPE_REFLECTION_DATA (current_class
))
2029 int count
= TYPE_REFLECTION_DATASIZE (current_class
);
2030 VEC (constructor_elt
, gc
) *v
2031 = VEC_alloc (constructor_elt
, gc
, count
);
2032 unsigned char *data
= TYPE_REFLECTION_DATA (current_class
);
2033 tree max_index
= build_int_cst (sizetype
, count
);
2034 tree index
= build_index_type (max_index
);
2035 tree type
= build_array_type (unsigned_byte_type_node
, index
);
2038 static int reflection_data_count
;
2040 sprintf (buf
, "_reflection_data_%d", reflection_data_count
++);
2041 array
= build_decl (VAR_DECL
, get_identifier (buf
), type
);
2043 rewrite_reflection_indexes (field_indexes
);
2045 for (i
= 0; i
< count
; i
++)
2047 constructor_elt
*elt
= VEC_quick_push (constructor_elt
, v
, NULL
);
2048 elt
->index
= build_int_cst (sizetype
, i
);
2049 elt
->value
= build_int_cstu (byte_type_node
, data
[i
]);
2052 DECL_INITIAL (array
) = build_constructor (type
, v
);
2053 TREE_STATIC (array
) = 1;
2054 DECL_ARTIFICIAL (array
) = 1;
2055 DECL_IGNORED_P (array
) = 1;
2056 TREE_READONLY (array
) = 1;
2057 TREE_CONSTANT (DECL_INITIAL (array
)) = 1;
2058 rest_of_decl_compilation (array
, 1, 0);
2060 PUSH_FIELD_VALUE (cons
, "reflection_data", build_address_of (array
));
2063 TYPE_REFLECTION_DATA (current_class
) = NULL
;
2066 PUSH_FIELD_VALUE (cons
, "reflection_data", null_pointer_node
);
2068 FINISH_RECORD_CONSTRUCTOR (cons
);
2070 DECL_INITIAL (decl
) = cons
;
2072 /* Hash synchronization requires at least 64-bit alignment. */
2073 if (flag_hash_synchronization
&& POINTER_SIZE
< 64)
2074 DECL_ALIGN (decl
) = 64;
2076 if (flag_indirect_classes
)
2078 TREE_READONLY (decl
) = 1;
2079 TREE_CONSTANT (DECL_INITIAL (decl
)) = 1;
2082 rest_of_decl_compilation (decl
, 1, 0);
2085 tree classdollar_field
= build_classdollar_field (type
);
2086 if (!flag_indirect_classes
)
2087 DECL_INITIAL (classdollar_field
) = build_static_class_ref (type
);
2088 rest_of_decl_compilation (classdollar_field
, 1, 0);
2091 TYPE_OTABLE_DECL (type
) = NULL_TREE
;
2092 TYPE_ATABLE_DECL (type
) = NULL_TREE
;
2093 TYPE_CTABLE_DECL (type
) = NULL_TREE
;
2099 if (TYPE_VERIFY_METHOD (output_class
))
2101 tree verify_method
= TYPE_VERIFY_METHOD (output_class
);
2102 DECL_SAVED_TREE (verify_method
)
2103 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method
), void_type_node
,
2104 build1 (RETURN_EXPR
, void_type_node
, NULL
));
2105 java_genericize (verify_method
);
2106 cgraph_finalize_function (verify_method
, false);
2107 TYPE_ASSERTIONS (current_class
) = NULL
;
2110 java_expand_catch_classes (current_class
);
2112 current_function_decl
= NULL_TREE
;
2113 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class
)) = 0;
2114 make_class_data (current_class
);
2116 rest_of_decl_compilation (TYPE_NAME (current_class
), 1, 0);
2119 /* Return 2 if CLASS is compiled by this compilation job;
2120 return 1 if CLASS can otherwise be assumed to be compiled;
2121 return 0 if we cannot assume that CLASS is compiled.
2122 Returns 1 for primitive and 0 for array types. */
2124 is_compiled_class (tree
class)
2127 if (TREE_CODE (class) == POINTER_TYPE
)
2128 class = TREE_TYPE (class);
2129 if (TREE_CODE (class) != RECORD_TYPE
) /* Primitive types are static. */
2131 if (TYPE_ARRAY_P (class))
2133 /* We have to check this explicitly to avoid trying to load a class
2134 that we're currently parsing. */
2135 if (class == current_class
)
2138 seen_in_zip
= (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2139 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2141 /* The class was seen in the current ZIP file and will be
2142 available as a compiled class in the future but may not have
2143 been loaded already. Load it if necessary. This prevent
2144 build_class_ref () from crashing. */
2146 if (seen_in_zip
&& !CLASS_LOADED_P (class))
2147 load_class (class, 1);
2149 /* We return 2 for class seen in ZIP and class from files
2150 belonging to the same compilation unit */
2154 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2156 if (!CLASS_LOADED_P (class))
2158 if (CLASS_FROM_SOURCE_P (class))
2159 safe_layout_class (class);
2161 load_class (class, 1);
2169 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2172 build_dtable_decl (tree type
)
2176 /* We need to build a new dtable type so that its size is uniquely
2177 computed when we're dealing with the class for real and not just
2178 faking it (like java.lang.Class during the initialization of the
2179 compiler.) We know we're not faking a class when CURRENT_CLASS is
2181 if (current_class
== type
)
2183 tree dummy
= NULL_TREE
;
2186 dtype
= make_node (RECORD_TYPE
);
2188 PUSH_FIELD (dtype
, dummy
, "top_offset", ptr_type_node
);
2189 PUSH_FIELD (dtype
, dummy
, "type_info", ptr_type_node
);
2191 PUSH_FIELD (dtype
, dummy
, "class", class_ptr_type
);
2192 for (n
= 1; n
< TARGET_VTABLE_USES_DESCRIPTORS
; ++n
)
2194 tree tmp_field
= build_decl (FIELD_DECL
, NULL_TREE
, ptr_type_node
);
2195 TREE_CHAIN (dummy
) = tmp_field
;
2196 DECL_CONTEXT (tmp_field
) = dtype
;
2197 DECL_ARTIFICIAL (tmp_field
) = 1;
2201 PUSH_FIELD (dtype
, dummy
, "gc_descr", ptr_type_node
);
2202 for (n
= 1; n
< TARGET_VTABLE_USES_DESCRIPTORS
; ++n
)
2204 tree tmp_field
= build_decl (FIELD_DECL
, NULL_TREE
, ptr_type_node
);
2205 TREE_CHAIN (dummy
) = tmp_field
;
2206 DECL_CONTEXT (tmp_field
) = dtype
;
2207 DECL_ARTIFICIAL (tmp_field
) = 1;
2211 n
= TREE_VEC_LENGTH (get_dispatch_vector (type
));
2212 if (TARGET_VTABLE_USES_DESCRIPTORS
)
2213 n
*= TARGET_VTABLE_USES_DESCRIPTORS
;
2215 PUSH_FIELD (dtype
, dummy
, "methods",
2216 build_prim_array_type (nativecode_ptr_type_node
, n
));
2217 layout_type (dtype
);
2220 dtype
= dtable_type
;
2222 decl
= build_decl (VAR_DECL
, get_identifier ("vt$"), dtype
);
2223 DECL_CONTEXT (decl
) = type
;
2224 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl
);
2225 DECL_VTABLE_P (decl
) = 1;
2230 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2231 fields inherited from SUPER_CLASS. */
2234 push_super_field (tree this_class
, tree super_class
)
2237 /* Don't insert the field if we're just re-laying the class out. */
2238 if (TYPE_FIELDS (this_class
) && !DECL_NAME (TYPE_FIELDS (this_class
)))
2240 base_decl
= build_decl (FIELD_DECL
, NULL_TREE
, super_class
);
2241 DECL_IGNORED_P (base_decl
) = 1;
2242 TREE_CHAIN (base_decl
) = TYPE_FIELDS (this_class
);
2243 TYPE_FIELDS (this_class
) = base_decl
;
2244 DECL_SIZE (base_decl
) = TYPE_SIZE (super_class
);
2245 DECL_SIZE_UNIT (base_decl
) = TYPE_SIZE_UNIT (super_class
);
2248 /* Handle the different manners we may have to lay out a super class. */
2251 maybe_layout_super_class (tree super_class
, tree this_class ATTRIBUTE_UNUSED
)
2255 else if (TREE_CODE (super_class
) == RECORD_TYPE
)
2257 if (!CLASS_LOADED_P (super_class
) && CLASS_FROM_SOURCE_P (super_class
))
2258 safe_layout_class (super_class
);
2259 if (!CLASS_LOADED_P (super_class
))
2260 load_class (super_class
, 1);
2262 /* We might have to layout the class before its dependency on
2263 the super class gets resolved by java_complete_class */
2264 else if (TREE_CODE (super_class
) == POINTER_TYPE
)
2266 if (TREE_TYPE (super_class
) != NULL_TREE
)
2267 super_class
= TREE_TYPE (super_class
);
2271 if (!TYPE_SIZE (super_class
))
2272 safe_layout_class (super_class
);
2277 /* safe_layout_class just makes sure that we can load a class without
2278 disrupting the current_class, input_file, input_line, etc, information
2279 about the class processed currently. */
2282 safe_layout_class (tree
class)
2284 tree save_current_class
= current_class
;
2285 location_t save_location
= input_location
;
2287 layout_class (class);
2289 current_class
= save_current_class
;
2290 input_location
= save_location
;
2294 layout_class (tree this_class
)
2296 tree super_class
= CLASSTYPE_SUPER (this_class
);
2298 class_list
= tree_cons (this_class
, NULL_TREE
, class_list
);
2299 if (CLASS_BEING_LAIDOUT (this_class
))
2305 sprintf (buffer
, " with '%s'",
2306 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
))));
2307 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2309 for (current
= TREE_CHAIN (class_list
); current
;
2310 current
= TREE_CHAIN (current
))
2312 tree decl
= TYPE_NAME (TREE_PURPOSE (current
));
2313 sprintf (buffer
, "\n which inherits from '%s' (%s:%d)",
2314 IDENTIFIER_POINTER (DECL_NAME (decl
)),
2315 DECL_SOURCE_FILE (decl
),
2316 DECL_SOURCE_LINE (decl
));
2317 obstack_grow (&temporary_obstack
, buffer
, strlen (buffer
));
2319 obstack_1grow (&temporary_obstack
, '\0');
2320 report
= obstack_finish (&temporary_obstack
);
2321 cyclic_inheritance_report
= ggc_strdup (report
);
2322 obstack_free (&temporary_obstack
, report
);
2323 TYPE_SIZE (this_class
) = error_mark_node
;
2326 CLASS_BEING_LAIDOUT (this_class
) = 1;
2328 if (super_class
&& !CLASS_BEING_LAIDOUT (super_class
))
2330 tree maybe_super_class
2331 = maybe_layout_super_class (super_class
, this_class
);
2332 if (maybe_super_class
== NULL
2333 || TREE_CODE (TYPE_SIZE (maybe_super_class
)) == ERROR_MARK
)
2335 TYPE_SIZE (this_class
) = error_mark_node
;
2336 CLASS_BEING_LAIDOUT (this_class
) = 0;
2337 class_list
= TREE_CHAIN (class_list
);
2340 if (TYPE_SIZE (this_class
) == NULL_TREE
)
2341 push_super_field (this_class
, maybe_super_class
);
2344 layout_type (this_class
);
2346 /* Also recursively load/layout any superinterfaces, but only if
2347 class was loaded from bytecode. The source parser will take care
2349 if (!CLASS_FROM_SOURCE_P (this_class
))
2352 if (TYPE_BINFO (this_class
))
2354 for (i
= BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class
)) - 1; i
> 0; i
--)
2356 tree binfo
= BINFO_BASE_BINFO (TYPE_BINFO (this_class
), i
);
2357 tree super_interface
= BINFO_TYPE (binfo
);
2358 tree maybe_super_interface
2359 = maybe_layout_super_class (super_interface
, NULL_TREE
);
2360 if (maybe_super_interface
== NULL
2361 || TREE_CODE (TYPE_SIZE (maybe_super_interface
)) == ERROR_MARK
)
2363 TYPE_SIZE (this_class
) = error_mark_node
;
2364 CLASS_BEING_LAIDOUT (this_class
) = 0;
2365 class_list
= TREE_CHAIN (class_list
);
2372 /* Convert the size back to an SI integer value. */
2373 TYPE_SIZE_UNIT (this_class
) =
2374 fold (convert (int_type_node
, TYPE_SIZE_UNIT (this_class
)));
2376 CLASS_BEING_LAIDOUT (this_class
) = 0;
2377 class_list
= TREE_CHAIN (class_list
);
2381 add_miranda_methods (tree base_class
, tree search_class
)
2384 tree binfo
, base_binfo
;
2386 if (!CLASS_PARSED_P (search_class
))
2387 load_class (search_class
, 1);
2389 for (binfo
= TYPE_BINFO (search_class
), i
= 1;
2390 BINFO_BASE_ITERATE (binfo
, i
, base_binfo
); i
++)
2393 tree elt
= BINFO_TYPE (base_binfo
);
2395 /* FIXME: This is totally bogus. We should not be handling
2396 Miranda methods at all if we're using the BC ABI. */
2397 if (TYPE_DUMMY (elt
))
2400 /* Ensure that interface methods are seen in declared order. */
2401 if (!CLASS_LOADED_P (elt
))
2402 load_class (elt
, 1);
2403 layout_class_methods (elt
);
2405 /* All base classes will have been laid out at this point, so the order
2406 will be correct. This code must match similar layout code in the
2408 for (method_decl
= TYPE_METHODS (elt
);
2409 method_decl
; method_decl
= TREE_CHAIN (method_decl
))
2413 /* An interface can have <clinit>. */
2414 if (ID_CLINIT_P (DECL_NAME (method_decl
)))
2417 sig
= build_java_argument_signature (TREE_TYPE (method_decl
));
2418 override
= lookup_argument_method (base_class
,
2419 DECL_NAME (method_decl
), sig
);
2420 if (override
== NULL_TREE
)
2422 /* Found a Miranda method. Add it. */
2424 sig
= build_java_signature (TREE_TYPE (method_decl
));
2426 = add_method (base_class
,
2427 get_access_flags_from_decl (method_decl
),
2428 DECL_NAME (method_decl
), sig
);
2429 METHOD_INVISIBLE (new_method
) = 1;
2433 /* Try superinterfaces. */
2434 add_miranda_methods (base_class
, elt
);
2439 layout_class_methods (tree this_class
)
2441 tree method_decl
, dtable_count
;
2442 tree super_class
, type_name
;
2444 if (TYPE_NVIRTUALS (this_class
))
2447 super_class
= CLASSTYPE_SUPER (this_class
);
2451 super_class
= maybe_layout_super_class (super_class
, this_class
);
2452 if (!TYPE_NVIRTUALS (super_class
))
2453 layout_class_methods (super_class
);
2454 dtable_count
= TYPE_NVIRTUALS (super_class
);
2457 dtable_count
= integer_zero_node
;
2459 type_name
= TYPE_NAME (this_class
);
2460 if (!flag_indirect_dispatch
2461 && (CLASS_ABSTRACT (type_name
) || CLASS_INTERFACE (type_name
)))
2463 /* An abstract class can have methods which are declared only in
2464 an implemented interface. These are called "Miranda
2465 methods". We make a dummy method entry for such methods
2467 add_miranda_methods (this_class
, this_class
);
2470 TYPE_METHODS (this_class
) = nreverse (TYPE_METHODS (this_class
));
2472 for (method_decl
= TYPE_METHODS (this_class
);
2473 method_decl
; method_decl
= TREE_CHAIN (method_decl
))
2474 dtable_count
= layout_class_method (this_class
, super_class
,
2475 method_decl
, dtable_count
);
2477 TYPE_NVIRTUALS (this_class
) = dtable_count
;
2480 /* Return the index of METHOD in INTERFACE. This index begins at 1
2481 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2483 get_interface_method_index (tree method
, tree interface
)
2488 for (meth
= TYPE_METHODS (interface
); ; meth
= TREE_CHAIN (meth
))
2492 /* We don't want to put <clinit> into the interface table. */
2493 if (! ID_CLINIT_P (DECL_NAME (meth
)))
2495 gcc_assert (meth
!= NULL_TREE
);
2499 /* Lay METHOD_DECL out, returning a possibly new value of
2500 DTABLE_COUNT. Also mangle the method's name. */
2503 layout_class_method (tree this_class
, tree super_class
,
2504 tree method_decl
, tree dtable_count
)
2506 tree method_name
= DECL_NAME (method_decl
);
2508 TREE_PUBLIC (method_decl
) = 1;
2509 /* Considered external unless it is being compiled into this object
2511 DECL_EXTERNAL (method_decl
) = ((is_compiled_class (this_class
) != 2)
2512 || METHOD_NATIVE (method_decl
));
2514 if (ID_INIT_P (method_name
))
2516 const char *p
= IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class
)));
2518 for (ptr
= p
; *ptr
; )
2523 DECL_CONSTRUCTOR_P (method_decl
) = 1;
2524 build_java_signature (TREE_TYPE (method_decl
));
2526 else if (! METHOD_STATIC (method_decl
))
2529 build_java_signature (TREE_TYPE (method_decl
));
2530 bool method_override
= false;
2531 tree super_method
= lookup_java_method (super_class
, method_name
,
2533 if (super_method
!= NULL_TREE
2534 && ! METHOD_DUMMY (super_method
))
2536 method_override
= true;
2537 if (! METHOD_PUBLIC (super_method
) &&
2538 ! METHOD_PROTECTED (super_method
))
2540 /* Don't override private method, or default-access method in
2542 if (METHOD_PRIVATE (super_method
) ||
2543 ! in_same_package (TYPE_NAME (this_class
),
2544 TYPE_NAME (super_class
)))
2545 method_override
= false;
2548 if (method_override
)
2550 tree method_index
= get_method_index (super_method
);
2551 set_method_index (method_decl
, method_index
);
2552 if (method_index
== NULL_TREE
2553 && ! flag_indirect_dispatch
2554 && !CLASS_FROM_SOURCE_P (this_class
)
2555 && ! DECL_ARTIFICIAL (super_method
))
2556 error ("non-static method %q+D overrides static method",
2559 else if (this_class
== object_type_node
2560 && (METHOD_FINAL (method_decl
)
2561 || METHOD_PRIVATE (method_decl
)))
2563 /* We don't generate vtable entries for final Object
2564 methods. This is simply to save space, since every
2565 object would otherwise have to define them. */
2567 else if (! METHOD_PRIVATE (method_decl
)
2570 /* We generate vtable entries for final methods because they
2571 may one day be changed to non-final. */
2572 set_method_index (method_decl
, dtable_count
);
2573 dtable_count
= fold_build2 (PLUS_EXPR
, integer_type_node
,
2574 dtable_count
, integer_one_node
);
2578 return dtable_count
;
2582 register_class (void)
2586 if (!registered_class
)
2587 registered_class
= VEC_alloc (tree
, gc
, 8);
2589 if (flag_indirect_classes
)
2590 node
= current_class
;
2592 node
= TREE_OPERAND (build_class_ref (current_class
), 0);
2593 VEC_safe_push (tree
, gc
, registered_class
, node
);
2596 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2597 all the classes we have emitted. */
2600 emit_indirect_register_classes (tree
*list_p
)
2602 tree klass
, t
, register_class_fn
;
2605 tree init
= NULL_TREE
;
2606 int size
= VEC_length (tree
, registered_class
) * 2 + 1;
2607 tree class_array_type
2608 = build_prim_array_type (ptr_type_node
, size
);
2609 tree
cdecl = build_decl (VAR_DECL
, get_identifier ("_Jv_CLS"),
2611 tree reg_class_list
;
2612 for (i
= 0; VEC_iterate (tree
, registered_class
, i
, klass
); ++i
)
2614 init
= tree_cons (NULL_TREE
,
2615 fold_convert (ptr_type_node
,
2616 build_static_class_ref (klass
)), init
);
2619 fold_convert (ptr_type_node
,
2620 build_address_of (build_classdollar_field (klass
))),
2623 init
= tree_cons (NULL_TREE
, integer_zero_node
, init
);
2624 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type
,
2626 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2627 TREE_STATIC (cdecl) = 1;
2628 DECL_ARTIFICIAL (cdecl) = 1;
2629 DECL_IGNORED_P (cdecl) = 1;
2630 TREE_READONLY (cdecl) = 1;
2631 TREE_CONSTANT (cdecl) = 1;
2632 rest_of_decl_compilation (cdecl, 1, 0);
2633 reg_class_list
= fold_convert (ptr_type_node
, build_address_of (cdecl));
2635 t
= build_function_type_list (void_type_node
,
2636 build_pointer_type (ptr_type_node
), NULL
);
2637 t
= build_decl (FUNCTION_DECL
,
2638 get_identifier ("_Jv_RegisterNewClasses"), t
);
2639 TREE_PUBLIC (t
) = 1;
2640 DECL_EXTERNAL (t
) = 1;
2641 register_class_fn
= t
;
2642 t
= tree_cons (NULL
, reg_class_list
, NULL
);
2643 t
= build_function_call_expr (register_class_fn
, t
);
2644 append_to_statement_list (t
, list_p
);
2648 /* Emit something to register classes at start-up time.
2650 The preferred mechanism is through the .jcr section, which contain
2651 a list of pointers to classes which get registered during constructor
2654 The fallback mechanism is to add statements to *LIST_P to call
2655 _Jv_RegisterClass for each class in this file. These statements will
2656 be added to a static constructor function for this translation unit. */
2659 emit_register_classes (tree
*list_p
)
2661 if (registered_class
== NULL
)
2664 if (flag_indirect_classes
)
2666 emit_indirect_register_classes (list_p
);
2670 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2671 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2672 but lack suitable crtbegin/end objects or linker support. These
2673 targets can override the default in tm.h to use the fallback mechanism. */
2674 if (TARGET_USE_JCR_SECTION
)
2679 #ifdef JCR_SECTION_NAME
2680 switch_to_section (get_section (JCR_SECTION_NAME
, SECTION_WRITE
, NULL
));
2682 /* A target has defined TARGET_USE_JCR_SECTION,
2683 but doesn't have a JCR_SECTION_NAME. */
2686 assemble_align (POINTER_SIZE
);
2688 for (i
= 0; VEC_iterate (tree
, registered_class
, i
, klass
); ++i
)
2690 t
= build_fold_addr_expr (klass
);
2691 output_constant (t
, POINTER_SIZE
/ BITS_PER_UNIT
, POINTER_SIZE
);
2696 tree klass
, t
, register_class_fn
;
2699 t
= build_function_type_list (void_type_node
, class_ptr_type
, NULL
);
2700 t
= build_decl (FUNCTION_DECL
, get_identifier ("_Jv_RegisterClass"), t
);
2701 TREE_PUBLIC (t
) = 1;
2702 DECL_EXTERNAL (t
) = 1;
2703 register_class_fn
= t
;
2705 for (i
= 0; VEC_iterate (tree
, registered_class
, i
, klass
); ++i
)
2707 t
= build_fold_addr_expr (klass
);
2708 t
= tree_cons (NULL
, t
, NULL
);
2709 t
= build_function_call_expr (register_class_fn
, t
);
2710 append_to_statement_list (t
, list_p
);
2715 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2718 build_symbol_entry (tree decl
, tree special
)
2720 tree clname
, name
, signature
, sym
;
2721 clname
= build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl
))));
2722 /* ??? Constructors are given the name foo.foo all the way through
2723 the compiler, but in the method table they're all renamed
2724 foo.<init>. So, we have to do the same here unless we want an
2725 unresolved reference at runtime. */
2726 name
= build_utf8_ref ((TREE_CODE (decl
) == FUNCTION_DECL
2727 && DECL_CONSTRUCTOR_P (decl
))
2728 ? init_identifier_node
2729 : DECL_NAME (decl
));
2730 signature
= build_java_signature (TREE_TYPE (decl
));
2731 signature
= build_utf8_ref (unmangle_classname
2732 (IDENTIFIER_POINTER (signature
),
2733 IDENTIFIER_LENGTH (signature
)));
2734 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2735 signature addr+1 if SPECIAL, and this indicates to the runtime
2736 system that this is a "special" symbol, i.e. one that should
2737 bypass access controls. */
2738 if (special
!= NULL_TREE
)
2739 signature
= build2 (PLUS_EXPR
, TREE_TYPE (signature
), signature
, special
);
2741 START_RECORD_CONSTRUCTOR (sym
, symbol_type
);
2742 PUSH_FIELD_VALUE (sym
, "clname", clname
);
2743 PUSH_FIELD_VALUE (sym
, "name", name
);
2744 PUSH_FIELD_VALUE (sym
, "signature", signature
);
2745 FINISH_RECORD_CONSTRUCTOR (sym
);
2746 TREE_CONSTANT (sym
) = 1;
2747 TREE_INVARIANT (sym
) = 1;
2752 /* Emit a symbol table: used by -findirect-dispatch. */
2755 emit_symbol_table (tree name
, tree the_table
, tree decl_list
,
2756 tree the_syms_decl
, tree the_array_element_type
,
2759 tree method_list
, method
, table
, list
, null_symbol
;
2760 tree table_size
, the_array_type
;
2763 /* Only emit a table if this translation unit actually made any
2764 references via it. */
2765 if (decl_list
== NULL_TREE
)
2768 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2770 method_list
= decl_list
;
2772 while (method_list
!= NULL_TREE
)
2774 tree special
= TREE_PURPOSE (method_list
);
2775 method
= TREE_VALUE (method_list
);
2776 list
= tree_cons (NULL_TREE
, build_symbol_entry (method
, special
), list
);
2777 method_list
= TREE_CHAIN (method_list
);
2781 /* Terminate the list with a "null" entry. */
2782 START_RECORD_CONSTRUCTOR (null_symbol
, symbol_type
);
2783 PUSH_FIELD_VALUE (null_symbol
, "clname", null_pointer_node
);
2784 PUSH_FIELD_VALUE (null_symbol
, "name", null_pointer_node
);
2785 PUSH_FIELD_VALUE (null_symbol
, "signature", null_pointer_node
);
2786 FINISH_RECORD_CONSTRUCTOR (null_symbol
);
2787 TREE_CONSTANT (null_symbol
) = 1;
2788 TREE_INVARIANT (null_symbol
) = 1;
2789 list
= tree_cons (NULL_TREE
, null_symbol
, list
);
2791 /* Put the list in the right order and make it a constructor. */
2792 list
= nreverse (list
);
2793 table
= build_constructor_from_list (symbols_array_type
, list
);
2795 /* Make it the initial value for otable_syms and emit the decl. */
2796 DECL_INITIAL (the_syms_decl
) = table
;
2797 DECL_ARTIFICIAL (the_syms_decl
) = 1;
2798 DECL_IGNORED_P (the_syms_decl
) = 1;
2799 rest_of_decl_compilation (the_syms_decl
, 1, 0);
2801 /* Now that its size is known, redefine the table as an
2802 uninitialized static array of INDEX + 1 elements. The extra entry
2803 is used by the runtime to track whether the table has been
2806 = build_index_type (build_int_cst (NULL_TREE
, index
* element_size
+ 1));
2807 the_array_type
= build_array_type (the_array_element_type
, table_size
);
2808 the_table
= build_decl (VAR_DECL
, name
, the_array_type
);
2809 TREE_STATIC (the_table
) = 1;
2810 TREE_READONLY (the_table
) = 1;
2811 rest_of_decl_compilation (the_table
, 1, 0);
2816 /* Make an entry for the catch_classes list. */
2818 make_catch_class_record (tree catch_class
, tree classname
)
2821 tree type
= TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class
)));
2822 START_RECORD_CONSTRUCTOR (entry
, type
);
2823 PUSH_FIELD_VALUE (entry
, "address", catch_class
);
2824 PUSH_FIELD_VALUE (entry
, "classname", classname
);
2825 FINISH_RECORD_CONSTRUCTOR (entry
);
2830 /* Generate the list of Throwable classes that are caught by exception
2831 handlers in this class. */
2833 emit_catch_table (tree this_class
)
2835 tree table
, table_size
, array_type
;
2836 TYPE_CATCH_CLASSES (this_class
) =
2838 make_catch_class_record (null_pointer_node
, null_pointer_node
),
2839 TYPE_CATCH_CLASSES (this_class
));
2840 TYPE_CATCH_CLASSES (this_class
) = nreverse (TYPE_CATCH_CLASSES (this_class
));
2841 TYPE_CATCH_CLASSES (this_class
) =
2843 make_catch_class_record (null_pointer_node
, null_pointer_node
),
2844 TYPE_CATCH_CLASSES (this_class
));
2845 table_size
= build_index_type
2846 (build_int_cst (NULL_TREE
,
2847 list_length (TYPE_CATCH_CLASSES (this_class
))));
2849 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class
))),
2852 build_decl (VAR_DECL
, DECL_NAME (TYPE_CTABLE_DECL (this_class
)), array_type
);
2853 DECL_INITIAL (table
) =
2854 build_constructor_from_list (array_type
, TYPE_CATCH_CLASSES (this_class
));
2855 TREE_STATIC (table
) = 1;
2856 TREE_READONLY (table
) = 1;
2857 DECL_IGNORED_P (table
) = 1;
2858 rest_of_decl_compilation (table
, 1, 0);
2862 /* Given a type, return the signature used by
2863 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2864 same as build_java_signature() because we want the canonical array
2868 build_signature_for_libgcj (tree type
)
2872 sig
= build_java_signature (type
);
2873 ref
= build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig
),
2874 IDENTIFIER_LENGTH (sig
)));
2878 /* Add an entry to the type assertion table. Callback used during hashtable
2882 add_assertion_table_entry (void **htab_entry
, void *ptr
)
2885 tree code_val
, op1_utf8
, op2_utf8
;
2886 tree
*list
= (tree
*) ptr
;
2887 type_assertion
*as
= (type_assertion
*) *htab_entry
;
2889 code_val
= build_int_cst (NULL_TREE
, as
->assertion_code
);
2891 if (as
->op1
== NULL_TREE
)
2892 op1_utf8
= null_pointer_node
;
2894 op1_utf8
= build_signature_for_libgcj (as
->op1
);
2896 if (as
->op2
== NULL_TREE
)
2897 op2_utf8
= null_pointer_node
;
2899 op2_utf8
= build_signature_for_libgcj (as
->op2
);
2901 START_RECORD_CONSTRUCTOR (entry
, assertion_entry_type
);
2902 PUSH_FIELD_VALUE (entry
, "assertion_code", code_val
);
2903 PUSH_FIELD_VALUE (entry
, "op1", op1_utf8
);
2904 PUSH_FIELD_VALUE (entry
, "op2", op2_utf8
);
2905 FINISH_RECORD_CONSTRUCTOR (entry
);
2907 *list
= tree_cons (NULL_TREE
, entry
, *list
);
2911 /* Generate the type assertion table for CLASS, and return its DECL. */
2914 emit_assertion_table (tree
class)
2916 tree null_entry
, ctor
, table_decl
;
2917 tree list
= NULL_TREE
;
2918 htab_t assertions_htab
= TYPE_ASSERTIONS (class);
2920 /* Iterate through the hash table. */
2921 htab_traverse (assertions_htab
, add_assertion_table_entry
, &list
);
2923 /* Finish with a null entry. */
2924 START_RECORD_CONSTRUCTOR (null_entry
, assertion_entry_type
);
2925 PUSH_FIELD_VALUE (null_entry
, "assertion_code", integer_zero_node
);
2926 PUSH_FIELD_VALUE (null_entry
, "op1", null_pointer_node
);
2927 PUSH_FIELD_VALUE (null_entry
, "op2", null_pointer_node
);
2928 FINISH_RECORD_CONSTRUCTOR (null_entry
);
2930 list
= tree_cons (NULL_TREE
, null_entry
, list
);
2932 /* Put the list in the right order and make it a constructor. */
2933 list
= nreverse (list
);
2934 ctor
= build_constructor_from_list (assertion_table_type
, list
);
2936 table_decl
= build_decl (VAR_DECL
, mangled_classname ("_type_assert_", class),
2937 assertion_table_type
);
2939 TREE_STATIC (table_decl
) = 1;
2940 TREE_READONLY (table_decl
) = 1;
2941 TREE_CONSTANT (table_decl
) = 1;
2942 DECL_IGNORED_P (table_decl
) = 1;
2944 DECL_INITIAL (table_decl
) = ctor
;
2945 DECL_ARTIFICIAL (table_decl
) = 1;
2946 rest_of_decl_compilation (table_decl
, 1, 0);
2952 init_class_processing (void)
2954 fields_ident
= get_identifier ("fields");
2955 info_ident
= get_identifier ("info");
2957 gcc_obstack_init (&temporary_obstack
);
2960 static hashval_t
java_treetreehash_hash (const void *);
2961 static int java_treetreehash_compare (const void *, const void *);
2963 /* A hash table mapping trees to trees. Used generally. */
2965 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
2968 java_treetreehash_hash (const void *k_p
)
2970 struct treetreehash_entry
*k
= (struct treetreehash_entry
*) k_p
;
2971 return JAVA_TREEHASHHASH_H (k
->key
);
2975 java_treetreehash_compare (const void * k1_p
, const void * k2_p
)
2977 struct treetreehash_entry
* k1
= (struct treetreehash_entry
*) k1_p
;
2978 tree k2
= (tree
) k2_p
;
2979 return (k1
->key
== k2
);
2983 java_treetreehash_find (htab_t ht
, tree t
)
2985 struct treetreehash_entry
*e
;
2986 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
2987 e
= htab_find_with_hash (ht
, t
, hv
);
2995 java_treetreehash_new (htab_t ht
, tree t
)
2998 struct treetreehash_entry
*tthe
;
2999 hashval_t hv
= JAVA_TREEHASHHASH_H (t
);
3001 e
= htab_find_slot_with_hash (ht
, t
, hv
, INSERT
);
3004 tthe
= (*ht
->alloc_f
) (1, sizeof (*tthe
));
3009 tthe
= (struct treetreehash_entry
*) *e
;
3010 return &tthe
->value
;
3014 java_treetreehash_create (size_t size
, int gc
)
3017 return htab_create_ggc (size
, java_treetreehash_hash
,
3018 java_treetreehash_compare
, NULL
);
3020 return htab_create_alloc (size
, java_treetreehash_hash
,
3021 java_treetreehash_compare
, free
, xcalloc
, free
);
3024 /* Break down qualified IDENTIFIER into package and class-name components.
3025 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3026 "pkg.foo", and RIGHT to "Bar". */
3029 split_qualified_name (tree
*left
, tree
*right
, tree source
)
3032 int l
= IDENTIFIER_LENGTH (source
);
3034 base
= alloca (l
+ 1);
3035 memcpy (base
, IDENTIFIER_POINTER (source
), l
+ 1);
3037 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3039 while (*p
!= '.' && p
!= base
)
3042 /* We didn't find a '.'. Return an error. */
3048 *right
= get_identifier (p
+1);
3049 *left
= get_identifier (base
);
3054 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3055 if the classes are from the same package. */
3058 in_same_package (tree name1
, tree name2
)
3064 if (TREE_CODE (name1
) == TYPE_DECL
)
3065 name1
= DECL_NAME (name1
);
3066 if (TREE_CODE (name2
) == TYPE_DECL
)
3067 name2
= DECL_NAME (name2
);
3069 if (QUALIFIED_P (name1
) != QUALIFIED_P (name2
))
3070 /* One in empty package. */
3073 if (QUALIFIED_P (name1
) == 0 && QUALIFIED_P (name2
) == 0)
3074 /* Both in empty package. */
3077 split_qualified_name (&pkg1
, &tmp
, name1
);
3078 split_qualified_name (&pkg2
, &tmp
, name2
);
3080 return (pkg1
== pkg2
);
3083 #include "gt-java-class.h"