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