This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v2] gcc/c-family/c-cppbuiltin.c: Let buffer enough to print host wide integer value


The original length 18 is not enough for HOST_WIDE_INT printing, need
use 20 instead of.

Also need additional bytes for printing related prefix and suffix, and
define the related macro in "hwint.h".

It passes testsuite under fedora 20 x86_64-unknown-linux-gnu.


2014-11-23  Chen Gang <gang.chen.5i5j@gmail.com> 

	* c-family/c-cppbuiltin.c (builtin_define_with_int_value): Let
	buffer enough to print host wide integer value.
---
 gcc/c-family/c-cppbuiltin.c | 30 +++++++++++++++++++++++-------
 gcc/hwint.h                 |  6 ++++++
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/gcc/c-family/c-cppbuiltin.c b/gcc/c-family/c-cppbuiltin.c
index c571d1b..88a717b 100644
--- a/gcc/c-family/c-cppbuiltin.c
+++ b/gcc/c-family/c-cppbuiltin.c
@@ -1366,15 +1366,31 @@ static void
 builtin_define_with_int_value (const char *macro, HOST_WIDE_INT value)
 {
   char *buf;
-  size_t mlen = strlen (macro);
-  size_t vlen = 18;
-  size_t extra = 2; /* space for = and NUL.  */
+  size_t vlen = 20; /* maximize value length: -9223372036854775807 */
+  size_t extra = 6; /* space for =, NUL, (, ), and L L. */
+
+  gcc_assert (wi::fits_to_tree_p(value, integer_type_node));
 
-  buf = (char *) alloca (mlen + vlen + extra);
-  memcpy (buf, macro, mlen);
-  buf[mlen] = '=';
-  sprintf (buf + mlen + 1, HOST_WIDE_INT_PRINT_DEC, value);
+  buf = (char *) alloca (strlen(macro) + vlen + extra);
 
+  if (value >= 0)
+    {
+      sprintf (buf, "%s="HOST_WIDE_INT_PRINT_DEC"%s",
+	       macro, value,
+	       value <= HOST_INT_MAX
+	       ? ""
+	       : value <= HOST_LONG_MAX
+		 ? "L" : "LL");
+    }
+  else
+    {
+      sprintf (buf, "%s=("HOST_WIDE_INT_PRINT_DEC"%s)",
+	       macro, value,
+	       value > HOST_INT_MIN
+	       ? ""
+	       : value > HOST_LONG_MIN
+		 ? "L" : "LL");
+    }
   cpp_define (parse_in, buf);
 }
 
diff --git a/gcc/hwint.h b/gcc/hwint.h
index fd961fd..3aecba3 100644
--- a/gcc/hwint.h
+++ b/gcc/hwint.h
@@ -225,6 +225,12 @@ exact_log2 (unsigned HOST_WIDE_INT x)
 
 #endif /* GCC_VERSION >= 3004 */
 
+#define HOST_INT_MIN (int) ((unsigned int) 1 << (HOST_BITS_PER_INT - 1))
+#define HOST_INT_MAX (~(HOST_INT_MIN))
+
+#define HOST_LONG_MIN (long) ((unsigned long) 1 << (HOST_BITS_PER_LONG - 1))
+#define HOST_LONG_MAX (~(HOST_LONG_MIN))
+
 #define HOST_WIDE_INT_MIN (HOST_WIDE_INT) \
   ((unsigned HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
 #define HOST_WIDE_INT_MAX (~(HOST_WIDE_INT_MIN))
-- 
1.9.3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]