diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-28 22:53:50 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-02-28 22:53:50 +0000 |
commit | 0b4a51d1f6c9401fa9fb1e5ce5a9e0e215cead79 (patch) | |
tree | d4062331b69694bd3a7bf9f269219dca8daa4de9 /gcc/stor-layout.c | |
parent | 5b77dfe298130ad41b07e281cbddc87e8ee68904 (diff) | |
download | gcc-0b4a51d1f6c9401fa9fb1e5ce5a9e0e215cead79.tar.gz |
* stor-layout.c (variable_size): Leave a minus 1 outside the
SAVE_EXPR.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@63585 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r-- | gcc/stor-layout.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 8fd70adf143..6caaf5f70de 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -157,6 +157,8 @@ tree variable_size (size) tree size; { + tree save; + /* If the language-processor is to take responsibility for variable-sized items (e.g., languages which have elaboration procedures like Ada), just return SIZE unchanged. Likewise for self-referential sizes and @@ -166,7 +168,12 @@ variable_size (size) || contains_placeholder_p (size)) return size; - size = save_expr (size); + if (TREE_CODE (size) == MINUS_EXPR && integer_onep (TREE_OPERAND (size, 1))) + /* If this is the upper bound of a C array, leave the minus 1 outside + the SAVE_EXPR so it can be folded away. */ + TREE_OPERAND (size, 0) = save = save_expr (TREE_OPERAND (size, 0)); + else + size = save = save_expr (size); /* If an array with a variable number of elements is declared, and the elements require destruction, we will emit a cleanup for the @@ -176,8 +183,8 @@ variable_size (size) `unsaved', i.e., all SAVE_EXPRs are recalculated. However, we do not wish to do that here; the array-size is the same in both places. */ - if (TREE_CODE (size) == SAVE_EXPR) - SAVE_EXPR_PERSISTENT_P (size) = 1; + if (TREE_CODE (save) == SAVE_EXPR) + SAVE_EXPR_PERSISTENT_P (save) = 1; if ((*lang_hooks.decls.global_bindings_p) ()) { @@ -190,16 +197,13 @@ variable_size (size) } if (immediate_size_expand) - /* NULL_RTX is not defined; neither is the rtx type. - Also, we would like to pass const0_rtx here, but don't have it. */ - expand_expr (size, expand_expr (integer_zero_node, NULL_RTX, VOIDmode, 0), - VOIDmode, 0); + expand_expr (save, const0_rtx, VOIDmode, 0); else if (cfun != 0 && cfun->x_dont_save_pending_sizes_p) /* The front-end doesn't want us to keep a list of the expressions that determine sizes for variable size objects. */ ; else - put_pending_size (size); + put_pending_size (save); return size; } |