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