]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/java/lang.c
Makefile.in: Update to use common.opt and lang_opt_files.
[thirdparty/gcc.git] / gcc / java / lang.c
1 /* Java(TM) language-specific utility routines.
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21
22 Java and all Java-based marks are trademarks or registered trademarks
23 of Sun Microsystems, Inc. in the United States and other countries.
24 The Free Software Foundation is independent of Sun Microsystems, Inc. */
25
26 /* 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 "xref.h"
43 #include "ggc.h"
44 #include "diagnostic.h"
45 #include "tree-inline.h"
46 #include "splay-tree.h"
47 #include "tree-dump.h"
48 #include "opts.h"
49 #include "options.h"
50
51 static bool java_init (void);
52 static void java_finish (void);
53 static int java_init_options (void);
54 static bool java_post_options (const char **);
55
56 static int java_handle_option (size_t scode, const char *arg, int value);
57 static void put_decl_string (const char *, int);
58 static void put_decl_node (tree);
59 static void java_print_error_function (diagnostic_context *, const char *);
60 static tree java_tree_inlining_walk_subtrees (tree *, int *, walk_tree_fn,
61 void *, void *);
62 static int java_unsafe_for_reeval (tree);
63 static int merge_init_test_initialization (void * *, void *);
64 static int inline_init_test_initialization (void * *, void *);
65 static bool java_can_use_bit_fields_p (void);
66 static bool java_dump_tree (void *, tree);
67 static void dump_compound_expr (dump_info_p, tree);
68 static bool java_decl_ok_for_sibcall (tree);
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 char tree_code_type[] = {
81 #include "tree.def"
82 'x',
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 /* Used to avoid printing error messages with bogus function
112 prototypes. Starts out false. */
113 static bool inhibit_error_function_printing;
114
115 int compiling_from_source;
116
117 const char *resource_name;
118
119 int flag_emit_class_files = 0;
120
121 /* Nonzero if input file is a file with a list of filenames to compile. */
122
123 int flag_filelist_file = 0;
124
125 /* When nonzero, we emit xref strings. Values of the flag for xref
126 backends are defined in xref_flag_table, xref.c. */
127
128 int flag_emit_xref = 0;
129
130 /* When nonzero, -Wall was turned on. */
131 int flag_wall = 0;
132
133 /* When nonzero, check for redundant modifier uses. */
134 int flag_redundant = 0;
135
136 /* When nonzero, call a library routine to do integer divisions. */
137 int flag_use_divide_subroutine = 1;
138
139 /* When nonzero, generate code for the Boehm GC. */
140 int flag_use_boehm_gc = 0;
141
142 /* When nonzero, assume the runtime uses a hash table to map an
143 object to its synchronization structure. */
144 int flag_hash_synchronization;
145
146 /* When nonzero, permit the use of the assert keyword. */
147 int flag_assert = 1;
148
149 /* When nonzero, assume all native functions are implemented with
150 JNI, not CNI. */
151 int flag_jni = 0;
152
153 /* When nonzero, warn when source file is newer than matching class
154 file. */
155 int flag_newer = 1;
156
157 /* When nonzero, generate checks for references to NULL. */
158 int flag_check_references = 0;
159
160 /* The encoding of the source file. */
161 const char *current_encoding = NULL;
162
163 /* When nonzero, report the now deprecated empty statements. */
164 int flag_extraneous_semicolon;
165
166 /* When nonzero, report use of deprecated classes, methods, or fields. */
167 int flag_deprecated = 1;
168
169 /* When nonzero, always check for a non gcj generated classes archive. */
170 int flag_force_classes_archive_check;
171
172 /* When zero, don't optimize static class initialization. This flag shouldn't
173 be tested alone, use STATIC_CLASS_INITIALIZATION_OPTIMIZATION_P instead. */
174 int flag_optimize_sci = 1;
175
176 /* When nonzero, use offset tables for virtual method calls
177 in order to improve binary compatibility. */
178 int flag_indirect_dispatch = 0;
179
180 /* When zero, don't generate runtime array store checks. */
181 int flag_store_check = 1;
182
183 /* When nonzero, print extra version information. */
184 static int version_flag = 0;
185
186 /* Set nonzero if the user specified -finline-functions on the command
187 line. */
188 int flag_really_inline = 0;
189
190 JCF *current_jcf;
191
192 /* Variable controlling how dependency tracking is enabled in
193 java_init. */
194 static int dependency_tracking = 0;
195
196 /* Flag values for DEPENDENCY_TRACKING. */
197 #define DEPEND_SET_FILE 1
198 #define DEPEND_ENABLE 2
199 #define DEPEND_TARGET_SET 4
200 #define DEPEND_FILE_ALREADY_SET 8
201
202 struct language_function GTY(())
203 {
204 int unused;
205 };
206
207 #undef LANG_HOOKS_NAME
208 #define LANG_HOOKS_NAME "GNU Java"
209 #undef LANG_HOOKS_INIT
210 #define LANG_HOOKS_INIT java_init
211 #undef LANG_HOOKS_FINISH
212 #define LANG_HOOKS_FINISH java_finish
213 #undef LANG_HOOKS_INIT_OPTIONS
214 #define LANG_HOOKS_INIT_OPTIONS java_init_options
215 #undef LANG_HOOKS_HANDLE_OPTION
216 #define LANG_HOOKS_HANDLE_OPTION java_handle_option
217 #undef LANG_HOOKS_POST_OPTIONS
218 #define LANG_HOOKS_POST_OPTIONS java_post_options
219 #undef LANG_HOOKS_PARSE_FILE
220 #define LANG_HOOKS_PARSE_FILE java_parse_file
221 #undef LANG_HOOKS_UNSAFE_FOR_REEVAL
222 #define LANG_HOOKS_UNSAFE_FOR_REEVAL java_unsafe_for_reeval
223 #undef LANG_HOOKS_MARK_ADDRESSABLE
224 #define LANG_HOOKS_MARK_ADDRESSABLE java_mark_addressable
225 #undef LANG_HOOKS_EXPAND_EXPR
226 #define LANG_HOOKS_EXPAND_EXPR java_expand_expr
227 #undef LANG_HOOKS_TRUTHVALUE_CONVERSION
228 #define LANG_HOOKS_TRUTHVALUE_CONVERSION java_truthvalue_conversion
229 #undef LANG_HOOKS_DUP_LANG_SPECIFIC_DECL
230 #define LANG_HOOKS_DUP_LANG_SPECIFIC_DECL java_dup_lang_specific_decl
231 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
232 #define LANG_HOOKS_DECL_PRINTABLE_NAME lang_printable_name
233 #undef LANG_HOOKS_PRINT_ERROR_FUNCTION
234 #define LANG_HOOKS_PRINT_ERROR_FUNCTION java_print_error_function
235 #undef LANG_HOOKS_CAN_USE_BIT_FIELDS_P
236 #define LANG_HOOKS_CAN_USE_BIT_FIELDS_P java_can_use_bit_fields_p
237
238 #undef LANG_HOOKS_TYPE_FOR_MODE
239 #define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode
240 #undef LANG_HOOKS_TYPE_FOR_SIZE
241 #define LANG_HOOKS_TYPE_FOR_SIZE java_type_for_size
242 #undef LANG_HOOKS_SIGNED_TYPE
243 #define LANG_HOOKS_SIGNED_TYPE java_signed_type
244 #undef LANG_HOOKS_UNSIGNED_TYPE
245 #define LANG_HOOKS_UNSIGNED_TYPE java_unsigned_type
246 #undef LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE
247 #define LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE java_signed_or_unsigned_type
248
249 #undef LANG_HOOKS_TREE_INLINING_WALK_SUBTREES
250 #define LANG_HOOKS_TREE_INLINING_WALK_SUBTREES java_tree_inlining_walk_subtrees
251
252 #undef LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN
253 #define LANG_HOOKS_TREE_DUMP_DUMP_TREE_FN java_dump_tree
254
255 #undef LANG_HOOKS_DECL_OK_FOR_SIBCALL
256 #define LANG_HOOKS_DECL_OK_FOR_SIBCALL java_decl_ok_for_sibcall
257
258 /* Each front end provides its own. */
259 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
260
261 /*
262 * process java-specific compiler command-line options
263 * return 0, but do not complain if the option is not recognized.
264 */
265 static int
266 java_handle_option (size_t scode, const char *arg, int value)
267 {
268 const struct cl_option *option = &cl_options[scode];
269 enum opt_code code = (enum opt_code) scode;
270
271 /* Ignore file names. */
272 if (code == N_OPTS)
273 return 1;
274
275 if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
276 {
277 /* These can take an empty argument. */
278 if (code == OPT_fassume_compiled_
279 || code == OPT_fclasspath_
280 || code == OPT_fCLASSPATH_
281 || code == OPT_fbootclasspath_)
282 arg = "";
283 else
284 {
285 error ("missing argument to \"-%s\"", option->opt_text);
286 return 1;
287 }
288 }
289
290 switch (code)
291 {
292 default:
293 abort();
294
295 case OPT_I:
296 jcf_path_include_arg (arg);
297 break;
298
299 case OPT_M:
300 jcf_dependency_init (1);
301 dependency_tracking |= DEPEND_ENABLE;
302 break;
303
304 case OPT_MD:
305 jcf_dependency_init (1);
306 dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
307 break;
308
309 case OPT_MF:
310 jcf_dependency_set_dep_file (arg);
311 dependency_tracking |= DEPEND_FILE_ALREADY_SET;
312 break;
313
314 case OPT_MM:
315 jcf_dependency_init (0);
316 dependency_tracking |= DEPEND_ENABLE;
317 break;
318
319 case OPT_MMD:
320 jcf_dependency_init (0);
321 dependency_tracking |= DEPEND_SET_FILE | DEPEND_ENABLE;
322 break;
323
324 case OPT_MP:
325 jcf_dependency_print_dummies ();
326 break;
327
328 case OPT_MT:
329 jcf_dependency_set_target (arg);
330 dependency_tracking |= DEPEND_TARGET_SET;
331 break;
332
333 case OPT_Wall:
334 flag_wall = value;
335 flag_redundant = value;
336 flag_extraneous_semicolon = value;
337 /* When -Wall given, enable -Wunused. We do this because the C
338 compiler does it, and people expect it. */
339 set_Wunused (value);
340 break;
341
342 case OPT_Wdeprecated:
343 flag_deprecated = value;
344 break;
345
346 case OPT_Wextraneous_semicolon:
347 flag_extraneous_semicolon = value;
348 break;
349
350 case OPT_Wout_of_date:
351 flag_newer = value;
352 break;
353
354 case OPT_Wredundant_modifiers:
355 flag_redundant = value;
356 break;
357
358 case OPT_fassert:
359 flag_assert = value;
360 break;
361
362 case OPT_fassume_compiled_:
363 add_assume_compiled (arg, !value);
364 break;
365
366 case OPT_fassume_compiled:
367 add_assume_compiled ("", !value);
368 break;
369
370 case OPT_fbootclasspath_:
371 jcf_path_bootclasspath_arg (arg);
372 break;
373
374 case OPT_fcheck_references:
375 flag_check_references = value;
376 break;
377
378 case OPT_fclasspath_:
379 case OPT_fCLASSPATH_:
380 jcf_path_classpath_arg (arg);
381 break;
382
383 case OPT_fcompile_resource_:
384 resource_name = arg;
385 break;
386
387 case OPT_fdump_:
388 if (!dump_switch_p (option->opt_text + strlen ("f")))
389 return 0;
390 break;
391
392 case OPT_femit_class_file:
393 case OPT_femit_class_files:
394 flag_emit_class_files = value;
395 break;
396
397 case OPT_fencoding_:
398 current_encoding = arg;
399 break;
400
401 case OPT_fextdirs_:
402 jcf_path_extdirs_arg (arg);
403 break;
404
405 case OPT_ffilelist_file:
406 flag_filelist_file = value;
407 break;
408
409 case OPT_fforce_classes_archive_check:
410 flag_force_classes_archive_check = value;
411 break;
412
413 case OPT_fhash_synchronization:
414 flag_hash_synchronization = value;
415 break;
416
417 case OPT_findirect_dispatch:
418 flag_indirect_dispatch = value;
419 break;
420
421 case OPT_finline_functions:
422 flag_inline_functions = value;
423 flag_really_inline = value;
424 break;
425
426 case OPT_fjni:
427 flag_jni = value;
428 break;
429
430 case OPT_foptimize_static_class_initialization:
431 flag_optimize_sci = value;
432 break;
433
434 case OPT_foutput_class_dir_:
435 jcf_write_base_directory = arg;
436 break;
437
438 case OPT_fstore_check:
439 flag_store_check = value;
440 break;
441
442 case OPT_fuse_boehm_gc:
443 flag_use_boehm_gc = value;
444 break;
445
446 case OPT_fuse_divide_subroutine:
447 flag_use_divide_subroutine = value;
448 break;
449
450 case OPT_version:
451 version_flag = 1;
452 break;
453 }
454
455 return 1;
456 }
457
458 /* Global open file. */
459 FILE *finput;
460
461 static bool
462 java_init (void)
463 {
464 #if 0
465 extern int flag_minimal_debug;
466 flag_minimal_debug = 0;
467 #endif
468
469 if (flag_inline_functions)
470 flag_inline_trees = 1;
471
472 /* Force minimum function alignment if g++ uses the least significant
473 bit of function pointers to store the virtual bit. This is required
474 to keep vtables compatible. */
475 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
476 && force_align_functions_log < 1)
477 force_align_functions_log = 1;
478
479 jcf_path_seal (version_flag);
480
481 java_init_decl_processing ();
482
483 using_eh_for_cleanups ();
484
485 return true;
486 }
487
488 static void
489 java_finish (void)
490 {
491 jcf_dependency_write ();
492 }
493
494 /* Buffer used by lang_printable_name. */
495 static char *decl_buf = NULL;
496
497 /* Allocated size of decl_buf. */
498 static int decl_buflen = 0;
499
500 /* Length of used part of decl_buf; position for next character. */
501 static int decl_bufpos = 0;
502
503 /* Append the string STR to decl_buf.
504 It length is given by LEN; -1 means the string is nul-terminated. */
505
506 static void
507 put_decl_string (const char *str, int len)
508 {
509 if (len < 0)
510 len = strlen (str);
511 if (decl_bufpos + len >= decl_buflen)
512 {
513 if (decl_buf == NULL)
514 {
515 decl_buflen = len + 100;
516 decl_buf = xmalloc (decl_buflen);
517 }
518 else
519 {
520 decl_buflen *= 2;
521 decl_buf = xrealloc (decl_buf, decl_buflen);
522 }
523 }
524 strcpy (decl_buf + decl_bufpos, str);
525 decl_bufpos += len;
526 }
527
528 /* Append to decl_buf a printable name for NODE. */
529
530 static void
531 put_decl_node (tree node)
532 {
533 int was_pointer = 0;
534 if (TREE_CODE (node) == POINTER_TYPE)
535 {
536 node = TREE_TYPE (node);
537 was_pointer = 1;
538 }
539 if (TREE_CODE_CLASS (TREE_CODE (node)) == 'd'
540 && DECL_NAME (node) != NULL_TREE)
541 {
542 if (TREE_CODE (node) == FUNCTION_DECL)
543 {
544 /* We want to print the type the DECL belongs to. We don't do
545 that when we handle constructors. */
546 if (! DECL_CONSTRUCTOR_P (node)
547 && ! DECL_ARTIFICIAL (node) && DECL_CONTEXT (node))
548 {
549 put_decl_node (TYPE_NAME (DECL_CONTEXT (node)));
550 put_decl_string (".", 1);
551 }
552 if (! DECL_CONSTRUCTOR_P (node))
553 put_decl_node (DECL_NAME (node));
554 if (TREE_TYPE (node) != NULL_TREE)
555 {
556 int i = 0;
557 tree args = TYPE_ARG_TYPES (TREE_TYPE (node));
558 if (TREE_CODE (TREE_TYPE (node)) == METHOD_TYPE)
559 args = TREE_CHAIN (args);
560 put_decl_string ("(", 1);
561 for ( ; args != end_params_node; args = TREE_CHAIN (args), i++)
562 {
563 if (i > 0)
564 put_decl_string (",", 1);
565 put_decl_node (TREE_VALUE (args));
566 }
567 put_decl_string (")", 1);
568 }
569 }
570 else
571 put_decl_node (DECL_NAME (node));
572 }
573 else if (TREE_CODE_CLASS (TREE_CODE (node)) == 't'
574 && TYPE_NAME (node) != NULL_TREE)
575 {
576 if (TREE_CODE (node) == RECORD_TYPE && TYPE_ARRAY_P (node))
577 {
578 put_decl_node (TYPE_ARRAY_ELEMENT (node));
579 put_decl_string("[]", 2);
580 }
581 else if (node == promoted_byte_type_node)
582 put_decl_string ("byte", 4);
583 else if (node == promoted_short_type_node)
584 put_decl_string ("short", 5);
585 else if (node == promoted_char_type_node)
586 put_decl_string ("char", 4);
587 else if (node == promoted_boolean_type_node)
588 put_decl_string ("boolean", 7);
589 else if (node == void_type_node && was_pointer)
590 put_decl_string ("null", 4);
591 else
592 put_decl_node (TYPE_NAME (node));
593 }
594 else if (TREE_CODE (node) == IDENTIFIER_NODE)
595 put_decl_string (IDENTIFIER_POINTER (node), IDENTIFIER_LENGTH (node));
596 else
597 put_decl_string ("<unknown>", -1);
598 }
599
600 /* Return a user-friendly name for DECL.
601 The resulting string is only valid until the next call.
602 The value of the hook decl_printable_name is this function,
603 which is also called directly by java_print_error_function. */
604
605 const char *
606 lang_printable_name (tree decl, int v __attribute__ ((__unused__)))
607 {
608 decl_bufpos = 0;
609 put_decl_node (decl);
610 put_decl_string ("", 1);
611 return decl_buf;
612 }
613
614 /* Does the same thing that lang_printable_name, but add a leading
615 space to the DECL name string -- With Leading Space. */
616
617 const char *
618 lang_printable_name_wls (tree decl, int v __attribute__ ((__unused__)))
619 {
620 decl_bufpos = 1;
621 put_decl_node (decl);
622 put_decl_string ("", 1);
623 decl_buf [0] = ' ';
624 return decl_buf;
625 }
626
627 /* Print on stderr the current class and method context. This function
628 is the value of the hook print_error_function. */
629
630 static GTY(()) tree last_error_function_context;
631 static GTY(()) tree last_error_function;
632 static void
633 java_print_error_function (diagnostic_context *context ATTRIBUTE_UNUSED,
634 const char *file)
635 {
636 /* Don't print error messages with bogus function prototypes. */
637 if (inhibit_error_function_printing)
638 return;
639
640 if (current_function_decl != NULL
641 && DECL_CONTEXT (current_function_decl) != last_error_function_context)
642 {
643 if (file)
644 fprintf (stderr, "%s: ", file);
645
646 last_error_function_context = DECL_CONTEXT (current_function_decl);
647 fprintf (stderr, "In class `%s':\n",
648 lang_printable_name (last_error_function_context, 0));
649 }
650 if (last_error_function != current_function_decl)
651 {
652 if (file)
653 fprintf (stderr, "%s: ", file);
654
655 if (current_function_decl == NULL)
656 fprintf (stderr, "At top level:\n");
657 else
658 {
659 const char *name = lang_printable_name (current_function_decl, 2);
660 fprintf (stderr, "In %s `%s':\n",
661 (DECL_CONSTRUCTOR_P (current_function_decl) ? "constructor"
662 : "method"),
663 name);
664 }
665
666 last_error_function = current_function_decl;
667 }
668
669 }
670
671 /* Called to install the PRINT_ERROR_FUNCTION hook differently
672 according to LEVEL. LEVEL is 1 during early parsing, when function
673 prototypes aren't fully resolved. java_print_error_function is set
674 so it doesn't print incomplete function prototypes. When LEVEL is
675 2, function prototypes are fully resolved and can be printed when
676 reporting errors. */
677
678 void lang_init_source (int level)
679 {
680 inhibit_error_function_printing = (level == 1);
681 }
682
683 static int
684 java_init_options (void)
685 {
686 flag_bounds_check = 1;
687 flag_exceptions = 1;
688 flag_non_call_exceptions = 1;
689
690 /* In Java floating point operations never trap. */
691 flag_trapping_math = 0;
692
693 /* In Java arithmetic overflow always wraps around. */
694 flag_wrapv = 1;
695
696 jcf_path_init ();
697
698 return CL_JAVA;
699 }
700
701 static bool
702 java_can_use_bit_fields_p (void)
703 {
704 /* The bit-field optimizations cause problems when generating class
705 files. */
706 return flag_emit_class_files ? false : true;
707 }
708
709 /* Post-switch processing. */
710 static bool
711 java_post_options (const char **pfilename)
712 {
713 const char *filename = *pfilename;
714
715 /* Use tree inlining if possible. Function instrumentation is only
716 done in the RTL level, so we disable tree inlining. */
717 if (! flag_instrument_function_entry_exit)
718 {
719 if (!flag_no_inline)
720 flag_no_inline = 1;
721 if (flag_inline_functions)
722 {
723 flag_inline_trees = 2;
724 flag_inline_functions = 0;
725 }
726 }
727
728 /* Open input file. */
729
730 if (filename == 0 || !strcmp (filename, "-"))
731 {
732 finput = stdin;
733 filename = "stdin";
734
735 if (dependency_tracking)
736 error ("can't do dependency tracking with input from stdin");
737 }
738 else
739 {
740 if (dependency_tracking)
741 {
742 char *dot;
743
744 /* If the target is set and the output filename is set, then
745 there's no processing to do here. Otherwise we must
746 compute one or the other. */
747 if (! ((dependency_tracking & DEPEND_TARGET_SET)
748 && (dependency_tracking & DEPEND_FILE_ALREADY_SET)))
749 {
750 dot = strrchr (filename, '.');
751 if (dot == NULL)
752 error ("couldn't determine target name for dependency tracking");
753 else
754 {
755 char *buf = xmalloc (dot - filename +
756 3 + sizeof (TARGET_OBJECT_SUFFIX));
757 strncpy (buf, filename, dot - filename);
758
759 /* If emitting class files, we might have multiple
760 targets. The class generation code takes care of
761 registering them. Otherwise we compute the
762 target name here. */
763 if ((dependency_tracking & DEPEND_TARGET_SET))
764 ; /* Nothing. */
765 else if (flag_emit_class_files)
766 jcf_dependency_set_target (NULL);
767 else
768 {
769 strcpy (buf + (dot - filename), TARGET_OBJECT_SUFFIX);
770 jcf_dependency_set_target (buf);
771 }
772
773 if ((dependency_tracking & DEPEND_FILE_ALREADY_SET))
774 ; /* Nothing. */
775 else if ((dependency_tracking & DEPEND_SET_FILE))
776 {
777 strcpy (buf + (dot - filename), ".d");
778 jcf_dependency_set_dep_file (buf);
779 }
780 else
781 jcf_dependency_set_dep_file ("-");
782
783 free (buf);
784 }
785 }
786 }
787 }
788
789 /* Initialize the compiler back end. */
790 return false;
791 }
792
793 /* Return either DECL or its known constant value (if it has one). */
794
795 tree
796 decl_constant_value (tree decl)
797 {
798 if (/* Don't change a variable array bound or initial value to a constant
799 in a place where a variable is invalid. */
800 current_function_decl != 0
801 && ! TREE_THIS_VOLATILE (decl)
802 && TREE_READONLY (decl)
803 && DECL_INITIAL (decl) != 0
804 && TREE_CODE (DECL_INITIAL (decl)) != ERROR_MARK
805 /* This is invalid if initial value is not constant.
806 If it has either a function call, a memory reference,
807 or a variable, then re-evaluating it could give different results. */
808 && TREE_CONSTANT (DECL_INITIAL (decl))
809 /* Check for cases where this is sub-optimal, even though valid. */
810 && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR)
811 return DECL_INITIAL (decl);
812 return decl;
813 }
814
815 /* Walk the language specific tree nodes during inlining. */
816
817 static tree
818 java_tree_inlining_walk_subtrees (tree *tp ATTRIBUTE_UNUSED,
819 int *subtrees ATTRIBUTE_UNUSED,
820 walk_tree_fn func ATTRIBUTE_UNUSED,
821 void *data ATTRIBUTE_UNUSED,
822 void *htab ATTRIBUTE_UNUSED)
823 {
824 enum tree_code code;
825 tree result;
826
827 #define WALK_SUBTREE(NODE) \
828 do \
829 { \
830 result = walk_tree (&(NODE), func, data, htab); \
831 if (result) \
832 return result; \
833 } \
834 while (0)
835
836 tree t = *tp;
837 if (!t)
838 return NULL_TREE;
839
840 code = TREE_CODE (t);
841 switch (code)
842 {
843 case BLOCK:
844 if (BLOCK_EXPR_BODY (t))
845 {
846 tree *prev = &BLOCK_EXPR_BODY (*tp);
847 while (*prev)
848 {
849 WALK_SUBTREE (*prev);
850 prev = &TREE_CHAIN (*prev);
851 }
852 }
853 return NULL_TREE;
854 break;
855
856 default:
857 return NULL_TREE;
858 }
859 }
860
861 /* Called from unsafe_for_reeval. */
862 static int
863 java_unsafe_for_reeval (tree t)
864 {
865 switch (TREE_CODE (t))
866 {
867 case BLOCK:
868 /* Our expander tries to expand the variables twice. Boom. */
869 if (BLOCK_EXPR_DECLS (t) != NULL)
870 return 2;
871 return unsafe_for_reeval (BLOCK_EXPR_BODY (t));
872
873 default:
874 break;
875 }
876
877 return -1;
878 }
879
880 /* Every call to a static constructor has an associated boolean
881 variable which is in the outermost scope of the calling method.
882 This variable is used to avoid multiple calls to the static
883 constructor for each class.
884
885 It looks something like this:
886
887 foo ()
888 {
889 boolean dummy = OtherClass.is_initialized;
890
891 ...
892
893 if (! dummy)
894 OtherClass.initialize();
895
896 ... use OtherClass.data ...
897 }
898
899 Each of these boolean variables has an entry in the
900 DECL_FUNCTION_INIT_TEST_TABLE of a method. When inlining a method
901 we must merge the DECL_FUNCTION_INIT_TEST_TABLE from the function
902 being inlined and create the boolean variables in the outermost
903 scope of the method being inlined into. */
904
905 /* Create a mapping from a boolean variable in a method being inlined
906 to one in the scope of the method being inlined into. */
907
908 static int
909 merge_init_test_initialization (void **entry, void *x)
910 {
911 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
912 splay_tree decl_map = (splay_tree)x;
913 splay_tree_node n;
914 tree *init_test_decl;
915
916 /* See if we have remapped this declaration. If we haven't there's
917 a bug in the inliner. */
918 n = splay_tree_lookup (decl_map, (splay_tree_key) ite->value);
919 if (! n)
920 abort ();
921
922 /* Create a new entry for the class and its remapped boolean
923 variable. If we already have a mapping for this class we've
924 already initialized it, so don't overwrite the value. */
925 init_test_decl = java_treetreehash_new
926 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
927 if (!*init_test_decl)
928 *init_test_decl = (tree)n->value;
929
930 return true;
931 }
932
933 /* Merge the DECL_FUNCTION_INIT_TEST_TABLE from the function we're
934 inlining. */
935
936 void
937 java_inlining_merge_static_initializers (tree fn, void *decl_map)
938 {
939 htab_traverse
940 (DECL_FUNCTION_INIT_TEST_TABLE (fn),
941 merge_init_test_initialization, decl_map);
942 }
943
944 /* Lookup a DECL_FUNCTION_INIT_TEST_TABLE entry in the method we're
945 inlining into. If we already have a corresponding entry in that
946 class we don't need to create another one, so we create a mapping
947 from the variable in the inlined class to the corresponding
948 pre-existing one. */
949
950 static int
951 inline_init_test_initialization (void **entry, void *x)
952 {
953 struct treetreehash_entry *ite = (struct treetreehash_entry *) *entry;
954 splay_tree decl_map = (splay_tree)x;
955
956 tree h = java_treetreehash_find
957 (DECL_FUNCTION_INIT_TEST_TABLE (current_function_decl), ite->key);
958 if (! h)
959 return true;
960
961 splay_tree_insert (decl_map,
962 (splay_tree_key) ite->value,
963 (splay_tree_value) h);
964
965 return true;
966 }
967
968 /* Look up the boolean variables in the DECL_FUNCTION_INIT_TEST_TABLE
969 of a method being inlined. For each hone, if we already have a
970 variable associated with the same class in the method being inlined
971 into, create a new mapping for it. */
972
973 void
974 java_inlining_map_static_initializers (tree fn, void *decl_map)
975 {
976 htab_traverse
977 (DECL_FUNCTION_INIT_TEST_TABLE (fn),
978 inline_init_test_initialization, decl_map);
979 }
980
981 /* Avoid voluminous output for deep recursion of compound exprs. */
982
983 static void
984 dump_compound_expr (dump_info_p di, tree t)
985 {
986 int i;
987
988 for (i=0; i<2; i++)
989 {
990 switch (TREE_CODE (TREE_OPERAND (t, i)))
991 {
992 case COMPOUND_EXPR:
993 dump_compound_expr (di, TREE_OPERAND (t, i));
994 break;
995
996 case EXPR_WITH_FILE_LOCATION:
997 {
998 tree wfl_node = EXPR_WFL_NODE (TREE_OPERAND (t, i));
999 dump_child ("expr", wfl_node);
1000 break;
1001 }
1002
1003 default:
1004 dump_child ("expr", TREE_OPERAND (t, i));
1005 }
1006 }
1007 }
1008
1009 static bool
1010 java_dump_tree (void *dump_info, tree t)
1011 {
1012 enum tree_code code;
1013 dump_info_p di = (dump_info_p) dump_info;
1014
1015 /* Figure out what kind of node this is. */
1016 code = TREE_CODE (t);
1017
1018 switch (code)
1019 {
1020 case FUNCTION_DECL:
1021 dump_child ("args", DECL_ARGUMENTS (t));
1022 if (DECL_EXTERNAL (t))
1023 dump_string (di, "undefined");
1024 if (TREE_PUBLIC (t))
1025 dump_string (di, "extern");
1026 else
1027 dump_string (di, "static");
1028 if (DECL_LANG_SPECIFIC (t))
1029 dump_child ("body", DECL_FUNCTION_BODY (t));
1030 if (DECL_LANG_SPECIFIC (t) && !dump_flag (di, TDF_SLIM, t))
1031 dump_child ("inline body", DECL_SAVED_TREE (t));
1032 return true;
1033
1034 case RETURN_EXPR:
1035 dump_child ("expr", TREE_OPERAND (t, 0));
1036 return true;
1037
1038 case GOTO_EXPR:
1039 dump_child ("goto", TREE_OPERAND (t, 0));
1040 return true;
1041
1042 case LABEL_EXPR:
1043 dump_child ("label", TREE_OPERAND (t, 0));
1044 return true;
1045
1046 case LABELED_BLOCK_EXPR:
1047 dump_child ("label", TREE_OPERAND (t, 0));
1048 dump_child ("block", TREE_OPERAND (t, 1));
1049 return true;
1050
1051 case EXIT_BLOCK_EXPR:
1052 dump_child ("block", TREE_OPERAND (t, 0));
1053 dump_child ("val", TREE_OPERAND (t, 1));
1054 return true;
1055
1056 case BLOCK:
1057 if (BLOCK_EXPR_BODY (t))
1058 {
1059 tree local = BLOCK_VARS (t);
1060 while (local)
1061 {
1062 tree next = TREE_CHAIN (local);
1063 dump_child ("var", local);
1064 local = next;
1065 }
1066
1067 {
1068 tree block = BLOCK_EXPR_BODY (t);
1069 dump_child ("body", block);
1070 block = TREE_CHAIN (block);
1071 }
1072 }
1073 return true;
1074
1075 case COMPOUND_EXPR:
1076 if (!dump_flag (di, TDF_SLIM, t))
1077 return false;
1078 dump_compound_expr (di, t);
1079 return true;
1080
1081 default:
1082 break;
1083 }
1084 return false;
1085 }
1086
1087 /* Java calls can't, in general, be sibcalls because we need an
1088 accurate stack trace in order to guarantee correct operation of
1089 methods such as Class.forName(String) and
1090 SecurityManager.getClassContext(). */
1091
1092 static bool
1093 java_decl_ok_for_sibcall (tree decl)
1094 {
1095 return decl != NULL && DECL_CONTEXT (decl) == current_class;
1096 }
1097
1098 #include "gt-java-lang.h"