OSDN Git Service

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