gimple-ssa-sprintf.c (format_string): Do not hardcode size of target's wchar_t.
authorJeff Law <law@gcc.gnu.org>
Thu, 4 Oct 2018 02:55:10 +0000 (20:55 -0600)
committerJeff Law <law@gcc.gnu.org>
Thu, 4 Oct 2018 02:55:10 +0000 (20:55 -0600)
        * gimple-ssa-sprintf.c (format_string): Do not hardcode size of
        target's wchar_t.
        * tree.c (get_typenode_from_name): Moved from fortran/trans-types.c.
        * tree.h (get_typenode_from_name): Prototype.

        * trans-types.c (get_typenode_from_name): Moved into gcc/tree.c.

From-SVN: r264833

gcc/ChangeLog
gcc/fortran/ChangeLog
gcc/fortran/trans-types.c
gcc/gimple-ssa-sprintf.c
gcc/tree.c
gcc/tree.h

index f365b249aeff363b721feafd7f5ff90132a68c23..03bc5727c23decaa4b96d144820912bc3b026941 100644 (file)
@@ -1,3 +1,10 @@
+2018-10-03  Jeff Law  <law@redhat.com>
+
+        * gimple-ssa-sprintf.c (format_string): Do not hardcode size of
+        target's wchar_t.
+        * tree.c (get_typenode_from_name): Moved from fortran/trans-types.c.
+        * tree.h (get_typenode_from_name): Prototype.
+
 2018-10-03  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (*cmp<X87MODEF:mode>_<SWI24:mode>_i387):
index d513f2a0c6a3457113b6506581fd99ee8bdeeb3a..521247c2dcc78a13a899dbbe08ffb249c7f25408 100644 (file)
@@ -1,3 +1,7 @@
+2018-10-03  Jeff Law  <law@redhat.comg>
+
+        * trans-types.c (get_typenode_from_name): Moved into gcc/tree.c.
+
 2018-10-01  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/65677
index 46f6d8c03a6430378648cfcc669a4625b2e2e5af..1a813eaf4d4f2edd3f14aa857556b8f4947c7832 100644 (file)
@@ -218,43 +218,6 @@ get_int_kind_from_node (tree type)
   return -1;
 }
 
-/* Return a typenode for the "standard" C type with a given name.  */
-static tree
-get_typenode_from_name (const char *name)
-{
-  if (name == NULL || *name == '\0')
-    return NULL_TREE;
-
-  if (strcmp (name, "char") == 0)
-    return char_type_node;
-  if (strcmp (name, "unsigned char") == 0)
-    return unsigned_char_type_node;
-  if (strcmp (name, "signed char") == 0)
-    return signed_char_type_node;
-
-  if (strcmp (name, "short int") == 0)
-    return short_integer_type_node;
-  if (strcmp (name, "short unsigned int") == 0)
-    return short_unsigned_type_node;
-
-  if (strcmp (name, "int") == 0)
-    return integer_type_node;
-  if (strcmp (name, "unsigned int") == 0)
-    return unsigned_type_node;
-
-  if (strcmp (name, "long int") == 0)
-    return long_integer_type_node;
-  if (strcmp (name, "long unsigned int") == 0)
-    return long_unsigned_type_node;
-
-  if (strcmp (name, "long long int") == 0)
-    return long_long_integer_type_node;
-  if (strcmp (name, "long long unsigned int") == 0)
-    return long_long_unsigned_type_node;
-
-  gcc_unreachable ();
-}
-
 static int
 get_int_kind_from_name (const char *name)
 {
index 88e952828e1c13a867d48ef16f442c8108f630b5..471bfc45eb87514824299ff975d2d464f80e60c4 100644 (file)
@@ -2179,7 +2179,19 @@ format_string (const directive &dir, tree arg, vr_values *)
   fmtresult res;
 
   /* Compute the range the argument's length can be in.  */
-  int count_by = dir.specifier == 'S' || dir.modifier == FMT_LEN_l ? 4 : 1;
+  int count_by = 1;
+  if (dir.specifier == 'S' || dir.modifier == FMT_LEN_l)
+    {
+      /* Get a node for a C type that will be the same size
+        as a wchar_t on the target.  */
+      tree node = get_typenode_from_name (MODIFIED_WCHAR_TYPE);
+
+      /* Now that we have a suitable node, get the number of
+        bytes it occupies.  */
+      count_by = int_size_in_bytes (node); 
+      gcc_checking_assert (count_by == 2 || count_by == 4);
+    }
+
   fmtresult slen = get_string_length (arg, count_by);
   if (slen.range.min == slen.range.max
       && slen.range.min < HOST_WIDE_INT_MAX)
index 748ece690ea4905a8629d213027d44d23739ecb3..d7dca77d2b2af30aed91ef4c0c8b32b4eb772825 100644 (file)
@@ -14408,6 +14408,43 @@ expr_type_first_operand_type_p (tree_code code)
     }
 }
 
+/* Return a typenode for the "standard" C type with a given name.  */
+tree
+get_typenode_from_name (const char *name)
+{
+  if (name == NULL || *name == '\0')
+    return NULL_TREE;
+
+  if (strcmp (name, "char") == 0)
+    return char_type_node;
+  if (strcmp (name, "unsigned char") == 0)
+    return unsigned_char_type_node;
+  if (strcmp (name, "signed char") == 0)
+    return signed_char_type_node;
+
+  if (strcmp (name, "short int") == 0)
+    return short_integer_type_node;
+  if (strcmp (name, "short unsigned int") == 0)
+    return short_unsigned_type_node;
+
+  if (strcmp (name, "int") == 0)
+    return integer_type_node;
+  if (strcmp (name, "unsigned int") == 0)
+    return unsigned_type_node;
+
+  if (strcmp (name, "long int") == 0)
+    return long_integer_type_node;
+  if (strcmp (name, "long unsigned int") == 0)
+    return long_unsigned_type_node;
+
+  if (strcmp (name, "long long int") == 0)
+    return long_long_integer_type_node;
+  if (strcmp (name, "long long unsigned int") == 0)
+    return long_long_unsigned_type_node;
+
+  gcc_unreachable ();
+}
+
 /* List of pointer types used to declare builtins before we have seen their
    real declaration.
 
index a0f24b61ef187d21aacd0c62dfd544a299885c02..1e59dd59cf39ea8d487be66c88d4288611ceee63 100644 (file)
@@ -4987,6 +4987,9 @@ extern tree get_base_address (tree t);
    of EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
 extern tree array_ref_element_size (tree);
 
+/* Return a typenode for the "standard" C type with a given name.  */
+extern tree get_typenode_from_name (const char *);
+
 /* Return a tree representing the upper bound of the array mentioned in
    EXP, an ARRAY_REF or an ARRAY_RANGE_REF.  */
 extern tree array_ref_up_bound (tree);