OSDN Git Service

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