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]

[v3] Fix libstdc++/8610


Hi,

the below is what I'm going to commit.

Regression tested both LFS and not-LFS (by hand) on i686-pc-linux-gnu,
x86_64-unknown-linux-gnu, powerpc-unknown-linux-gnu + passed some
basic large file tests on all of the above (*).

Paolo.

(*) x86_64, being actually a 64 bit architecture, passes those tests
also as is.

////////////
2003-10-22  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/8610
	* acinclude.m4 (GLIBCXX_CHECK_INT64_T): New macro,
	checking for the availability of int64_t.
	(GLIBCXX_CHECK_LFS): New macro, checking for LFS support.
	* configure.ac: Call here.
	* acconfig.h: Add undef for the corresponding symbols.
	* config/io/basic_file_stdio.cc	(__basic_file<char>::open):
	Depending on _GLIBCXX_USE_LFS, call fopen64 or fopen.
	(__basic_file<char>::seekoff): Likewise, call lseek64 when
	available, otherwise lseek, checking the __off parameter.
	* include/bits/postypes.h: Typedef __streamoff_base_type
	to int64_t if available, otherwise long long.
	* aclocal.m4: Regenerate.
	* config.h.in: Likewise.
	* configure: Likewise.

	* acinclude.m4 (GLIBCXX_CHECK_POLL, GLIBCXX_CHECK_WRITEV):
	Use AC_TRY_LINK instead of AC_TRY_COMPILE.
diff -urN libstdc++-v3-orig/acconfig.h libstdc++-v3/acconfig.h
--- libstdc++-v3-orig/acconfig.h	2003-10-16 23:00:57.000000000 +0200
+++ libstdc++-v3/acconfig.h	2003-10-21 18:45:43.000000000 +0200
@@ -153,6 +153,12 @@
 // Define if writev is available in <sys/uio.h>.
 #undef HAVE_WRITEV
 
+// Define if int64_t is available in <stdint.h>.
+#undef HAVE_INT64_T
+
+// Define if LFS support is available.
+#undef _GLIBCXX_USE_LFS
+
 // Define if LC_MESSAGES is available in <locale.h>.
 #undef HAVE_LC_MESSAGES
 
