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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [java/] [lang.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
/* Java(TM) language-specific utility routines.
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
/* Hacked by Per Bothner <bothner@cygnus.com> February 1996. */
27
 
28
#include "config.h"
29
#include "system.h"
30
#include "coretypes.h"
31
#include "tm.h"
32
#include "tree.h"
33
#include "input.h"
34
#include "rtl.h"
35
#include "expr.h"
36
#include "java-tree.h"
37
#include "jcf.h"
38
#include "toplev.h"
39
#include "langhooks.h"
40
#include "langhooks-def.h"
41
#include "flags.h"
42
#include "ggc.h"
43
#include "diagnostic.h"
44
#include "tree-inline.h"
45
#include "splay-tree.h"
46
#include "tree-dump.h"
47
#include "opts.h"
48
#include "options.h"
49
 
50
static bool java_init (void);
51
static void java_finish (void);
52
static unsigned int java_init_options (unsigned int, const char **);
53
static bool java_post_options (const char **);
54
 
55
static int java_handle_option (size_t scode, const char *arg, int value);
56
static void put_decl_string (const char *, int);
57
static void put_decl_node (tree);
58
static void java_print_error_function (diagnostic_context *, const char *);
59
static tree java_tree_inlining_walk_subtrees (tree *, int *, walk_tree_fn,
60
                                              void *, struct pointer_set_t *);
61
static int merge_init_test_initialization (void * *, void *);
62
static int inline_init_test_initialization (void * *, void *);
63
static bool java_can_use_bit_fields_p (void);
64
static bool java_dump_tree (void *, tree);
65
static void dump_compound_expr (dump_info_p, tree);
66
static bool java_decl_ok_for_sibcall (tree);
67
static tree java_get_callee_fndecl (tree);
68
static void java_clear_binding_stack (void);
69
 
70
#ifndef TARGET_OBJECT_SUFFIX
71
# define TARGET_OBJECT_SUFFIX ".o"
72
#endif
73
 
74
/* Table indexed by tree code giving a string containing a character
75
   classifying the tree code.  Possibilities are
76
   t, d, s, c, r, <, 1 and 2.  See java/java-tree.def for details.  */
77
 
78
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) TYPE,
79
 
80
const enum tree_code_class tree_code_type[] = {
81
#include "tree.def"
82
  tcc_exceptional,
83
#include "java-tree.def"
84
};
85
#undef DEFTREECODE
86
 
87
/* Table indexed by tree code giving number of expression
88
   operands beyond the fixed part of the node structure.
89
   Not used for types or decls.  */
90
 
91
#define DEFTREECODE(SYM, NAME, TYPE, LENGTH) LENGTH,
92
 
93
const unsigned char tree_code_length[] = {
94
#include "tree.def"
95
  0,
96
#include "java-tree.def"
97
};
98
#undef DEFTREECODE
99
 
100
/* Names of tree components.
101
   Used for printing out the tree and error messages.  */
102
#define DEFTREECODE(SYM, NAME, TYPE, LEN) NAME,
103
 
104
const char *const tree_code_name[] = {
105
#include "tree.def"
106
  "@@dummy",
107
#include "java-tree.def"
108
};
109
#undef DEFTREECODE
110
 
111
/* Table of machine-independent attributes.  */
112
const struct attribute_spec java_attribute_table[] =
113
{
114
 { "nonnull",                0, -1, false, true, true,
115
                              NULL },
116
  { NULL,                     0, 0, false, false, false, NULL }
117
};
118
 
119
/* Used to avoid printing error messages with bogus function
120
   prototypes.  Starts out false.  */
121
static bool inhibit_error_function_printing;
122
 
123
int compiling_from_source;
124
 
125
const char *resource_name;
126
 
127
/* When nonzero, -Wall was turned on.  */
128
int flag_wall = 0;
129
 
130
/* The encoding of the source file.  */
131
const char *current_encoding = NULL;
132
 
133
/* When nonzero, report use of deprecated classes, methods, or fields.  */
134
int flag_deprecated = 1;
135
 
136
/* When zero, don't optimize static class initialization. This flag shouldn't
137
   be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead.  */
138
/* FIXME: Make this work with gimplify.  */
139
/* int flag_optimize_sci = 0;  */
140
 
141
/* Don't attempt to verify invocations.  */
142
int flag_verify_invocations = 0;
143
 
144
/* When nonzero, print extra version information.  */
145
static int v_flag = 0;
146
 
147
JCF *current_jcf;
148
 
149
/* Variable controlling how dependency tracking is enabled in
150
   java_init.  */
