OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [java/] [class.c] - Blame information for rev 20

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.