]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
langhooks-def.h (LANG_HOOKS_TYPE_MAX_SIZE): New langhook.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Sat, 3 Jul 2004 13:40:47 +0000 (13:40 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Sat, 3 Jul 2004 13:40:47 +0000 (09:40 -0400)
* langhooks-def.h (LANG_HOOKS_TYPE_MAX_SIZE): New langhook.
* langhooks.h (strct lang_hooks): New field type_max_size.
* function.c (assign_temp): Call it.

From-SVN: r84053

gcc/ChangeLog
gcc/function.c
gcc/langhooks-def.h
gcc/langhooks.h

index 447484b987991e11b0a00ba22a0d52de39ad40a9..7a161eb53712ab6399c069b4f9e664f2ce450d64 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-03  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+       
+       * langhooks-def.h (LANG_HOOKS_TYPE_MAX_SIZE): New langhook.
+       * langhooks.h (strct lang_hooks): New field type_max_size.
+       * function.c (assign_temp): Call it.
+
 2004-07-03  Steven Bosscher  <stevenb@suse.de>
 
        * config/sh/sh.c (sh_use_dfa_interface): Add TARGET_SH1.
index b6d37896a8e6176fece97735d0624ca5760a7f6a..c3ab96dbae3a6e83f18a0327bf39ca194a41537c 100644 (file)
@@ -914,6 +914,7 @@ assign_temp (tree type_or_decl, int keep, int memory_required,
   if (mode == BLKmode || memory_required)
     {
       HOST_WIDE_INT size = int_size_in_bytes (type);
+      tree size_tree;
       rtx tmp;
 
       /* Zero sized arrays are GNU C extension.  Set size to 1 to avoid
@@ -930,6 +931,13 @@ assign_temp (tree type_or_decl, int keep, int memory_required,
          && host_integerp (TYPE_ARRAY_MAX_SIZE (type), 1))
        size = tree_low_cst (TYPE_ARRAY_MAX_SIZE (type), 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.type_max_size (type)) != 0
+         && host_integerp (size_tree, 1))
+       size = tree_low_cst (size_tree, 1);
+
       /* The size of the temporary may be too large to fit into an integer.  */
       /* ??? Not sure this should happen except for user silliness, so limit
         this to things that aren't compiler-generated temporaries.  The
index 60642990794123ab40fbe83dd1ff719f343cc260..2cbd3fd2d1442b724e067699bf57409baae69529 100644 (file)
@@ -127,6 +127,7 @@ extern int lhd_gimplify_expr (tree *, tree *, tree *);
 #define LANG_HOOKS_DECL_PRINTABLE_NAME lhd_decl_printable_name
 #define LANG_HOOKS_GET_CALLEE_FNDECL   lhd_return_null_tree
 #define LANG_HOOKS_EXPR_SIZE           lhd_expr_size
+#define LANG_HOOKS_TYPE_MAX_SIZE       lhd_return_null_tree
 #define LANG_HOOKS_TREE_SIZE           lhd_tree_size
 #define LANG_HOOKS_TYPES_COMPATIBLE_P  lhd_types_compatible_p
 #define LANG_HOOKS_UPDATE_DECL_AFTER_SAVING NULL
@@ -305,6 +306,7 @@ extern tree lhd_make_node (enum tree_code);
   LANG_HOOKS_GET_CALLEE_FNDECL, \
   LANG_HOOKS_PRINT_ERROR_FUNCTION, \
   LANG_HOOKS_EXPR_SIZE, \
+  LANG_HOOKS_TYPE_MAX_SIZE, \
   LANG_HOOKS_UPDATE_DECL_AFTER_SAVING, \
   LANG_HOOKS_ATTRIBUTE_TABLE, \
   LANG_HOOKS_COMMON_ATTRIBUTE_TABLE, \
index a8c0ccac2a79649965400fb13a6c8387cce03f4a..6f526ef898d5caa8c0cfcc42ac9c6acdca5b0ef0 100644 (file)
@@ -390,6 +390,10 @@ struct lang_hooks
      semantics in cases that it doesn't want to handle specially.  */
   tree (*expr_size) (tree);
 
+  /* Called from assign_temp to return the maximum size, if there is one,
+     for a type.  */
+  tree (*type_max_size) PARAMS ((tree));
+
   /* Update lang specific fields after duplicating function body.  */
   void (*update_decl_after_saving) (tree, void *);