151
static int dependency_tracking = 0;
152
 
153
/* Flag values for DEPENDENCY_TRACKING.  */
154
#define DEPEND_SET_FILE 1
155
#define DEPEND_ENABLE   2
156
#define DEPEND_TARGET_SET 4
157
#define DEPEND_FILE_ALREADY_SET 8
158
 
159
struct language_function GTY(())
160
{
161
  int unused;
162
};
163
 
164
#undef LANG_HOOKS_NAME
165
#define LANG_HOOKS_NAME "GNU Java"
166
#undef LANG_HOOKS_INIT
167
#define LANG_HOOKS_INIT java_init
168
#undef LANG_HOOKS_FINISH
169
#define LANG_HOOKS_FINISH java_finish
170
#undef LANG_HOOKS_INIT_OPTIONS
171
#define LANG_HOOKS_INIT_OPTIONS java_init_options
172
#undef LANG_HOOKS_HANDLE_OPTION
173
#define LANG_HOOKS_HANDLE_OPTION java_handle_option
174
#undef LANG_HOOKS_POST_OPTIONS
175
#define LANG_HOOKS_POST_OPTIONS java_post_options
176
#undef LANG_HOOKS_PARSE_FILE
177
#define LANG_HOOKS_PARSE_FILE java_parse_file
178
#undef LANG_HOOKS_MARK_ADDRESSABLE
179
#define LANG_HOOKS_MARK_ADDRESSABLE java_mark_addressable
180
#undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
181
#define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL java_dup_lang_specific_decl
182
#undef LANG_HOOKS_DECL_PRINTABLE_NAME
183
#define LANG_HOOKS_DECL_PRINTABLE_NAME lang_printable_name
184
#undef LANG_HOOKS_PRINT_ERROR_FUNCTION
185
#define LANG_HOOKS_PRINT_ERROR_FUNCTION java_print_error_function
186
#undef LANG_HOOKS_CAN_USE_BIT_FIELDS_P
187
#define LANG_HOOKS_CAN_USE_BIT_FIELDS_P java_can_use_bit_fields_p
188
 
189
#undef LANG_HOOKS_TYPE_FOR_MODE
190
#define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode
191
#undef LANG_HOOKS_TYPE_FOR_SIZE
192
#define LANG_HOOKS_TYPE_FOR_SIZE java_type_for_size
193
#undef LANG_HOOKS_SIGNED_TYPE
194
#define LANG_HOOKS_SIGNED_TYPE java_signed_type
195
#undef LANG_HOOKS_UNSIGNED_TYPE
196
#define LANG_HOOKS_UNSIGNED_TYPE java_unsigned_type
197
#undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
198
#define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE java_signed_or_unsigned_type
199
 
200
#undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
201
#define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN java_dump_tree
202
 
203
#undef LANG_HOOKS_GIMPLIFY_EXPR
204
#define LANG_HOOKS_GIMPLIFY_EXPR java_gimplify_expr
205
 
206
#undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES
207
#define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES java_tree_inlining_walk_subtrees
208
 
209
#undef LANG_HOOKS_DECL_OK_FOR_SIBCALL
210
#define LANG_HOOKS_DECL_OK_FOR_SIBCALL java_decl_ok_for_sibcall
211
 
212
#undef LANG_HOOKS_GET_CALLEE_FNDECL
213
#define LANG_HOOKS_GET_CALLEE_FNDECL java_get_callee_fndecl
214
 
215
#undef LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION
216
#define LANG_HOOKS_CALLGRAPH_EXPAND_FUNCTION java_expand_body
217
 
218
#undef LANG_HOOKS_CLEAR_BINDING_STACK
219
#define LANG_HOOKS_CLEAR_BINDING_STACK java_clear_binding_stack
220
 
221
#undef LANG_HOOKS_SET_DECL_ASSEMBLER_NAME
222
#define LANG_HOOKS_SET_DECL_ASSEMBLER_NAME java_mangle_decl
223
 
224
#undef LANG_HOOKS_ATTRIBUTE_TABLE
225
#define LANG_HOOKS_ATTRIBUTE_TABLE java_attribute_table
226
 
227
/* Each front end provides its own.  */
228
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
229
 
230
/*
231
 * process java-specific compiler command-line options
232
 * return 0, but do not complain if the option is not recognized.
233
 */
