aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2006-06-23 16:18:49 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2006-06-23 16:18:49 +0000
commita441447f7f6495bb8a8e6d160d7c095da787e708 (patch)
tree21e2dd58058f99241fdf55ad680c1c3ebc3dd2e5 /gcc/tree.c
parenta3d536f1c1c0aa3d414c17c4acc44c900b1f1e38 (diff)
downloadgcc-a441447f7f6495bb8a8e6d160d7c095da787e708.zip
gcc-a441447f7f6495bb8a8e6d160d7c095da787e708.tar.gz
gcc-a441447f7f6495bb8a8e6d160d7c095da787e708.tar.bz2
tree.c (max_int_size_in_bytes): New function, inspired from code in function.c:assign_temp.
* tree.c (max_int_size_in_bytes): New function, inspired from code in function.c:assign_temp. * tree.h (max_int_size_in_bytes): Declare. * function.c (assign_temp): Use it. * gimplify.c (create_tmp_var): Relax the assertions on the type properties, not mandating constant size any more. (force_constant_size): New static function. (gimple_add_tmp_var): Use it, forcing variable size to a constant upper bound if it is not constant on entry. * ada/misc.c (gnat_type_max_size): Look at TYPE_ADA_SIZE if we have not been able to get a constant upper bound from TYPE_SIZE_UNIT. * gnat.dg/varsize_temp.adb: New test. From-SVN: r114938
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 2df2f7b..cbf4cc5 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -1733,6 +1733,39 @@ int_size_in_bytes (tree type)
return TREE_INT_CST_LOW (t);
}
+
+/* Return the maximum size of TYPE (in bytes) as a wide integer
+ or return -1 if the size can vary or is larger than an integer. */
+
+HOST_WIDE_INT
+max_int_size_in_bytes (tree type)
+{
+ HOST_WIDE_INT size = -1;
+ tree size_tree;
+
+ /* If this is an array type, check for a possible MAX_SIZE attached. */
+
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ {
+ size_tree = TYPE_ARRAY_MAX_SIZE (type);
+
+ if (size_tree && host_integerp (size_tree, 1))
+ size = tree_low_cst (size_tree, 1);
+ }
+
+ /* If we still haven't been able to get a size, see if the language
+ can compute a maximum size. */
+
+ if (size == -1)
+ {
+ size_tree = lang_hooks.types.max_size (type);
+
+ if (size_tree && host_integerp (size_tree, 1))
+ size = tree_low_cst (size_tree, 1);
+ }
+
+ return size;
+}
/* Return the bit position of FIELD, in bits from the start of the record.
This is a tree of type bitsizetype. */