1 /* Code to test for "definitive assignment".
3 Copyright (C) 1999 Free Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNU CC; see the file COPYING. If not, write to
17 the Free Software Foundation, 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
20 Java and all Java-based marks are trademarks or registered trademarks
21 of Sun Microsystems, Inc. in the United States and other countries.
22 The Free Software Foundation is independent of Sun Microsystems, Inc. */
24 /* Written by Per Bothner <bothner@cygnus.com>, January 1999. */
29 #include "java-tree.h"
30 #include "toplev.h" /* Needed for fatal. */
32 /* The basic idea is that we assign each local variable declaration
33 an index, and then we pass around bitstrings, where the i'th bit
34 is set if decl whose DECL_BIT_INDEX is i is definitely assigned. */
36 /* One segment of a bitstring. */
37 typedef unsigned int word;
39 /* Pointer to a bitstring. */
42 /* For a local VAR_DECL, holds the index into a words bitstring that
43 specifies if this decl is definitively assigned.
44 A DECL_BIT_INDEX of -1 means we no longer care. */
45 #define DECL_BIT_INDEX(DECL) DECL_FIELD_SIZE(DECL)
47 /* Number of locals variables currently active. */
48 int num_current_locals = 0;
50 /* The index of the first local variable in the current block.
52 The variables whose DECL_BIT_INDEX are in the range from
53 start_current_locals (inclusive) up to num_current_locals (exclusive)
54 are declared in the "current" block. If there is a loop or branch
55 form, we set start_current_locals to num_current_locals to indicate
56 there is no current block.
58 The point is that if a variable in the current block is set,
59 there are no other control paths that we have to worry about.
60 Hence, we can remove it from the set of variables we are
61 checking, making its bit index available for some other variable.
62 For simplicity, we only do that if the variable's bit index
63 is (num_current_locals-1); freeing up its bit index is then
64 just a simple matter of decrementing num_current_locals.
65 The reason this is worth doing is that it is simple, and
66 allows us to use short (usually one-word) bit-strings,
67 even for methods with thousands of local variables, as
68 long as most of them are initialized immediately after or in
70 int start_current_locals = 0;
72 int num_current_words = 1;
76 #define COPYN(DST, SRC, NWORDS) memcpy (DST, SRC, NWORDS * sizeof(word))
77 #define COPY(DST, SRC) COPYN (DST, SRC, num_current_words)
79 #define SET_ALL(DST) memset (DST, ~0, num_current_words * sizeof(word))
80 #define CLEAR_ALL(DST) memset (DST, 0, num_current_words * sizeof(word))
82 #define INTERSECTN(DST, SRC1, SRC2, N) \
84 while (--n >= 0) DST[n] = SRC1[n] & SRC2[n]; \
87 #define UNION(DST, SRC1, SRC2) \
88 UNIONN (DST, SRC1, SRC2, num_current_words)
90 #define UNIONN(DST, SRC1, SRC2, N) \
92 while (--n >= 0) DST[n] = SRC1[n] | SRC2[n]; \
95 #define INTERSECT(DST, SRC1, SRC2) \
96 INTERSECTN (DST, SRC1, SRC2, num_current_words)
98 #define WORD_SIZE ((unsigned int)(sizeof(word) * 8))
100 static void check_bool_init PROTO ((tree, words, words, words));
101 static void check_init PROTO ((tree, words));
102 static void check_cond_init PROTO ((tree, tree, tree, words, words, words));
103 static void check_bool2_init PROTO ((enum tree_code, tree, tree, words, words, words));
105 static void done_alternative PROTO ((words, struct alternatives *));
108 #define ALLOC_WORDS(NUM) ((word*) xmalloc ((NUM) * sizeof (word)))
109 #define FREE_WORDS(PTR) (free (PTR))
111 #define ALLOC_WORDS(NUM) ((word*)alloca ((NUM) * sizeof (word)))
112 #define FREE_WORDS(PTR) ((void)0)
115 #define SET_P(WORDS, BIT) \
116 (WORDS[BIT / WORD_SIZE] & (1 << (BIT % WORD_SIZE)))
118 #define CLEAR_BIT(WORDS, BIT) \
119 (WORDS[BIT / WORD_SIZE] &= ~ (1 << (BIT % WORD_SIZE)))
121 #define SET_BIT(WORDS, BIT) \
122 (WORDS[BIT / WORD_SIZE] |= (1 << (BIT % WORD_SIZE)))
124 #define WORDS_NEEDED(BITS) (((BITS)+(WORD_SIZE-1))/(WORD_SIZE))
126 /* Check a conditional form (TEST_EXP ? THEN_EXP : ELSE_EXP) for
128 BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
131 check_cond_init (test_exp, then_exp, else_exp,
132 before, when_false, when_true)
133 tree test_exp, then_exp, else_exp;
134 words before, when_false, when_true;
136 words tmp = ALLOC_WORDS (6 * num_current_words);
137 words test_false = tmp;
138 words test_true = tmp + num_current_words;
139 words then_false = tmp + 2 * num_current_words;
140 words then_true = tmp + 3 * num_current_words;
141 words else_false = tmp + 4 * num_current_words;
142 words else_true = tmp + 5 * num_current_words;
143 check_bool_init (test_exp, before, test_false, test_true);
144 check_bool_init (then_exp, test_true, then_false, then_true);
145 check_bool_init (else_exp, test_false, else_false, else_true);
146 INTERSECT (when_false, then_false, else_false);
147 INTERSECT (when_true, then_true, else_true);
151 /* Check a boolean binary form CODE (EXP0, EXP1),
152 where CODE is one of EQ_EXPR, BIT_AND_EXPR, or BIT_IOR_EXPR.
153 BEFORE, WHEN_FALSE, and WHEN_TRUE are as in check_bool_init. */
156 check_bool2_init (code, exp0, exp1, before, when_false, when_true)
157 enum tree_code code; tree exp0, exp1;
158 words before, when_false, when_true;
161 words tmp = num_current_words <= 1 ? buf
162 : ALLOC_WORDS (4 * num_current_words);
163 words when_false_0 = tmp;
164 words when_false_1 = tmp+num_current_words;
165 words when_true_0 = tmp+2*num_current_words;
166 words when_true_1 = tmp+3*num_current_words;
167 check_bool_init (exp0, before, when_false_0, when_true_0);
168 INTERSECT (before, when_false_0, when_true_0);
169 check_bool_init (exp1, before, when_false_1, when_true_1);
171 INTERSECT (before, when_false_1, when_true_1);
176 * when_true = (when_false_1 INTERSECTION when_true_1)
177 * UNION (when_true_0 INTERSECTION when_false_1)
178 * UNION (when_false_0 INTERSECTION when_true_1);
179 * using when_false and before as temporary working areas. */
180 INTERSECT (when_true, when_true_0, when_false_1);
181 INTERSECT (when_false, when_true_0, when_false_1);
182 UNION (when_true, when_true, when_false);
183 UNION (when_true, when_true, before);
186 * when_false = (when_false_1 INTERSECTION when_true_1)
187 * UNION (when_true_0 INTERSECTION when_true_1)
188 * UNION (when_false_0 INTERSECTION when_false_1);
189 * using before as a temporary working area. */
190 INTERSECT (when_false, when_true_0, when_true_1);
191 UNION (when_false, when_false, before);
192 INTERSECT (before, when_false_0, when_false_1);
193 UNION (when_false, when_false, before);
195 else if (code == BIT_AND_EXPR || code == TRUTH_AND_EXPR)
197 UNION (when_true, when_true_0, when_true_1);
198 INTERSECT (when_false, when_false_0, when_false_1);
199 UNION (when_false, when_false, before);
201 else /* if (code == BIT_IOR_EXPR || code == TRUTH_OR_EXPR) */
203 UNION (when_false, when_false_0, when_false_1);
204 INTERSECT (when_true, when_true_0, when_true_1);
205 UNION (when_true, when_true, before);
212 /* Check a boolean expression EXP for definite assignment.
213 BEFORE is the set of variables definitely assigned before the conditional.
214 (This bitstring may be modified arbitrarily in this function.)
215 On output, WHEN_FALSE is the set of variables definitely assigned after
216 the conditional when the conditional is false.
217 On output, WHEN_TRUE is the set of variables definitely assigned after
218 the conditional when the conditional is true.
219 (WHEN_FALSE and WHEN_TRUE are overwriten with initial values ignored.)
220 (None of BEFORE, WHEN_FALSE, or WHEN_TRUE can overlap, as they may
221 be used as temporary working areas. */
224 check_bool_init (exp, before, when_false, when_true)
226 words before, when_false, when_true;
228 switch (TREE_CODE (exp))
231 check_cond_init (TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
232 TREE_OPERAND (exp, 2),
233 before, when_false, when_true);
236 case TRUTH_ANDIF_EXPR:
237 check_cond_init (TREE_OPERAND (exp, 0),
238 TREE_OPERAND (exp, 1), boolean_false_node,
239 before, when_false, when_true);
241 case TRUTH_ORIF_EXPR:
242 check_cond_init (TREE_OPERAND (exp, 0),
243 boolean_true_node, TREE_OPERAND (exp, 1),
244 before, when_false, when_true);
247 check_bool_init (TREE_OPERAND (exp, 0), before, when_true, when_false);
251 tree tmp = TREE_OPERAND (exp, 0);
252 if (TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp))
255 check_bool_init (TREE_OPERAND (exp, 1), before,
256 when_false, when_true);
257 index = DECL_BIT_INDEX (tmp);
260 SET_BIT (when_false, index);
261 SET_BIT (when_true, index);
273 check_bool2_init (TREE_CODE (exp),
274 TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
275 before, when_false, when_true);
281 /* Just like EQ_EXPR, but switch when_true and when_false. */
282 check_bool2_init (EQ_EXPR, TREE_OPERAND (exp, 0), TREE_OPERAND (exp, 1),
283 before, when_true, when_false);
288 if (integer_zerop (exp))
291 COPY (when_false, before);
295 SET_ALL (when_false);
296 COPY (when_true, before);
301 check_init (exp, before);
302 COPY (when_false, before);
303 COPY (when_true, before);
307 /* Used to keep track of control flow branches. */
311 struct alternatives *outer;
313 /* The value of num_current_locals at the start of this compound. */
316 /* The value of the "before" set at the start of the control stucture.
317 Used for SWITCH_EXPR but not set for LABELED_BLOCK_EXPR. */
320 int save_start_current_locals;
322 /* If num_current_words==1, combined==&one_word, for efficiency. */
325 /* The intersection of the "after" sets from previous branches. */
331 struct alternatives * alternatives = NULL;
333 #define BEGIN_ALTERNATIVES(before, current) \
335 current.saved = NULL; \
336 current.num_locals = num_current_locals; \
337 current.combined = num_current_words <= 1 ? ¤t.one_word \
338 : ALLOC_WORDS (num_current_words); \
339 SET_ALL (current.combined); \
340 current.outer = alternatives; \
341 alternatives = ¤t; \
342 current.save_start_current_locals = start_current_locals; \
343 start_current_locals = num_current_locals; \
347 done_alternative (after, current)
349 struct alternatives *current;
351 INTERSECTN (current->combined, current->combined, after,
352 WORDS_NEEDED (current->num_locals));
355 #define END_ALTERNATIVES(after, current) \
357 alternatives = current.outer; \
358 COPY (after, current.combined); \
359 if (current.combined != ¤t.one_word) \
360 FREE_WORDS (current.combined); \
361 start_current_locals = current.save_start_current_locals; \
364 /* Check for (un)initialized local variables in EXP.
368 check_init (exp, before)
374 switch (TREE_CODE (exp))
377 if (! FIELD_STATIC (exp) && DECL_NAME (exp) != NULL_TREE)
379 int index = DECL_BIT_INDEX (exp);
380 if (index >= 0 && ! SET_P (before, index))
383 parse_error_context (wfl,
384 "Variable `%s' may not have been initialized"
385 , IDENTIFIER_POINTER (DECL_NAME (exp)));
387 error_with_decl (exp, "variable may be used uninitialized");
389 /* Suppress further errors. */
390 DECL_BIT_INDEX (exp) = -1;
395 tmp = TREE_OPERAND (exp, 0);
396 if (TREE_CODE (tmp) == VAR_DECL && ! FIELD_STATIC (tmp))
399 check_init (TREE_OPERAND (exp, 1), before);
400 index = DECL_BIT_INDEX (tmp);
402 SET_BIT (before, index);
403 /* Minor optimization. See comment for start_current_locals. */
404 if (index >= start_current_locals
405 && index == num_current_locals - 1)
407 num_current_locals--;
408 DECL_BIT_INDEX (tmp) = -1;
415 if (BLOCK_EXPR_BODY (exp))
417 tree decl = BLOCK_EXPR_DECLS (exp);
421 int save_start_current_locals = start_current_locals;
422 int save_num_current_words = num_current_words;
423 start_current_locals = num_current_locals;
424 for (; decl != NULL_TREE; decl = TREE_CHAIN (decl))
426 DECL_BIT_INDEX (decl) = num_current_locals++;
428 words_needed = WORDS_NEEDED (num_current_locals);
429 if (words_needed > num_current_words)
431 tmp = ALLOC_WORDS (words_needed);
433 num_current_words = words_needed;
437 for (i = start_current_locals; i < num_current_locals; i++)
439 check_init (BLOCK_EXPR_BODY (exp), tmp);
440 num_current_locals = start_current_locals;
441 start_current_locals = save_start_current_locals;
444 num_current_words = save_num_current_words;
452 struct alternatives alt;
453 BEGIN_ALTERNATIVES (before, alt);
455 check_init (TREE_OPERAND (exp, 0), before);
456 done_alternative (before, &alt);
457 END_ALTERNATIVES (before, alt);
462 struct alternatives *alt = alternatives;
463 words tmp = ALLOC_WORDS (2 * num_current_words);
464 words when_true = tmp;
465 words when_false = tmp + num_current_words;
466 #ifdef ENABLE_CHECKING
467 if (TREE_CODE (alt->block) != LOOP_EXPR)
468 fatal ("internal error in check-init: EXIT_EXPR not in LOOP_EXPR");
470 check_bool_init (TREE_OPERAND (exp, 0), before, when_false, when_true);
471 done_alternative (when_true, alt);
472 COPY (before, when_false);
476 case LABELED_BLOCK_EXPR:
478 struct alternatives alt;
479 BEGIN_ALTERNATIVES (before, alt);
481 if (LABELED_BLOCK_BODY (exp))
482 check_init (LABELED_BLOCK_BODY (exp), before);
483 done_alternative (before, &alt);
484 END_ALTERNATIVES (before, alt);
487 case EXIT_BLOCK_EXPR:
489 tree block = TREE_OPERAND (exp, 0);
490 struct alternatives *alt = alternatives;
491 while (alt->block != block)
493 done_alternative (before, alt);
499 struct alternatives alt;
500 check_init (TREE_OPERAND (exp, 0), before);
501 BEGIN_ALTERNATIVES (before, alt);
502 alt.saved = ALLOC_WORDS (num_current_words);
503 COPY (alt.saved, before);
505 check_init (TREE_OPERAND (exp, 1), before);
506 done_alternative (before, &alt);
507 FREE_WORDS (alt.saved);
508 END_ALTERNATIVES (before, alt);
515 struct alternatives *alt = alternatives;
516 while (TREE_CODE (alt->block) != SWITCH_EXPR)
518 COPYN (before, alt->saved, WORDS_NEEDED (alt->num_locals));
519 for (i = alt->num_locals; i < num_current_locals; i++)
520 CLEAR_BIT (before, i);
524 case CLEANUP_POINT_EXPR:
526 struct alternatives alt;
527 BEGIN_ALTERNATIVES (before, alt);
528 CLEAR_ALL (alt.combined);
529 check_init (TREE_OPERAND (exp, 0), before);
530 UNION (alt.combined, alt.combined, before);
531 END_ALTERNATIVES (before, alt);
534 case WITH_CLEANUP_EXPR:
536 struct alternatives *alt = alternatives;
537 #ifdef ENABLE_CHECKING
538 if (TREE_CODE (alt->block) != CLEANUP_POINT_EXPR)
539 fatal ("internal error in check-init: WITH_CLEANUP_EXPR not in CLEANUP_POINT_EXPR");
541 check_init (TREE_OPERAND (exp, 0), before);
542 UNION (alt->combined, alt->combined, before);
543 check_init (TREE_OPERAND (exp, 2), alt->combined);
549 tree try_clause = TREE_OPERAND (exp, 0);
550 tree clause = TREE_OPERAND (exp, 1);
551 words save = ALLOC_WORDS (num_current_words);
552 words tmp = ALLOC_WORDS (num_current_words);
553 struct alternatives alt;
554 BEGIN_ALTERNATIVES (before, alt);
557 check_init (try_clause, tmp);
558 done_alternative (tmp, &alt);
559 for ( ; clause != NULL_TREE; clause = TREE_CHAIN (clause))
561 tree catch_clause = TREE_OPERAND (clause, 0);
563 check_init (catch_clause, tmp);
564 done_alternative (tmp, &alt);
568 END_ALTERNATIVES (before, alt);
572 case TRY_FINALLY_EXPR:
574 words tmp = ALLOC_WORDS (num_current_words);
576 check_init (TREE_OPERAND (exp, 0), tmp);
577 check_init (TREE_OPERAND (exp, 1), before);
584 if (TREE_OPERAND (exp, 0))
585 check_init (TREE_OPERAND (exp, 0), before);
586 goto never_continues;
594 case TRUTH_ANDIF_EXPR:
595 case TRUTH_ORIF_EXPR:
597 words tmp = ALLOC_WORDS (2 * num_current_words);
598 words when_true = tmp;
599 words when_false = tmp + num_current_words;
600 check_bool_init (exp, before, when_false, when_true);
601 INTERSECT (before, when_false, when_true);
605 case UNARY_PLUS_EXPR:
620 case PREDECREMENT_EXPR:
621 case PREINCREMENT_EXPR:
622 case POSTDECREMENT_EXPR:
623 case POSTINCREMENT_EXPR:
624 case NON_LVALUE_EXPR:
625 case INSTANCEOF_EXPR:
626 /* Avoid needless recursion. */
627 exp = TREE_OPERAND (exp, 0);
653 check_init (TREE_OPERAND (exp, 0), before);
654 /* Avoid needless recursion, especially for COMPOUND_EXPR. */
655 exp = TREE_OPERAND (exp, 1);
669 tree func = TREE_OPERAND (exp, 0);
670 tree x = TREE_OPERAND (exp, 1);
671 if (TREE_CODE (func) == ADDR_EXPR)
672 func = TREE_OPERAND (func, 0);
673 check_init (func, before);
675 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
676 check_init (TREE_VALUE (x), before);
677 if (func == throw_node)
678 goto never_continues;
684 tree x = CONSTRUCTOR_ELTS (TREE_OPERAND (exp, 0));
685 for ( ; x != NULL_TREE; x = TREE_CHAIN (x))
686 check_init (TREE_VALUE (x), before);
690 case EXPR_WITH_FILE_LOCATION:
692 char *saved_input_filename = input_filename;
693 tree saved_wfl = wfl;
694 tree body = EXPR_WFL_NODE (exp);
695 int saved_lineno = lineno;
696 if (body == empty_stmt_node)
699 input_filename = EXPR_WFL_FILENAME (exp);
700 lineno = EXPR_WFL_LINENO (exp);
701 check_init (body, before);
702 input_filename = saved_input_filename;
703 lineno = saved_lineno;
709 fatal ("internal error in check-init: tree code not implemented: %s",
710 tree_code_name [(int) TREE_CODE (exp)]);
715 check_for_initialization (body)
719 check_init (body, &before);