234
static int
235
java_handle_option (size_t scode, const char *arg, int value)
236
{
237
  enum opt_code code = (enum opt_code) scode;
238
 
239
  switch (code)
240
    {
241
    case OPT_I:
242
      jcf_path_include_arg (arg);
243
      break;
244
 
245
    case OPT_M:
246
      jcf_dependency_init (1);
247
      dependency_tracking |= DEPEND_ENABLE;
248
      break;
249
 
250
    case OPT_MD_:
251
      jcf_dependency_init (1);
252
      dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
253
      break;
254
 
255
    case OPT_MF:
256
      jcf_dependency_set_dep_file (arg);
257
      dependency_tracking |= DEPEND_FILE_ALREADY_SET;
258
      break;
259
 
260
    case OPT_MM:
261
      jcf_dependency_init (0);
262
      dependency_tracking |= DEPEND_ENABLE;
263
      break;
264
 
265
    case OPT_MMD_:
266
      jcf_dependency_init (0);
267
      dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
268
      break;
269
 
270
    case OPT_MP:
271
      jcf_dependency_print_dummies ();
272
      break;
273
 
274
    case OPT_MT:
275
      jcf_dependency_set_target (arg);
276
      dependency_tracking |= DEPEND_TARGET_SET;
277
      break;
278
 
279
    case OPT_Wall:
280
      flag_wall = value;
281
      flag_redundant = value;
282
      flag_extraneous_semicolon = value;
283
      /* When -Wall given, enable -Wunused.  We do this because the C
284
         compiler does it, and people expect it.  */
285
      set_Wunused (value);
286
      break;
287
 
288
    case OPT_fenable_assertions_:
289
      add_enable_assert (arg, value);
290
      break;
291
 
292
    case OPT_fenable_assertions:
293
      add_enable_assert ("", value);
294
      break;
295
 
296
    case OPT_fdisable_assertions_:
297
      add_enable_assert (arg, !value);
298
      break;
299
 
300
    case OPT_fdisable_assertions:
301
      add_enable_assert ("", !value);
302
      break;
303
 
304
    case OPT_fassume_compiled_:
305
      add_assume_compiled (arg, !value);
306
      break;
307
 
308
    case OPT_fassume_compiled:
309
      add_assume_compiled ("", !value);
310
      break;
311
 
312
    case OPT_fbootclasspath_:
313
      jcf_path_bootclasspath_arg (arg);
314
      break;
315
 
316
    case OPT_fclasspath_:
317
    case OPT_fCLASSPATH_:
318
      jcf_path_classpath_arg (arg);
319
      break;
320
 
321
    case OPT_fcompile_resource_:
322
      resource_name = arg;
323
      break;
324
 
325
    case OPT_fdump_:
326
      if (!dump_switch_p (arg))
327
        return 0;
328
      break;
329
 
330
    case OPT_fencoding_:
331
      current_encoding = arg;
332
      break;
333
 
334
    case OPT_fextdirs_:
335
      jcf_path_extdirs_arg (arg);
336
      break;
337
 
338
    case OPT_foutput_class_dir_:
339
      jcf_write_base_directory = arg;
340
      break;
341
 
342
    case OPT_version:
343
      v_flag = 1;
344
      break;
345
 
346
    default:
347
      if (cl_options[code].flags & CL_Java)
348
        break;
349
      abort();
350
    }
351
 
352
  return 1;
353
}
354
 
355
/* Global open file.  */
356
FILE *finput;
357
 
358
static bool
359
java_init (void)
360
{
361
#if 0
362
  extern int flag_minimal_debug;
363
  flag_minimal_debug = 0;
364
#endif
365
 
366
  /* FIXME: Indirect dispatch isn't yet compatible with static class
367
     init optimization.  */
368
  if (flag_indirect_dispatch)
369
    always_initialize_class_p = true;
370
 
371
  /* Force minimum function alignment if g++ uses the least significant
372
     bit of function pointers to store the virtual bit. This is required
373
     to keep vtables compatible.  */
374
  if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
375
      && force_align_functions_log < 1)
376
    force_align_functions_log = 1;
377
 
378
  jcf_path_seal (v_flag);
379
 
380
  java_init_decl_processing ();
381
 
382
  using_eh_for_cleanups ();
383
 
384
  return true;
385
}
386
 
387
static void
388
java_finish (void)
389
{
390
  jcf_dependency_write ();
391
}
392
 
393
/* Buffer used by lang_printable_name. */
394
static char *decl_buf = NULL;
395
 
396
/* Allocated size of decl_buf. */
397
static int decl_buflen = 0;
398
 
399
/* Length of used part of decl_buf;  position for next character. */
400
static int decl_bufpos = 0;
401
 
402
/* Append the string STR to decl_buf.
403
   It length is given by LEN;  -1 means the string is nul-terminated. */
