Merged gcj-eclipse branch to trunk.
[gcc.git] / gcc / java / class.c
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.
4
5 This file is part of GCC.
6
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)
10 any later version.
11
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.
16
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.
21
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. */
25
26 /* Written by Per Bothner <bothner@cygnus.com> */
27
28 #include "config.h"
29 #include "system.h"
30 #include "coretypes.h"
31 #include "tm.h"
32 #include "tree.h"
33 #include "rtl.h"
34 #include "flags.h"
35 #include "java-tree.h"
36 #include "jcf.h"
37 #include "obstack.h"
38 #include "toplev.h"
39 #include "output.h"
40 #include "parse.h"
41 #include "function.h"
42 #include "ggc.h"
43 #include "stdio.h"
44 #include "target.h"
45 #include "except.h"
46 #include "cgraph.h"
47 #include "tree-iterator.h"
48 #include "cgraph.h"
49 #include "vecprim.h"
50
51 /* DOS brain-damage */
52 #ifndef O_BINARY
53 #define O_BINARY 0 /* MS-DOS brain-damage */
54 #endif
55
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);
69
70 struct obstack temporary_obstack;
71
72 static const char *cyclic_inheritance_report;
73
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. */
81
82 typedef struct class_flag_node_struct
83 {
84 /* The class or package name. */
85 const char *ident;
86
87 /* Nonzero if this represents an exclusion. */
88 int value;
89
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;
94 } class_flag_node;
95
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);
98
99 /* This is the root of the include/exclude tree. */
100
101 static class_flag_node *assume_compiled_tree;
102
103 static class_flag_node *enable_assert_tree;
104
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]
110
111 static GTY(()) VEC(tree,gc) *registered_class;
112
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. */
116
117 static class_flag_node *
118 find_class_flag_node (class_flag_node *node, const char *ident)
119 {
120 while (node)
121 {
122 size_t node_ident_length = strlen (node->ident);
123
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
127 package name. */
128
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] == '.')))
133 {
134 /* We've found a match, however, there might be a more
135 specific match. */
136
137 class_flag_node *found = find_class_flag_node (node->child, ident);
138 if (found)
139 return found;
140 else
141 return node;
142 }
143
144 /* No match yet. Continue through the sibling list. */
145 node = node->sibling;
146 }
147
148 /* No match at all in this tree. */
149 return NULL;
150 }
151
152 void
153 add_class_flag (class_flag_node **rootp, const char *ident, int value)
154 {
155 class_flag_node *root = *rootp;
156 class_flag_node *parent, *node;
157
158 /* Create the root of the tree if it doesn't exist yet. */
159
160 if (NULL == root)
161 {
162 root = XNEW (class_flag_node);
163 root->ident = "";
164 root->value = 0;
165 root->sibling = NULL;
166 root->child = NULL;
167 root->parent = NULL;
168 *rootp = root;
169 }
170
171 /* Calling the function with the empty string means we're setting
172 value for the root of the hierarchy. */
173
174 if (0 == ident[0])
175 {
176 root->value = value;
177 return;
178 }
179
180 /* Find the parent node for this new node. PARENT will either be a
181 class or a package name. Adjust PARENT accordingly. */
182
183 parent = find_class_flag_node (root, ident);
184 if (strcmp (ident, parent->ident) == 0)
185 parent->value = value;
186 else
187 {
188 /* Insert new node into the tree. */
189 node = XNEW (class_flag_node);
190
191 node->ident = xstrdup (ident);
192 node->value = value;
193 node->child = NULL;
194
195 node->parent = parent;
196 node->sibling = parent->child;
197 parent->child = node;
198 }
199 }
200
201 /* Add a new IDENT to the include/exclude tree. It's an exclusion
202 if EXCLUDEP is nonzero. */
203
204 void
205 add_assume_compiled (const char *ident, int excludep)
206 {
207 add_class_flag (&assume_compiled_tree, ident, excludep);
208 }
209
210 /* The default value returned by enable_assertions. */
211
212 #define DEFAULT_ENABLE_ASSERT (flag_emit_class_files || optimize == 0)
213
214 /* Enter IDENT (a class or package name) into the enable-assertions table.
215 VALUE is true to enable and false to disable. */
216
217 void
218 add_enable_assert (const char *ident, int value)
219 {
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);
223 }
224
225 /* Returns nonzero if IDENT is the name of a class that the compiler
226 should assume has been compiled to object code. */
227
228 static int
229 assume_compiled (const char *ident)
230 {
231 class_flag_node *i;
232 int result;
233
234 if (NULL == assume_compiled_tree)
235 return 1;
236
237 i = find_class_flag_node (assume_compiled_tree, ident);
238
239 result = ! i->value;
240
241 return (result);
242 }
243
244 /* Return true if we should generate code to check assertions within KLASS. */
245
246 bool
247 enable_assertions (tree klass)
248 {
249 /* Check if command-line specifies whether we should check assertions. */
250
251 if (klass != NULL_TREE && DECL_NAME (klass) && enable_assert_tree != NULL)
252 {
253 const char *ident = IDENTIFIER_POINTER (DECL_NAME (klass));
254 class_flag_node *node
255 = find_class_flag_node (enable_assert_tree, ident);
256 return node->value;
257 }
258
259 /* The default is to enable assertions if generating class files,
260 or not optimizing. */
261 return DEFAULT_ENABLE_ASSERT;
262 }
263
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. */
267
268 tree
269 ident_subst (const char* old_name,
270 int old_length,
271 const char *prefix,
272 int old_char,
273 int new_char,
274 const char *suffix)
275 {
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);
280
281 strcpy (buffer, prefix);
282 for (i = 0; i < old_length; i++)
283 {
284 char ch = old_name[i];
285 if (ch == old_char)
286 ch = new_char;
287 buffer[prefix_len + i] = ch;
288 }
289 strcpy (buffer + prefix_len + old_length, suffix);
290 return get_identifier (buffer);
291 }
292
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. */
296
297 tree
298 identifier_subst (const tree old_id,
299 const char *prefix,
300 int old_char,
301 int new_char,
302 const char *suffix)
303 {
304 return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
305 prefix, old_char, new_char, suffix);
306 }
307
308 /* Generate a valid C identifier from the name of the class TYPE,
309 prefixed by PREFIX. */
310
311 tree
312 mangled_classname (const char *prefix, tree type)
313 {
314 tree ident = TYPE_NAME (type);
315 if (TREE_CODE (ident) != IDENTIFIER_NODE)
316 ident = DECL_NAME (ident);
317 return identifier_subst (ident, prefix, '.', '_', "");
318 }
319
320 tree
321 make_class (void)
322 {
323 tree type;
324 type = make_node (RECORD_TYPE);
325 /* Unfortunately we must create the binfo here, so that class
326 loading works. */
327 TYPE_BINFO (type) = make_tree_binfo (0);
328 MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
329
330 return type;
331 }
332
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. */
336
337 tree
338 unmangle_classname (const char *name, int name_length)
339 {
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
344 trailing ';'. */
345 name = IDENTIFIER_POINTER (to_return);
346 while (*name)
347 if (*name++ == '.')
348 {
349 QUALIFIED_P (to_return) = 1;
350 break;
351 }
352
353 return to_return;
354 }
355
356 #define GEN_TABLE(TABLE, NAME, TABLE_TYPE, TYPE) \
357 do \
358 { \
359 const char *typename = IDENTIFIER_POINTER (mangled_classname ("", TYPE)); \
360 char *buf = alloca (strlen (typename) + strlen (#NAME "_syms_") + 1); \
361 tree decl; \
362 \
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. */ \
372 pushdecl (decl); \
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; \
381 } \
382 while (0)
383
384 /* Given a class, create the DECLs for all its associated indirect
385 dispatch tables. */
386 void
387 gen_indirect_dispatch_tables (tree type)
388 {
389 const char *typename = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
390 {
391 tree field = NULL;
392 char *buf = alloca (strlen (typename) + strlen ("_catch_classes_") + 1);
393 tree catch_class_type = make_node (RECORD_TYPE);
394
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);
399
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));
409 }
410
411 if (flag_indirect_dispatch)
412 {
413 GEN_TABLE (ATABLE, _atable, atable_type, type);
414 GEN_TABLE (OTABLE, _otable, otable_type, type);
415 GEN_TABLE (ITABLE, _itable, itable_type, type);
416 }
417 }
418
419 #undef GEN_TABLE
420
421 tree
422 push_class (tree class_type, tree class_name)
423 {
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);
429 input_line = 0;
430 #endif
431 CLASS_P (class_type) = 1;
432 decl = build_decl (TYPE_DECL, class_name, class_type);
433 TYPE_DECL_SUPPRESS_DEBUG (decl) = 1;
434
435 /* dbxout needs a DECL_SIZE if in gstabs mode */
436 DECL_SIZE (decl) = integer_zero_node;
437
438 input_location = saved_loc;
439 signature = identifier_subst (class_name, "L", '.', '/', ";");
440 IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
441
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;
446
447 pushdecl_top_level (decl);
448
449 return decl;
450 }
451
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. */
456
457 tree
458 lookup_class (tree name)
459 {
460 tree decl = IDENTIFIER_CLASS_VALUE (name);
461 if (decl == NULL_TREE)
462 decl = push_class (make_class (), name);
463 return TREE_TYPE (decl);
464 }
465
466 void
467 set_super_info (int access_flags, tree this_class,
468 tree super_class, int interfaces_count)
469 {
470 int total_supers = interfaces_count;
471 tree class_decl = TYPE_NAME (this_class);
472
473 if (super_class)
474 total_supers++;
475
476 if (total_supers)
477 TYPE_BINFO (this_class) = make_tree_binfo (total_supers);
478 TYPE_VFIELD (this_class) = TYPE_VFIELD (object_type_node);
479 if (super_class)
480 {
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;
486 }
487
488 set_class_decl_access_flags (access_flags, class_decl);
489 }
490
491 void
492 set_class_decl_access_flags (int access_flags, tree class_decl)
493 {
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;
506 }
507
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. */
510
511 int
512 class_depth (tree clas)
513 {
514 int depth = 0;
515 if (! CLASS_LOADED_P (clas))
516 load_class (clas, 1);
517 if (TYPE_SIZE (clas) == error_mark_node)
518 return -1;
519 while (clas != object_type_node)
520 {
521 depth++;
522 clas = BINFO_TYPE (BINFO_BASE_BINFO (TYPE_BINFO (clas), 0));
523 }
524 return depth;
525 }
526
527 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
528
529 int
530 interface_of_p (tree type1, tree type2)
531 {
532 int i;
533 tree binfo, base_binfo;
534
535 if (! TYPE_BINFO (type2))
536 return 0;
537
538 for (binfo = TYPE_BINFO (type2), i = 0;
539 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
540 if (BINFO_TYPE (base_binfo) == type1)
541 return 1;
542
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)))
547 return 1;
548
549 return 0;
550 }
551
552 /* Return true iff TYPE1 inherits from TYPE2. */
553
554 int
555 inherits_from_p (tree type1, tree type2)
556 {
557 while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
558 {
559 if (type1 == type2)
560 return 1;
561
562 if (! CLASS_LOADED_P (type1))
563 load_class (type1, 1);
564
565 type1 = maybe_layout_super_class (CLASSTYPE_SUPER (type1), type1);
566 }
567 return 0;
568 }
569
570 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
571
572 int
573 enclosing_context_p (tree type1, tree type2)
574 {
575 if (!INNER_CLASS_TYPE_P (type2))
576 return 0;
577
578 for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
579 type2;
580 type2 = (INNER_CLASS_TYPE_P (type2) ?
581 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
582 {
583 if (type2 == type1)
584 return 1;
585 }
586
587 return 0;
588 }
589
590
591 /* Return 1 iff TYPE1 and TYPE2 share a common enclosing class, regardless of
592 nesting level. */
593
594 int
595 common_enclosing_context_p (tree type1, tree type2)
596 {
597 while (type1)
598 {
599 tree current;
600 for (current = type2; current;
601 current = (INNER_CLASS_TYPE_P (current) ?
602 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) :
603 NULL_TREE))
604 if (type1 == current)
605 return 1;
606
607 if (INNER_CLASS_TYPE_P (type1))
608 type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1)));
609 else
610 break;
611 }
612 return 0;
613 }
614
615 /* Return 1 iff there exists a common enclosing "this" between TYPE1
616 and TYPE2, without crossing any static context. */
617
618 int
619 common_enclosing_instance_p (tree type1, tree type2)
620 {
621 if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
622 return 0;
623
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))
627 {
628 tree current;
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))) :
632 NULL_TREE))
633 if (type1 == current)
634 return 1;
635 }
636 return 0;
637 }
638
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. */
642
643 tree
644 maybe_add_interface (tree this_class, tree interface_class)
645 {
646 tree binfo, base_binfo;
647 int i;
648
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);
654 return NULL_TREE;
655 }
656
657 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
658
659 void
660 add_interface (tree this_class, tree interface_class)
661 {
662 tree interface_binfo = make_tree_binfo (0);
663
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;
668
669 BINFO_BASE_APPEND (TYPE_BINFO (this_class), interface_binfo);
670 }
671
672 #if 0
673 /* Return the address of a pointer to the first FUNCTION_DECL
674 in the list (*LIST) whose DECL_NAME is NAME. */
675
676 static tree *
677 find_named_method (tree *list, tree name)
678 {
679 while (*list && DECL_NAME (*list) != name)
680 list = &TREE_CHAIN (*list);
681 return list;
682 }
683 #endif
684
685 static tree
686 build_java_method_type (tree fntype, tree this_class, int access_flags)
687 {
688 if (access_flags & ACC_STATIC)
689 return fntype;
690 fntype = build_method_type (this_class, fntype);
691
692 /* We know that arg 1 of every nonstatic method is non-null; tell
693 the back-end so. */
694 TYPE_ATTRIBUTES (fntype) = (tree_cons
695 (get_identifier ("nonnull"),
696 tree_cons (NULL_TREE,
697 build_int_cst (NULL_TREE, 1),
698 NULL_TREE),
699 TYPE_ATTRIBUTES (fntype)));
700 return fntype;
701 }
702
703 tree
704 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
705 {
706 tree method_type, fndecl;
707
708 method_type = build_java_method_type (function_type,
709 this_class, access_flags);
710
711 fndecl = build_decl (FUNCTION_DECL, name, method_type);
712 DECL_CONTEXT (fndecl) = this_class;
713
714 DECL_LANG_SPECIFIC (fndecl)
715 = ggc_alloc_cleared (sizeof (struct lang_decl));
716 DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
717
718 /* Initialize the static initializer test table. */
719
720 DECL_FUNCTION_INIT_TEST_TABLE (fndecl) =
721 java_treetreehash_create (10, 1);
722
723 /* Initialize the initialized (static) class table. */
724 if (access_flags & ACC_STATIC)
725 DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
726 htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
727
728 TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
729 TYPE_METHODS (this_class) = fndecl;
730
731 /* Notice that this is a finalizer and update the class type
732 accordingly. This is used to optimize instance allocation. */
733 if (name == finalize_identifier_node
734 && TREE_TYPE (function_type) == void_type_node
735 && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
736 HAS_FINALIZER_P (this_class) = 1;
737
738 if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
739 if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
740 if (access_flags & ACC_PRIVATE)
741 METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
742 if (access_flags & ACC_NATIVE)
743 {
744 METHOD_NATIVE (fndecl) = 1;
745 DECL_EXTERNAL (fndecl) = 1;
746 }
747 if (access_flags & ACC_STATIC)
748 METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
749 if (access_flags & ACC_FINAL)
750 METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
751 if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
752 if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
753 if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
754 if (access_flags & ACC_SYNTHETIC) DECL_ARTIFICIAL (fndecl) = 1;
755 if (access_flags & ACC_BRIDGE) METHOD_BRIDGE (fndecl) = 1;
756 if (access_flags & ACC_VARARGS) METHOD_VARARGS (fndecl) = 1;
757 return fndecl;
758 }
759
760 /* Add a method to THIS_CLASS.
761 The method's name is NAME.
762 Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
763
764 tree
765 add_method (tree this_class, int access_flags, tree name, tree method_sig)
766 {
767 tree function_type, fndecl;
768 const unsigned char *sig
769 = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
770
771 if (sig[0] != '(')
772 fatal_error ("bad method signature");
773
774 function_type = get_type_from_signature (method_sig);
775 fndecl = add_method_1 (this_class, access_flags, name, function_type);
776 set_java_signature (TREE_TYPE (fndecl), method_sig);
777 return fndecl;
778 }
779
780 tree
781 add_field (tree class, tree name, tree field_type, int flags)
782 {
783 int is_static = (flags & ACC_STATIC) != 0;
784 tree field;
785 field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
786 TREE_CHAIN (field) = TYPE_FIELDS (class);
787 TYPE_FIELDS (class) = field;
788 DECL_CONTEXT (field) = class;
789 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (field);
790
791 if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
792 if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
793 if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
794 if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
795 if (flags & ACC_VOLATILE)
796 {
797 FIELD_VOLATILE (field) = 1;
798 TREE_THIS_VOLATILE (field) = 1;
799 }
800 if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
801 if (flags & ACC_ENUM) FIELD_ENUM (field) = 1;
802 if (flags & ACC_SYNTHETIC) FIELD_SYNTHETIC (field) = 1;
803 if (is_static)
804 {
805 FIELD_STATIC (field) = 1;
806 /* Always make field externally visible. This is required so
807 that native methods can always access the field. */
808 TREE_PUBLIC (field) = 1;
809 /* Considered external unless we are compiling it into this
810 object file. */
811 DECL_EXTERNAL (field) = (is_compiled_class (class) != 2);
812 }
813
814 return field;
815 }
816
817 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
818
819 void
820 set_constant_value (tree field, tree constant)
821 {
822 if (field == NULL_TREE)
823 warning (OPT_Wattributes,
824 "misplaced ConstantValue attribute (not in any field)");
825 else if (DECL_INITIAL (field) != NULL_TREE)
826 warning (OPT_Wattributes,
827 "duplicate ConstantValue attribute for field '%s'",
828 IDENTIFIER_POINTER (DECL_NAME (field)));
829 else
830 {
831 DECL_INITIAL (field) = constant;
832 if (TREE_TYPE (constant) != TREE_TYPE (field)
833 && ! (TREE_TYPE (constant) == int_type_node
834 && INTEGRAL_TYPE_P (TREE_TYPE (field))
835 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
836 && ! (TREE_TYPE (constant) == utf8const_ptr_type
837 && TREE_TYPE (field) == string_ptr_type_node))
838 error ("ConstantValue attribute of field '%s' has wrong type",
839 IDENTIFIER_POINTER (DECL_NAME (field)));
840 if (FIELD_FINAL (field))
841 DECL_FIELD_FINAL_IUD (field) = 1;
842 }
843 }
844
845 /* Count the number of Unicode chars encoded in a given Ut8 string. */
846
847 #if 0
848 int
849 strLengthUtf8 (char *str, int len)
850 {
851 register unsigned char* ptr = (unsigned char*) str;
852 register unsigned char *limit = ptr + len;
853 int str_length = 0;
854 for (; ptr < limit; str_length++) {
855 if (UTF8_GET (ptr, limit) < 0)
856 return -1;
857 }
858 return str_length;
859 }
860 #endif
861
862
863 /* Calculate a hash value for a string encoded in Utf8 format.
864 * This returns the same hash value as specified for java.lang.String.hashCode.
865 */
866
867 static int32
868 hashUtf8String (const char *str, int len)
869 {
870 const unsigned char* ptr = (const unsigned char*) str;
871 const unsigned char *limit = ptr + len;
872 int32 hash = 0;
873 for (; ptr < limit;)
874 {
875 int ch = UTF8_GET (ptr, limit);
876 /* Updated specification from
877 http://www.javasoft.com/docs/books/jls/clarify.html. */
878 hash = (31 * hash) + ch;
879 }
880 return hash;
881 }
882
883 static GTY(()) tree utf8_decl_list = NULL_TREE;
884
885 tree
886 build_utf8_ref (tree name)
887 {
888 const char * name_ptr = IDENTIFIER_POINTER(name);
889 int name_len = IDENTIFIER_LENGTH(name);
890 char buf[60];
891 tree ctype, field = NULL_TREE, str_type, cinit, string;
892 static int utf8_count = 0;
893 int name_hash;
894 tree ref = IDENTIFIER_UTF8_REF (name);
895 tree decl;
896 if (ref != NULL_TREE)
897 return ref;
898
899 ctype = make_node (RECORD_TYPE);
900 str_type = build_prim_array_type (unsigned_byte_type_node,
901 name_len + 1); /* Allow for final '\0'. */
902 PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
903 PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
904 PUSH_FIELD (ctype, field, "data", str_type);
905 FINISH_RECORD (ctype);
906 START_RECORD_CONSTRUCTOR (cinit, ctype);
907 name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
908 PUSH_FIELD_VALUE (cinit, "hash", build_int_cst (NULL_TREE, name_hash));
909 PUSH_FIELD_VALUE (cinit, "length", build_int_cst (NULL_TREE, name_len));
910 string = build_string (name_len, name_ptr);
911 TREE_TYPE (string) = str_type;
912 PUSH_FIELD_VALUE (cinit, "data", string);
913 FINISH_RECORD_CONSTRUCTOR (cinit);
914 TREE_CONSTANT (cinit) = 1;
915 TREE_INVARIANT (cinit) = 1;
916
917 /* Generate a unique-enough identifier. */
918 sprintf(buf, "_Utf%d", ++utf8_count);
919
920 decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
921 TREE_STATIC (decl) = 1;
922 DECL_ARTIFICIAL (decl) = 1;
923 DECL_IGNORED_P (decl) = 1;
924 TREE_READONLY (decl) = 1;
925 TREE_THIS_VOLATILE (decl) = 0;
926 DECL_INITIAL (decl) = cinit;
927
928 if (HAVE_GAS_SHF_MERGE)
929 {
930 int decl_size;
931 /* Ensure decl_size is a multiple of utf8const_type's alignment. */
932 decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
933 & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
934 if (flag_merge_constants && decl_size < 256)
935 {
936 char buf[32];
937 int flags = (SECTION_OVERRIDE
938 | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
939 sprintf (buf, ".rodata.jutf8.%d", decl_size);
940 switch_to_section (get_section (buf, flags, NULL));
941 DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
942 }
943 }
944
945 TREE_CHAIN (decl) = utf8_decl_list;
946 layout_decl (decl, 0);
947 pushdecl (decl);
948 rest_of_decl_compilation (decl, global_bindings_p (), 0);
949 varpool_mark_needed_node (varpool_node (decl));
950 utf8_decl_list = decl;
951 ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
952 IDENTIFIER_UTF8_REF (name) = ref;
953 return ref;
954 }
955
956 /* Like build_class_ref, but instead of a direct reference generate a
957 pointer into the constant pool. */
958
959 static tree
960 build_indirect_class_ref (tree type)
961 {
962 int index;
963 tree cl;
964 index = alloc_class_constant (type);
965 cl = build_ref_from_constant_pool (index);
966 return convert (promote_type (class_ptr_type), cl);
967 }
968
969 static tree
970 build_static_class_ref (tree type)
971 {
972 tree decl_name, decl, ref;
973
974 if (TYPE_SIZE (type) == error_mark_node)
975 return null_pointer_node;
976 decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
977 "", '/', '/', ".class$$");
978 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
979 if (decl == NULL_TREE)
980 {
981 decl = build_decl (VAR_DECL, decl_name, class_type_node);
982 TREE_STATIC (decl) = 1;
983 if (! flag_indirect_classes)
984 TREE_PUBLIC (decl) = 1;
985 DECL_IGNORED_P (decl) = 1;
986 DECL_ARTIFICIAL (decl) = 1;
987 if (is_compiled_class (type) == 1)
988 DECL_EXTERNAL (decl) = 1;
989 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
990 DECL_CLASS_FIELD_P (decl) = 1;
991 DECL_CONTEXT (decl) = type;
992
993 /* ??? We want to preserve the DECL_CONTEXT we set just above,
994 that that means not calling pushdecl_top_level. */
995 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
996 }
997
998 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
999 return ref;
1000 }
1001
1002 static tree
1003 build_classdollar_field (tree type)
1004 {
1005 tree decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
1006 "", '/', '/', ".class$");
1007 tree decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1008
1009 if (decl == NULL_TREE)
1010 {
1011 decl
1012 = build_decl (VAR_DECL, decl_name,
1013 (build_type_variant
1014 (build_pointer_type
1015 (build_type_variant (class_type_node,
1016 /* const */ 1, 0)),
1017 /* const */ 1, 0)));
1018 TREE_STATIC (decl) = 1;
1019 TREE_INVARIANT (decl) = 1;
1020 TREE_CONSTANT (decl) = 1;
1021 TREE_READONLY (decl) = 1;
1022 TREE_PUBLIC (decl) = 1;
1023 DECL_IGNORED_P (decl) = 1;
1024 DECL_ARTIFICIAL (decl) = 1;
1025 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
1026 IDENTIFIER_GLOBAL_VALUE (decl_name) = decl;
1027 DECL_CLASS_FIELD_P (decl) = 1;
1028 DECL_CONTEXT (decl) = type;
1029 }
1030
1031 return decl;
1032 }
1033
1034 /* Build a reference to the class TYPE.
1035 Also handles primitive types and array types. */
1036
1037 tree
1038 build_class_ref (tree type)
1039 {
1040 int is_compiled = is_compiled_class (type);
1041 if (is_compiled)
1042 {
1043 tree ref, decl;
1044 if (TREE_CODE (type) == POINTER_TYPE)
1045 type = TREE_TYPE (type);
1046
1047 if (flag_indirect_dispatch
1048 && type != output_class
1049 && TREE_CODE (type) == RECORD_TYPE)
1050 return build_indirect_class_ref (type);
1051
1052 if (type == output_class && flag_indirect_classes)
1053 return build_classdollar_field (type);
1054
1055 if (TREE_CODE (type) == RECORD_TYPE)
1056 return build_static_class_ref (type);
1057 else
1058 {
1059 const char *name;
1060 tree decl_name;
1061 char buffer[25];
1062 if (flag_emit_class_files)
1063 {
1064 const char *prim_class_name;
1065 tree prim_class;
1066 if (type == char_type_node)
1067 prim_class_name = "java.lang.Character";
1068 else if (type == boolean_type_node)
1069 prim_class_name = "java.lang.Boolean";
1070 else if (type == byte_type_node)
1071 prim_class_name = "java.lang.Byte";
1072 else if (type == short_type_node)
1073 prim_class_name = "java.lang.Short";
1074 else if (type == int_type_node)
1075 prim_class_name = "java.lang.Integer";
1076 else if (type == long_type_node)
1077 prim_class_name = "java.lang.Long";
1078 else if (type == float_type_node)
1079 prim_class_name = "java.lang.Float";
1080 else if (type == double_type_node)
1081 prim_class_name = "java.lang.Double";
1082 else if (type == void_type_node)
1083 prim_class_name = "java.lang.Void";
1084 else
1085 gcc_unreachable ();
1086
1087 prim_class = lookup_class (get_identifier (prim_class_name));
1088 /* We wrap the class in a NOP_EXPR, because it is a
1089 type. We can't hold it in the COMPONENT_REF itself,
1090 as that type must remain NULL. */
1091 prim_class = build1 (NOP_EXPR, prim_class, NULL_TREE);
1092
1093 return build3 (COMPONENT_REF, NULL_TREE,
1094 prim_class, TYPE_identifier_node, NULL_TREE);
1095 }
1096 decl_name = TYPE_NAME (type);
1097 if (TREE_CODE (decl_name) == TYPE_DECL)
1098 decl_name = DECL_NAME (decl_name);
1099 name = IDENTIFIER_POINTER (decl_name);
1100 if (strncmp (name, "promoted_", 9) == 0)
1101 name += 9;
1102 sprintf (buffer, "_Jv_%sClass", name);
1103 decl_name = get_identifier (buffer);
1104 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1105 if (decl == NULL_TREE)
1106 {
1107 decl = build_decl (VAR_DECL, decl_name, class_type_node);
1108 TREE_STATIC (decl) = 1;
1109 TREE_PUBLIC (decl) = 1;
1110 DECL_EXTERNAL (decl) = 1;
1111 DECL_ARTIFICIAL (decl) = 1;
1112 pushdecl_top_level (decl);
1113 }
1114 }
1115
1116 ref = build1 (ADDR_EXPR, class_ptr_type, decl);
1117 return ref;
1118 }
1119 else
1120 return build_indirect_class_ref (type);
1121 }
1122
1123 /* Create a local statically allocated variable that will hold a
1124 pointer to a static field. */
1125
1126 static tree
1127 build_fieldref_cache_entry (int index, tree fdecl ATTRIBUTE_UNUSED)
1128 {
1129 tree decl, decl_name;
1130 const char *name = IDENTIFIER_POINTER (mangled_classname ("_cpool_", output_class));
1131 char *buf = alloca (strlen (name) + 20);
1132 sprintf (buf, "%s_%d_ref", name, index);
1133 decl_name = get_identifier (buf);
1134 decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
1135 if (decl == NULL_TREE)
1136 {
1137 decl = build_decl (VAR_DECL, decl_name, ptr_type_node);
1138 TREE_STATIC (decl) = 1;
1139 TREE_PUBLIC (decl) = 0;
1140 DECL_EXTERNAL (decl) = 0;
1141 DECL_ARTIFICIAL (decl) = 1;
1142 DECL_IGNORED_P (decl) = 1;
1143 pushdecl_top_level (decl);
1144 }
1145 return decl;
1146 }
1147
1148 tree
1149 build_static_field_ref (tree fdecl)
1150 {
1151 tree fclass = DECL_CONTEXT (fdecl);
1152 int is_compiled = is_compiled_class (fclass);
1153 int from_class = ! CLASS_FROM_SOURCE_P (current_class);
1154
1155 /* Allow static final fields to fold to a constant. When using
1156 -findirect-dispatch, we simply never do this folding if compiling
1157 from .class; in the .class file constants will be referred to via
1158 the constant pool. */
1159 if ((!flag_indirect_dispatch || !from_class)
1160 && (is_compiled
1161 || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
1162 && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
1163 || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
1164 && TREE_CONSTANT (DECL_INITIAL (fdecl)))))
1165 {
1166 if (is_compiled == 1)
1167 DECL_EXTERNAL (fdecl) = 1;
1168 }
1169 else
1170 {
1171 /* Generate a CONSTANT_FieldRef for FDECL in the constant pool
1172 and a class local static variable CACHE_ENTRY, then
1173
1174 *(fdecl **)((__builtin_expect (cache_entry == null, false))
1175 ? cache_entry = _Jv_ResolvePoolEntry (output_class, cpool_index)
1176 : cache_entry)
1177
1178 This can mostly be optimized away, so that the usual path is a
1179 load followed by a test and branch. _Jv_ResolvePoolEntry is
1180 only called once for each constant pool entry.
1181
1182 There is an optimization that we don't do: at the start of a
1183 method, create a local copy of CACHE_ENTRY and use that instead.
1184
1185 */
1186
1187 int cpool_index = alloc_constant_fieldref (output_class, fdecl);
1188 tree cache_entry = build_fieldref_cache_entry (cpool_index, fdecl);
1189 tree test
1190 = build3 (CALL_EXPR, boolean_type_node,
1191 build_address_of (built_in_decls[BUILT_IN_EXPECT]),
1192 tree_cons (NULL_TREE, build2 (EQ_EXPR, boolean_type_node,
1193 cache_entry, null_pointer_node),
1194 build_tree_list (NULL_TREE, boolean_false_node)),
1195 NULL_TREE);
1196 tree cpool_index_cst = build_int_cst (NULL_TREE, cpool_index);
1197 tree init
1198 = build3 (CALL_EXPR, ptr_type_node,
1199 build_address_of (soft_resolvepoolentry_node),
1200 tree_cons (NULL_TREE, build_class_ref (output_class),
1201 build_tree_list (NULL_TREE, cpool_index_cst)),
1202 NULL_TREE);
1203 init = build2 (MODIFY_EXPR, ptr_type_node, cache_entry, init);
1204 init = build3 (COND_EXPR, ptr_type_node, test, init, cache_entry);
1205 init = fold_convert (build_pointer_type (TREE_TYPE (fdecl)), init);
1206 fdecl = build1 (INDIRECT_REF, TREE_TYPE (fdecl), init);
1207 }
1208 return fdecl;
1209 }
1210
1211 int
1212 get_access_flags_from_decl (tree decl)
1213 {
1214 int access_flags = 0;
1215 if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
1216 {
1217 if (FIELD_STATIC (decl))
1218 access_flags |= ACC_STATIC;
1219 if (FIELD_PUBLIC (decl))
1220 access_flags |= ACC_PUBLIC;
1221 if (FIELD_PROTECTED (decl))
1222 access_flags |= ACC_PROTECTED;
1223 if (FIELD_PRIVATE (decl))
1224 access_flags |= ACC_PRIVATE;
1225 if (FIELD_FINAL (decl))
1226 access_flags |= ACC_FINAL;
1227 if (FIELD_VOLATILE (decl))
1228 access_flags |= ACC_VOLATILE;
1229 if (FIELD_TRANSIENT (decl))
1230 access_flags |= ACC_TRANSIENT;
1231 if (FIELD_ENUM (decl))
1232 access_flags |= ACC_ENUM;
1233 if (FIELD_SYNTHETIC (decl))
1234 access_flags |= ACC_SYNTHETIC;
1235 return access_flags;
1236 }
1237 if (TREE_CODE (decl) == TYPE_DECL)
1238 {
1239 if (CLASS_PUBLIC (decl))
1240 access_flags |= ACC_PUBLIC;
1241 if (CLASS_FINAL (decl))
1242 access_flags |= ACC_FINAL;
1243 if (CLASS_SUPER (decl))
1244 access_flags |= ACC_SUPER;
1245 if (CLASS_INTERFACE (decl))
1246 access_flags |= ACC_INTERFACE;
1247 if (CLASS_ABSTRACT (decl))
1248 access_flags |= ACC_ABSTRACT;
1249 if (CLASS_STATIC (decl))
1250 access_flags |= ACC_STATIC;
1251 if (CLASS_PRIVATE (decl))
1252 access_flags |= ACC_PRIVATE;
1253 if (CLASS_PROTECTED (decl))
1254 access_flags |= ACC_PROTECTED;
1255 if (CLASS_STRICTFP (decl))
1256 access_flags |= ACC_STRICT;
1257 if (CLASS_ENUM (decl))
1258 access_flags |= ACC_ENUM;
1259 if (CLASS_SYNTHETIC (decl))
1260 access_flags |= ACC_SYNTHETIC;
1261 if (CLASS_ANNOTATION (decl))
1262 access_flags |= ACC_ANNOTATION;
1263 return access_flags;
1264 }
1265 if (TREE_CODE (decl) == FUNCTION_DECL)
1266 {
1267 if (METHOD_PUBLIC (decl))
1268 access_flags |= ACC_PUBLIC;
1269 if (METHOD_PRIVATE (decl))
1270 access_flags |= ACC_PRIVATE;
1271 if (METHOD_PROTECTED (decl))
1272 access_flags |= ACC_PROTECTED;
1273 if (METHOD_STATIC (decl))
1274 access_flags |= ACC_STATIC;
1275 if (METHOD_FINAL (decl))
1276 access_flags |= ACC_FINAL;
1277 if (METHOD_SYNCHRONIZED (decl))
1278 access_flags |= ACC_SYNCHRONIZED;
1279 if (METHOD_NATIVE (decl))
1280 access_flags |= ACC_NATIVE;
1281 if (METHOD_ABSTRACT (decl))
1282 access_flags |= ACC_ABSTRACT;
1283 if (METHOD_STRICTFP (decl))
1284 access_flags |= ACC_STRICT;
1285 if (METHOD_INVISIBLE (decl))
1286 access_flags |= ACC_INVISIBLE;
1287 if (DECL_ARTIFICIAL (decl))
1288 access_flags |= ACC_SYNTHETIC;
1289 if (METHOD_BRIDGE (decl))
1290 access_flags |= ACC_BRIDGE;
1291 if (METHOD_VARARGS (decl))
1292 access_flags |= ACC_VARARGS;
1293 return access_flags;
1294 }
1295 gcc_unreachable ();
1296 }
1297
1298 static GTY (()) int alias_labelno = 0;
1299
1300 /* Create a private alias for METHOD. Using this alias instead of the method
1301 decl ensures that ncode entries in the method table point to the real function
1302 at runtime, not a PLT entry. */
1303
1304 static tree
1305 make_local_function_alias (tree method)
1306 {
1307 #ifdef ASM_OUTPUT_DEF
1308 tree alias;
1309
1310 const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
1311 char *name = alloca (strlen (method_name) + 2);
1312 char *buf = alloca (strlen (method_name) + 128);
1313
1314 /* Only create aliases for local functions. */
1315 if (DECL_EXTERNAL (method))
1316 return method;
1317
1318 /* Prefix method_name with 'L' for the alias label. */
1319 *name = 'L';
1320 strcpy (name + 1, method_name);
1321
1322 ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
1323 alias = build_decl (FUNCTION_DECL, get_identifier (buf),
1324 TREE_TYPE (method));
1325 DECL_CONTEXT (alias) = NULL;
1326 TREE_READONLY (alias) = TREE_READONLY (method);
1327 TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
1328 TREE_PUBLIC (alias) = 0;
1329 DECL_EXTERNAL (alias) = 0;
1330 DECL_ARTIFICIAL (alias) = 1;
1331 DECL_INLINE (alias) = 0;
1332 DECL_INITIAL (alias) = error_mark_node;
1333 TREE_ADDRESSABLE (alias) = 1;
1334 TREE_USED (alias) = 1;
1335 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
1336 if (!flag_syntax_only)
1337 assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
1338 return alias;
1339 #else
1340 return method;
1341 #endif
1342 }
1343
1344 /** Make reflection data (_Jv_Field) for field FDECL. */
1345
1346 static tree
1347 make_field_value (tree fdecl)
1348 {
1349 tree finit;
1350 int flags;
1351 tree type = TREE_TYPE (fdecl);
1352 int resolved = is_compiled_class (type) && ! flag_indirect_dispatch;
1353
1354 START_RECORD_CONSTRUCTOR (finit, field_type_node);
1355 PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1356 if (resolved)
1357 type = build_class_ref (type);
1358 else
1359 {
1360 tree signature = build_java_signature (type);
1361
1362 type = build_utf8_ref (unmangle_classname
1363 (IDENTIFIER_POINTER (signature),
1364 IDENTIFIER_LENGTH (signature)));
1365 }
1366 PUSH_FIELD_VALUE (finit, "type", type);
1367
1368 flags = get_access_flags_from_decl (fdecl);
1369 if (! resolved)
1370 flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1371
1372 PUSH_FIELD_VALUE (finit, "accflags", build_int_cst (NULL_TREE, flags));
1373 PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1374
1375 {
1376 tree field_address = integer_zero_node;
1377 if ((DECL_INITIAL (fdecl) || ! flag_indirect_classes)
1378 && FIELD_STATIC (fdecl))
1379 field_address = build_address_of (fdecl);
1380
1381 PUSH_FIELD_VALUE
1382 (finit, "info",
1383 build_constructor_from_list (field_info_union_node,
1384 build_tree_list
1385 ((FIELD_STATIC (fdecl)
1386 ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1387 : TYPE_FIELDS (field_info_union_node)),
1388 (FIELD_STATIC (fdecl)
1389 ? field_address
1390 : byte_position (fdecl)))));
1391 }
1392
1393 FINISH_RECORD_CONSTRUCTOR (finit);
1394 return finit;
1395 }
1396
1397 /** Make reflection data (_Jv_Method) for method MDECL. */
1398
1399 static tree
1400 make_method_value (tree mdecl)
1401 {
1402 static int method_name_count = 0;
1403 tree minit;
1404 tree index;
1405 tree code;
1406 tree class_decl;
1407 #define ACC_TRANSLATED 0x4000
1408 int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1409
1410 class_decl = DECL_CONTEXT (mdecl);
1411 /* For interfaces, the index field contains the dispatch index. */
1412 if (CLASS_INTERFACE (TYPE_NAME (class_decl)))
1413 index = build_int_cst (NULL_TREE,
1414 get_interface_method_index (mdecl, class_decl));
1415 else if (!flag_indirect_dispatch && get_method_index (mdecl) != NULL_TREE)
1416 index = get_method_index (mdecl);
1417 else
1418 index = integer_minus_one_node;
1419
1420 code = null_pointer_node;
1421 if (METHOD_ABSTRACT (mdecl))
1422 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1423 soft_abstractmethod_node);
1424 else
1425 code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
1426 make_local_function_alias (mdecl));
1427 START_RECORD_CONSTRUCTOR (minit, method_type_node);
1428 PUSH_FIELD_VALUE (minit, "name",
1429 build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1430 init_identifier_node
1431 : DECL_NAME (mdecl)));
1432 {
1433 tree signature = build_java_signature (TREE_TYPE (mdecl));
1434 PUSH_FIELD_VALUE (minit, "signature",
1435 (build_utf8_ref
1436 (unmangle_classname
1437 (IDENTIFIER_POINTER(signature),
1438 IDENTIFIER_LENGTH(signature)))));
1439 }
1440 PUSH_FIELD_VALUE (minit, "accflags", build_int_cst (NULL_TREE, accflags));
1441 PUSH_FIELD_VALUE (minit, "index", index);
1442 PUSH_FIELD_VALUE (minit, "ncode", code);
1443
1444 {
1445 /* Compute the `throws' information for the method. */
1446 tree table = null_pointer_node;
1447 if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1448 {
1449 int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1450 tree iter, type, array;
1451 char buf[60];
1452
1453 table = tree_cons (NULL_TREE, table, NULL_TREE);
1454 for (iter = DECL_FUNCTION_THROWS (mdecl);
1455 iter != NULL_TREE;
1456 iter = TREE_CHAIN (iter))
1457 {
1458 tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1459 tree utf8
1460 = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1461 IDENTIFIER_LENGTH (sig)));
1462 table = tree_cons (NULL_TREE, utf8, table);
1463 }
1464 type = build_prim_array_type (ptr_type_node, length);
1465 table = build_constructor_from_list (type, table);
1466 /* Compute something unique enough. */
1467 sprintf (buf, "_methods%d", method_name_count++);
1468 array = build_decl (VAR_DECL, get_identifier (buf), type);
1469 DECL_INITIAL (array) = table;
1470 TREE_STATIC (array) = 1;
1471 DECL_ARTIFICIAL (array) = 1;
1472 DECL_IGNORED_P (array) = 1;
1473 rest_of_decl_compilation (array, 1, 0);
1474
1475 table = build1 (ADDR_EXPR, ptr_type_node, array);
1476 }
1477
1478 PUSH_FIELD_VALUE (minit, "throws", table);
1479 }
1480
1481 FINISH_RECORD_CONSTRUCTOR (minit);
1482 return minit;
1483 }
1484
1485 static tree
1486 get_dispatch_vector (tree type)
1487 {
1488 tree vtable = TYPE_VTABLE (type);
1489
1490 if (vtable == NULL_TREE)
1491 {
1492 HOST_WIDE_INT i;
1493 tree method;
1494 tree super = CLASSTYPE_SUPER (type);
1495 HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1496 vtable = make_tree_vec (nvirtuals);
1497 TYPE_VTABLE (type) = vtable;
1498 if (super != NULL_TREE)
1499 {
1500 tree super_vtable = get_dispatch_vector (super);
1501
1502 for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1503 TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1504 }
1505
1506 for (method = TYPE_METHODS (type); method != NULL_TREE;
1507 method = TREE_CHAIN (method))
1508 {
1509 tree method_index = get_method_index (method);
1510 if (method_index != NULL_TREE
1511 && host_integerp (method_index, 0))
1512 TREE_VEC_ELT (vtable, tree_low_cst (method_index, 0)) = method;
1513 }
1514 }
1515
1516 return vtable;
1517 }
1518
1519 static tree
1520 get_dispatch_table (tree type, tree this_class_addr)
1521 {
1522 int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1523 tree vtable = get_dispatch_vector (type);
1524 int i, j;
1525 tree list = NULL_TREE;
1526 int nvirtuals = TREE_VEC_LENGTH (vtable);
1527 int arraysize;
1528 tree gc_descr;
1529
1530 for (i = nvirtuals; --i >= 0; )
1531 {
1532 tree method = TREE_VEC_ELT (vtable, i);
1533 if (METHOD_ABSTRACT (method))
1534 {
1535 if (! abstract_p)
1536 warning (0, "%Jabstract method in non-abstract class", method);
1537
1538 if (TARGET_VTABLE_USES_DESCRIPTORS)
1539 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1540 list = tree_cons (NULL_TREE, null_pointer_node, list);
1541 else
1542 list = tree_cons (NULL_TREE, null_pointer_node, list);
1543 }
1544 else
1545 {
1546 if (TARGET_VTABLE_USES_DESCRIPTORS)
1547 for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1548 {
1549 tree fdesc = build2 (FDESC_EXPR, nativecode_ptr_type_node,
1550 method, build_int_cst (NULL_TREE, j));
1551 TREE_CONSTANT (fdesc) = 1;
1552 TREE_INVARIANT (fdesc) = 1;
1553 list = tree_cons (NULL_TREE, fdesc, list);
1554 }
1555 else
1556 list = tree_cons (NULL_TREE,
1557 build1 (ADDR_EXPR, nativecode_ptr_type_node,
1558 method),
1559 list);
1560 }
1561 }
1562
1563 /* Dummy entry for compatibility with G++ -fvtable-thunks. When
1564 using the Boehm GC we sometimes stash a GC type descriptor
1565 there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1566 the emitted byte count during the output to the assembly file. */
1567 /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1568 fake "function descriptor". It's first word is the is the class
1569 pointer, and subsequent words (usually one) contain the GC descriptor.
1570 In all other cases, we reserve two extra vtable slots. */
1571 gc_descr = get_boehm_type_descriptor (type);
1572 list = tree_cons (NULL_TREE, gc_descr, list);
1573 for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1574 list = tree_cons (NULL_TREE, gc_descr, list);
1575 list = tree_cons (NULL_TREE, this_class_addr, list);
1576
1577 /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1578 list = tree_cons (NULL_TREE, null_pointer_node, list);
1579 /** Offset to start of whole object. Always (ptrdiff_t)0 for Java. */
1580 list = tree_cons (integer_zero_node, null_pointer_node, list);
1581
1582 arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1583 if (TARGET_VTABLE_USES_DESCRIPTORS)
1584 arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1585 arraysize += 2;
1586 return build_constructor_from_list
1587 (build_prim_array_type (nativecode_ptr_type_node,
1588 arraysize), list);
1589 }
1590
1591
1592 /* Set the method_index for a method decl. */
1593 void
1594 set_method_index (tree decl, tree method_index)
1595 {
1596 if (method_index != NULL_TREE)
1597 {
1598 /* method_index is null if we're using indirect dispatch. */
1599 method_index = fold (convert (sizetype, method_index));
1600
1601 if (TARGET_VTABLE_USES_DESCRIPTORS)
1602 /* Add one to skip bogus descriptor for class and GC descriptor. */
1603 method_index = size_binop (PLUS_EXPR, method_index, size_int (1));
1604 else
1605 /* Add 1 to skip "class" field of dtable, and 1 to skip GC
1606 descriptor. */
1607 method_index = size_binop (PLUS_EXPR, method_index, size_int (2));
1608 }
1609
1610 DECL_VINDEX (decl) = method_index;
1611 }
1612
1613 /* Get the method_index for a method decl. */
1614 tree
1615 get_method_index (tree decl)
1616 {
1617 tree method_index = DECL_VINDEX (decl);
1618
1619 if (! method_index)
1620 return NULL;
1621
1622 if (TARGET_VTABLE_USES_DESCRIPTORS)
1623 /* Sub one to skip bogus descriptor for class and GC descriptor. */
1624 method_index = size_binop (MINUS_EXPR, method_index, size_int (1));
1625 else
1626 /* Sub 1 to skip "class" field of dtable, and 1 to skip GC descriptor. */
1627 method_index = size_binop (MINUS_EXPR, method_index, size_int (2));
1628
1629 return method_index;
1630 }
1631
1632 static int
1633 supers_all_compiled (tree type)
1634 {
1635 while (type != NULL_TREE)
1636 {
1637 if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1638 return 0;
1639 type = CLASSTYPE_SUPER (type);
1640 }
1641 return 1;
1642 }
1643
1644 void
1645 make_class_data (tree type)
1646 {
1647 tree decl, cons, temp;
1648 tree field, fields_decl;
1649 tree static_fields = NULL_TREE;
1650 tree instance_fields = NULL_TREE;
1651 HOST_WIDE_INT static_field_count = 0;
1652 HOST_WIDE_INT instance_field_count = 0;
1653 HOST_WIDE_INT field_count;
1654 tree field_array_type;
1655 tree method;
1656 tree methods = NULL_TREE;
1657 tree dtable_decl = NULL_TREE;
1658 HOST_WIDE_INT method_count = 0;
1659 tree method_array_type;
1660 tree methods_decl;
1661 tree super;
1662 tree this_class_addr;
1663 tree constant_pool_constructor;
1664 tree interfaces = null_pointer_node;
1665 int interface_len = 0;
1666 int uses_jv_markobj = 0;
1667 tree type_decl = TYPE_NAME (type);
1668 tree id_main = get_identifier("main");
1669 tree id_class = get_identifier("java.lang.Class");
1670 /** Offset from start of virtual function table declaration
1671 to where objects actually point at, following new g++ ABI. */
1672 tree dtable_start_offset = build_int_cst (NULL_TREE,
1673 2 * POINTER_SIZE / BITS_PER_UNIT);
1674 VEC(int, heap) *field_indexes;
1675 tree first_real_field;
1676
1677 this_class_addr = build_static_class_ref (type);
1678 decl = TREE_OPERAND (this_class_addr, 0);
1679
1680 if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1681 && !flag_indirect_dispatch)
1682 {
1683 tree dtable = get_dispatch_table (type, this_class_addr);
1684 uses_jv_markobj = uses_jv_markobj_p (dtable);
1685 if (type == class_type_node && class_dtable_decl != NULL_TREE)
1686 {
1687 /* We've already created some other class, and consequently
1688 we made class_dtable_decl. Now we just want to fill it
1689 in. */
1690 dtable_decl = class_dtable_decl;
1691 }
1692 else
1693 {
1694 dtable_decl = build_dtable_decl (type);
1695 TREE_STATIC (dtable_decl) = 1;
1696 DECL_ARTIFICIAL (dtable_decl) = 1;
1697 DECL_IGNORED_P (dtable_decl) = 1;
1698 }
1699
1700 TREE_PUBLIC (dtable_decl) = 1;
1701 DECL_INITIAL (dtable_decl) = dtable;
1702 if (! flag_indirect_classes)
1703 rest_of_decl_compilation (dtable_decl, 1, 0);
1704 /* Maybe we're compiling Class as the first class. If so, set
1705 class_dtable_decl to the decl we just made. */
1706 if (type == class_type_node && class_dtable_decl == NULL_TREE)
1707 class_dtable_decl = dtable_decl;
1708 }
1709
1710 /* Build Field array. */
1711 field = TYPE_FIELDS (type);
1712 while (field && DECL_ARTIFICIAL (field))
1713 field = TREE_CHAIN (field); /* Skip dummy fields. */
1714 if (field && DECL_NAME (field) == NULL_TREE)
1715 field = TREE_CHAIN (field); /* Skip dummy field for inherited data. */
1716 first_real_field = field;
1717
1718 /* First count static and instance fields. */
1719 for ( ; field != NULL_TREE; field = TREE_CHAIN (field))
1720 {
1721 if (! DECL_ARTIFICIAL (field))
1722 {
1723 if (FIELD_STATIC (field))
1724 static_field_count++;
1725 else if (uses_jv_markobj || !flag_reduced_reflection)
1726 instance_field_count++;
1727 }
1728 }
1729 field_count = static_field_count + instance_field_count;
1730 field_indexes = VEC_alloc (int, heap, field_count);
1731
1732 /* gcj sorts fields so that static fields come first, followed by
1733 instance fields. Unfortunately, by the time this takes place we
1734 have already generated the reflection_data for this class, and
1735 that data contians indexes into the fields. So, we generate a
1736 permutation that maps each original field index to its final
1737 position. Then we pass this permutation to
1738 rewrite_reflection_indexes(), which fixes up the reflection
1739 data. */
1740 {
1741 int i;
1742 int static_count = 0;
1743 int instance_count = static_field_count;
1744 int field_index;
1745
1746 for (i = 0, field = first_real_field;
1747 field != NULL_TREE;
1748 field = TREE_CHAIN (field), i++)
1749 {
1750 if (! DECL_ARTIFICIAL (field))
1751 {
1752 field_index = 0;
1753 if (FIELD_STATIC (field))
1754 field_index = static_count++;
1755 else if (uses_jv_markobj || !flag_reduced_reflection)
1756 field_index = instance_count++;
1757 VEC_quick_push (int, field_indexes, field_index);
1758 }
1759 }
1760 }
1761
1762 for (field = first_real_field; field != NULL_TREE;
1763 field = TREE_CHAIN (field))
1764 {
1765 if (! DECL_ARTIFICIAL (field))
1766 {
1767 if (FIELD_STATIC (field))
1768 {
1769 /* We must always create reflection data for static fields
1770 as it is used in the creation of the field itself. */
1771 tree init = make_field_value (field);
1772 tree initial = DECL_INITIAL (field);
1773 static_fields = tree_cons (NULL_TREE, init, static_fields);
1774 /* If the initial value is a string constant,
1775 prevent output_constant from trying to assemble the value. */
1776 if (initial != NULL_TREE
1777 && TREE_TYPE (initial) == string_ptr_type_node)
1778 DECL_INITIAL (field) = NULL_TREE;
1779 rest_of_decl_compilation (field, 1, 1);
1780 DECL_INITIAL (field) = initial;
1781 }
1782 else if (uses_jv_markobj || !flag_reduced_reflection)
1783 {
1784 tree init = make_field_value (field);
1785 instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1786 }
1787 }
1788 }
1789
1790 if (field_count > 0)
1791 {
1792 static_fields = nreverse (static_fields);
1793 instance_fields = nreverse (instance_fields);
1794 static_fields = chainon (static_fields, instance_fields);
1795 field_array_type = build_prim_array_type (field_type_node, field_count);
1796 fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1797 field_array_type);
1798 DECL_INITIAL (fields_decl) = build_constructor_from_list
1799 (field_array_type, static_fields);
1800 TREE_STATIC (fields_decl) = 1;
1801 DECL_ARTIFICIAL (fields_decl) = 1;
1802 DECL_IGNORED_P (fields_decl) = 1;
1803 rest_of_decl_compilation (fields_decl, 1, 0);
1804 }
1805 else
1806 fields_decl = NULL_TREE;
1807
1808 /* Build Method array. */
1809 for (method = TYPE_METHODS (type);
1810 method != NULL_TREE; method = TREE_CHAIN (method))
1811 {
1812 tree init;
1813 if (METHOD_PRIVATE (method)
1814 && ! flag_keep_inline_functions
1815 && optimize)
1816 continue;
1817 /* Even if we have a decl, we don't necessarily have the code.
1818 This can happen if we inherit a method from a superclass for
1819 which we don't have a .class file. */
1820 if (METHOD_DUMMY (method))
1821 continue;
1822
1823 /* Generate method reflection data if:
1824
1825 - !flag_reduced_reflection.
1826
1827 - <clinit> -- The runtime uses reflection to initialize the
1828 class.
1829
1830 - Any method in class java.lang.Class -- Class.forName() and
1831 perhaps other things require it.
1832
1833 - class$ -- It does not work if reflection data missing.
1834
1835 - main -- Reflection is used to find main(String[]) methods.
1836
1837 - public not static -- It is potentially part of an
1838 interface. The runtime uses reflection data to build
1839 interface dispatch tables. */
1840 if (!flag_reduced_reflection
1841 || DECL_CLINIT_P (method)
1842 || DECL_NAME (type_decl) == id_class
1843 || DECL_NAME (method) == id_main
1844 || (METHOD_PUBLIC (method) && !METHOD_STATIC (method))
1845 || TYPE_DOT_CLASS (type) == method)
1846 {
1847 init = make_method_value (method);
1848 method_count++;
1849 methods = tree_cons (NULL_TREE, init, methods);
1850 }
1851 }
1852 method_array_type = build_prim_array_type (method_type_node, method_count);
1853 methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1854 method_array_type);
1855 DECL_INITIAL (methods_decl) = build_constructor_from_list
1856 (method_array_type, nreverse (methods));
1857 TREE_STATIC (methods_decl) = 1;
1858 DECL_ARTIFICIAL (methods_decl) = 1;
1859 DECL_IGNORED_P (methods_decl) = 1;
1860 rest_of_decl_compilation (methods_decl, 1, 0);
1861
1862 if (class_dtable_decl == NULL_TREE)
1863 {
1864 class_dtable_decl = build_dtable_decl (class_type_node);
1865 TREE_STATIC (class_dtable_decl) = 1;
1866 DECL_ARTIFICIAL (class_dtable_decl) = 1;
1867 DECL_IGNORED_P (class_dtable_decl) = 1;
1868 if (is_compiled_class (class_type_node) != 2)
1869 {
1870 DECL_EXTERNAL (class_dtable_decl) = 1;
1871 rest_of_decl_compilation (class_dtable_decl, 1, 0);
1872 }
1873 }
1874
1875 super = CLASSTYPE_SUPER (type);
1876 if (super == NULL_TREE)
1877 super = null_pointer_node;
1878 else if (! flag_indirect_dispatch
1879 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1880 && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1881 super = build_class_ref (super);
1882 else
1883 {
1884 int super_index = alloc_class_constant (super);
1885 super = build_int_cst (ptr_type_node, super_index);
1886 }
1887
1888 /* Build and emit the array of implemented interfaces. */
1889 if (type != object_type_node)
1890 interface_len = BINFO_N_BASE_BINFOS (TYPE_BINFO (type)) - 1;
1891
1892 if (interface_len > 0)
1893 {
1894 tree init = NULL_TREE;
1895 int i;
1896 tree interface_array_type, idecl;
1897 interface_array_type
1898 = build_prim_array_type (class_ptr_type, interface_len);
1899 idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1900 interface_array_type);
1901
1902 for (i = interface_len; i > 0; i--)
1903 {
1904 tree child = BINFO_BASE_BINFO (TYPE_BINFO (type), i);
1905 tree iclass = BINFO_TYPE (child);
1906 tree index;
1907 if (! flag_indirect_dispatch
1908 && (assume_compiled
1909 (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass))))))
1910 index = build_class_ref (iclass);
1911 else
1912 {
1913 int int_index = alloc_class_constant (iclass);
1914 index = build_int_cst (ptr_type_node, int_index);
1915 }
1916 init = tree_cons (NULL_TREE, index, init);
1917 }
1918 DECL_INITIAL (idecl) = build_constructor_from_list (interface_array_type,
1919 init);
1920 TREE_STATIC (idecl) = 1;
1921 DECL_ARTIFICIAL (idecl) = 1;
1922 DECL_IGNORED_P (idecl) = 1;
1923 interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1924 rest_of_decl_compilation (idecl, 1, 0);
1925 }
1926
1927 constant_pool_constructor = build_constants_constructor ();
1928
1929 if (flag_indirect_dispatch)
1930 {
1931 TYPE_OTABLE_DECL (type)
1932 = emit_symbol_table
1933 (DECL_NAME (TYPE_OTABLE_DECL (type)),
1934 TYPE_OTABLE_DECL (type), TYPE_OTABLE_METHODS (type),
1935 TYPE_OTABLE_SYMS_DECL (type), integer_type_node, 1);
1936
1937 TYPE_ATABLE_DECL (type)
1938 = emit_symbol_table
1939 (DECL_NAME (TYPE_ATABLE_DECL (type)),
1940 TYPE_ATABLE_DECL (type), TYPE_ATABLE_METHODS (type),
1941 TYPE_ATABLE_SYMS_DECL (type), ptr_type_node, 1);
1942
1943 TYPE_ITABLE_DECL (type)
1944 = emit_symbol_table
1945 (DECL_NAME (TYPE_ITABLE_DECL (type)),
1946 TYPE_ITABLE_DECL (type), TYPE_ITABLE_METHODS (type),
1947 TYPE_ITABLE_SYMS_DECL (type), ptr_type_node, 2);
1948 }
1949
1950 TYPE_CTABLE_DECL (type) = emit_catch_table (type);
1951
1952 START_RECORD_CONSTRUCTOR (temp, object_type_node);
1953 PUSH_FIELD_VALUE (temp, "vtable",
1954 (flag_indirect_classes
1955 ? null_pointer_node
1956 : build2 (PLUS_EXPR, dtable_ptr_type,
1957 build1 (ADDR_EXPR, dtable_ptr_type,
1958 class_dtable_decl),
1959 dtable_start_offset)));
1960 if (! flag_hash_synchronization)
1961 PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1962 FINISH_RECORD_CONSTRUCTOR (temp);
1963 START_RECORD_CONSTRUCTOR (cons, class_type_node);
1964 PUSH_SUPER_VALUE (cons, temp);
1965 PUSH_FIELD_VALUE (cons, "next_or_version", gcj_abi_version);
1966 PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1967 PUSH_FIELD_VALUE (cons, "accflags",
1968 build_int_cst (NULL_TREE,
1969 get_access_flags_from_decl (type_decl)));
1970
1971 PUSH_FIELD_VALUE (cons, "superclass",
1972 CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1973 PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1974 PUSH_FIELD_VALUE (cons, "methods",
1975 methods_decl == NULL_TREE ? null_pointer_node
1976 : build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1977 PUSH_FIELD_VALUE (cons, "method_count",
1978 build_int_cst (NULL_TREE, method_count));
1979
1980 if (flag_indirect_dispatch)
1981 PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node);
1982 else
1983 PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1984
1985 PUSH_FIELD_VALUE (cons, "fields",
1986 fields_decl == NULL_TREE ? null_pointer_node
1987 : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1988 /* If we're using the binary compatibility ABI we don't know the
1989 size until load time. */
1990 PUSH_FIELD_VALUE (cons, "size_in_bytes",
1991 (flag_indirect_dispatch
1992 ? integer_minus_one_node
1993 : size_in_bytes (type)));
1994 PUSH_FIELD_VALUE (cons, "field_count",
1995 build_int_cst (NULL_TREE, field_count));
1996 PUSH_FIELD_VALUE (cons, "static_field_count",
1997 build_int_cst (NULL_TREE, static_field_count));
1998
1999 if (flag_indirect_dispatch)
2000 PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node);
2001 else
2002 PUSH_FIELD_VALUE (cons, "vtable",
2003 dtable_decl == NULL_TREE ? null_pointer_node
2004 : build2 (PLUS_EXPR, dtable_ptr_type,
2005 build1 (ADDR_EXPR, dtable_ptr_type,
2006 dtable_decl),
2007 dtable_start_offset));
2008 if (TYPE_OTABLE_METHODS (type) == NULL_TREE)
2009 {
2010 PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
2011 PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
2012 }
2013 else
2014 {
2015 pushdecl_top_level (TYPE_OTABLE_SYMS_DECL (type));
2016 PUSH_FIELD_VALUE (cons, "otable",
2017 build1 (ADDR_EXPR, otable_ptr_type, TYPE_OTABLE_DECL (type)));
2018 PUSH_FIELD_VALUE (cons, "otable_syms",
2019 build1 (ADDR_EXPR, symbols_array_ptr_type,
2020 TYPE_OTABLE_SYMS_DECL (type)));
2021 TREE_CONSTANT (TYPE_OTABLE_DECL (type)) = 1;
2022 TREE_INVARIANT (TYPE_OTABLE_DECL (type)) = 1;
2023 }
2024 if (TYPE_ATABLE_METHODS(type) == NULL_TREE)
2025 {
2026 PUSH_FIELD_VALUE (cons, "atable", null_pointer_node);
2027 PUSH_FIELD_VALUE (cons, "atable_syms", null_pointer_node);
2028 }
2029 else
2030 {
2031 pushdecl_top_level (TYPE_ATABLE_SYMS_DECL (type));
2032 PUSH_FIELD_VALUE (cons, "atable",
2033 build1 (ADDR_EXPR, atable_ptr_type, TYPE_ATABLE_DECL (type)));
2034 PUSH_FIELD_VALUE (cons, "atable_syms",
2035 build1 (ADDR_EXPR, symbols_array_ptr_type,
2036 TYPE_ATABLE_SYMS_DECL (type)));
2037 TREE_CONSTANT (TYPE_ATABLE_DECL (type)) = 1;
2038 TREE_INVARIANT (TYPE_ATABLE_DECL (type)) = 1;
2039 }
2040 if (TYPE_ITABLE_METHODS(type) == NULL_TREE)
2041 {
2042 PUSH_FIELD_VALUE (cons, "itable", null_pointer_node);
2043 PUSH_FIELD_VALUE (cons, "itable_syms", null_pointer_node);
2044 }
2045 else
2046 {
2047 pushdecl_top_level (TYPE_ITABLE_SYMS_DECL (type));
2048 PUSH_FIELD_VALUE (cons, "itable",
2049 build1 (ADDR_EXPR, itable_ptr_type, TYPE_ITABLE_DECL (type)));
2050 PUSH_FIELD_VALUE (cons, "itable_syms",
2051 build1 (ADDR_EXPR, symbols_array_ptr_type,
2052 TYPE_ITABLE_SYMS_DECL (type)));
2053 TREE_CONSTANT (TYPE_ITABLE_DECL (type)) = 1;
2054 TREE_INVARIANT (TYPE_ITABLE_DECL (type)) = 1;
2055 }
2056
2057 PUSH_FIELD_VALUE (cons, "catch_classes",
2058 build1 (ADDR_EXPR, ptr_type_node, TYPE_CTABLE_DECL (type)));
2059 PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
2060 PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
2061 PUSH_FIELD_VALUE (cons, "interface_count",
2062 build_int_cst (NULL_TREE, interface_len));
2063 PUSH_FIELD_VALUE (cons, "state",
2064 convert (byte_type_node,
2065 build_int_cst (NULL_TREE, JV_STATE_PRELOADING)));
2066
2067 PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
2068 PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
2069 PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
2070 PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
2071 PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
2072 PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
2073
2074 {
2075 tree assertion_table_ref;
2076 if (TYPE_ASSERTIONS (type) == NULL)
2077 assertion_table_ref = null_pointer_node;
2078 else
2079 assertion_table_ref = build1 (ADDR_EXPR,
2080 build_pointer_type (assertion_table_type),
2081 emit_assertion_table (type));
2082
2083 PUSH_FIELD_VALUE (cons, "assertion_table", assertion_table_ref);
2084 }
2085
2086 PUSH_FIELD_VALUE (cons, "hack_signers", null_pointer_node);
2087 PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
2088 PUSH_FIELD_VALUE (cons, "aux_info", null_pointer_node);
2089 PUSH_FIELD_VALUE (cons, "engine", null_pointer_node);
2090
2091 if (TYPE_REFLECTION_DATA (current_class))
2092 {
2093 int i;
2094 int count = TYPE_REFLECTION_DATASIZE (current_class);
2095 VEC (constructor_elt, gc) *v
2096 = VEC_alloc (constructor_elt, gc, count);
2097 unsigned char *data = TYPE_REFLECTION_DATA (current_class);
2098 tree max_index = build_int_cst (sizetype, count);
2099 tree index = build_index_type (max_index);
2100 tree type = build_array_type (unsigned_byte_type_node, index);
2101 char buf[64];
2102 tree array;
2103 static int reflection_data_count;
2104
2105 sprintf (buf, "_reflection_data_%d", reflection_data_count++);
2106 array = build_decl (VAR_DECL, get_identifier (buf), type);
2107
2108 rewrite_reflection_indexes (field_indexes);
2109
2110 for (i = 0; i < count; i++)
2111 {
2112 constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
2113 elt->index = build_int_cst (sizetype, i);
2114 elt->value = build_int_cstu (byte_type_node, data[i]);
2115 }
2116
2117 DECL_INITIAL (array) = build_constructor (type, v);
2118 TREE_STATIC (array) = 1;
2119 DECL_ARTIFICIAL (array) = 1;
2120 DECL_IGNORED_P (array) = 1;
2121 TREE_READONLY (array) = 1;
2122 TREE_CONSTANT (DECL_INITIAL (array)) = 1;
2123 rest_of_decl_compilation (array, 1, 0);
2124
2125 PUSH_FIELD_VALUE (cons, "reflection_data", build_address_of (array));
2126
2127 free (data);
2128 TYPE_REFLECTION_DATA (current_class) = NULL;
2129 }
2130 else
2131 PUSH_FIELD_VALUE (cons, "reflection_data", null_pointer_node);
2132
2133 FINISH_RECORD_CONSTRUCTOR (cons);
2134
2135 DECL_INITIAL (decl) = cons;
2136
2137 /* Hash synchronization requires at least 64-bit alignment. */
2138 if (flag_hash_synchronization && POINTER_SIZE < 64)
2139 DECL_ALIGN (decl) = 64;
2140
2141 if (flag_indirect_classes)
2142 {
2143 TREE_READONLY (decl) = 1;
2144 TREE_CONSTANT (DECL_INITIAL (decl)) = 1;
2145 }
2146
2147 rest_of_decl_compilation (decl, 1, 0);
2148
2149 {
2150 tree classdollar_field = build_classdollar_field (type);
2151 if (!flag_indirect_classes)
2152 DECL_INITIAL (classdollar_field) = build_static_class_ref (type);
2153 rest_of_decl_compilation (classdollar_field, 1, 0);
2154 }
2155
2156 TYPE_OTABLE_DECL (type) = NULL_TREE;
2157 TYPE_ATABLE_DECL (type) = NULL_TREE;
2158 TYPE_CTABLE_DECL (type) = NULL_TREE;
2159 }
2160
2161 void
2162 finish_class (void)
2163 {
2164 if (TYPE_VERIFY_METHOD (output_class))
2165 {
2166 tree verify_method = TYPE_VERIFY_METHOD (output_class);
2167 DECL_SAVED_TREE (verify_method)
2168 = add_stmt_to_compound (DECL_SAVED_TREE (verify_method), void_type_node,
2169 build1 (RETURN_EXPR, void_type_node, NULL));
2170 java_genericize (verify_method);
2171 cgraph_finalize_function (verify_method, false);
2172 TYPE_ASSERTIONS (current_class) = NULL;
2173 }
2174
2175 java_expand_catch_classes (current_class);
2176
2177 current_function_decl = NULL_TREE;
2178 TYPE_DECL_SUPPRESS_DEBUG (TYPE_NAME (current_class)) = 0;
2179 make_class_data (current_class);
2180 register_class ();
2181 rest_of_decl_compilation (TYPE_NAME (current_class), 1, 0);
2182 }
2183
2184 /* Return 2 if CLASS is compiled by this compilation job;
2185 return 1 if CLASS can otherwise be assumed to be compiled;
2186 return 0 if we cannot assume that CLASS is compiled.
2187 Returns 1 for primitive and 0 for array types. */
2188 int
2189 is_compiled_class (tree class)
2190 {
2191 int seen_in_zip;
2192 if (TREE_CODE (class) == POINTER_TYPE)
2193 class = TREE_TYPE (class);
2194 if (TREE_CODE (class) != RECORD_TYPE) /* Primitive types are static. */
2195 return 1;
2196 if (TYPE_ARRAY_P (class))
2197 return 0;
2198 /* We have to check this explicitly to avoid trying to load a class
2199 that we're currently parsing. */
2200 if (class == current_class)
2201 return 2;
2202
2203 seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
2204 if (CLASS_FROM_CURRENTLY_COMPILED_P (class))
2205 {
2206 /* The class was seen in the current ZIP file and will be
2207 available as a compiled class in the future but may not have
2208 been loaded already. Load it if necessary. This prevent
2209 build_class_ref () from crashing. */
2210
2211 if (seen_in_zip && !CLASS_LOADED_P (class))
2212 load_class (class, 1);
2213
2214 /* We return 2 for class seen in ZIP and class from files
2215 belonging to the same compilation unit */
2216 return 2;
2217 }
2218
2219 if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
2220 {
2221 if (!CLASS_LOADED_P (class))
2222 {
2223 if (CLASS_FROM_SOURCE_P (class))
2224 safe_layout_class (class);
2225 else
2226 load_class (class, 1);
2227 }
2228 return 1;
2229 }
2230
2231 return 0;
2232 }
2233
2234 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
2235
2236 tree
2237 build_dtable_decl (tree type)
2238 {
2239 tree dtype, decl;
2240
2241 /* We need to build a new dtable type so that its size is uniquely
2242 computed when we're dealing with the class for real and not just
2243 faking it (like java.lang.Class during the initialization of the
2244 compiler.) We know we're not faking a class when CURRENT_CLASS is
2245 TYPE. */
2246 if (current_class == type)
2247 {
2248 tree dummy = NULL_TREE;
2249 int n;
2250
2251 dtype = make_node (RECORD_TYPE);
2252
2253 PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
2254 PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
2255
2256 PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
2257 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2258 {
2259 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2260 TREE_CHAIN (dummy) = tmp_field;
2261 DECL_CONTEXT (tmp_field) = dtype;
2262 DECL_ARTIFICIAL (tmp_field) = 1;
2263 dummy = tmp_field;
2264 }
2265
2266 PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
2267 for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
2268 {
2269 tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
2270 TREE_CHAIN (dummy) = tmp_field;
2271 DECL_CONTEXT (tmp_field) = dtype;
2272 DECL_ARTIFICIAL (tmp_field) = 1;
2273 dummy = tmp_field;
2274 }
2275
2276 n = TREE_VEC_LENGTH (get_dispatch_vector (type));
2277 if (TARGET_VTABLE_USES_DESCRIPTORS)
2278 n *= TARGET_VTABLE_USES_DESCRIPTORS;
2279
2280 PUSH_FIELD (dtype, dummy, "methods",
2281 build_prim_array_type (nativecode_ptr_type_node, n));
2282 layout_type (dtype);
2283 }
2284 else
2285 dtype = dtable_type;
2286
2287 decl = build_decl (VAR_DECL, get_identifier ("vt$"), dtype);
2288 DECL_CONTEXT (decl) = type;
2289 MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
2290 DECL_VTABLE_P (decl) = 1;
2291
2292 return decl;
2293 }
2294
2295 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
2296 fields inherited from SUPER_CLASS. */
2297
2298 void
2299 push_super_field (tree this_class, tree super_class)
2300 {
2301 tree base_decl;
2302 /* Don't insert the field if we're just re-laying the class out. */
2303 if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
2304 return;
2305 base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
2306 DECL_IGNORED_P (base_decl) = 1;
2307 TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
2308 TYPE_FIELDS (this_class) = base_decl;
2309 DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
2310 DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
2311 }
2312
2313 /* Handle the different manners we may have to lay out a super class. */
2314
2315 static tree
2316 maybe_layout_super_class (tree super_class, tree this_class ATTRIBUTE_UNUSED)
2317 {
2318 if (!super_class)
2319 return NULL_TREE;
2320 else if (TREE_CODE (super_class) == RECORD_TYPE)
2321 {
2322 if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
2323 safe_layout_class (super_class);
2324 if (!CLASS_LOADED_P (super_class))
2325 load_class (super_class, 1);
2326 }
2327 /* We might have to layout the class before its dependency on
2328 the super class gets resolved by java_complete_class */
2329 else if (TREE_CODE (super_class) == POINTER_TYPE)
2330 {
2331 if (TREE_TYPE (super_class) != NULL_TREE)
2332 super_class = TREE_TYPE (super_class);
2333 else
2334 {
2335 #if 0
2336 /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
2337 we give it one. */
2338 tree this_wrap = NULL_TREE;
2339
2340 /* Set the correct context for class resolution. */
2341 current_class = this_class;
2342
2343 if (this_class)
2344 {
2345 tree this_decl = TYPE_NAME (this_class);
2346 #ifdef USE_MAPPED_LOCATION
2347 this_wrap = build_expr_wfl (this_class,
2348 DECL_SOURCE_LOCATION (this_decl));
2349 #else
2350 this_wrap = build_expr_wfl (this_class,
2351 DECL_SOURCE_FILE (this_decl),
2352 DECL_SOURCE_LINE (this_decl), 0);
2353 #endif
2354 }
2355 super_class
2356 = do_resolve_class (DECL_CONTEXT (TYPE_NAME (this_class)),
2357 this_class, super_class, NULL_TREE, this_wrap);
2358 if (!super_class)
2359 return NULL_TREE; /* FIXME, NULL_TREE not checked by caller. */
2360 super_class = TREE_TYPE (super_class);
2361 #endif
2362 gcc_unreachable ();
2363 }
2364 }
2365 if (!TYPE_SIZE (super_class))
2366 safe_layout_class (super_class);
2367
2368 return super_class;
2369 }
2370
2371 /* safe_layout_class just makes sure that we can load a class without
2372 disrupting the current_class, input_file, input_line, etc, information
2373 about the class processed currently. */
2374
2375 void
2376 safe_layout_class (tree class)
2377 {
2378 tree save_current_class = current_class;
2379 location_t save_location = input_location;
2380
2381 layout_class (class);
2382
2383 current_class = save_current_class;
2384 input_location = save_location;
2385 }
2386
2387 void
2388 layout_class (tree this_class)
2389 {
2390 tree super_class = CLASSTYPE_SUPER (this_class);
2391
2392 class_list = tree_cons (this_class, NULL_TREE, class_list);
2393 if (CLASS_BEING_LAIDOUT (this_class))
2394 {
2395 char buffer [1024];
2396 char *report;
2397 tree current;
2398
2399 sprintf (buffer, " with '%s'",
2400 IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
2401 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2402
2403 for (current = TREE_CHAIN (class_list); current;
2404 current = TREE_CHAIN (current))
2405 {
2406 tree decl = TYPE_NAME (TREE_PURPOSE (current));
2407 sprintf (buffer, "\n which inherits from '%s' (%s:%d)",
2408 IDENTIFIER_POINTER (DECL_NAME (decl)),
2409 DECL_SOURCE_FILE (decl),
2410 DECL_SOURCE_LINE (decl));
2411 obstack_grow (&temporary_obstack, buffer, strlen (buffer));
2412 }
2413 obstack_1grow (&temporary_obstack, '\0');
2414 report = obstack_finish (&temporary_obstack);
2415 cyclic_inheritance_report = ggc_strdup (report);
2416 obstack_free (&temporary_obstack, report);
2417 TYPE_SIZE (this_class) = error_mark_node;
2418 return;
2419 }
2420 CLASS_BEING_LAIDOUT (this_class) = 1;
2421
2422 if (super_class && !CLASS_BEING_LAIDOUT (super_class))
2423 {
2424 tree maybe_super_class
2425 = maybe_layout_super_class (super_class, this_class);
2426 if (maybe_super_class == NULL
2427 || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
2428 {
2429 TYPE_SIZE (this_class) = error_mark_node;
2430 CLASS_BEING_LAIDOUT (this_class) = 0;
2431 class_list = TREE_CHAIN (class_list);
2432 return;
2433 }
2434 if (TYPE_SIZE (this_class) == NULL_TREE)
2435 push_super_field (this_class, maybe_super_class);
2436 }
2437
2438 layout_type (this_class);
2439
2440 /* Also recursively load/layout any superinterfaces, but only if
2441 class was loaded from bytecode. The source parser will take care
2442 of this itself. */
2443 if (!CLASS_FROM_SOURCE_P (this_class))
2444 {
2445 int i;
2446 if (TYPE_BINFO (this_class))
2447 {
2448 for (i = BINFO_N_BASE_BINFOS (TYPE_BINFO (this_class)) - 1; i > 0; i--)
2449 {
2450 tree binfo = BINFO_BASE_BINFO (TYPE_BINFO (this_class), i);
2451 tree super_interface = BINFO_TYPE (binfo);
2452 tree maybe_super_interface
2453 = maybe_layout_super_class (super_interface, NULL_TREE);
2454 if (maybe_super_interface == NULL
2455 || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
2456 {
2457 TYPE_SIZE (this_class) = error_mark_node;
2458 CLASS_BEING_LAIDOUT (this_class) = 0;
2459 class_list = TREE_CHAIN (class_list);
2460 return;
2461 }
2462 }
2463 }
2464 }
2465
2466 /* Convert the size back to an SI integer value. */
2467 TYPE_SIZE_UNIT (this_class) =
2468 fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
2469
2470 CLASS_BEING_LAIDOUT (this_class) = 0;
2471 class_list = TREE_CHAIN (class_list);
2472 }
2473
2474 static void
2475 add_miranda_methods (tree base_class, tree search_class)
2476 {
2477 int i;
2478 tree binfo, base_binfo;
2479
2480 if (!CLASS_PARSED_P (search_class))
2481 load_class (search_class, 1);
2482
2483 for (binfo = TYPE_BINFO (search_class), i = 1;
2484 BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
2485 {
2486 tree method_decl;
2487 tree elt = BINFO_TYPE (base_binfo);
2488
2489 /* FIXME: This is totally bogus. We should not be handling
2490 Miranda methods at all if we're using the BC ABI. */
2491 if (TYPE_DUMMY (elt))
2492 continue;
2493
2494 /* Ensure that interface methods are seen in declared order. */
2495 if (!CLASS_LOADED_P (elt))
2496 load_class (elt, 1);
2497 layout_class_methods (elt);
2498
2499 /* All base classes will have been laid out at this point, so the order
2500 will be correct. This code must match similar layout code in the
2501 runtime. */
2502 for (method_decl = TYPE_METHODS (elt);
2503 method_decl; method_decl = TREE_CHAIN (method_decl))
2504 {
2505 tree sig, override;
2506
2507 /* An interface can have <clinit>. */
2508 if (ID_CLINIT_P (DECL_NAME (method_decl)))
2509 continue;
2510
2511 sig = build_java_argument_signature (TREE_TYPE (method_decl));
2512 override = lookup_argument_method (base_class,
2513 DECL_NAME (method_decl), sig);
2514 if (override == NULL_TREE)
2515 {
2516 /* Found a Miranda method. Add it. */
2517 tree new_method;
2518 sig = build_java_signature (TREE_TYPE (method_decl));
2519 new_method
2520 = add_method (base_class,
2521 get_access_flags_from_decl (method_decl),
2522 DECL_NAME (method_decl), sig);
2523 METHOD_INVISIBLE (new_method) = 1;
2524 }
2525 }
2526
2527 /* Try superinterfaces. */
2528 add_miranda_methods (base_class, elt);
2529 }
2530 }
2531
2532 void
2533 layout_class_methods (tree this_class)
2534 {
2535 tree method_decl, dtable_count;
2536 tree super_class, type_name;
2537
2538 if (TYPE_NVIRTUALS (this_class))
2539 return;
2540
2541 super_class = CLASSTYPE_SUPER (this_class);
2542
2543 if (super_class)
2544 {
2545 super_class = maybe_layout_super_class (super_class, this_class);
2546 if (!TYPE_NVIRTUALS (super_class))
2547 layout_class_methods (super_class);
2548 dtable_count = TYPE_NVIRTUALS (super_class);
2549 }
2550 else
2551 dtable_count = integer_zero_node;
2552
2553 type_name = TYPE_NAME (this_class);
2554 if (!flag_indirect_dispatch
2555 && (CLASS_ABSTRACT (type_name) || CLASS_INTERFACE (type_name)))
2556 {
2557 /* An abstract class can have methods which are declared only in
2558 an implemented interface. These are called "Miranda
2559 methods". We make a dummy method entry for such methods
2560 here. */
2561 add_miranda_methods (this_class, this_class);
2562 }
2563
2564 TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
2565
2566 for (method_decl = TYPE_METHODS (this_class);
2567 method_decl; method_decl = TREE_CHAIN (method_decl))
2568 dtable_count = layout_class_method (this_class, super_class,
2569 method_decl, dtable_count);
2570
2571 TYPE_NVIRTUALS (this_class) = dtable_count;
2572 }
2573
2574 /* Return the index of METHOD in INTERFACE. This index begins at 1
2575 and is used as an argument for _Jv_LookupInterfaceMethodIdx(). */
2576 int
2577 get_interface_method_index (tree method, tree interface)
2578 {
2579 tree meth;
2580 int i = 1;
2581
2582 for (meth = TYPE_METHODS (interface); ; meth = TREE_CHAIN (meth))
2583 {
2584 if (meth == method)
2585 return i;
2586 /* We don't want to put <clinit> into the interface table. */
2587 if (! ID_CLINIT_P (DECL_NAME (meth)))
2588 ++i;
2589 gcc_assert (meth != NULL_TREE);
2590 }
2591 }
2592
2593 /* Lay METHOD_DECL out, returning a possibly new value of
2594 DTABLE_COUNT. Also mangle the method's name. */
2595
2596 tree
2597 layout_class_method (tree this_class, tree super_class,
2598 tree method_decl, tree dtable_count)
2599 {
2600 tree method_name = DECL_NAME (method_decl);
2601
2602 TREE_PUBLIC (method_decl) = 1;
2603 /* Considered external unless it is being compiled into this object
2604 file. */
2605 DECL_EXTERNAL (method_decl) = ((is_compiled_class (this_class) != 2)
2606 || METHOD_NATIVE (method_decl));
2607
2608 if (ID_INIT_P (method_name))
2609 {
2610 const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
2611 const char *ptr;
2612 for (ptr = p; *ptr; )
2613 {
2614 if (*ptr++ == '.')
2615 p = ptr;
2616 }
2617 DECL_CONSTRUCTOR_P (method_decl) = 1;
2618 build_java_signature (TREE_TYPE (method_decl));
2619 }
2620 else if (! METHOD_STATIC (method_decl))
2621 {
2622 tree method_sig =
2623 build_java_signature (TREE_TYPE (method_decl));
2624 bool method_override = false;
2625 tree super_method = lookup_java_method (super_class, method_name,
2626 method_sig);
2627 if (super_method != NULL_TREE
2628 && ! METHOD_DUMMY (super_method))
2629 {
2630 method_override = true;
2631 if (! METHOD_PUBLIC (super_method) &&
2632 ! METHOD_PROTECTED (super_method))
2633 {
2634 /* Don't override private method, or default-access method in
2635 another package. */
2636 if (METHOD_PRIVATE (super_method) ||
2637 ! in_same_package (TYPE_NAME (this_class),
2638 TYPE_NAME (super_class)))
2639 method_override = false;
2640 }
2641 }
2642 if (method_override)
2643 {
2644 tree method_index = get_method_index (super_method);
2645 set_method_index (method_decl, method_index);
2646 if (method_index == NULL_TREE
2647 && ! flag_indirect_dispatch
2648 && !CLASS_FROM_SOURCE_P (this_class)
2649 && ! DECL_ARTIFICIAL (super_method))
2650 error ("non-static method %q+D overrides static method",
2651 method_decl);
2652 }
2653 else if (this_class == object_type_node
2654 && (METHOD_FINAL (method_decl)
2655 || METHOD_PRIVATE (method_decl)))
2656 {
2657 /* We don't generate vtable entries for final Object
2658 methods. This is simply to save space, since every
2659 object would otherwise have to define them. */
2660 }
2661 else if (! METHOD_PRIVATE (method_decl)
2662 && dtable_count)
2663 {
2664 /* We generate vtable entries for final methods because they
2665 may one day be changed to non-final. */
2666 set_method_index (method_decl, dtable_count);
2667 dtable_count = fold_build2 (PLUS_EXPR, integer_type_node,
2668 dtable_count, integer_one_node);
2669 }
2670 }
2671
2672 return dtable_count;
2673 }
2674
2675 static void
2676 register_class (void)
2677 {
2678 tree node;
2679
2680 if (!registered_class)
2681 registered_class = VEC_alloc (tree, gc, 8);
2682
2683 if (flag_indirect_classes)
2684 node = current_class;
2685 else
2686 node = TREE_OPERAND (build_class_ref (current_class), 0);
2687 VEC_safe_push (tree, gc, registered_class, node);
2688 }
2689
2690 /* Emit a function that calls _Jv_RegisterNewClasses with a list of
2691 all the classes we have emitted. */
2692
2693 static void
2694 emit_indirect_register_classes (tree *list_p)
2695 {
2696 tree klass, t, register_class_fn;
2697 int i;
2698
2699 tree init = NULL_TREE;
2700 int size = VEC_length (tree, registered_class) * 2 + 1;
2701 tree class_array_type
2702 = build_prim_array_type (ptr_type_node, size);
2703 tree cdecl = build_decl (VAR_DECL, get_identifier ("_Jv_CLS"),
2704 class_array_type);
2705 tree reg_class_list;
2706 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2707 {
2708 init = tree_cons (NULL_TREE,
2709 fold_convert (ptr_type_node,
2710 build_static_class_ref (klass)), init);
2711 init = tree_cons
2712 (NULL_TREE,
2713 fold_convert (ptr_type_node,
2714 build_address_of (build_classdollar_field (klass))),
2715 init);
2716 }
2717 init = tree_cons (NULL_TREE, integer_zero_node, init);
2718 DECL_INITIAL (cdecl) = build_constructor_from_list (class_array_type,
2719 nreverse (init));
2720 TREE_CONSTANT (DECL_INITIAL (cdecl)) = 1;
2721 TREE_STATIC (cdecl) = 1;
2722 DECL_ARTIFICIAL (cdecl) = 1;
2723 DECL_IGNORED_P (cdecl) = 1;
2724 TREE_READONLY (cdecl) = 1;
2725 TREE_CONSTANT (cdecl) = 1;
2726 rest_of_decl_compilation (cdecl, 1, 0);
2727 reg_class_list = fold_convert (ptr_type_node, build_address_of (cdecl));
2728
2729 t = build_function_type_list (void_type_node,
2730 build_pointer_type (ptr_type_node), NULL);
2731 t = build_decl (FUNCTION_DECL,
2732 get_identifier ("_Jv_RegisterNewClasses"), t);
2733 TREE_PUBLIC (t) = 1;
2734 DECL_EXTERNAL (t) = 1;
2735 register_class_fn = t;
2736 t = tree_cons (NULL, reg_class_list, NULL);
2737 t = build_function_call_expr (register_class_fn, t);
2738 append_to_statement_list (t, list_p);
2739 }
2740
2741
2742 /* Emit something to register classes at start-up time.
2743
2744 The preferred mechanism is through the .jcr section, which contain
2745 a list of pointers to classes which get registered during constructor
2746 invocation time.
2747
2748 The fallback mechanism is to add statements to *LIST_P to call
2749 _Jv_RegisterClass for each class in this file. These statements will
2750 be added to a static constructor function for this translation unit. */
2751
2752 void
2753 emit_register_classes (tree *list_p)
2754 {
2755 if (registered_class == NULL)
2756 return;
2757
2758 if (flag_indirect_classes)
2759 {
2760 emit_indirect_register_classes (list_p);
2761 return;
2762 }
2763
2764 /* TARGET_USE_JCR_SECTION defaults to 1 if SUPPORTS_WEAK and
2765 TARGET_ASM_NAMED_SECTION, else 0. Some targets meet those conditions
2766 but lack suitable crtbegin/end objects or linker support. These
2767 targets can override the default in tm.h to use the fallback mechanism. */
2768 if (TARGET_USE_JCR_SECTION)
2769 {
2770 tree klass, t;
2771 int i;
2772
2773 #ifdef JCR_SECTION_NAME
2774 switch_to_section (get_section (JCR_SECTION_NAME, SECTION_WRITE, NULL));
2775 #else
2776 /* A target has defined TARGET_USE_JCR_SECTION,
2777 but doesn't have a JCR_SECTION_NAME. */
2778 gcc_unreachable ();
2779 #endif
2780 assemble_align (POINTER_SIZE);
2781
2782 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2783 {
2784 t = build_fold_addr_expr (klass);
2785 output_constant (t, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE);
2786 }
2787 }
2788 else
2789 {
2790 tree klass, t, register_class_fn;
2791 int i;
2792
2793 t = build_function_type_list (void_type_node, class_ptr_type, NULL);
2794 t = build_decl (FUNCTION_DECL, get_identifier ("_Jv_RegisterClass"), t);
2795 TREE_PUBLIC (t) = 1;
2796 DECL_EXTERNAL (t) = 1;
2797 register_class_fn = t;
2798
2799 for (i = 0; VEC_iterate (tree, registered_class, i, klass); ++i)
2800 {
2801 t = build_fold_addr_expr (klass);
2802 t = tree_cons (NULL, t, NULL);
2803 t = build_function_call_expr (register_class_fn, t);
2804 append_to_statement_list (t, list_p);
2805 }
2806 }
2807 }
2808
2809 /* Make a symbol_type (_Jv_MethodSymbol) node for DECL. */
2810
2811 static tree
2812 build_symbol_entry (tree decl, tree special)
2813 {
2814 tree clname, name, signature, sym;
2815 clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (decl))));
2816 /* ??? Constructors are given the name foo.foo all the way through
2817 the compiler, but in the method table they're all renamed
2818 foo.<init>. So, we have to do the same here unless we want an
2819 unresolved reference at runtime. */
2820 name = build_utf8_ref ((TREE_CODE (decl) == FUNCTION_DECL
2821 && DECL_CONSTRUCTOR_P (decl))
2822 ? init_identifier_node
2823 : DECL_NAME (decl));
2824 signature = build_java_signature (TREE_TYPE (decl));
2825 signature = build_utf8_ref (unmangle_classname
2826 (IDENTIFIER_POINTER (signature),
2827 IDENTIFIER_LENGTH (signature)));
2828 /* SPECIAL is either NULL_TREE or integer_one_node. We emit
2829 signature addr+1 if SPECIAL, and this indicates to the runtime
2830 system that this is a "special" symbol, i.e. one that should
2831 bypass access controls. */
2832 if (special != NULL_TREE)
2833 signature = build2 (PLUS_EXPR, TREE_TYPE (signature), signature, special);
2834
2835 START_RECORD_CONSTRUCTOR (sym, symbol_type);
2836 PUSH_FIELD_VALUE (sym, "clname", clname);
2837 PUSH_FIELD_VALUE (sym, "name", name);
2838 PUSH_FIELD_VALUE (sym, "signature", signature);
2839 FINISH_RECORD_CONSTRUCTOR (sym);
2840 TREE_CONSTANT (sym) = 1;
2841 TREE_INVARIANT (sym) = 1;
2842
2843 return sym;
2844 }
2845
2846 /* Emit a symbol table: used by -findirect-dispatch. */
2847
2848 tree
2849 emit_symbol_table (tree name, tree the_table, tree decl_list,
2850 tree the_syms_decl, tree the_array_element_type,
2851 int element_size)
2852 {
2853 tree method_list, method, table, list, null_symbol;
2854 tree table_size, the_array_type;
2855 int index;
2856
2857 /* Only emit a table if this translation unit actually made any
2858 references via it. */
2859 if (decl_list == NULL_TREE)
2860 return the_table;
2861
2862 /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2863 index = 0;
2864 method_list = decl_list;
2865 list = NULL_TREE;
2866 while (method_list != NULL_TREE)
2867 {
2868 tree special = TREE_PURPOSE (method_list);
2869 method = TREE_VALUE (method_list);
2870 list = tree_cons (NULL_TREE, build_symbol_entry (method, special), list);
2871 method_list = TREE_CHAIN (method_list);
2872 index++;
2873 }
2874
2875 /* Terminate the list with a "null" entry. */
2876 START_RECORD_CONSTRUCTOR (null_symbol, symbol_type);
2877 PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2878 PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2879 PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2880 FINISH_RECORD_CONSTRUCTOR (null_symbol);
2881 TREE_CONSTANT (null_symbol) = 1;
2882 TREE_INVARIANT (null_symbol) = 1;
2883 list = tree_cons (NULL_TREE, null_symbol, list);
2884
2885 /* Put the list in the right order and make it a constructor. */
2886 list = nreverse (list);
2887 table = build_constructor_from_list (symbols_array_type, list);
2888
2889 /* Make it the initial value for otable_syms and emit the decl. */
2890 DECL_INITIAL (the_syms_decl) = table;
2891 DECL_ARTIFICIAL (the_syms_decl) = 1;
2892 DECL_IGNORED_P (the_syms_decl) = 1;
2893 rest_of_decl_compilation (the_syms_decl, 1, 0);
2894
2895 /* Now that its size is known, redefine the table as an
2896 uninitialized static array of INDEX + 1 elements. The extra entry
2897 is used by the runtime to track whether the table has been
2898 initialized. */
2899 table_size
2900 = build_index_type (build_int_cst (NULL_TREE, index * element_size + 1));
2901 the_array_type = build_array_type (the_array_element_type, table_size);
2902 the_table = build_decl (VAR_DECL, name, the_array_type);
2903 TREE_STATIC (the_table) = 1;
2904 TREE_READONLY (the_table) = 1;
2905 rest_of_decl_compilation (the_table, 1, 0);
2906
2907 return the_table;
2908 }
2909
2910 /* Make an entry for the catch_classes list. */
2911 tree
2912 make_catch_class_record (tree catch_class, tree classname)
2913 {
2914 tree entry;
2915 tree type = TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (output_class)));
2916 START_RECORD_CONSTRUCTOR (entry, type);
2917 PUSH_FIELD_VALUE (entry, "address", catch_class);
2918 PUSH_FIELD_VALUE (entry, "classname", classname);
2919 FINISH_RECORD_CONSTRUCTOR (entry);
2920 return entry;
2921 }
2922
2923
2924 /* Generate the list of Throwable classes that are caught by exception
2925 handlers in this class. */
2926 tree
2927 emit_catch_table (tree this_class)
2928 {
2929 tree table, table_size, array_type;
2930 TYPE_CATCH_CLASSES (this_class) =
2931 tree_cons (NULL,
2932 make_catch_class_record (null_pointer_node, null_pointer_node),
2933 TYPE_CATCH_CLASSES (this_class));
2934 TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class));
2935 TYPE_CATCH_CLASSES (this_class) =
2936 tree_cons (NULL,
2937 make_catch_class_record (null_pointer_node, null_pointer_node),
2938 TYPE_CATCH_CLASSES (this_class));
2939 table_size = build_index_type
2940 (build_int_cst (NULL_TREE,
2941 list_length (TYPE_CATCH_CLASSES (this_class))));
2942 array_type
2943 = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))),
2944 table_size);
2945 table =
2946 build_decl (VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type);
2947 DECL_INITIAL (table) =
2948 build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class));
2949 TREE_STATIC (table) = 1;
2950 TREE_READONLY (table) = 1;
2951 DECL_IGNORED_P (table) = 1;
2952 rest_of_decl_compilation (table, 1, 0);
2953 return table;
2954 }
2955
2956 /* Given a type, return the signature used by
2957 _Jv_FindClassFromSignature() in libgcj. This isn't exactly the
2958 same as build_java_signature() because we want the canonical array
2959 type. */
2960
2961 static tree
2962 build_signature_for_libgcj (tree type)
2963 {
2964 tree sig, ref;
2965
2966 sig = build_java_signature (type);
2967 ref = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
2968 IDENTIFIER_LENGTH (sig)));
2969 return ref;
2970 }
2971
2972 /* Add an entry to the type assertion table. Callback used during hashtable
2973 traversal. */
2974
2975 static int
2976 add_assertion_table_entry (void **htab_entry, void *ptr)
2977 {
2978 tree entry;
2979 tree code_val, op1_utf8, op2_utf8;
2980 tree *list = (tree *) ptr;
2981 type_assertion *as = (type_assertion *) *htab_entry;
2982
2983 code_val = build_int_cst (NULL_TREE, as->assertion_code);
2984
2985 if (as->op1 == NULL_TREE)
2986 op1_utf8 = null_pointer_node;
2987 else
2988 op1_utf8 = build_signature_for_libgcj (as->op1);
2989
2990 if (as->op2 == NULL_TREE)
2991 op2_utf8 = null_pointer_node;
2992 else
2993 op2_utf8 = build_signature_for_libgcj (as->op2);
2994
2995 START_RECORD_CONSTRUCTOR (entry, assertion_entry_type);
2996 PUSH_FIELD_VALUE (entry, "assertion_code", code_val);
2997 PUSH_FIELD_VALUE (entry, "op1", op1_utf8);
2998 PUSH_FIELD_VALUE (entry, "op2", op2_utf8);
2999 FINISH_RECORD_CONSTRUCTOR (entry);
3000
3001 *list = tree_cons (NULL_TREE, entry, *list);
3002 return true;
3003 }
3004
3005 /* Generate the type assertion table for CLASS, and return its DECL. */
3006
3007 static tree
3008 emit_assertion_table (tree class)
3009 {
3010 tree null_entry, ctor, table_decl;
3011 tree list = NULL_TREE;
3012 htab_t assertions_htab = TYPE_ASSERTIONS (class);
3013
3014 /* Iterate through the hash table. */
3015 htab_traverse (assertions_htab, add_assertion_table_entry, &list);
3016
3017 /* Finish with a null entry. */
3018 START_RECORD_CONSTRUCTOR (null_entry, assertion_entry_type);
3019 PUSH_FIELD_VALUE (null_entry, "assertion_code", integer_zero_node);
3020 PUSH_FIELD_VALUE (null_entry, "op1", null_pointer_node);
3021 PUSH_FIELD_VALUE (null_entry, "op2", null_pointer_node);
3022 FINISH_RECORD_CONSTRUCTOR (null_entry);
3023
3024 list = tree_cons (NULL_TREE, null_entry, list);
3025
3026 /* Put the list in the right order and make it a constructor. */
3027 list = nreverse (list);
3028 ctor = build_constructor_from_list (assertion_table_type, list);
3029
3030 table_decl = build_decl (VAR_DECL, mangled_classname ("_type_assert_", class),
3031 assertion_table_type);
3032
3033 TREE_STATIC (table_decl) = 1;
3034 TREE_READONLY (table_decl) = 1;
3035 TREE_CONSTANT (table_decl) = 1;
3036 DECL_IGNORED_P (table_decl) = 1;
3037
3038 DECL_INITIAL (table_decl) = ctor;
3039 DECL_ARTIFICIAL (table_decl) = 1;
3040 rest_of_decl_compilation (table_decl, 1, 0);
3041
3042 return table_decl;
3043 }
3044
3045 void
3046 init_class_processing (void)
3047 {
3048 fields_ident = get_identifier ("fields");
3049 info_ident = get_identifier ("info");
3050
3051 gcc_obstack_init (&temporary_obstack);
3052 }
3053 \f
3054 static hashval_t java_treetreehash_hash (const void *);
3055 static int java_treetreehash_compare (const void *, const void *);
3056
3057 /* A hash table mapping trees to trees. Used generally. */
3058
3059 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
3060
3061 static hashval_t
3062 java_treetreehash_hash (const void *k_p)
3063 {
3064 struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
3065 return JAVA_TREEHASHHASH_H (k->key);
3066 }
3067
3068 static int
3069 java_treetreehash_compare (const void * k1_p, const void * k2_p)
3070 {
3071 struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
3072 tree k2 = (tree) k2_p;
3073 return (k1->key == k2);
3074 }
3075
3076 tree
3077 java_treetreehash_find (htab_t ht, tree t)
3078 {
3079 struct treetreehash_entry *e;
3080 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3081 e = htab_find_with_hash (ht, t, hv);
3082 if (e == NULL)
3083 return NULL;
3084 else
3085 return e->value;
3086 }
3087
3088 tree *
3089 java_treetreehash_new (htab_t ht, tree t)
3090 {
3091 void **e;
3092 struct treetreehash_entry *tthe;
3093 hashval_t hv = JAVA_TREEHASHHASH_H (t);
3094
3095 e = htab_find_slot_with_hash (ht, t, hv, INSERT);
3096 if (*e == NULL)
3097 {
3098 tthe = (*ht->alloc_f) (1, sizeof (*tthe));
3099 tthe->key = t;
3100 *e = tthe;
3101 }
3102 else
3103 tthe = (struct treetreehash_entry *) *e;
3104 return &tthe->value;
3105 }
3106
3107 htab_t
3108 java_treetreehash_create (size_t size, int gc)
3109 {
3110 if (gc)
3111 return htab_create_ggc (size, java_treetreehash_hash,
3112 java_treetreehash_compare, NULL);
3113 else
3114 return htab_create_alloc (size, java_treetreehash_hash,
3115 java_treetreehash_compare, free, xcalloc, free);
3116 }
3117
3118 /* Break down qualified IDENTIFIER into package and class-name components.
3119 For example, given SOURCE "pkg.foo.Bar", LEFT will be set to
3120 "pkg.foo", and RIGHT to "Bar". */
3121
3122 int
3123 split_qualified_name (tree *left, tree *right, tree source)
3124 {
3125 char *p, *base;
3126 int l = IDENTIFIER_LENGTH (source);
3127
3128 base = alloca (l + 1);
3129 memcpy (base, IDENTIFIER_POINTER (source), l + 1);
3130
3131 /* Breakdown NAME into REMAINDER . IDENTIFIER. */
3132 p = base + l - 1;
3133 while (*p != '.' && p != base)
3134 p--;
3135
3136 /* We didn't find a '.'. Return an error. */
3137 if (p == base)
3138 return 1;
3139
3140 *p = '\0';
3141 if (right)
3142 *right = get_identifier (p+1);
3143 *left = get_identifier (base);
3144
3145 return 0;
3146 }
3147
3148 /* Given two classes (TYPE_DECL) or class names (IDENTIFIER), return TRUE
3149 if the classes are from the same package. */
3150
3151 int
3152 in_same_package (tree name1, tree name2)
3153 {
3154 tree tmp;
3155 tree pkg1;
3156 tree pkg2;
3157
3158 if (TREE_CODE (name1) == TYPE_DECL)
3159 name1 = DECL_NAME (name1);
3160 if (TREE_CODE (name2) == TYPE_DECL)
3161 name2 = DECL_NAME (name2);
3162
3163 if (QUALIFIED_P (name1) != QUALIFIED_P (name2))
3164 /* One in empty package. */
3165 return 0;
3166
3167 if (QUALIFIED_P (name1) == 0 && QUALIFIED_P (name2) == 0)
3168 /* Both in empty package. */
3169 return 1;
3170
3171 split_qualified_name (&pkg1, &tmp, name1);
3172 split_qualified_name (&pkg2, &tmp, name2);
3173
3174 return (pkg1 == pkg2);
3175 }
3176
3177 #include "gt-java-class.h"