This is the mail archive of the newlib@sourceware.org mailing list for the newlib 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]

Re: [PATCH 2/2] Add autoconf detection of size of uintptr_t




Thought I should follow up. Even though this is noted
as 2/2, the other patch is all of the generated files and
it was easier to put them in a git commit and ignore them.

This should fix the definition of PRIxxPTR and SCNxxPTR in
a way that makes printf() warnings disappear on some
targets where they were defined incorrectly.

This should implement the solution that Eric Blake suggested
in this post: https://sourceware.org/ml/newlib/2014/msg00426.html

With this patch in place, we eliminated 17 printf() warnings
in the RTEMS source base which only showed up on a subset
of our 18 architectures.

A review is appreciated. If OK, then someone who is more comfortable
bootstrapping should commit it.

--joel

On 10/24/2014 5:41 PM, Joel Sherrill wrote:
2014-10-24  Joel Sherrill <joel.sherrill@oarcorp.com>

	* configure.in: Add autoconf test to determine size of uintptr_t.
	* newlib.hin: Add new autoconf feature variables.
	* libc/include/inttypes.h: Use new feature variables.
	* configure: Regenerate.
---
  newlib/configure.in            | 41 +++++++++++++++++++++++++++++++++++++++++
  newlib/libc/include/inttypes.h | 12 ++++++------
  newlib/newlib.hin              |  6 ++++++
  3 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/newlib/configure.in b/newlib/configure.in
index 9465787..88886f7 100644
--- a/newlib/configure.in
+++ b/newlib/configure.in
@@ -617,6 +617,47 @@ if test $newlib_cv_ldbl_eq_dbl = yes; then
    AC_DEFINE_UNQUOTED(_LDBL_EQ_DBL)
  fi
+#### Determine if uintptr_t is unsigned long long
+AC_CACHE_CHECK(whether uintptr_t equals unsigned long long,
+	       newlib_cv_uintptr_eq_ulonglong, [dnl
+cat > conftest.c <<EOF
+#include <inttypes.h>
+extern int foo(uintptr_t);
+extern int foo(unsigned long long);
+EOF
+if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
+							1>&AS_MESSAGE_LOG_FD])
+then
+  newlib_cv_uintptr_eq_ulonglong=yes;
+else
+  newlib_cv_uintptr_eq_ulonglong=no;
+fi
+rm -f conftest*])
+if test $newlib_cv_uintptr_eq_ulonglong = yes; then
+  AC_DEFINE_UNQUOTED(_UINTPTR_EQ_ULONGLONG)
+fi
+
+#### Determine if uintptr_t is unsigned long
+AC_CACHE_CHECK(whether uintptr_t equals unsigned long,
+	       newlib_cv_uintptr_eq_ulong, [dnl
+cat > conftest.c <<EOF
+#include <inttypes.h>
+extern int foo(uintptr_t);
+extern int foo(unsigned long);
+EOF
+if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
+							1>&AS_MESSAGE_LOG_FD])
+then
+  newlib_cv_uintptr_eq_ulong=yes;
+else
+  newlib_cv_uintptr_eq_ulong=no;
+fi
+rm -f conftest*])
+if test $newlib_cv_uintptr_eq_ulong = yes; then
+  AC_DEFINE_UNQUOTED(_UINTPTR_EQ_ULONG)
+fi
+
+
  AC_SUBST(CFLAGS)
AC_CONFIG_FILES([Makefile],
diff --git a/newlib/libc/include/inttypes.h b/newlib/libc/include/inttypes.h
index 2470b09..5a8770b 100644
--- a/newlib/libc/include/inttypes.h
+++ b/newlib/libc/include/inttypes.h
@@ -243,15 +243,15 @@
  #define SCNxMAX		__SCNMAX(x)
/* ptr types */
-#if PTRDIFF_MAX <= __STDINT_EXP(INT_MAX)
-# define __PRIPTR(x) __STRINGIFY(x)
-# define __SCNPTR(x) __STRINGIFY(x)
-#elif PTRDIFF_MAX <= __STDINT_EXP(LONG_MAX) || !defined(__have_longlong64)
+#if defined(_UINTPTR_EQ_ULONGLONG)
+# define __PRIPTR(x) __STRINGIFY(ll##x)
+# define __SCNPTR(x) __STRINGIFY(ll##x)
+#elif defined(_UINTPTR_EQ_ULONG)
  # define __PRIPTR(x) __STRINGIFY(l##x)
  # define __SCNPTR(x) __STRINGIFY(l##x)
  #else
-# define __PRIPTR(x) __STRINGIFY(ll##x)
-# define __SCNPTR(x) __STRINGIFY(ll##x)
+# define __PRIPTR(x) __STRINGIFY(x)
+# define __SCNPTR(x) __STRINGIFY(x)
  #endif
#define PRIdPTR __PRIPTR(d)
diff --git a/newlib/newlib.hin b/newlib/newlib.hin
index eadafc8..64aa9b3 100644
--- a/newlib/newlib.hin
+++ b/newlib/newlib.hin
@@ -61,6 +61,12 @@
  /* True if long double supported and it is equal to double.  */
  #undef  _LDBL_EQ_DBL
+/* Define if uintptr_t is unsigned long on this architecture */
+#undef  _UINTPTR_EQ_ULONG
+
+/* Define if uintptr_t is unsigned long long on this architecture */
+#undef  _UINTPTR_EQ_ULONGLONG
+
  /* Define if ivo supported in streamio.  */
  #undef _FVWRITE_IN_STREAMIO


--
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill@OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985


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