diff -urN libstdc++-v3-orig/acinclude.m4 libstdc++-v3/acinclude.m4
--- libstdc++-v3-orig/acinclude.m4	2003-10-17 00:37:40.000000000 +0200
+++ libstdc++-v3/acinclude.m4	2003-10-21 22:54:28.000000000 +0200
@@ -540,7 +540,7 @@
 dnl
 AC_DEFUN(GLIBCXX_CHECK_POLL, [
   AC_CACHE_VAL(glibcxx_cv_POLL, [
-    AC_TRY_COMPILE(
+    AC_TRY_LINK(
       [#include <poll.h>],
       [struct pollfd pfd[1];
        pfd[0].events = POLLIN;
@@ -559,7 +559,7 @@
 dnl
 AC_DEFUN(GLIBCXX_CHECK_WRITEV, [
   AC_CACHE_VAL(glibcxx_cv_WRITEV, [
-    AC_TRY_COMPILE(
+    AC_TRY_LINK(
       [#include <sys/uio.h>],
       [struct iovec iov[2];
        writev(0, iov, 0);],
@@ -573,6 +573,41 @@
 
 
 dnl
+dnl Check whether int64_t is available in <stdint.h>, and define HAVE_INT64_T.
+dnl
+AC_DEFUN(GLIBCXX_CHECK_INT64_T, [
+  AC_CACHE_VAL(glibcxx_cv_INT64_T, [
+    AC_TRY_COMPILE(
+      [#include <stdint.h>],
+      [int64_t var;],
+      [glibcxx_cv_INT64_T=yes],
+      [glibcxx_cv_INT64_T=no])
+  ])
+  if test $glibcxx_cv_INT64_T = yes; then
+    AC_DEFINE(HAVE_INT64_T)
+  fi
+])
+
+
+dnl
+dnl Check whether LFS support is available.
+dnl
+AC_DEFUN(GLIBCXX_CHECK_LFS, [
+  AC_CACHE_VAL(glibcxx_cv_LFS, [
+    AC_TRY_LINK(
+      [#include <unistd.h>],
+      [fopen64("t", "w");
+       lseek64(1, 0, SEEK_CUR);],	
+      [glibcxx_cv_LFS=yes],
+      [glibcxx_cv_LFS=no])
+  ])
+  if test $glibcxx_cv_LFS = yes; then
+    AC_DEFINE(_GLIBCXX_USE_LFS)
+  fi
+])
+
+
+dnl
 dnl Does any necessary configuration of the testsuite directory.  Generates
 dnl the testsuite_hooks.h header.
 dnl
diff -urN libstdc++-v3-orig/config/io/basic_file_stdio.cc libstdc++-v3/config/io/basic_file_stdio.cc
--- libstdc++-v3-orig/config/io/basic_file_stdio.cc	2003-10-17 00:37:48.000000000 +0200
+++ libstdc++-v3/config/io/basic_file_stdio.cc	2003-10-21 23:47:54.000000000 +0200
@@ -68,6 +68,8 @@
 # endif
 #endif
 
+#include <limits> // For <off_t>::max()
+
 namespace std 
 {
   // Definitions for __basic_file<char>.
@@ -173,7 +175,11 @@
 
     if (!this->is_open())
       {
+#ifdef _GLIBCXX_USE_LFS
+	if ((_M_cfile = fopen64(__name, __c_mode)))
+#else
 	if ((_M_cfile = fopen(__name, __c_mode)))
+#endif
 	  {
 	    _M_cfile_created = true;
 	    __ret = this;
@@ -262,7 +268,16 @@
 
   streamoff
   __basic_file<char>::seekoff(streamoff __off, ios_base::seekdir __way)
-  { return lseek(this->fd(), __off, __way); }
+  {
+#ifdef _GLIBCXX_USE_LFS
+    return lseek64(this->fd(), __off, __way);
+#else
+    if (__off > std::numeric_limits<off_t>::max()
+	|| __off < std::numeric_limits<off_t>::min())
+      return -1L;
+    return lseek(this->fd(), __off, __way);
+#endif
+  }
 
   int 
   __basic_file<char>::sync() 
diff -urN libstdc++-v3-orig/config.h.in libstdc++-v3/config.h.in
--- libstdc++-v3-orig/config.h.in	2003-10-16 23:00:57.000000000 +0200
+++ libstdc++-v3/config.h.in	2003-10-21 18:52:13.000000000 +0200
@@ -154,6 +154,12 @@
 // Define if writev is available in <sys/uio.h>.
 #undef HAVE_WRITEV
 
+// Define if int64_t is available in <stdint.h>.
+#undef HAVE_INT64_T
+
+// Define if LFS support is available.
+#undef _GLIBCXX_USE_LFS
+
 // Define if LC_MESSAGES is available in <locale.h>.
 #undef HAVE_LC_MESSAGES

diff -urN libstdc++-v3-orig/configure.ac libstdc++-v3/configure.ac
--- libstdc++-v3-orig/configure.ac	2003-10-20 20:27:16.000000000 +0200
+++ libstdc++-v3/configure.ac	2003-10-21 18:48:49.000000000 +0200
@@ -134,6 +134,12 @@
   AC_CHECK_HEADERS(sys/uio.h)
   GLIBCXX_CHECK_WRITEV
 
+  # For the __streamoff_base_type typedef.
+  GLIBCXX_CHECK_INT64_T
+
+  # For LFS support.
+  GLIBCXX_CHECK_LFS
+
   AC_LC_MESSAGES
 
   AC_TRY_COMPILE(
diff -urN libstdc++-v3-orig/include/bits/postypes.h libstdc++-v3/include/bits/postypes.h
--- libstdc++-v3-orig/include/bits/postypes.h	2003-10-17 00:37:50.000000000 +0200
+++ libstdc++-v3/include/bits/postypes.h	2003-10-21 18:27:06.000000000 +0200
@@ -45,6 +45,10 @@
 
 #include <cwchar> // For mbstate_t
 
+#ifdef _GLIBCXX_HAVE_STDINT_H
+#include <stdint.h> // For int64_t
+#endif
+
 namespace std
 {
   // The types streamoff, streampos and wstreampos and the class
@@ -52,8 +56,14 @@
   // 27.2, 27.4.1, 27.4.3 and D.6. Despite all this verbage, the
   // behaviour of these types is mostly implementation defined or
   // unspecified. The behaviour in this implementation is as noted
-  // below.  
-  typedef long  	__streamoff_base_type;
+  // below.
+
+#ifdef _GLIBCXX_HAVE_INT64_T
+  typedef int64_t       __streamoff_base_type;
+#else
+  typedef long long     __streamoff_base_type;
+#endif
+
   typedef ptrdiff_t	streamsize; // Signed integral type
 
   template<typename _StateT>


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