404
 
405
static void
406
put_decl_string (const char *str, int len)
407
{
408
  if (len < 0)
409
    len = strlen (str);
410
  if (decl_bufpos + len >= decl_buflen)
411
    {
412
      if (decl_buf == NULL)
413
        {
414
          decl_buflen = len + 100;
415
          decl_buf = xmalloc (decl_buflen);
416
        }
417
      else
418
        {
419
          decl_buflen *= 2;
420
          decl_buf = xrealloc (decl_buf, decl_buflen);
421
        }
422
    }
423
  strcpy (decl_buf + decl_bufpos, str);
424
  decl_bufpos += len;
425
}
426
 
427
/* Append to decl_buf a printable name for NODE. */
428
 
429
static void
430
put_decl_node (tree node)
431
{
432
  int was_pointer = 0;
433
  if (TREE_CODE (node) == POINTER_TYPE)
434
    {
435
      node = TREE_TYPE (node);
436
      was_pointer = 1;
437
    }
438
  if (DECL_P (node) && DECL_NAME (node) != NULL_TREE)
439
    {
440
      if (TREE_CODE (node) == FUNCTION_DECL)
441
        {
442
          /* We want to print the type the DECL belongs to. We don't do
443
             that when we handle constructors. */
444
          if (! DECL_CONSTRUCTOR_P (node)
445
              && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node))
446
            {
447
              put_decl_node (TYPE_NAME (DECL_CONTEXT (node)));
448
              put_decl_string (".", 1);
449
            }
450
          if (! DECL_CONSTRUCTOR_P (node))
451
            put_decl_node (DECL_NAME (node));
452
          if (TREE_TYPE (node) != NULL_TREE)
453
            {
454
              int i = 0;
455
              tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
456
              if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
457
                args = TREE_CHAIN (args);
458
              put_decl_string ("(", 1);
459
              for ( ; args != end_params_node;  args = TREE_CHAIN (args), i++)
460
                {
461
                  if (i > 0)
462
                    put_decl_string (",", 1);
463
                  put_decl_node (TREE_VALUE (args));
464
                }
465
              put_decl_string (")", 1);
466
            }
467
        }
468
      else
469
        put_decl_node (DECL_NAME (node));
470
    }
471
  else if (TYPE_P (node) && TYPE_NAME (node) != NULL_TREE)
472
    {
473
      if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node))
474
        {
475
          put_decl_node (TYPE_ARRAY_ELEMENT (node));
476
          put_decl_string("[]", 2);
477
        }
478
      else if (node == promoted_byte_type_node)
479
        put_decl_string ("byte", 4);
480
      else if (node == promoted_short_type_node)
481
        put_decl_string ("short", 5);
482
      else if (node == promoted_char_type_node)
483
        put_decl_string ("char", 4);
484
      else if (node == promoted_boolean_type_node)
485
        put_decl_string ("boolean", 7);
486
      else if (node == void_type_node && was_pointer)
487
        put_decl_string ("null", 4);
488
      else
489
        put_decl_node (TYPE_NAME (node));
490
    }
491
  else if (TREE_CODE (node) == IDENTIFIER_NODE)
492
    put_decl_string (IDENTIFIER_POINTER (node), IDENTIFIER_LENGTH (node));
493
  else
494
    put_decl_string ("<unknown>", -1);
495
}
496
 
497
/* Return a user-friendly name for DECL.
498
   The resulting string is only valid until the next call.
499
   The value of the hook decl_printable_name is this function,
500
   which is also called directly by java_print_error_function. */
501
 
502
const char *
503
lang_printable_name (tree decl, int v)
504
{
505
  decl_bufpos = 0;
506
  if (v == 0 && TREE_CODE (decl) == FUNCTION_DECL)
507
    put_decl_node (DECL_NAME (decl));
508
  else
509
    put_decl_node (decl);
510
  put_decl_string ("", 1);
511
  return decl_buf;
512
}
513
 
514
/* Print on stderr the current class and method context.  This function
515
   is the value of the hook print_error_function. */
516
 
517
static GTY(()) tree last_error_function_context;
518
static GTY(()) tree last_error_function;
519
static void
520
java_print_error_function (diagnostic_context *context ATTRIBUTE_UNUSED,
521
                           const char *file)
