OSDN Git Service

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