OSDN Git Service

* tree.c (build_constructor): New function.
[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
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, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, 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
46 /* DOS brain-damage */
47 #ifndef O_BINARY
48 #define O_BINARY 0 /* MS-DOS brain-damage */
49 #endif
50
51 static tree make_method_value (tree);
52 static tree build_java_method_type (tree, tree, int);
53 static int32 hashUtf8String (const char *, int);
54 static tree make_field_value (tree);
55 static tree get_dispatch_vector (tree);
56 static tree get_dispatch_table (tree, tree);
57 static int supers_all_compiled (tree type);
58 static void add_interface_do (tree, tree, int);
59 static tree maybe_layout_super_class (tree, tree);
60 static int assume_compiled (const char *);
61 static tree build_method_symbols_entry (tree);
62
63 static GTY(()) rtx registerClass_libfunc;
64
65 struct obstack temporary_obstack;
66
67 /* The compiler generates different code depending on whether or not
68    it can assume certain classes have been compiled down to native
69    code or not.  The compiler options -fassume-compiled= and
70    -fno-assume-compiled= are used to create a tree of
71    assume_compiled_node objects.  This tree is queried to determine if
72    a class is assume to be compiled or not.  Each node in the tree
73    represents either a package or a specific class.  */
74
75 typedef struct assume_compiled_node_struct
76 {
77   /* The class or package name.  */
78   const char *ident;
79
80   /* Nonzero if this represents an exclusion.  */
81   int excludep;
82
83   /* Pointers to other nodes in the tree.  */
84   struct assume_compiled_node_struct *parent;
85   struct assume_compiled_node_struct *sibling;
86   struct assume_compiled_node_struct *child;
87 } assume_compiled_node;
88
89 static assume_compiled_node *find_assume_compiled_node (assume_compiled_node *,
90                                                         const char *);
91
92 /* This is the root of the include/exclude tree.  */
93
94 static assume_compiled_node *assume_compiled_tree;
95
96 static GTY(()) tree class_roots[5];
97 #define registered_class class_roots[0]
98 #define fields_ident class_roots[1]  /* get_identifier ("fields") */
99 #define info_ident class_roots[2]  /* get_identifier ("info") */
100 #define class_list class_roots[3]
101 #define class_dtable_decl class_roots[4]
102
103 /* Return the node that most closely represents the class whose name
104    is IDENT.  Start the search from NODE.  Return NULL if an
105    appropriate node does not exist.  */
106
107 static assume_compiled_node *
108 find_assume_compiled_node (assume_compiled_node *node, const char *ident)
109 {
110   while (node)
111     {
112       size_t node_ident_length = strlen (node->ident);
113
114       /* node_ident_length is zero at the root of the tree.  If the
115          identifiers are the same length, then we have matching
116          classes.  Otherwise check if we've matched an enclosing
117          package name.  */
118
119       if (node_ident_length == 0
120           || (strncmp (ident, node->ident, node_ident_length) == 0
121               && (strlen (ident) == node_ident_length
122                   || ident[node_ident_length] == '.')))
123         {
124           /* We've found a match, however, there might be a more
125              specific match.  */
126
127           assume_compiled_node *found = find_assume_compiled_node (node->child,
128                                                                    ident);
129           if (found)
130             return found;
131           else
132             return node;
133         }
134
135       /* No match yet.  Continue through the sibling list.  */
136       node = node->sibling;
137     }
138
139   /* No match at all in this tree.  */
140   return NULL;
141 }
142
143 /* Add a new IDENT to the include/exclude tree.  It's an exclusion
144    if EXCLUDEP is nonzero.  */
145
146 void
147 add_assume_compiled (const char *ident, int excludep)
148 {
149   int len;
150   assume_compiled_node *parent;
151   assume_compiled_node *node = 
152     xmalloc (sizeof (assume_compiled_node));
153
154   node->ident = xstrdup (ident);
155   node->excludep = excludep;
156   node->child = NULL;
157
158   /* Create the root of the tree if it doesn't exist yet.  */
159
160   if (NULL == assume_compiled_tree)
161     {
162       assume_compiled_tree = xmalloc (sizeof (assume_compiled_node));
163       assume_compiled_tree->ident = "";
164       assume_compiled_tree->excludep = 0;
165       assume_compiled_tree->sibling = NULL;
166       assume_compiled_tree->child = NULL;
167       assume_compiled_tree->parent = NULL;
168     }
169
170   /* Calling the function with the empty string means we're setting
171      excludep for the root of the hierarchy.  */
172
173   if (0 == ident[0])
174     {
175       assume_compiled_tree->excludep = excludep;
176       return;
177     }
178
179   /* Find the parent node for this new node.  PARENT will either be a
180      class or a package name.  Adjust PARENT accordingly.  */
181
182   parent = find_assume_compiled_node (assume_compiled_tree, ident);
183   len = strlen (parent->ident);
184   if (parent->ident[len] && parent->ident[len] != '.')
185     parent = parent->parent;
186
187   /* Insert NODE into the tree.  */
188
189   node->parent = parent;
190   node->sibling = parent->child;
191   parent->child = node;
192 }
193
194 /* Returns nonzero if IDENT is the name of a class that the compiler
195    should assume has been compiled to object code.  */
196
197 static int
198 assume_compiled (const char *ident)
199 {
200   assume_compiled_node *i;
201   int result;
202   
203   if (NULL == assume_compiled_tree)
204     return 1;
205
206   i = find_assume_compiled_node (assume_compiled_tree,
207                                  ident);
208
209   result = ! i->excludep;
210   
211   return (result);
212 }
213
214 /* Return an IDENTIFIER_NODE the same as (OLD_NAME, OLD_LENGTH).
215    except that characters matching OLD_CHAR are substituted by NEW_CHAR.
216    Also, PREFIX is prepended, and SUFFIX is appended. */
217
218 tree
219 ident_subst (const char* old_name,
220              int old_length,
221              const char *prefix,
222              int old_char,
223              int new_char,
224              const char *suffix)
225 {
226   int prefix_len = strlen (prefix);
227   int suffix_len = strlen (suffix);
228   int i = prefix_len + old_length + suffix_len + 1;
229 #ifdef __GNUC__
230   char buffer[i];
231 #else
232   char *buffer = alloca (i);
233 #endif
234   strcpy (buffer, prefix);
235   for (i = 0; i < old_length; i++)
236     {
237       char ch = old_name[i];
238       if (ch == old_char)
239         ch = new_char;
240       buffer[prefix_len + i] = ch;
241     }
242   strcpy (buffer + prefix_len + old_length, suffix);
243   return get_identifier (buffer);
244 }
245
246 /* Return an IDENTIFIER_NODE the same as OLD_ID,
247    except that characters matching OLD_CHAR are substituted by NEW_CHAR.
248    Also, PREFIX is prepended, and SUFFIX is appended. */
249
250 tree
251 identifier_subst (const tree old_id,
252                   const char *prefix,
253                   int old_char,
254                   int new_char,
255                   const char *suffix)
256 {
257   return ident_subst (IDENTIFIER_POINTER (old_id), IDENTIFIER_LENGTH (old_id),
258                       prefix, old_char, new_char, suffix);
259 }
260
261 /* Generate a valid C identifier from the name of the class TYPE,
262    prefixed by PREFIX. */
263
264 tree
265 mangled_classname (const char *prefix, tree type)
266 {
267   tree ident = TYPE_NAME (type);
268   if (TREE_CODE (ident) != IDENTIFIER_NODE)
269     ident = DECL_NAME (ident);
270   return identifier_subst (ident, prefix, '.', '_', "");
271 }
272
273 tree
274 make_class (void)
275 {
276   tree type;
277   type = make_node (RECORD_TYPE);
278   TYPE_BINFO (type) = make_tree_vec (BINFO_ELTS);
279   MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type);
280
281   return type;
282 }
283
284 /* Given a fully-qualified classname in NAME (whose length is NAME_LENGTH),
285    and where each of the constituents is separated by '/',
286    return a corresponding IDENTIFIER_NODE, except using '.' as separator. */
287
288 tree
289 unmangle_classname (const char *name, int name_length)
290 {
291   tree to_return = ident_subst (name, name_length, "", '/', '.', "");
292   /* It's not sufficient to compare to_return and get_identifier
293      (name) to determine whether to_return is qualified. There are
294      cases in signature analysis where name will be stripped of a
295      trailing ';'. */
296   name = IDENTIFIER_POINTER (to_return);
297   while (*name)
298     if (*name++ == '.') 
299       {
300         QUALIFIED_P (to_return) = 1;
301         break;
302       }
303   
304   return to_return;
305 }
306
307 tree
308 push_class (tree class_type, tree class_name)
309 {
310   tree decl, signature;
311   const char *save_input_filename = input_filename;
312   int save_lineno = lineno;
313   tree source_name = identifier_subst (class_name, "", '.', '/', ".java");
314   CLASS_P (class_type) = 1;
315   input_filename = IDENTIFIER_POINTER (source_name);
316   lineno = 0;
317   decl = build_decl (TYPE_DECL, class_name, class_type);
318
319   /* dbxout needs a DECL_SIZE if in gstabs mode */
320   DECL_SIZE (decl) = integer_zero_node;
321
322   input_filename = save_input_filename;
323   lineno = save_lineno;
324   signature = identifier_subst (class_name, "L", '.', '/', ";");
325   IDENTIFIER_SIGNATURE_TYPE (signature) = build_pointer_type (class_type);
326
327   /* Setting DECL_ARTIFICIAL forces dbxout.c to specific the type is
328      both a typedef and in the struct name-space.  We may want to re-visit
329      this later, but for now it reduces the changes needed for gdb. */
330   DECL_ARTIFICIAL (decl) = 1;
331
332   pushdecl_top_level (decl);
333
334   return decl;
335 }
336
337 /* Finds the (global) class named NAME.  Creates the class if not found.
338    Also creates associated TYPE_DECL.
339    Does not check if the class actually exists, load the class,
340    fill in field or methods, or do layout_type. */
341
342 tree
343 lookup_class (tree name)
344 {
345   tree decl = IDENTIFIER_CLASS_VALUE (name);
346   if (decl == NULL_TREE)
347     decl = push_class (make_class (), name);
348   return TREE_TYPE (decl);
349 }
350
351 void
352 set_super_info (int access_flags, tree this_class,
353                 tree super_class, int interfaces_count)
354 {
355   int total_supers = interfaces_count;
356   tree class_decl = TYPE_NAME (this_class);
357   if (super_class)
358     total_supers++;
359
360   TYPE_BINFO_BASETYPES (this_class) = make_tree_vec (total_supers);
361   if (super_class)
362     {
363       tree super_binfo = make_tree_vec (BINFO_ELTS);
364       BINFO_TYPE (super_binfo) = super_class;
365       BINFO_OFFSET (super_binfo) = integer_zero_node;
366       TREE_VEC_ELT (BINFO_BASETYPES (TYPE_BINFO (this_class)), 0)
367         = super_binfo;
368       CLASS_HAS_SUPER (this_class) = 1;
369     }
370
371   set_class_decl_access_flags (access_flags, class_decl);
372 }
373
374 void
375 set_class_decl_access_flags (int access_flags, tree class_decl)
376 {
377   if (access_flags & ACC_PUBLIC)    CLASS_PUBLIC (class_decl) = 1;
378   if (access_flags & ACC_FINAL)     CLASS_FINAL (class_decl) = 1;
379   if (access_flags & ACC_SUPER)     CLASS_SUPER (class_decl) = 1;
380   if (access_flags & ACC_INTERFACE) CLASS_INTERFACE (class_decl) = 1;
381   if (access_flags & ACC_ABSTRACT)  CLASS_ABSTRACT (class_decl) = 1;
382   if (access_flags & ACC_STATIC)    CLASS_STATIC (class_decl) = 1;
383   if (access_flags & ACC_PRIVATE)   CLASS_PRIVATE (class_decl) = 1;
384   if (access_flags & ACC_PROTECTED) CLASS_PROTECTED (class_decl) = 1;
385   if (access_flags & ACC_STRICT)    CLASS_STRICTFP (class_decl) = 1;
386 }
387
388 /* Return length of inheritance chain of CLAS, where java.lang.Object is 0,
389    direct sub-classes of Object are 1, and so on. */
390
391 int
392 class_depth (tree clas)
393 {
394   int depth = 0;
395   if (! CLASS_LOADED_P (clas))
396     load_class (clas, 1);
397   if (TYPE_SIZE (clas) == error_mark_node)
398     return -1;
399   while (clas != object_type_node)
400     {
401       depth++;
402       clas = TYPE_BINFO_BASETYPE (clas, 0);
403     }
404   return depth;
405 }
406
407 /* Return true iff TYPE2 is an interface that extends interface TYPE1 */
408
409 int
410 interface_of_p (tree type1, tree type2)
411 {
412   int n, i;
413   tree basetype_vec;
414
415   if (!(basetype_vec = TYPE_BINFO_BASETYPES (type2)))
416     return 0;
417   n = TREE_VEC_LENGTH (basetype_vec);
418   for (i = 0; i < n; i++)
419     {
420       tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
421       if (vec_elt && BINFO_TYPE (vec_elt) == type1)
422         return 1;
423     }
424   for (i = 0; i < n; i++)
425     {
426       tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
427       if (vec_elt && BINFO_TYPE (vec_elt) 
428           && interface_of_p (type1, BINFO_TYPE (vec_elt)))
429         return 1;
430     }
431   return 0;
432 }
433
434 /* Return true iff TYPE1 inherits from TYPE2. */
435
436 int
437 inherits_from_p (tree type1, tree type2)
438 {
439   while (type1 != NULL_TREE && TREE_CODE (type1) == RECORD_TYPE)
440     {
441       if (type1 == type2)
442         return 1;
443       type1 = CLASSTYPE_SUPER (type1);
444     }
445   return 0;
446 }
447
448 /* Return a 1 iff TYPE1 is an enclosing context for TYPE2 */
449
450 int
451 enclosing_context_p (tree type1, tree type2)
452 {
453   if (!INNER_CLASS_TYPE_P (type2))
454     return 0;
455
456   for (type2 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2)));
457        type2; 
458        type2 = (INNER_CLASS_TYPE_P (type2) ?
459                 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))) : NULL_TREE))
460     {
461       if (type2 == type1)
462         return 1;
463     }
464
465   return 0;
466 }
467
468 /* Return 1 iff there exists a common enclosing context between TYPE1
469    and TYPE2.  */
470
471 int common_enclosing_context_p (tree type1, tree type2)
472 {
473   if (!PURE_INNER_CLASS_TYPE_P (type1) || !PURE_INNER_CLASS_TYPE_P (type2))
474     return 0;
475   
476   for (type1 = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))); type1; 
477        type1 = (PURE_INNER_CLASS_TYPE_P (type1) ?
478                 TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type1))) : NULL_TREE))
479     {
480       tree current;
481       for (current = TREE_TYPE (DECL_CONTEXT (TYPE_NAME (type2))); current;
482            current = (PURE_INNER_CLASS_TYPE_P (current) ?
483                       TREE_TYPE (DECL_CONTEXT (TYPE_NAME (current))) : 
484                       NULL_TREE))
485         if (type1 == current)
486           return 1;
487     }
488   return 0;
489 }
490
491 static void
492 add_interface_do (tree basetype_vec, tree interface_class, int i)
493 {
494   tree interface_binfo = make_tree_vec (BINFO_ELTS);
495   BINFO_TYPE (interface_binfo) = interface_class;
496   BINFO_OFFSET (interface_binfo) = integer_zero_node;
497   BINFO_VPTR_FIELD (interface_binfo) = integer_zero_node;
498   TREE_VIA_VIRTUAL (interface_binfo) = 1;
499   TREE_VEC_ELT (basetype_vec, i) = interface_binfo;
500 }
501
502 /* Add INTERFACE_CLASS to THIS_CLASS iff INTERFACE_CLASS can't be
503    found in THIS_CLASS. Returns NULL_TREE upon success, INTERFACE_CLASS
504    if attempt is made to add it twice. */
505
506 tree
507 maybe_add_interface (tree this_class, tree interface_class)
508 {
509   tree basetype_vec = TYPE_BINFO_BASETYPES (this_class);
510   int i;
511   int n = TREE_VEC_LENGTH (basetype_vec);
512   for (i = 0; ; i++)
513     {
514       if (i >= n)
515         {
516           error ("internal error - too many interface type");
517           return NULL_TREE;
518         }
519       else if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
520         break;
521       else if (BINFO_TYPE (TREE_VEC_ELT (basetype_vec, i)) == interface_class)
522         return interface_class;
523     } 
524   add_interface_do (basetype_vec, interface_class, i);
525   return NULL_TREE;
526 }
527
528 /* Add the INTERFACE_CLASS as one of the interfaces of THIS_CLASS. */
529
530 void
531 add_interface (tree this_class, tree interface_class)
532 {
533   tree basetype_vec = TYPE_BINFO_BASETYPES (this_class);
534   int i;
535   int n = TREE_VEC_LENGTH (basetype_vec);
536   for (i = 0; ; i++)
537     {
538       if (i >= n)
539         {
540           error ("internal error - too many interface type");
541           return;
542         }
543       else if (TREE_VEC_ELT (basetype_vec, i) == NULL_TREE)
544         break;
545     }
546   add_interface_do (basetype_vec, interface_class, i);
547 }
548
549 #if 0
550 /* Return the address of a pointer to the first FUNCTION_DECL
551    in the list (*LIST) whose DECL_NAME is NAME. */
552
553 static tree *
554 find_named_method (tree *list, tree name)
555 {
556   while (*list && DECL_NAME (*list) != name)
557     list = &TREE_CHAIN (*list);
558   return list;
559 }
560 #endif
561
562 static tree
563 build_java_method_type (tree fntype, tree this_class, int access_flags)
564 {
565   if (access_flags & ACC_STATIC)
566     return fntype;
567   return build_method_type (this_class, fntype);
568 }
569
570 tree
571 add_method_1 (tree this_class, int access_flags, tree name, tree function_type)
572 {
573   tree method_type, fndecl;
574
575   method_type = build_java_method_type (function_type,
576                                         this_class, access_flags);
577
578   fndecl = build_decl (FUNCTION_DECL, name, method_type);
579   DECL_CONTEXT (fndecl) = this_class;
580
581   DECL_LANG_SPECIFIC (fndecl)
582     = ggc_alloc_cleared (sizeof (struct lang_decl));
583   DECL_LANG_SPECIFIC (fndecl)->desc = LANG_DECL_FUNC;
584
585   /* Initialize the static initializer test table.  */
586   
587   DECL_FUNCTION_INIT_TEST_TABLE (fndecl) = 
588     java_treetreehash_create (10, 1);
589
590   /* Initialize the initialized (static) class table. */
591   if (access_flags & ACC_STATIC)
592     DECL_FUNCTION_INITIALIZED_CLASS_TABLE (fndecl) =
593       htab_create_ggc (50, htab_hash_pointer, htab_eq_pointer, NULL);
594
595   /* Initialize the static method invocation compound list */
596   DECL_FUNCTION_STATIC_METHOD_INVOCATION_COMPOUND (fndecl) = NULL_TREE;
597
598   TREE_CHAIN (fndecl) = TYPE_METHODS (this_class);
599   TYPE_METHODS (this_class) = fndecl;
600
601   /* Notice that this is a finalizer and update the class type
602      accordingly. This is used to optimize instance allocation. */
603   if (name == finalize_identifier_node
604       && TREE_TYPE (function_type) == void_type_node
605       && TREE_VALUE (TYPE_ARG_TYPES (function_type)) == void_type_node)
606     HAS_FINALIZER_P (this_class) = 1;
607
608   if (access_flags & ACC_PUBLIC) METHOD_PUBLIC (fndecl) = 1;
609   if (access_flags & ACC_PROTECTED) METHOD_PROTECTED (fndecl) = 1;
610   if (access_flags & ACC_PRIVATE)
611     METHOD_PRIVATE (fndecl) = DECL_INLINE (fndecl) = 1;
612   if (access_flags & ACC_NATIVE)
613     {
614       METHOD_NATIVE (fndecl) = 1;
615       DECL_EXTERNAL (fndecl) = 1;
616     }
617   if (access_flags & ACC_STATIC) 
618     METHOD_STATIC (fndecl) = DECL_INLINE (fndecl) = 1;
619   if (access_flags & ACC_FINAL) 
620     METHOD_FINAL (fndecl) = DECL_INLINE (fndecl) = 1;
621   if (access_flags & ACC_SYNCHRONIZED) METHOD_SYNCHRONIZED (fndecl) = 1;
622   if (access_flags & ACC_ABSTRACT) METHOD_ABSTRACT (fndecl) = 1;
623   if (access_flags & ACC_TRANSIENT) METHOD_TRANSIENT (fndecl) = 1;
624   if (access_flags & ACC_STRICT) METHOD_STRICTFP (fndecl) = 1;
625   return fndecl;
626 }
627
628 /* Add a method to THIS_CLASS.
629    The method's name is NAME.
630    Its signature (mangled type) is METHOD_SIG (an IDENTIFIER_NODE). */
631
632 tree
633 add_method (tree this_class, int access_flags, tree name, tree method_sig)
634 {
635   tree function_type, fndecl;
636   const unsigned char *sig
637     = (const unsigned char *) IDENTIFIER_POINTER (method_sig);
638
639   if (sig[0] != '(')
640     fatal_error ("bad method signature");
641
642   function_type = get_type_from_signature (method_sig);
643   fndecl = add_method_1 (this_class, access_flags, name, function_type);
644   set_java_signature (TREE_TYPE (fndecl), method_sig);
645   return fndecl;
646 }
647
648 tree
649 add_field (tree class, tree name, tree field_type, int flags)
650 {
651   int is_static = (flags & ACC_STATIC) != 0;
652   tree field;
653   field = build_decl (is_static ? VAR_DECL : FIELD_DECL, name, field_type);
654   TREE_CHAIN (field) = TYPE_FIELDS (class);
655   TYPE_FIELDS (class) = field;
656   DECL_CONTEXT (field) = class;
657
658   if (flags & ACC_PUBLIC) FIELD_PUBLIC (field) = 1;
659   if (flags & ACC_PROTECTED) FIELD_PROTECTED (field) = 1;
660   if (flags & ACC_PRIVATE) FIELD_PRIVATE (field) = 1;
661   if (flags & ACC_FINAL) FIELD_FINAL (field) = 1;
662   if (flags & ACC_VOLATILE) FIELD_VOLATILE (field) = 1;
663   if (flags & ACC_TRANSIENT) FIELD_TRANSIENT (field) = 1;
664   if (is_static)
665     {
666       FIELD_STATIC (field) = 1;
667       /* Always make field externally visible.  This is required so
668          that native methods can always access the field.  */
669       TREE_PUBLIC (field) = 1;
670       /* Considered external until we know what classes are being
671          compiled into this object file.  */
672       DECL_EXTERNAL (field) = 1;
673     }
674
675   return field;
676 }
677
678 /* Associate a constant value CONSTANT with VAR_DECL FIELD. */
679
680 void
681 set_constant_value (tree field, tree constant)
682 {
683   if (field == NULL_TREE)
684     warning ("misplaced ConstantValue attribute (not in any field)");
685   else if (DECL_INITIAL (field) != NULL_TREE)
686     warning ("duplicate ConstantValue attribute for field '%s'",
687              IDENTIFIER_POINTER (DECL_NAME (field)));
688   else
689     {
690       DECL_INITIAL (field) = constant;
691       if (TREE_TYPE (constant) != TREE_TYPE (field)
692           && ! (TREE_TYPE (constant) == int_type_node
693                 && INTEGRAL_TYPE_P (TREE_TYPE (field))
694                 && TYPE_PRECISION (TREE_TYPE (field)) <= 32)
695           && ! (TREE_TYPE (constant) == utf8const_ptr_type
696                 && TREE_TYPE (field) == string_ptr_type_node))
697         error ("ConstantValue attribute of field '%s' has wrong type",
698                IDENTIFIER_POINTER (DECL_NAME (field)));
699       if (FIELD_FINAL (field))
700         DECL_FIELD_FINAL_IUD (field) = 1;
701     }
702 }
703
704 /* Count the number of Unicode chars encoded in a given Ut8 string. */
705
706 #if 0
707 int
708 strLengthUtf8 (char *str, int len)
709 {
710   register unsigned char* ptr = (unsigned char*) str;
711   register unsigned char *limit = ptr + len;
712   int str_length = 0;
713   for (; ptr < limit; str_length++) {
714     if (UTF8_GET (ptr, limit) < 0)
715       return -1;
716   }
717   return str_length;
718 }
719 #endif
720
721
722 /* Calculate a hash value for a string encoded in Utf8 format.
723  * This returns the same hash value as specified for java.lang.String.hashCode.
724  */
725
726 static int32
727 hashUtf8String (const char *str, int len)
728 {
729   register const unsigned char* ptr = (const unsigned char*) str;
730   register const unsigned char *limit = ptr + len;
731   int32 hash = 0;
732   for (; ptr < limit;)
733     {
734       int ch = UTF8_GET (ptr, limit);
735       /* Updated specification from
736          http://www.javasoft.com/docs/books/jls/clarify.html. */
737       hash = (31 * hash) + ch;
738     }
739   return hash;
740 }
741
742 static GTY(()) tree utf8_decl_list = NULL_TREE;
743
744 tree
745 build_utf8_ref (tree name)
746 {
747   const char * name_ptr = IDENTIFIER_POINTER(name);
748   int name_len = IDENTIFIER_LENGTH(name);
749   char buf[60];
750   tree ctype, field = NULL_TREE, str_type, cinit, string;
751   static int utf8_count = 0;
752   int name_hash;
753   tree ref = IDENTIFIER_UTF8_REF (name);
754   tree decl;
755   if (ref != NULL_TREE)
756     return ref;
757
758   ctype = make_node (RECORD_TYPE);
759   str_type = build_prim_array_type (unsigned_byte_type_node,
760                                     name_len + 1); /* Allow for final '\0'. */
761   PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
762   PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
763   PUSH_FIELD (ctype, field, "data", str_type);
764   FINISH_RECORD (ctype);
765   START_RECORD_CONSTRUCTOR (cinit, ctype);
766   name_hash = hashUtf8String (name_ptr, name_len) & 0xFFFF;
767   PUSH_FIELD_VALUE (cinit, "hash", build_int_2 (name_hash, 0));
768   PUSH_FIELD_VALUE (cinit, "length", build_int_2 (name_len, 0));
769   string = build_string (name_len, name_ptr);
770   TREE_TYPE (string) = str_type;
771   PUSH_FIELD_VALUE (cinit, "data", string);
772   FINISH_RECORD_CONSTRUCTOR (cinit);
773   TREE_CONSTANT (cinit) = 1;
774
775   /* Generate a unique-enough identifier.  */
776   sprintf(buf, "_Utf%d", ++utf8_count);
777
778   decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_type);
779   TREE_STATIC (decl) = 1;
780   DECL_ARTIFICIAL (decl) = 1;
781   DECL_IGNORED_P (decl) = 1;
782   TREE_READONLY (decl) = 1;
783   TREE_THIS_VOLATILE (decl) = 0;
784   DECL_INITIAL (decl) = cinit;
785 #ifdef HAVE_GAS_SHF_MERGE
786   {
787     int decl_size;
788     /* Ensure decl_size is a multiple of utf8const_type's alignment. */
789     decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
790                  & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
791     if (flag_merge_constants && decl_size < 256)
792       {
793         char buf[32];
794         int flags = (SECTION_OVERRIDE
795                    | SECTION_MERGE | (SECTION_ENTSIZE & decl_size));
796         sprintf (buf, ".rodata.jutf8.%d", decl_size);
797         named_section_flags (buf, flags);
798         DECL_SECTION_NAME (decl) = build_string (strlen (buf), buf);
799       }
800   }
801 #endif
802   TREE_CHAIN (decl) = utf8_decl_list;
803   layout_decl (decl, 0);
804   pushdecl (decl);
805   rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);
806   utf8_decl_list = decl;
807   make_decl_rtl (decl, (char*) 0);
808   ref = build1 (ADDR_EXPR, utf8const_ptr_type, decl);
809   IDENTIFIER_UTF8_REF (name) = ref;
810   return ref;
811 }
812
813 /* Build a reference to the class TYPE.
814    Also handles primitive types and array types. */
815
816 tree
817 build_class_ref (tree type)
818 {
819   int is_compiled = is_compiled_class (type);
820   if (is_compiled)
821     {
822       tree ref, decl_name, decl;
823       if (TREE_CODE (type) == POINTER_TYPE)
824         type = TREE_TYPE (type);
825       if (TREE_CODE (type) == RECORD_TYPE)
826         {
827           if (TYPE_SIZE (type) == error_mark_node)
828             return null_pointer_node;
829           decl_name = identifier_subst (DECL_NAME (TYPE_NAME (type)),
830                                         "", '/', '/', ".class");
831           decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
832           if (decl == NULL_TREE)
833             {
834               decl = build_decl (VAR_DECL, decl_name, class_type_node);
835               DECL_SIZE (decl) = TYPE_SIZE (class_type_node);
836               DECL_SIZE_UNIT (decl) = TYPE_SIZE_UNIT (class_type_node);
837               TREE_STATIC (decl) = 1;
838               TREE_PUBLIC (decl) = 1;
839               DECL_IGNORED_P (decl) = 1;
840               DECL_ARTIFICIAL (decl) = 1;
841               if (is_compiled == 1)
842                 DECL_EXTERNAL (decl) = 1;
843               SET_DECL_ASSEMBLER_NAME (decl, 
844                                        java_mangle_class_field
845                                        (&temporary_obstack, type));
846               make_decl_rtl (decl, NULL);
847               pushdecl_top_level (decl);
848             }
849         }
850       else
851         {
852           const char *name;
853           char buffer[25];
854           if (flag_emit_class_files)
855             {
856               const char *prim_class_name;
857               tree prim_class;
858               if (type == char_type_node)
859                 prim_class_name = "java.lang.Character";
860               else if (type == boolean_type_node)
861                 prim_class_name = "java.lang.Boolean";
862               else if (type == byte_type_node)
863                 prim_class_name = "java.lang.Byte";
864               else if (type == short_type_node)
865                 prim_class_name = "java.lang.Short";
866               else if (type == int_type_node)
867                 prim_class_name = "java.lang.Integer";
868               else if (type == long_type_node)
869                 prim_class_name = "java.lang.Long";
870               else if (type == float_type_node)
871                 prim_class_name = "java.lang.Float";
872               else if (type == double_type_node)
873                 prim_class_name = "java.lang.Double";
874               else if (type == void_type_node)
875                 prim_class_name = "java.lang.Void";
876               else
877                 abort ();
878
879               prim_class = lookup_class (get_identifier (prim_class_name));
880               return build (COMPONENT_REF, NULL_TREE,
881                             prim_class, TYPE_identifier_node);
882             }
883           decl_name = TYPE_NAME (type);
884           if (TREE_CODE (decl_name) == TYPE_DECL)
885             decl_name = DECL_NAME (decl_name);
886           name = IDENTIFIER_POINTER (decl_name);
887           if (strncmp (name, "promoted_", 9) == 0)
888             name += 9;
889           sprintf (buffer, "_Jv_%sClass", name);
890           decl_name = get_identifier (buffer);
891           decl = IDENTIFIER_GLOBAL_VALUE (decl_name);
892           if (decl == NULL_TREE)
893             {
894               decl = build_decl (VAR_DECL, decl_name, class_type_node);
895               TREE_STATIC (decl) = 1;
896               TREE_PUBLIC (decl) = 1;
897               DECL_EXTERNAL (decl) = 1;
898               make_decl_rtl (decl, NULL);
899               pushdecl_top_level (decl);
900             }
901         }
902
903       ref = build1 (ADDR_EXPR, class_ptr_type, decl);
904       return ref;
905     }
906   else
907     {
908       int index;
909       tree cl;
910       index = alloc_class_constant (type);
911       cl = build_ref_from_constant_pool (index); 
912       TREE_TYPE (cl) = promote_type (class_ptr_type);
913       return cl;
914     }
915 }
916
917 tree
918 build_static_field_ref (tree fdecl)
919 {
920   tree fclass = DECL_CONTEXT (fdecl);
921   int is_compiled = is_compiled_class (fclass);
922
923   /* Allow static final fields to fold to a constant.  When using
924      -fno-assume-compiled, gcj will sometimes try to fold a field from
925      an uncompiled class.  This is required when the field in question
926      meets the appropriate criteria for a compile-time constant.
927      However, currently sometimes gcj is too eager and will end up
928      returning the field itself, leading to an incorrect external
929      reference being generated.  */
930   if (is_compiled
931       || (FIELD_FINAL (fdecl) && DECL_INITIAL (fdecl) != NULL_TREE
932           && (JSTRING_TYPE_P (TREE_TYPE (fdecl))
933               || JNUMERIC_TYPE_P (TREE_TYPE (fdecl)))
934           && TREE_CONSTANT (DECL_INITIAL (fdecl))))
935     {
936       if (!DECL_RTL_SET_P (fdecl))
937         {
938           if (is_compiled == 1)
939             DECL_EXTERNAL (fdecl) = 1;
940           make_decl_rtl (fdecl, NULL);
941         }
942       return fdecl;
943     }
944   else
945     {
946       /* Compile as:
947        * *(FTYPE*)build_class_ref(FCLASS)->fields[INDEX].info.addr */
948       tree ref = build_class_ref (fclass);
949       tree fld;
950       int field_index = 0;
951       ref = build1 (INDIRECT_REF, class_type_node, ref);
952       ref = build (COMPONENT_REF, field_ptr_type_node, ref,
953                    lookup_field (&class_type_node, fields_ident));
954
955       for (fld = TYPE_FIELDS (fclass); ; fld = TREE_CHAIN (fld))
956         {
957           if (fld == fdecl)
958             break;
959           if (fld == NULL_TREE)
960             fatal_error ("field '%s' not found in class",
961                          IDENTIFIER_POINTER (DECL_NAME (fdecl)));
962           if (FIELD_STATIC (fld))
963             field_index++;
964         }
965       field_index *= int_size_in_bytes (field_type_node);
966       ref = fold (build (PLUS_EXPR, field_ptr_type_node,
967                          ref, build_int_2 (field_index, 0)));
968       ref = build1 (INDIRECT_REF, field_type_node, ref);
969       ref = build (COMPONENT_REF, field_info_union_node,
970                    ref, lookup_field (&field_type_node, info_ident));
971       ref = build (COMPONENT_REF, ptr_type_node,
972                    ref, TREE_CHAIN (TYPE_FIELDS (field_info_union_node)));
973       return fold (build1 (INDIRECT_REF, TREE_TYPE(fdecl), ref));
974     }
975 }
976
977 int
978 get_access_flags_from_decl (tree decl)
979 {
980   int access_flags = 0;
981   if (TREE_CODE (decl) == FIELD_DECL || TREE_CODE (decl) == VAR_DECL)
982     {
983       if (FIELD_STATIC (decl))
984         access_flags |= ACC_STATIC;
985       if (FIELD_PUBLIC (decl))
986         access_flags |= ACC_PUBLIC;
987       if (FIELD_PROTECTED (decl))
988         access_flags |= ACC_PROTECTED;
989       if (FIELD_PRIVATE (decl))
990         access_flags |= ACC_PRIVATE;
991       if (FIELD_FINAL (decl))
992         access_flags |= ACC_FINAL;
993       if (FIELD_VOLATILE (decl))
994         access_flags |= ACC_VOLATILE;
995       if (FIELD_TRANSIENT (decl))
996         access_flags |= ACC_TRANSIENT;
997       return access_flags;
998     }
999   if (TREE_CODE (decl) == TYPE_DECL)
1000     {
1001       if (CLASS_PUBLIC (decl))
1002         access_flags |= ACC_PUBLIC;
1003       if (CLASS_FINAL (decl))
1004         access_flags |= ACC_FINAL;
1005       if (CLASS_SUPER (decl))
1006         access_flags |= ACC_SUPER;
1007       if (CLASS_INTERFACE (decl))
1008         access_flags |= ACC_INTERFACE;
1009       if (CLASS_ABSTRACT (decl))
1010         access_flags |= ACC_ABSTRACT;
1011       if (CLASS_STATIC (decl))
1012         access_flags |= ACC_STATIC;
1013       if (CLASS_PRIVATE (decl))
1014         access_flags |= ACC_PRIVATE;
1015       if (CLASS_PROTECTED (decl))
1016         access_flags |= ACC_PROTECTED;
1017       if (CLASS_STRICTFP (decl))
1018         access_flags |= ACC_STRICT;
1019       return access_flags;
1020     }
1021   if (TREE_CODE (decl) == FUNCTION_DECL)
1022     {
1023       if (METHOD_PUBLIC (decl))
1024         access_flags |= ACC_PUBLIC;
1025       if (METHOD_PRIVATE (decl))
1026         access_flags |= ACC_PRIVATE;
1027       if (METHOD_PROTECTED (decl))
1028         access_flags |= ACC_PROTECTED;
1029       if (METHOD_STATIC (decl))
1030         access_flags |= ACC_STATIC;
1031       if (METHOD_FINAL (decl))
1032         access_flags |= ACC_FINAL;
1033       if (METHOD_SYNCHRONIZED (decl))
1034         access_flags |= ACC_SYNCHRONIZED;
1035       if (METHOD_NATIVE (decl))
1036         access_flags |= ACC_NATIVE;
1037       if (METHOD_ABSTRACT (decl))
1038         access_flags |= ACC_ABSTRACT;
1039       if (METHOD_TRANSIENT (decl))
1040         access_flags |= ACC_TRANSIENT;
1041       if (METHOD_STRICTFP (decl))
1042         access_flags |= ACC_STRICT;
1043       return access_flags;
1044     }
1045   abort ();
1046 }
1047
1048 static tree
1049 make_field_value (tree fdecl)
1050 {
1051   tree finit;
1052   int flags;
1053   tree type = TREE_TYPE (fdecl);
1054   int resolved = is_compiled_class (type);
1055
1056   START_RECORD_CONSTRUCTOR (finit, field_type_node);
1057   PUSH_FIELD_VALUE (finit, "name", build_utf8_ref (DECL_NAME (fdecl)));
1058   if (resolved)
1059     type = build_class_ref (type);
1060   else
1061     {
1062       tree signature = build_java_signature (type);
1063
1064       type = build_utf8_ref (unmangle_classname 
1065                              (IDENTIFIER_POINTER (signature),
1066                               IDENTIFIER_LENGTH (signature)));
1067     }
1068   PUSH_FIELD_VALUE (finit, "type", type);
1069
1070   flags = get_access_flags_from_decl (fdecl);
1071   if (! resolved)
1072     flags |= 0x8000 /* FIELD_UNRESOLVED_FLAG */;
1073
1074   PUSH_FIELD_VALUE (finit, "accflags", build_int_2 (flags, 0));
1075   PUSH_FIELD_VALUE (finit, "bsize", TYPE_SIZE_UNIT (TREE_TYPE (fdecl)));
1076
1077   PUSH_FIELD_VALUE
1078     (finit, "info",
1079      build_constructor (field_info_union_node,
1080             build_tree_list
1081             ((FIELD_STATIC (fdecl)
1082               ? TREE_CHAIN (TYPE_FIELDS (field_info_union_node))
1083               : TYPE_FIELDS (field_info_union_node)),
1084              (FIELD_STATIC (fdecl)
1085               ? build_address_of (build_static_field_ref (fdecl))
1086               : byte_position (fdecl)))));
1087
1088   FINISH_RECORD_CONSTRUCTOR (finit);
1089   return finit;
1090 }
1091
1092 static tree
1093 make_method_value (tree mdecl)
1094 {
1095   static int method_name_count = 0;
1096   tree minit;
1097   tree index;
1098   tree code;
1099 #define ACC_TRANSLATED          0x4000
1100   int accflags = get_access_flags_from_decl (mdecl) | ACC_TRANSLATED;
1101
1102   if (!flag_indirect_dispatch && DECL_VINDEX (mdecl) != NULL_TREE)
1103     index = DECL_VINDEX (mdecl);
1104   else
1105     index = integer_minus_one_node;
1106
1107   code = null_pointer_node;
1108   if (DECL_RTL_SET_P (mdecl))
1109     code = build1 (ADDR_EXPR, nativecode_ptr_type_node, mdecl);
1110   START_RECORD_CONSTRUCTOR (minit, method_type_node);
1111   PUSH_FIELD_VALUE (minit, "name",
1112                     build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
1113                                     init_identifier_node
1114                                     : DECL_NAME (mdecl)));
1115   {
1116     tree signature = build_java_signature (TREE_TYPE (mdecl));
1117     PUSH_FIELD_VALUE (minit, "signature", 
1118                       (build_utf8_ref 
1119                        (unmangle_classname 
1120                         (IDENTIFIER_POINTER(signature),
1121                          IDENTIFIER_LENGTH(signature)))));
1122   }
1123   PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0));
1124   PUSH_FIELD_VALUE (minit, "index", index);
1125   PUSH_FIELD_VALUE (minit, "ncode", code);
1126
1127   {
1128     /* Compute the `throws' information for the method.  */
1129     tree table = null_pointer_node;
1130     if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
1131       {
1132         int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
1133         tree iter, type, array;
1134         char buf[60];
1135
1136         table = tree_cons (NULL_TREE, table, NULL_TREE);
1137         for (iter = DECL_FUNCTION_THROWS (mdecl);
1138              iter != NULL_TREE;
1139              iter = TREE_CHAIN (iter))
1140           {
1141             tree sig = DECL_NAME (TYPE_NAME (TREE_VALUE (iter)));
1142             tree utf8
1143               = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
1144                                                     IDENTIFIER_LENGTH (sig)));
1145             table = tree_cons (NULL_TREE, utf8, table);
1146           }
1147         type = build_prim_array_type (ptr_type_node, length);
1148         table = build_constructor (type, table);
1149         /* Compute something unique enough.  */
1150         sprintf (buf, "_methods%d", method_name_count++);
1151         array = build_decl (VAR_DECL, get_identifier (buf), type);
1152         DECL_INITIAL (array) = table;
1153         TREE_STATIC (array) = 1;
1154         DECL_ARTIFICIAL (array) = 1;
1155         DECL_IGNORED_P (array) = 1;
1156         rest_of_decl_compilation (array, (char*) 0, 1, 0);
1157
1158         table = build1 (ADDR_EXPR, ptr_type_node, array);
1159       }
1160
1161     PUSH_FIELD_VALUE (minit, "throws", table);
1162   }
1163
1164   FINISH_RECORD_CONSTRUCTOR (minit);
1165   return minit;
1166 }
1167
1168 static tree
1169 get_dispatch_vector (tree type)
1170 {
1171   tree vtable = TYPE_VTABLE (type);
1172
1173   if (vtable == NULL_TREE)
1174     {
1175       HOST_WIDE_INT i;
1176       tree method;
1177       tree super = CLASSTYPE_SUPER (type);
1178       HOST_WIDE_INT nvirtuals = tree_low_cst (TYPE_NVIRTUALS (type), 0);
1179       vtable = make_tree_vec (nvirtuals);
1180       TYPE_VTABLE (type) = vtable;
1181       if (super != NULL_TREE)
1182         {
1183           tree super_vtable = get_dispatch_vector (super);
1184
1185           for (i = tree_low_cst (TYPE_NVIRTUALS (super), 0); --i >= 0; )
1186             TREE_VEC_ELT (vtable, i) = TREE_VEC_ELT (super_vtable, i);
1187         }
1188
1189       for (method = TYPE_METHODS (type);  method != NULL_TREE;
1190            method = TREE_CHAIN (method))
1191         if (DECL_VINDEX (method) != NULL_TREE
1192             && host_integerp (DECL_VINDEX (method), 0))
1193           TREE_VEC_ELT (vtable, tree_low_cst (DECL_VINDEX (method), 0))
1194             = method;
1195     }
1196
1197   return vtable;
1198 }
1199
1200 static tree
1201 get_dispatch_table (tree type, tree this_class_addr)
1202 {
1203   int abstract_p = CLASS_ABSTRACT (TYPE_NAME (type));
1204   tree vtable = get_dispatch_vector (type);
1205   int i, j;
1206   tree list = NULL_TREE;
1207   int nvirtuals = TREE_VEC_LENGTH (vtable);
1208   int arraysize;
1209   tree gc_descr;
1210
1211   for (i = nvirtuals;  --i >= 0; )
1212     {
1213       tree method = TREE_VEC_ELT (vtable, i);
1214       if (METHOD_ABSTRACT (method))
1215         {
1216           if (! abstract_p)
1217             warning_with_decl (method,
1218                                "abstract method in non-abstract class");
1219
1220           if (TARGET_VTABLE_USES_DESCRIPTORS)
1221             for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1222               list = tree_cons (NULL_TREE, null_pointer_node, list);
1223           else
1224             list = tree_cons (NULL_TREE, null_pointer_node, list);
1225         }
1226       else
1227         {
1228           if (!DECL_RTL_SET_P (method))
1229             make_decl_rtl (method, NULL);
1230
1231           if (TARGET_VTABLE_USES_DESCRIPTORS)
1232             for (j = 0; j < TARGET_VTABLE_USES_DESCRIPTORS; ++j)
1233               {
1234                 tree fdesc = build (FDESC_EXPR, nativecode_ptr_type_node, 
1235                                     method, build_int_2 (j, 0));
1236                 TREE_CONSTANT (fdesc) = 1;
1237                 list = tree_cons (NULL_TREE, fdesc, list);
1238               }
1239           else
1240             list = tree_cons (NULL_TREE,
1241                               build1 (ADDR_EXPR, nativecode_ptr_type_node,
1242                                       method),
1243                               list);
1244         }
1245     }
1246
1247   /* Dummy entry for compatibility with G++ -fvtable-thunks.  When
1248      using the Boehm GC we sometimes stash a GC type descriptor
1249      there. We set the PURPOSE to NULL_TREE not to interfere (reset)
1250      the emitted byte count during the output to the assembly file. */
1251   /* With TARGET_VTABLE_USES_DESCRIPTORS, we only add one extra
1252      fake "function descriptor".  It's first word is the is the class
1253      pointer, and subsequent words (usually one) contain the GC descriptor.
1254      In all other cases, we reserve two extra vtable slots. */
1255   gc_descr =  get_boehm_type_descriptor (type);
1256   list = tree_cons (NULL_TREE, gc_descr, list);
1257   for (j = 1; j < TARGET_VTABLE_USES_DESCRIPTORS-1; ++j)
1258     list = tree_cons (NULL_TREE, gc_descr, list);
1259   list = tree_cons (NULL_TREE, this_class_addr, list);
1260
1261   /** Pointer to type_info object (to be implemented), according to g++ ABI. */
1262   list = tree_cons (NULL_TREE, null_pointer_node, list);
1263   /** Offset to start of whole object.  Always (ptrdiff_t)0 for Java. */
1264   list = tree_cons (integer_zero_node, null_pointer_node, list);
1265
1266   arraysize = (TARGET_VTABLE_USES_DESCRIPTORS? nvirtuals + 1 : nvirtuals + 2);
1267   if (TARGET_VTABLE_USES_DESCRIPTORS)
1268     arraysize *= TARGET_VTABLE_USES_DESCRIPTORS;
1269   arraysize += 2;
1270   return build_constructor (build_prim_array_type (nativecode_ptr_type_node,
1271                                                    arraysize), list);
1272 }
1273
1274 static int
1275 supers_all_compiled (tree type)
1276 {
1277   while (type != NULL_TREE)
1278     {
1279       if (!assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)))))
1280         return 0;
1281       type = CLASSTYPE_SUPER (type);
1282     }
1283   return 1;
1284 }
1285
1286 void
1287 make_class_data (tree type)
1288 {
1289   tree decl, cons, temp;
1290   tree field, fields_decl;
1291   tree static_fields = NULL_TREE;
1292   tree instance_fields = NULL_TREE;
1293   HOST_WIDE_INT static_field_count = 0;
1294   HOST_WIDE_INT instance_field_count = 0;
1295   HOST_WIDE_INT field_count;
1296   tree field_array_type;
1297   tree method;
1298   tree methods = NULL_TREE;
1299   tree dtable_decl = NULL_TREE;
1300   HOST_WIDE_INT method_count = 0;
1301   tree method_array_type;
1302   tree methods_decl;
1303   tree super;
1304   tree this_class_addr;
1305   tree constant_pool_constructor;
1306   tree interfaces = null_pointer_node;
1307   int interface_len = 0;
1308   tree type_decl = TYPE_NAME (type);
1309   /** Offset from start of virtual function table declaration
1310       to where objects actually point at, following new g++ ABI. */
1311   tree dtable_start_offset = build_int_2 (2 * POINTER_SIZE / BITS_PER_UNIT, 0);
1312
1313   this_class_addr = build_class_ref (type);
1314   decl = TREE_OPERAND (this_class_addr, 0);
1315
1316   /* Build Field array. */
1317   field = TYPE_FIELDS (type);
1318   if (DECL_NAME (field) == NULL_TREE)
1319     field = TREE_CHAIN (field);  /* Skip dummy field for inherited data. */
1320   for ( ;  field != NULL_TREE;  field = TREE_CHAIN (field))
1321     {
1322       if (! DECL_ARTIFICIAL (field))
1323         {
1324           tree init = make_field_value (field);
1325           if (FIELD_STATIC (field))
1326             {
1327               tree initial = DECL_INITIAL (field);
1328               static_field_count++;
1329               static_fields = tree_cons (NULL_TREE, init, static_fields);
1330               /* If the initial value is a string constant,
1331                  prevent output_constant from trying to assemble the value. */
1332               if (initial != NULL_TREE
1333                   && TREE_TYPE (initial) == string_ptr_type_node)
1334                 DECL_INITIAL (field) = NULL_TREE;
1335               rest_of_decl_compilation (field, (char*) 0, 1, 1);
1336               DECL_INITIAL (field) = initial;
1337             }
1338           else
1339             {
1340               instance_field_count++;
1341               instance_fields = tree_cons (NULL_TREE, init, instance_fields);
1342             }
1343         }
1344     }
1345   field_count = static_field_count + instance_field_count;
1346   if (field_count > 0)
1347     {
1348       static_fields = nreverse (static_fields);
1349       instance_fields = nreverse (instance_fields);
1350       static_fields = chainon (static_fields, instance_fields);
1351       field_array_type = build_prim_array_type (field_type_node, field_count);
1352       fields_decl = build_decl (VAR_DECL, mangled_classname ("_FL_", type),
1353                                 field_array_type);
1354       DECL_INITIAL (fields_decl) = build_constructor (field_array_type,
1355                                                       static_fields);
1356       TREE_STATIC (fields_decl) = 1;
1357       DECL_ARTIFICIAL (fields_decl) = 1;
1358       DECL_IGNORED_P (fields_decl) = 1;
1359       rest_of_decl_compilation (fields_decl, (char*) 0, 1, 0);
1360     }
1361   else
1362     fields_decl = NULL_TREE;
1363
1364   /* Build Method array. */
1365   for (method = TYPE_METHODS (type);
1366        method != NULL_TREE; method = TREE_CHAIN (method))
1367     {
1368       tree init;
1369       if (METHOD_PRIVATE (method)
1370           && ! flag_keep_inline_functions
1371           && (flag_inline_functions || optimize))
1372         continue;
1373       init = make_method_value (method);
1374       method_count++;
1375       methods = tree_cons (NULL_TREE, init, methods);
1376     }
1377   method_array_type = build_prim_array_type (method_type_node, method_count);
1378   methods_decl = build_decl (VAR_DECL, mangled_classname ("_MT_", type),
1379                              method_array_type);
1380   DECL_INITIAL (methods_decl) = build_constructor (method_array_type,
1381                                                    nreverse (methods));
1382   TREE_STATIC (methods_decl) = 1;
1383   DECL_ARTIFICIAL (methods_decl) = 1;
1384   DECL_IGNORED_P (methods_decl) = 1;
1385   rest_of_decl_compilation (methods_decl, (char*) 0, 1, 0);
1386
1387   if (supers_all_compiled (type) && ! CLASS_INTERFACE (type_decl)
1388       && !flag_indirect_dispatch)
1389     {
1390       tree dtable = get_dispatch_table (type, this_class_addr);
1391       dtable_decl = build_dtable_decl (type);
1392       DECL_INITIAL (dtable_decl) = dtable;
1393       TREE_STATIC (dtable_decl) = 1;
1394       DECL_ARTIFICIAL (dtable_decl) = 1;
1395       DECL_IGNORED_P (dtable_decl) = 1;
1396       TREE_PUBLIC (dtable_decl) = 1;
1397       rest_of_decl_compilation (dtable_decl, (char*) 0, 1, 0);
1398       if (type == class_type_node)
1399         class_dtable_decl = dtable_decl;
1400     }
1401
1402   if (class_dtable_decl == NULL_TREE)
1403     {
1404       class_dtable_decl = build_dtable_decl (class_type_node);
1405       TREE_STATIC (class_dtable_decl) = 1;
1406       DECL_ARTIFICIAL (class_dtable_decl) = 1;
1407       DECL_IGNORED_P (class_dtable_decl) = 1;
1408       if (is_compiled_class (class_type_node) != 2)
1409         DECL_EXTERNAL (class_dtable_decl) = 1;
1410       rest_of_decl_compilation (class_dtable_decl, (char*) 0, 1, 0);
1411     }
1412
1413   super = CLASSTYPE_SUPER (type);
1414   if (super == NULL_TREE)
1415     super = null_pointer_node;
1416   else if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (type_decl)))
1417            && assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (super)))))
1418     super = build_class_ref (super);
1419   else
1420     {
1421       int super_index = alloc_class_constant (super);
1422       super = build_int_2 (super_index, 0);
1423       TREE_TYPE (super) = ptr_type_node;
1424     }
1425
1426   /* Build and emit the array of implemented interfaces. */
1427   if (type != object_type_node)
1428       interface_len = TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type)) - 1;
1429   if (interface_len > 0)
1430     {
1431       tree init = NULL_TREE;
1432       int i;
1433       tree interface_array_type, idecl;
1434       interface_array_type
1435         = build_prim_array_type (class_ptr_type, interface_len);
1436       idecl = build_decl (VAR_DECL, mangled_classname ("_IF_", type),
1437                           interface_array_type);
1438       for (i = interface_len;  i > 0; i--)
1439         {
1440           tree child = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), i);
1441           tree iclass = BINFO_TYPE (child);
1442           tree index;
1443           if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (iclass)))))
1444             index = build_class_ref (iclass);
1445           else
1446             {
1447                 int int_index = alloc_class_constant (iclass);
1448                 index = build_int_2 (int_index, 0);
1449                 TREE_TYPE (index) = ptr_type_node;
1450             }
1451           init = tree_cons (NULL_TREE, index, init); 
1452         }
1453       DECL_INITIAL (idecl) = build_constructor (interface_array_type, init);
1454       TREE_STATIC (idecl) = 1;
1455       DECL_ARTIFICIAL (idecl) = 1;
1456       DECL_IGNORED_P (idecl) = 1;
1457       interfaces = build1 (ADDR_EXPR, ptr_type_node, idecl);
1458       rest_of_decl_compilation (idecl,  (char*) 0, 1, 0);
1459     }
1460
1461   constant_pool_constructor = build_constants_constructor ();
1462
1463   START_RECORD_CONSTRUCTOR (temp, object_type_node);
1464   PUSH_FIELD_VALUE (temp, "vtable",
1465                     build (PLUS_EXPR, dtable_ptr_type,
1466                            build1 (ADDR_EXPR, dtable_ptr_type, class_dtable_decl),
1467                            dtable_start_offset));
1468   if (! flag_hash_synchronization)
1469     PUSH_FIELD_VALUE (temp, "sync_info", null_pointer_node);
1470   FINISH_RECORD_CONSTRUCTOR (temp);
1471   START_RECORD_CONSTRUCTOR (cons, class_type_node);
1472   PUSH_SUPER_VALUE (cons, temp);
1473   PUSH_FIELD_VALUE (cons, "next", null_pointer_node);
1474   PUSH_FIELD_VALUE (cons, "name", build_utf8_ref (DECL_NAME (type_decl)));
1475   PUSH_FIELD_VALUE (cons, "accflags",
1476                     build_int_2 (get_access_flags_from_decl (type_decl), 0));
1477
1478   PUSH_FIELD_VALUE (cons, "superclass", 
1479                     CLASS_INTERFACE (type_decl) ? null_pointer_node : super);
1480   PUSH_FIELD_VALUE (cons, "constants", constant_pool_constructor);
1481   PUSH_FIELD_VALUE (cons, "methods",
1482                     build1 (ADDR_EXPR, method_ptr_type_node, methods_decl));
1483   PUSH_FIELD_VALUE (cons, "method_count",  build_int_2 (method_count, 0));
1484
1485   if (flag_indirect_dispatch)
1486     PUSH_FIELD_VALUE (cons, "vtable_method_count", integer_minus_one_node)
1487   else
1488     PUSH_FIELD_VALUE (cons, "vtable_method_count", TYPE_NVIRTUALS (type));
1489     
1490   PUSH_FIELD_VALUE (cons, "fields",
1491                     fields_decl == NULL_TREE ? null_pointer_node
1492                     : build1 (ADDR_EXPR, field_ptr_type_node, fields_decl));
1493   PUSH_FIELD_VALUE (cons, "size_in_bytes", size_in_bytes (type));
1494   PUSH_FIELD_VALUE (cons, "field_count", build_int_2 (field_count, 0));
1495   PUSH_FIELD_VALUE (cons, "static_field_count",
1496                     build_int_2 (static_field_count, 0));
1497
1498   if (flag_indirect_dispatch)
1499     PUSH_FIELD_VALUE (cons, "vtable", null_pointer_node)
1500   else
1501     PUSH_FIELD_VALUE (cons, "vtable",
1502                       dtable_decl == NULL_TREE ? null_pointer_node
1503                       : build (PLUS_EXPR, dtable_ptr_type,
1504                                build1 (ADDR_EXPR, dtable_ptr_type, dtable_decl),
1505                                dtable_start_offset));
1506   
1507   if (otable_methods == NULL_TREE)
1508     {
1509       PUSH_FIELD_VALUE (cons, "otable", null_pointer_node);
1510       PUSH_FIELD_VALUE (cons, "otable_syms", null_pointer_node);
1511     }
1512   else
1513     {
1514       PUSH_FIELD_VALUE (cons, "otable",
1515                         build1 (ADDR_EXPR, otable_ptr_type, otable_decl));
1516       PUSH_FIELD_VALUE (cons, "otable_syms",
1517                         build1 (ADDR_EXPR, method_symbols_array_ptr_type,
1518                                 otable_syms_decl));
1519     }
1520   PUSH_FIELD_VALUE (cons, "interfaces", interfaces);
1521   PUSH_FIELD_VALUE (cons, "loader", null_pointer_node);
1522   PUSH_FIELD_VALUE (cons, "interface_count", build_int_2 (interface_len, 0));
1523   PUSH_FIELD_VALUE (cons, "state", integer_zero_node);
1524
1525   PUSH_FIELD_VALUE (cons, "thread", null_pointer_node);
1526   PUSH_FIELD_VALUE (cons, "depth", integer_zero_node);
1527   PUSH_FIELD_VALUE (cons, "ancestors", null_pointer_node);
1528   PUSH_FIELD_VALUE (cons, "idt", null_pointer_node);
1529   PUSH_FIELD_VALUE (cons, "arrayclass", null_pointer_node);
1530   PUSH_FIELD_VALUE (cons, "protectionDomain", null_pointer_node);
1531   PUSH_FIELD_VALUE (cons, "chain", null_pointer_node);
1532
1533   FINISH_RECORD_CONSTRUCTOR (cons);
1534
1535   DECL_INITIAL (decl) = cons;
1536   
1537   /* Hash synchronization requires at least 64-bit alignment. */
1538   if (flag_hash_synchronization && POINTER_SIZE < 64)
1539     DECL_ALIGN (decl) = 64; 
1540   
1541   rest_of_decl_compilation (decl, (char*) 0, 1, 0);
1542 }
1543
1544 void
1545 finish_class (void)
1546 {
1547   tree method;
1548   tree type_methods = TYPE_METHODS (current_class);
1549   int saw_native_method = 0;
1550
1551   /* Find out if we have any native methods.  We use this information
1552      later.  */
1553   for (method = type_methods;
1554        method != NULL_TREE;
1555        method = TREE_CHAIN (method))
1556     {
1557       if (METHOD_NATIVE (method))
1558         {
1559           saw_native_method = 1;
1560           break;
1561         }
1562     }
1563
1564   /* Emit deferred inline methods. */  
1565   for (method = type_methods; method != NULL_TREE; )
1566     {
1567       if (! TREE_ASM_WRITTEN (method) && DECL_SAVED_INSNS (method) != 0)
1568         {
1569           output_inline_function (method);
1570           /* Scan the list again to see if there are any earlier
1571              methods to emit. */
1572           method = type_methods;
1573           continue;
1574         }
1575       method = TREE_CHAIN (method);
1576     }
1577
1578   current_function_decl = NULL_TREE;
1579   make_class_data (current_class);
1580   register_class ();
1581   rest_of_decl_compilation (TYPE_NAME (current_class), (char*) 0, 1, 0);
1582 }
1583
1584 /* Return 2 if CLASS is compiled by this compilation job;
1585    return 1 if CLASS can otherwise be assumed to be compiled;
1586    return 0 if we cannot assume that CLASS is compiled.
1587    Returns 1 for primitive and 0 for array types.  */
1588 int
1589 is_compiled_class (tree class)
1590 {
1591   int seen_in_zip;
1592   if (TREE_CODE (class) == POINTER_TYPE)
1593     class = TREE_TYPE (class);
1594   if (TREE_CODE (class) != RECORD_TYPE)  /* Primitive types are static. */
1595     return 1;
1596   if (TYPE_ARRAY_P (class))
1597     return 0;
1598   if (class == current_class)
1599     return 2;
1600
1601   seen_in_zip = (TYPE_JCF (class) && JCF_SEEN_IN_ZIP (TYPE_JCF (class)));
1602   if (CLASS_FROM_CURRENTLY_COMPILED_P (class) || seen_in_zip)
1603     {
1604       /* The class was seen in the current ZIP file and will be
1605          available as a compiled class in the future but may not have
1606          been loaded already. Load it if necessary. This prevent
1607          build_class_ref () from crashing. */
1608
1609       if (seen_in_zip && !CLASS_LOADED_P (class))
1610         load_class (class, 1);
1611
1612       /* We return 2 for class seen in ZIP and class from files
1613          belonging to the same compilation unit */
1614       return 2;
1615     }
1616
1617   if (assume_compiled (IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (class)))))
1618     {
1619       if (!CLASS_LOADED_P (class))
1620         {
1621           if (CLASS_FROM_SOURCE_P (class))
1622             safe_layout_class (class);
1623           else
1624             load_class (class, 1);
1625         }
1626       return 1;
1627     }
1628
1629   return 0;
1630 }
1631
1632 /* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
1633
1634 tree
1635 build_dtable_decl (tree type)
1636 {
1637   tree dtype;
1638
1639   /* We need to build a new dtable type so that its size is uniquely
1640      computed when we're dealing with the class for real and not just
1641      faking it (like java.lang.Class during the initialization of the
1642      compiler.) We know we're not faking a class when CURRENT_CLASS is
1643      TYPE. */
1644   if (current_class == type)
1645     {
1646       tree dummy = NULL_TREE;
1647       int n;
1648
1649       dtype = make_node (RECORD_TYPE);
1650
1651       PUSH_FIELD (dtype, dummy, "top_offset", ptr_type_node);
1652       PUSH_FIELD (dtype, dummy, "type_info", ptr_type_node);
1653
1654       PUSH_FIELD (dtype, dummy, "class", class_ptr_type);
1655       for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1656         {
1657           tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1658           TREE_CHAIN (dummy) = tmp_field;
1659           DECL_CONTEXT (tmp_field) = dtype;
1660           DECL_ARTIFICIAL (tmp_field) = 1;
1661           dummy = tmp_field;
1662         }
1663
1664       PUSH_FIELD (dtype, dummy, "gc_descr", ptr_type_node);
1665       for (n = 1; n < TARGET_VTABLE_USES_DESCRIPTORS; ++n)
1666         {
1667           tree tmp_field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node);
1668           TREE_CHAIN (dummy) = tmp_field;
1669           DECL_CONTEXT (tmp_field) = dtype;
1670           DECL_ARTIFICIAL (tmp_field) = 1;
1671           dummy = tmp_field;
1672         }
1673
1674       n = TREE_VEC_LENGTH (get_dispatch_vector (type));
1675       if (TARGET_VTABLE_USES_DESCRIPTORS)
1676         n *= TARGET_VTABLE_USES_DESCRIPTORS;
1677
1678       PUSH_FIELD (dtype, dummy, "methods",
1679                   build_prim_array_type (nativecode_ptr_type_node, n));
1680       layout_type (dtype);
1681     }
1682   else
1683     dtype = dtable_type;
1684
1685   return build_decl (VAR_DECL, 
1686                      java_mangle_vtable (&temporary_obstack, type), dtype);
1687 }
1688
1689 /* Pre-pend the TYPE_FIELDS of THIS_CLASS with a dummy FIELD_DECL for the
1690    fields inherited from SUPER_CLASS. */
1691
1692 void
1693 push_super_field (tree this_class, tree super_class)
1694 {
1695   tree base_decl;
1696   /* Don't insert the field if we're just re-laying the class out. */ 
1697   if (TYPE_FIELDS (this_class) && !DECL_NAME (TYPE_FIELDS (this_class)))
1698     return;
1699   base_decl = build_decl (FIELD_DECL, NULL_TREE, super_class);
1700   DECL_IGNORED_P (base_decl) = 1;
1701   TREE_CHAIN (base_decl) = TYPE_FIELDS (this_class);
1702   TYPE_FIELDS (this_class) = base_decl;
1703   DECL_SIZE (base_decl) = TYPE_SIZE (super_class);
1704   DECL_SIZE_UNIT (base_decl) = TYPE_SIZE_UNIT (super_class);
1705 }
1706
1707 /* Handle the different manners we may have to lay out a super class.  */
1708
1709 static tree
1710 maybe_layout_super_class (tree super_class, tree this_class)
1711 {
1712   if (TREE_CODE (super_class) == RECORD_TYPE)
1713     {
1714       if (!CLASS_LOADED_P (super_class) && CLASS_FROM_SOURCE_P (super_class))
1715         safe_layout_class (super_class);
1716       if (!CLASS_LOADED_P (super_class))
1717         load_class (super_class, 1);
1718     }
1719   /* We might have to layout the class before its dependency on
1720      the super class gets resolved by java_complete_class  */
1721   else if (TREE_CODE (super_class) == POINTER_TYPE)
1722     {
1723       if (TREE_TYPE (super_class) != NULL_TREE)
1724         super_class = TREE_TYPE (super_class);
1725       else
1726         {
1727           /* do_resolve_class expects an EXPR_WITH_FILE_LOCATION, so
1728              we give it one.  */
1729           tree this_wrap = NULL_TREE;
1730
1731           if (this_class)
1732             {
1733               tree this_decl = TYPE_NAME (this_class);
1734               this_wrap = build_expr_wfl (this_class,
1735                                           DECL_SOURCE_FILE (this_decl),
1736                                           DECL_SOURCE_LINE (this_decl), 0);
1737             }
1738           super_class = do_resolve_class (NULL_TREE, /* FIXME? */
1739                                           super_class, NULL_TREE, this_wrap);
1740           if (!super_class)
1741             return NULL_TREE;   /* FIXME, NULL_TREE not checked by caller. */
1742           super_class = TREE_TYPE (super_class);
1743         }
1744     }
1745   if (!TYPE_SIZE (super_class))
1746     safe_layout_class (super_class);
1747
1748   return super_class;
1749 }
1750
1751 void
1752 layout_class (tree this_class)
1753 {
1754   tree super_class = CLASSTYPE_SUPER (this_class);
1755   tree field;
1756   
1757   class_list = tree_cons (this_class, NULL_TREE, class_list);
1758   if (CLASS_BEING_LAIDOUT (this_class))
1759     {
1760       char buffer [1024];
1761       char *report;
1762       tree current;
1763       
1764       sprintf (buffer, " with `%s'",
1765                IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class))));
1766       obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1767
1768       for (current = TREE_CHAIN (class_list); current; 
1769            current = TREE_CHAIN (current))
1770         {
1771           tree decl = TYPE_NAME (TREE_PURPOSE (current));
1772           sprintf (buffer, "\n  which inherits from `%s' (%s:%d)",
1773                    IDENTIFIER_POINTER (DECL_NAME (decl)),
1774                    DECL_SOURCE_FILE (decl),
1775                    DECL_SOURCE_LINE (decl));
1776           obstack_grow (&temporary_obstack, buffer, strlen (buffer));
1777         }
1778       obstack_1grow (&temporary_obstack, '\0');
1779       report = obstack_finish (&temporary_obstack);
1780       cyclic_inheritance_report = ggc_strdup (report);
1781       obstack_free (&temporary_obstack, report);
1782       TYPE_SIZE (this_class) = error_mark_node;
1783       return;
1784     }
1785   CLASS_BEING_LAIDOUT (this_class) = 1;
1786
1787   if (super_class && !CLASS_BEING_LAIDOUT (super_class))
1788     {
1789       tree maybe_super_class 
1790         = maybe_layout_super_class (super_class, this_class);
1791       if (maybe_super_class == NULL
1792           || TREE_CODE (TYPE_SIZE (maybe_super_class)) == ERROR_MARK)
1793         {
1794           TYPE_SIZE (this_class) = error_mark_node;
1795           CLASS_BEING_LAIDOUT (this_class) = 0;
1796           class_list = TREE_CHAIN (class_list);
1797           return;
1798         }
1799       if (TYPE_SIZE (this_class) == NULL_TREE)
1800         push_super_field (this_class, maybe_super_class);
1801     }
1802
1803   for (field = TYPE_FIELDS (this_class);
1804        field != NULL_TREE;  field = TREE_CHAIN (field))
1805     {
1806       if (FIELD_STATIC (field))
1807         {
1808           /* Set DECL_ASSEMBLER_NAME to something suitably mangled. */
1809           SET_DECL_ASSEMBLER_NAME (field,
1810                                    java_mangle_decl
1811                                    (&temporary_obstack, field));
1812         }
1813     }
1814
1815   layout_type (this_class);
1816
1817   /* Also recursively load/layout any superinterfaces, but only if class was
1818   loaded from bytecode. The source parser will take care of this itself. */
1819   if (!CLASS_FROM_SOURCE_P (this_class))
1820     {
1821       tree basetype_vec = TYPE_BINFO_BASETYPES (this_class);
1822
1823       if (basetype_vec)
1824         {
1825           int n = TREE_VEC_LENGTH (basetype_vec) - 1;
1826           int i;
1827           for (i = n; i > 0; i--)
1828             {
1829               tree vec_elt = TREE_VEC_ELT (basetype_vec, i);
1830               tree super_interface = BINFO_TYPE (vec_elt);
1831
1832               tree maybe_super_interface 
1833                 = maybe_layout_super_class (super_interface, NULL_TREE);
1834               if (maybe_super_interface == NULL
1835                   || TREE_CODE (TYPE_SIZE (maybe_super_interface)) == ERROR_MARK)
1836                 {
1837                   TYPE_SIZE (this_class) = error_mark_node;
1838                   CLASS_BEING_LAIDOUT (this_class) = 0;
1839                   class_list = TREE_CHAIN (class_list);
1840                   return;
1841                 }
1842             }
1843         }
1844     }
1845
1846   /* Convert the size back to an SI integer value */
1847   TYPE_SIZE_UNIT (this_class) = 
1848     fold (convert (int_type_node, TYPE_SIZE_UNIT (this_class)));
1849
1850   CLASS_BEING_LAIDOUT (this_class) = 0;
1851   class_list = TREE_CHAIN (class_list);
1852 }
1853
1854 void
1855 layout_class_methods (tree this_class)
1856 {
1857   tree method_decl, dtable_count;
1858   tree super_class;
1859
1860   if (TYPE_NVIRTUALS (this_class))
1861     return;
1862
1863   super_class = CLASSTYPE_SUPER (this_class);
1864
1865   if (super_class)
1866     {
1867       super_class = maybe_layout_super_class (super_class, this_class);
1868       if (!TYPE_NVIRTUALS (super_class))
1869         layout_class_methods (super_class);
1870       dtable_count = TYPE_NVIRTUALS (super_class);
1871     }
1872   else
1873     dtable_count = integer_zero_node;
1874
1875   TYPE_METHODS (this_class) = nreverse (TYPE_METHODS (this_class));
1876
1877   for (method_decl = TYPE_METHODS (this_class);
1878        method_decl; method_decl = TREE_CHAIN (method_decl))
1879     dtable_count = layout_class_method (this_class, super_class, 
1880                                         method_decl, dtable_count);
1881
1882   TYPE_NVIRTUALS (this_class) = dtable_count;
1883 }
1884
1885 /* Lay METHOD_DECL out, returning a possibly new value of
1886    DTABLE_COUNT. Also mangle the method's name. */
1887
1888 tree
1889 layout_class_method (tree this_class, tree super_class,
1890                      tree method_decl, tree dtable_count)
1891 {
1892   tree method_name = DECL_NAME (method_decl);
1893
1894   TREE_PUBLIC (method_decl) = 1;
1895
1896   /* This is a good occasion to mangle the method's name */
1897   SET_DECL_ASSEMBLER_NAME (method_decl,
1898                            java_mangle_decl (&temporary_obstack, 
1899                                              method_decl));
1900   /* We don't generate a RTL for the method if it's abstract, or if
1901      it's an interface method that isn't clinit. */
1902   if (! METHOD_ABSTRACT (method_decl) 
1903       || (CLASS_INTERFACE (TYPE_NAME (this_class)) 
1904           && (DECL_CLINIT_P (method_decl))))
1905     make_decl_rtl (method_decl, NULL);
1906
1907   if (ID_INIT_P (method_name))
1908     {
1909       const char *p = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (this_class)));
1910       const char *ptr;
1911       for (ptr = p; *ptr; )
1912         {
1913           if (*ptr++ == '.')
1914             p = ptr;
1915         }
1916       DECL_CONSTRUCTOR_P (method_decl) = 1;
1917       build_java_argument_signature (TREE_TYPE (method_decl));
1918     }
1919   else if (! METHOD_STATIC (method_decl) && !DECL_ARTIFICIAL (method_decl))
1920     {
1921       tree method_sig =
1922         build_java_argument_signature (TREE_TYPE (method_decl));
1923       tree super_method = lookup_argument_method (super_class, method_name,
1924                                                   method_sig);
1925       if (super_method != NULL_TREE && ! METHOD_PRIVATE (super_method))
1926         {
1927           DECL_VINDEX (method_decl) = DECL_VINDEX (super_method);
1928           if (DECL_VINDEX (method_decl) == NULL_TREE 
1929               && !CLASS_FROM_SOURCE_P (this_class))
1930             error_with_decl (method_decl,
1931                              "non-static method '%s' overrides static method");
1932         }
1933       else if (! METHOD_FINAL (method_decl)
1934                && ! METHOD_PRIVATE (method_decl)
1935                && ! CLASS_FINAL (TYPE_NAME (this_class))
1936                && dtable_count)
1937         {
1938           DECL_VINDEX (method_decl) = dtable_count;
1939           dtable_count = fold (build (PLUS_EXPR, integer_type_node,
1940                                       dtable_count, integer_one_node));
1941         }
1942     }
1943
1944   return dtable_count;
1945 }
1946
1947 void
1948 register_class (void)
1949 {
1950   /* END does not need to be registered with the garbage collector
1951      because it always points into the list given by REGISTERED_CLASS,
1952      and that variable is registered with the collector.  */
1953   static tree end;
1954   tree node    = TREE_OPERAND (build_class_ref (current_class), 0);
1955   tree current = copy_node (node);
1956
1957   XEXP (DECL_RTL (current), 0) = copy_rtx (XEXP (DECL_RTL(node), 0));
1958   if (!registered_class)
1959     registered_class = current;
1960   else
1961     TREE_CHAIN (end) = current;
1962
1963   end = current;
1964 }
1965
1966 /* Emit something to register classes at start-up time.
1967
1968    The preferred mechanism is through the .jcr section, which contain
1969    a list of pointers to classes which get registered during
1970    constructor invocation time.  The fallback mechanism is to generate
1971    a `constructor' function which calls _Jv_RegisterClass for each
1972    class in this file.  */
1973
1974 void
1975 emit_register_classes (void)
1976 {
1977   /* ??? This isn't quite the correct test.  We also have to know
1978      that the target is using gcc's crtbegin/crtend objects rather
1979      than the ones that come with the operating system.  */
1980   if (SUPPORTS_WEAK && targetm.have_named_sections)
1981     {
1982 #ifdef JCR_SECTION_NAME
1983       tree t;
1984       named_section_flags (JCR_SECTION_NAME, SECTION_WRITE);
1985       assemble_align (POINTER_SIZE);
1986       for (t = registered_class; t; t = TREE_CHAIN (t))
1987         assemble_integer (XEXP (DECL_RTL (t), 0),
1988                           POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1989 #else
1990       abort ();
1991 #endif
1992     }
1993   else
1994     {
1995       extern tree get_file_function_name (int);
1996       tree init_name = get_file_function_name ('I');
1997       tree init_type = build_function_type (void_type_node, end_params_node);
1998       tree init_decl;
1999       tree t;
2000       
2001       init_decl = build_decl (FUNCTION_DECL, init_name, init_type);
2002       SET_DECL_ASSEMBLER_NAME (init_decl, init_name);
2003       TREE_STATIC (init_decl) = 1;
2004       current_function_decl = init_decl;
2005       DECL_RESULT (init_decl) = build_decl (RESULT_DECL, NULL_TREE,
2006                                             void_type_node);
2007
2008       /* It can be a static function as long as collect2 does not have
2009          to scan the object file to find its ctor/dtor routine.  */
2010       TREE_PUBLIC (init_decl) = ! targetm.have_ctors_dtors;
2011
2012       /* Suppress spurious warnings.  */
2013       TREE_USED (init_decl) = 1;
2014
2015       pushlevel (0);
2016       make_decl_rtl (init_decl, NULL);
2017       init_function_start (init_decl, input_filename, 0);
2018       expand_function_start (init_decl, 0);
2019
2020       /* Do not allow the function to be deferred.  */
2021       current_function_cannot_inline
2022         = "static constructors and destructors cannot be inlined";
2023
2024       for ( t = registered_class; t; t = TREE_CHAIN (t))
2025         emit_library_call (registerClass_libfunc, 0, VOIDmode, 1,
2026                            XEXP (DECL_RTL (t), 0), Pmode);
2027       
2028       expand_function_end (input_filename, 0, 0);
2029       poplevel (1, 0, 1);
2030       rest_of_compilation (init_decl);
2031       current_function_decl = NULL_TREE;
2032
2033       if (targetm.have_ctors_dtors)
2034         (* targetm.asm_out.constructor) (XEXP (DECL_RTL (init_decl), 0),
2035                                          DEFAULT_INIT_PRIORITY);
2036     }
2037 }
2038
2039 /* Make a method_symbol_type (_Jv_MethodSymbol) node for METHOD. */
2040
2041 tree
2042 build_method_symbols_entry (tree method)
2043 {
2044   tree clname, name, signature, method_symbol;
2045   
2046   clname = build_utf8_ref (DECL_NAME (TYPE_NAME (DECL_CONTEXT (method))));
2047   name = build_utf8_ref (DECL_NAME (method));
2048   signature = build_java_signature (TREE_TYPE (method));
2049   signature = build_utf8_ref (unmangle_classname 
2050                               (IDENTIFIER_POINTER (signature),
2051                                IDENTIFIER_LENGTH (signature)));
2052
2053   START_RECORD_CONSTRUCTOR (method_symbol, method_symbol_type);
2054   PUSH_FIELD_VALUE (method_symbol, "clname", clname);
2055   PUSH_FIELD_VALUE (method_symbol, "name", name);
2056   PUSH_FIELD_VALUE (method_symbol, "signature", signature);
2057   FINISH_RECORD_CONSTRUCTOR (method_symbol);
2058   TREE_CONSTANT (method_symbol) = 1;
2059
2060   return method_symbol;
2061
2062
2063 /* Emit the offset symbols table for indirect virtual dispatch. */
2064
2065 void
2066 emit_offset_symbol_table (void)
2067 {
2068   tree method_list, method, table, list, null_symbol;
2069   tree otable_bound, otable_array_type;
2070   int index;
2071   
2072   /* Only emit an offset table if this translation unit actually made virtual 
2073      calls. */
2074   if (otable_methods == NULL_TREE)
2075     return;
2076
2077   /* Build a list of _Jv_MethodSymbols for each entry in otable_methods. */
2078   index = 0;
2079   method_list = otable_methods;
2080   list = NULL_TREE;  
2081   while (method_list != NULL_TREE)
2082     {
2083       method = TREE_VALUE (method_list);
2084       list = tree_cons (NULL_TREE, build_method_symbols_entry (method), list);
2085       method_list = TREE_CHAIN (method_list);
2086       index++;
2087     }
2088
2089   /* Terminate the list with a "null" entry. */
2090   START_RECORD_CONSTRUCTOR (null_symbol, method_symbol_type);
2091   PUSH_FIELD_VALUE (null_symbol, "clname", null_pointer_node);
2092   PUSH_FIELD_VALUE (null_symbol, "name", null_pointer_node);
2093   PUSH_FIELD_VALUE (null_symbol, "signature", null_pointer_node);
2094   FINISH_RECORD_CONSTRUCTOR (null_symbol);
2095   TREE_CONSTANT (null_symbol) = 1;  
2096   list = tree_cons (NULL_TREE, null_symbol, list);
2097
2098   /* Put the list in the right order and make it a constructor. */
2099   list = nreverse (list);
2100   table = build_constructor (method_symbols_array_type, list);  
2101
2102   /* Make it the initial value for otable_syms and emit the decl. */
2103   DECL_INITIAL (otable_syms_decl) = table;
2104   DECL_ARTIFICIAL (otable_syms_decl) = 1;
2105   DECL_IGNORED_P (otable_syms_decl) = 1;
2106   rest_of_decl_compilation (otable_syms_decl, NULL, 1, 0);
2107   
2108   /* Now that its size is known, redefine otable as an uninitialized static 
2109      array of INDEX + 1 integers. The extra entry is used by the runtime 
2110      to track whether the otable has been initialized. */
2111   otable_bound = build_index_type (build_int_2 (index, 0));
2112   otable_array_type = build_array_type (integer_type_node, otable_bound);
2113   otable_decl = build_decl (VAR_DECL, get_identifier ("otable"), 
2114                             otable_array_type);
2115   TREE_STATIC (otable_decl) = 1;
2116   TREE_READONLY (otable_decl) = 1;  
2117   rest_of_decl_compilation (otable_decl, NULL, 1, 0);
2118 }
2119
2120 void
2121 init_class_processing (void)
2122 {
2123   registerClass_libfunc = gen_rtx_SYMBOL_REF (Pmode, "_Jv_RegisterClass");
2124   fields_ident = get_identifier ("fields");
2125   info_ident = get_identifier ("info");
2126   gcc_obstack_init (&temporary_obstack);
2127 }
2128 \f
2129 static hashval_t java_treetreehash_hash (const void *);
2130 static int java_treetreehash_compare (const void *, const void *);
2131
2132 /* A hash table mapping trees to trees.  Used generally.  */
2133
2134 #define JAVA_TREEHASHHASH_H(t) (htab_hash_pointer (t))
2135
2136 static hashval_t
2137 java_treetreehash_hash (const void *k_p)
2138 {
2139   struct treetreehash_entry *k = (struct treetreehash_entry *) k_p;
2140   return JAVA_TREEHASHHASH_H (k->key);
2141 }
2142
2143 static int
2144 java_treetreehash_compare (const void * k1_p, const void * k2_p)
2145 {
2146   struct treetreehash_entry * k1 = (struct treetreehash_entry *) k1_p;
2147   tree k2 = (tree) k2_p;
2148   return (k1->key == k2);
2149 }
2150
2151 tree 
2152 java_treetreehash_find (htab_t ht, tree t)
2153 {
2154   struct treetreehash_entry *e;
2155   hashval_t hv = JAVA_TREEHASHHASH_H (t);
2156   e = (struct treetreehash_entry *) htab_find_with_hash (ht, t, hv);
2157   if (e == NULL)
2158     return NULL;
2159   else
2160     return e->value;
2161 }
2162
2163 tree *
2164 java_treetreehash_new (htab_t ht, tree t)
2165 {
2166   void **e;
2167   struct treetreehash_entry *tthe;
2168   hashval_t hv = JAVA_TREEHASHHASH_H (t);
2169
2170   e = htab_find_slot_with_hash (ht, t, hv, INSERT);
2171   if (*e == NULL)
2172     {
2173       tthe = (*ht->alloc_f) (1, sizeof (*tthe));
2174       tthe->key = t;
2175       *e = tthe;
2176     }
2177   else
2178     tthe = (struct treetreehash_entry *) *e;
2179   return &tthe->value;
2180 }
2181
2182 htab_t
2183 java_treetreehash_create (size_t size, int gc)
2184 {
2185   if (gc)
2186     return htab_create_ggc (size, java_treetreehash_hash,
2187                             java_treetreehash_compare, NULL);
2188   else
2189     return htab_create_alloc (size, java_treetreehash_hash,
2190                               java_treetreehash_compare, free, xcalloc, free);
2191 }
2192
2193 #include "gt-java-class.h"