From 0d2a93500c4b071977a9ee89dbc24586fe54bca5 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 22 Nov 2013 14:01:23 +0000 Subject: Merging r195442: ------------------------------------------------------------------------ r195442 | eugenis | 2013-11-22 15:01:43 +0400 (Fri, 22 Nov 2013) | 2 lines [sanitizer] Fix kernel headers compatibility on powerpc64. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/branches/release_34@195464 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../sanitizer_platform_limits_linux.cc | 20 +++++++++++++++++ .../sanitizer_platform_limits_posix.h | 25 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/lib/sanitizer_common/sanitizer_platform_limits_linux.cc b/lib/sanitizer_common/sanitizer_platform_limits_linux.cc index bb9721b68..4c9f12acd 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_linux.cc +++ b/lib/sanitizer_common/sanitizer_platform_limits_linux.cc @@ -25,8 +25,25 @@ // For offsetof -> __builtin_offsetof definition. #include +// With old kernels (and even new kernels on powerpc) asm/stat.h uses types that +// are not defined anywhere in userspace headers. Fake them. This seems to work +// fine with newer headers, too. +#include +#define ino_t __kernel_ino_t +#define mode_t __kernel_mode_t +#define nlink_t __kernel_nlink_t +#define uid_t __kernel_uid_t +#define gid_t __kernel_gid_t +#define off_t __kernel_off_t // This header seems to contain the definitions of _kernel_ stat* structs. #include +#undef ino_t +#undef mode_t +#undef nlink_t +#undef uid_t +#undef gid_t +#undef off_t + #include #if SANITIZER_ANDROID @@ -43,7 +60,10 @@ namespace __sanitizer { unsigned struct_statfs64_sz = sizeof(struct statfs64); } // namespace __sanitizer +#if !defined(__powerpc64__) COMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat)); +#endif + COMPILER_CHECK(struct_kernel_stat_sz == sizeof(struct stat)); #if defined(__i386__) diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h index a3001f02a..9ce48ddc9 100644 --- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h +++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h @@ -61,6 +61,14 @@ namespace __sanitizer { const unsigned struct___old_kernel_stat_sz = 32; const unsigned struct_kernel_stat_sz = 64; const unsigned struct_kernel_stat64_sz = 104; +#elif defined(__powerpc__) && !defined(__powerpc64__) + const unsigned struct___old_kernel_stat_sz = 32; + const unsigned struct_kernel_stat_sz = 72; + const unsigned struct_kernel_stat64_sz = 104; +#elif defined(__powerpc64__) + const unsigned struct___old_kernel_stat_sz = 0; + const unsigned struct_kernel_stat_sz = 144; + const unsigned struct_kernel_stat64_sz = 104; #endif const unsigned struct_io_event_sz = 32; struct __sanitizer_perf_event_attr { @@ -126,17 +134,24 @@ namespace __sanitizer { int gid; int cuid; int cgid; +#ifdef __powerpc64__ + unsigned mode; + unsigned __seq; +#else unsigned short mode; unsigned short __pad1; unsigned short __seq; unsigned short __pad2; +#endif uptr __unused1; uptr __unused2; }; struct __sanitizer_shmid_ds { __sanitizer_ipc_perm shm_perm; + #ifndef __powerpc__ uptr shm_segsz; + #endif uptr shm_atime; #ifndef _LP64 uptr __unused1; @@ -148,6 +163,9 @@ namespace __sanitizer { uptr shm_ctime; #ifndef _LP64 uptr __unused3; + #endif + #ifdef __powerpc__ + uptr shm_segsz; #endif int shm_cpid; int shm_lpid; @@ -271,8 +289,15 @@ namespace __sanitizer { typedef unsigned short __sanitizer___kernel_gid_t; typedef long __sanitizer___kernel_off_t; #endif + +#if defined(__powerpc64__) + typedef unsigned int __sanitizer___kernel_old_uid_t; + typedef unsigned int __sanitizer___kernel_old_gid_t; +#else typedef unsigned short __sanitizer___kernel_old_uid_t; typedef unsigned short __sanitizer___kernel_old_gid_t; +#endif + typedef long long __sanitizer___kernel_loff_t; typedef struct { unsigned long fds_bits[1024 / (8 * sizeof(long))]; -- cgit v1.2.1