522
{
523
  /* Don't print error messages with bogus function prototypes.  */
524
  if (inhibit_error_function_printing)
525
    return;
526
 
527
  if (current_function_decl != NULL
528
      && DECL_CONTEXT (current_function_decl) != last_error_function_context)
529
    {
530
      if (file)
531
        fprintf (stderr, "%s: ", file);
532
 
533
      last_error_function_context = DECL_CONTEXT (current_function_decl);
534
      fprintf (stderr, "In class '%s':\n",
535
               lang_printable_name (last_error_function_context, 0));
536
    }
537
  if (last_error_function != current_function_decl)
538
    {
539
      if (file)
540
        fprintf (stderr, "%s: ", file);
541
 
542
      if (current_function_decl == NULL)
543
        fprintf (stderr, "At top level:\n");
544
      else
545
        {
546
          const char *name = lang_printable_name (current_function_decl, 2);
547
          fprintf (stderr, "In %s '%s':\n",
548
                   (DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor"
549
                    : "method"),
550
                   name);
551
        }
552
 
553
      last_error_function = current_function_decl;
554
    }
555
 
556
}
557
 
558
/* Called to install the PRINT_ERROR_FUNCTION hook differently
559
   according to LEVEL. LEVEL is 1 during early parsing, when function
560
   prototypes aren't fully resolved. java_print_error_function is set
561
   so it doesn't print incomplete function prototypes. When LEVEL is
562
   2, function prototypes are fully resolved and can be printed when
563
   reporting errors.  */
564
 
565
void
566
lang_init_source (int level)
567
{
568
  inhibit_error_function_printing = (level == 1);
569
}
570
 
571
static unsigned int
572
java_init_options (unsigned int argc ATTRIBUTE_UNUSED,
573
                   const char **argv ATTRIBUTE_UNUSED)
574
{
575
  flag_bounds_check = 1;
576
  flag_exceptions = 1;
577
  flag_non_call_exceptions = 1;
578
 
579
  /* In Java floating point operations never trap.  */
580
  flag_trapping_math = 0;
581
 
582
  /* In Java arithmetic overflow always wraps around.  */
583
  flag_wrapv = 1;
584
 
585
  /* Java requires left-to-right evaluation of subexpressions.  */
586
  flag_evaluation_order = 1;
587
 
588
  jcf_path_init ();
589
 
590
  return CL_Java;
591
}
592
 
593
static bool
594
java_can_use_bit_fields_p (void)
595
{
596
  /* The bit-field optimizations cause problems when generating class
597
     files.  */
598
  return flag_emit_class_files ? false : true;
599
}
600
 
601
/* Post-switch processing.  */
602
static bool
603
java_post_options (const char **pfilename)
604
{
605
  const char *filename = *pfilename;
606
 
607
  /* Use tree inlining.  */
608
  if (!flag_no_inline)
609
    flag_no_inline = 1;
610
  if (flag_inline_functions)
611
    flag_inline_trees = 2;
612
 
613
  /* An absolute requirement: if we're not using indirect dispatch, we
614
     must always verify everything.  */
615
  if (! flag_indirect_dispatch)
616
    flag_verify_invocations = true;
617
 
618
  /* Open input file.  */
619
 
620
  if (filename == 0 || !strcmp (filename, "-"))
621
    {
622
      finput = stdin;
623
      filename = "stdin";
624
 
625
      if (dependency_tracking)
626
        error ("can't do dependency tracking with input from stdin");
627
    }
628
  else
629
    {
630
      if (dependency_tracking)
631
        {
632
          char *dot;
633
 
634
          /* If the target is set and the output filename is set, then
635
             there's no processing to do here.  Otherwise we must
636
             compute one or the other.  */
637
          if (! ((dependency_tracking & DEPEND_TARGET_SET)
638
                 && (dependency_tracking & DEPEND_FILE_ALREADY_SET)))
639
            {
640
              dot = strrchr (filename, '.');
641
              if (dot == NULL)
642
                error ("couldn't determine target name for dependency tracking");
643
              else
644
                {
645
                  char *buf = xmalloc (dot - filename +
646
                                       3 + sizeof (TARGET_OBJECT_SUFFIX));
647
                  strncpy (buf, filename, dot - filename);
648
 
649
                  /* If emitting class files, we might have multiple
650
                     targets.  The class generation code takes care of
651
                     registering them.  Otherwise we compute the
652
                     target name here.  */
653
                  if ((dependency_tracking & DEPEND_TARGET_SET))
654
                    ; /* Nothing.  */
655
                  else if (flag_emit_class_files)
656
                    jcf_dependency_set_target (NULL);
657
                  else
658
                    {
659
                      strcpy (buf + (dot - filename), TARGET_OBJECT_SUFFIX);
660
                      jcf_dependency_set_target (buf);
661
                    }
662
 
663
                  if ((dependency_tracking & DEPEND_FILE_ALREADY_SET))
664
                    ; /* Nothing.  */
665
                  else if ((dependency_tracking & DEPEND_SET_FILE))
666
                    {
667
                      strcpy (buf + (dot - filename), ".d");
668
                      jcf_dependency_set_dep_file (buf);
669
                    }
670
                  else
671
                    jcf_dependency_set_dep_file ("-");
672
 
673
                  free (buf);
674
                }
675
            }
676
        }
677
    }
678
#ifdef USE_MAPPED_LOCATION
679
  linemap_add (&line_table, LC_ENTER, false, filename, 0);
680
  linemap_add (&line_table, LC_RENAME, false, "<built-in>", 0);
681
#endif
682
 
683
  /* Initialize the compiler back end.  */
684
  return false;
685
}
686
 
