This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH v2] gcc/c-family/c-cppbuiltin.c: Let buffer enough to print host wide integer value
- From: Chen Gang <gang dot chen dot 5i5j at gmail dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, rth at redhat dot com, Jeff Law <law at redhat dot com>
- Cc: gcc-patches List <gcc-patches at gcc dot gnu dot org>
- Date: Sun, 23 Nov 2014 09:03:33 +0800
- Subject: [PATCH v2] gcc/c-family/c-cppbuiltin.c: Let buffer enough to print host wide integer value
- Authentication-results: sourceware.org; auth=none
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