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