687
/* Return either DECL or its known constant value (if it has one).  */
688
 
689
tree
690
decl_constant_value (tree decl)
691
{
692
  if (/* Don't change a variable array bound or initial value to a constant
693
         in a place where a variable is invalid.  */
694
      current_function_decl != 0
695
      && ! TREE_THIS_VOLATILE (decl)
696
      && TREE_READONLY (decl)
697
      && DECL_INITIAL (decl) != 0
698
      && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
699
      /* This is invalid if initial value is not constant.
700
         If it has either a function call, a memory reference,
701
         or a variable, then re-evaluating it could give different results.  */
702
      && TREE_CONSTANT (DECL_INITIAL (decl))
703
      /* Check for cases where this is sub-optimal, even though valid.  */
704
      && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
705
    return DECL_INITIAL (decl);
706
  return decl;
707
}
708
 
709
/* Walk the language specific tree nodes during inlining.  */
710
 
711
static tree
712
java_tree_inlining_walk_subtrees (tree *tp ATTRIBUTE_UNUSED,
713
                                  int *subtrees ATTRIBUTE_UNUSED,
714
                                  walk_tree_fn func ATTRIBUTE_UNUSED,
715
                                  void *data ATTRIBUTE_UNUSED,
716
                                  struct pointer_set_t *pset ATTRIBUTE_UNUSED)
717
{
718
  enum tree_code code;
719
  tree result;
720
 
721
#define WALK_SUBTREE(NODE)                              \
722
  do                                                    \
723
    {                                                   \
724
      result = walk_tree (&(NODE), func, data, pset);   \
725
      if (result)                                       \
726
        return result;                                  \
727
    }                                                   \
728
  while (0)
729
 
730
  tree t = *tp;
731
  if (!t)
732
    return NULL_TREE;
733
 
734
  code = TREE_CODE (t);
735
  switch (code)
736
    {
737
    case BLOCK:
738
      WALK_SUBTREE (BLOCK_EXPR_BODY (t));
739
      return NULL_TREE;
740
 
741
    case EXIT_BLOCK_EXPR:
742
      *subtrees = 0;
743
      return NULL_TREE;
744
 
745
    default:
746
      return NULL_TREE;
747
    }
748
 
749
  #undef WALK_SUBTREE
750
}
751
 
752
/* Every call to a static constructor has an associated boolean
753
   variable which is in the outermost scope of the calling method.
754
   This variable is used to avoid multiple calls to the static
755
   constructor for each class.
756
 
757
   It looks something like this:
758
 
759
   foo ()
760
   {
761
      boolean dummy = OtherClass.is_initialized;
762
 
763
     ...
764
 
765
     if (! dummy)
766
       OtherClass.initialize();
767
 
768
     ... use OtherClass.data ...
769
   }
770
 
771
   Each of these boolean variables has an entry in the
772
   DECL_FUNCTION_INIT_TEST_TABLE of a method.  When inlining a method
773
   we must merge the DECL_FUNCTION_INIT_TEST_TABLE from the function
774
   being inlined and create the boolean variables in the outermost
775
   scope of the method being inlined into.  */
776
 
777
/* Create a mapping from a boolean variable in a method being inlined
778
   to one in the scope of the method being inlined into.  */
779
 
780
static int
781
merge_init_test_initialization (void **entry, void *x)
782
{
783
  struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
784
  splay_tree decl_map = (splay_tree)x;
785
  splay_tree_node n;
786
  tree *init_test_decl;
787
 
788
  /* See if we have remapped this declaration.  If we haven't there's
789
     a bug in the inliner.  */
790
  n = splay_tree_lookup (decl_map, (splay_tree_key) ite->value);
791
  if (! n)
792
    abort ();
793
 
794
  /* Create a new entry for the class and its remapped boolean
795
     variable.  If we already have a mapping for this class we've
796
     already initialized it, so don't overwrite the value.  */
797
  init_test_decl = java_treetreehash_new
798
    (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
799
  if (!*init_test_decl)
800
    *init_test_decl = (tree)n->value;
801
 
802
  /* This fixes a weird case.
803
 
804
  The front end assumes that once we have called a method that
805
  initializes some class, we can assume the class is initialized.  It
806
  does this by setting the DECL_INITIAL of the init_test_decl for that
807
  class, and no initializations are emitted for that class.
808
 
809
  However, what if the method that is supposed to do the initialization
810
  is itself inlined in the caller?  When expanding the called method
811
  we'll assume that the class initialization has already been done,
812
  because the DECL_INITIAL of the init_test_decl is set.
813
 
814
  To fix this we remove the DECL_INITIAL (in the caller scope) of all
815
  the init_test_decls corresponding to classes initialized by the
816
  inlined method.  This makes the caller no longer assume that the
817
  method being inlined does any class initializations.  */
818
  DECL_INITIAL (*init_test_decl) = NULL;
819
 
820
  return true;
821
}
822
 
823
/* Merge the DECL_FUNCTION_INIT_TEST_TABLE from the function we're
824
   inlining.  */
825
 
826
void
827
java_inlining_merge_static_initializers (tree fn, void *decl_map)
828
{
829
  htab_traverse
830
    (DECL_FUNCTION_INIT_TEST_TABLE (fn),
831
     merge_init_test_initialization, decl_map);
832
}
833
 
834
/* Lookup a DECL_FUNCTION_INIT_TEST_TABLE entry in the method we're
835
   inlining into.  If we already have a corresponding entry in that
836
   class we don't need to create another one, so we create a mapping
837
   from the variable in the inlined class to the corresponding
838
   pre-existing one.  */
839
 
840
static int
841
inline_init_test_initialization (void **entry, void *x)
842
{
843
  struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
844
  splay_tree decl_map = (splay_tree)x;
845
 
846
  tree h = java_treetreehash_find
847
    (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
848
  if (! h)
849
    return true;
850
  splay_tree_insert (decl_map,
851
                     (splay_tree_key) ite->value,
852
                     (splay_tree_value) h);
853
  return true;
854
}
855
 
856
/* Look up the boolean variables in the DECL_FUNCTION_INIT_TEST_TABLE
857
   of a method being inlined.  For each hone, if we already have a
858
   variable associated with the same class in the method being inlined
859
   into, create a new mapping for it.  */
860
 
861
void
862
java_inlining_map_static_initializers (tree fn, void *decl_map)
863
{
864
  htab_traverse
865
    (DECL_FUNCTION_INIT_TEST_TABLE (fn),
866
     inline_init_test_initialization, decl_map);
867
}
868
 
869
/* Avoid voluminous output for deep recursion of compound exprs.  */
870
 
871
static void
872
dump_compound_expr (dump_info_p di, tree t)
873
{
874
  int i;
875
 
876
  for (i=0; i<2; i++)
877
    {
878
      switch (TREE_CODE (TREE_OPERAND (t, i)))
879
        {
880
        case COMPOUND_EXPR:
881
          dump_compound_expr (di, TREE_OPERAND (t, i));
882
          break;
883
 
884
        case EXPR_WITH_FILE_LOCATION:
885
            {
886
              tree wfl_node = EXPR_WFL_NODE (TREE_OPERAND (t, i));
887
              dump_child ("expr", wfl_node);
888
              break;
889
            }
890
 
891
        default:
892
          dump_child ("expr", TREE_OPERAND (t, i));
893
        }
894
    }
895
}
896
 
897
static bool
898
java_dump_tree (void *dump_info, tree t)
899
{
900
  enum tree_code code;
901
  dump_info_p di = (dump_info_p) dump_info;
902
 
903
  /* Figure out what kind of node this is.  */
904
  code = TREE_CODE (t);
905
 
906
  switch (code)
907
    {
908
    case FUNCTION_DECL:
909
      dump_child ("args", DECL_ARGUMENTS (t));
910
      if (DECL_EXTERNAL (t))
911
        dump_string (di, "undefined");
912
      if (TREE_PUBLIC (t))
913
        dump_string (di, "extern");
914
      else
915
        dump_string (di, "static");
916
      if (DECL_LANG_SPECIFIC (t))
917
        dump_child ("body", DECL_FUNCTION_BODY (t));
918
      if (DECL_LANG_SPECIFIC (t) && !dump_flag (di, TDF_SLIM, t))
919
        dump_child ("inline body", DECL_SAVED_TREE (t));
920
      return true;
921
 
922
    case RETURN_EXPR:
923
      dump_child ("expr", TREE_OPERAND (t, 0));
924
      return true;
925
 
926
    case GOTO_EXPR:
927
      dump_child ("goto", TREE_OPERAND (t, 0));
928
      return true;
929
 
930
    case LABEL_EXPR:
931
      dump_child ("label", TREE_OPERAND (t, 0));
932
      return true;
933
 
934
    case LABELED_BLOCK_EXPR:
935
      dump_child ("label", LABELED_BLOCK_LABEL (t));
936
      dump_child ("block", LABELED_BLOCK_BODY (t));
937
      return true;
938
 
939
    case EXIT_BLOCK_EXPR:
940
      dump_child ("block", EXIT_BLOCK_LABELED_BLOCK (t));
941
      return true;
942
 
943
    case BLOCK:
944
      if (BLOCK_EXPR_BODY (t))
945
        {
946
          tree local = BLOCK_VARS (t);
947
          while (local)
948
            {
949
              tree next = TREE_CHAIN (local);
950
              dump_child ("var", local);
951
              local = next;
952
            }
953
 
954
          {
955
            tree block = BLOCK_EXPR_BODY (t);
956
            dump_child ("body", block);
957
            block = TREE_CHAIN (block);
958
          }
959
        }
960
      return true;
961
 
962
    case COMPOUND_EXPR:
963
      if (!dump_flag (di, TDF_SLIM, t))
964
        return false;
965
      dump_compound_expr (di, t);
966
      return true;
967
 
968
    default:
969
      break;
970
    }
971
  return false;
972
}
973
 
974
/* Java calls can't, in general, be sibcalls because we need an
975
   accurate stack trace in order to guarantee correct operation of
976
   methods such as Class.forName(String) and
977
   SecurityManager.getClassContext().  */
978
 
979
static bool
980
java_decl_ok_for_sibcall (tree decl)
981
{
982
  return decl != NULL && DECL_CONTEXT (decl) == output_class;
983
}
984
 
985
/* Given a call_expr, try to figure out what its target might be.  In
986
   the case of an indirection via the atable, search for the decl.  If
987
   the decl is external, we return NULL.  If we don't, the optimizer
988
   will replace the indirection with a direct call, which undoes the
989
   purpose of the atable indirection.  */
990
static tree
991
java_get_callee_fndecl (tree call_expr)
992
{
993
  tree method, table, element, atable_methods;
994
 
995
  HOST_WIDE_INT index;
996
 
997
  /* FIXME: This is disabled because we end up passing calls through
998
     the PLT, and we do NOT want to do that.  */
999
  return NULL;
1000
 
1001
  if (TREE_CODE (call_expr) != CALL_EXPR)
1002
    return NULL;
1003
  method = TREE_OPERAND (call_expr, 0);
1004
  STRIP_NOPS (method);
1005
  if (TREE_CODE (method) != ARRAY_REF)
1006
    return NULL;
1007
  table = TREE_OPERAND (method, 0);
1008
  if (! DECL_LANG_SPECIFIC(table)
1009
      || !DECL_OWNER (table)
1010
      || TYPE_ATABLE_DECL (DECL_OWNER (table)) != table)
1011
    return NULL;
1012
 
1013
  atable_methods = TYPE_ATABLE_METHODS (DECL_OWNER (table));
1014
  index = TREE_INT_CST_LOW (TREE_OPERAND (method, 1));
1015
 
1016
  /* FIXME: Replace this for loop with a hash table lookup.  */
1017
  for (element = atable_methods; element; element = TREE_CHAIN (element))
1018
    {
1019
      if (index == 1)
1020
        {
1021
          tree purpose = TREE_PURPOSE (element);
1022
          if (TREE_CODE (purpose) == FUNCTION_DECL
1023
              && ! DECL_EXTERNAL (purpose))
1024
            return purpose;
1025
          else
1026
            return NULL;
1027
        }
1028
      --index;
1029
    }
1030
 
1031
  return NULL;
1032
}
1033
 
1034
 
1035
/* Clear the binding stack.  */
1036
static void
1037
java_clear_binding_stack (void)
1038
{
1039
  while (!global_bindings_p ())
1040
    poplevel (0, 0, 0);
1041
}
1042
 
1043
#include "gt-java-lang.h"

powered by: WebSVN 2.1.0

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