|
From: <sv...@va...> - 2011-07-13 09:07:05
|
Author: tom
Date: 2011-07-13 10:02:14 +0100 (Wed, 13 Jul 2011)
New Revision: 11893
Log:
Allow core dumps on 32 bit architectures to go over 2Gb in size. BZ#277610.
Modified:
trunk/coregrind/m_coredump/coredump-elf.c
trunk/coregrind/m_libcfile.c
trunk/include/pub_tool_libcfile.h
Modified: trunk/coregrind/m_coredump/coredump-elf.c
===================================================================
--- trunk/coregrind/m_coredump/coredump-elf.c 2011-07-12 19:07:05 UTC (rev 11892)
+++ trunk/coregrind/m_coredump/coredump-elf.c 2011-07-13 09:02:14 UTC (rev 11893)
@@ -520,6 +520,7 @@
vg_assert(buf);
for(;;) {
+ Int oflags = VKI_O_CREAT|VKI_O_WRONLY|VKI_O_EXCL|VKI_O_TRUNC;
SysRes sres;
if (seq == 0)
@@ -530,9 +531,11 @@
basename, coreext, VG_(getpid)(), seq);
seq++;
- sres = VG_(open)(buf,
- VKI_O_CREAT|VKI_O_WRONLY|VKI_O_EXCL|VKI_O_TRUNC,
- VKI_S_IRUSR|VKI_S_IWUSR);
+# if defined(VKI_O_LARGEFILE)
+ oflags |= VKI_O_LARGEFILE;
+# endif
+
+ sres = VG_(open)(buf, oflags, VKI_S_IRUSR|VKI_S_IWUSR);
if (!sr_isError(sres)) {
core_fd = sr_Res(sres);
break;
Modified: trunk/coregrind/m_libcfile.c
===================================================================
--- trunk/coregrind/m_libcfile.c 2011-07-12 19:07:05 UTC (rev 11892)
+++ trunk/coregrind/m_libcfile.c 2011-07-13 09:02:14 UTC (rev 11893)
@@ -210,18 +210,27 @@
# endif
}
-OffT VG_(lseek) ( Int fd, OffT offset, Int whence )
+Off64T VG_(lseek) ( Int fd, Off64T offset, Int whence )
{
# if defined(VGO_linux) || defined(VGP_amd64_darwin)
+# if defined(__NR__llseek)
+ Off64T result;
+ SysRes res = VG_(do_syscall5)(__NR__llseek, fd,
+ offset >> 32, offset & 0xffffffff,
+ &result, whence);
+ return sr_isError(res) ? (-1) : result;
+# else
SysRes res = VG_(do_syscall3)(__NR_lseek, fd, offset, whence);
- vg_assert(sizeof(OffT) == sizeof(Word));
+ vg_assert(sizeof(Off64T) == sizeof(Word));
+ return sr_isError(res) ? (-1) : sr_Res(res);
+# endif
# elif defined(VGP_x86_darwin)
SysRes res = VG_(do_syscall4)(__NR_lseek, fd,
offset & 0xffffffff, offset >> 32, whence);
+ return sr_isError(res) ? (-1) : sr_Res(res);
# else
# error "Unknown plat"
# endif
- return sr_isError(res) ? (-1) : sr_Res(res);
/* if you change the error-reporting conventions of this, also
change VG_(pread) and all other usage points. */
}
Modified: trunk/include/pub_tool_libcfile.h
===================================================================
--- trunk/include/pub_tool_libcfile.h 2011-07-12 19:07:05 UTC (rev 11892)
+++ trunk/include/pub_tool_libcfile.h 2011-07-13 09:02:14 UTC (rev 11893)
@@ -77,7 +77,7 @@
extern Int VG_(read) ( Int fd, void* buf, Int count);
extern Int VG_(write) ( Int fd, const void* buf, Int count);
extern Int VG_(pipe) ( Int fd[2] );
-extern OffT VG_(lseek) ( Int fd, OffT offset, Int whence );
+extern Off64T VG_(lseek) ( Int fd, Off64T offset, Int whence );
extern SysRes VG_(stat) ( const Char* file_name, struct vg_stat* buf );
extern Int VG_(fstat) ( Int fd, struct vg_stat* buf );
|