diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-11-22 14:01:23 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-11-22 14:01:23 +0000 |
commit | 0d2a93500c4b071977a9ee89dbc24586fe54bca5 (patch) | |
tree | 91e4ea9ff17bc5cb71dd885cd293a9f697188364 | |
parent | f17dd743288942a36f82e09706f18477b27f603d (diff) | |
download | compiler-rt-0d2a93500c4b071977a9ee89dbc24586fe54bca5.tar.gz |
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
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_linux.cc | 20 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_limits_posix.h | 25 |
2 files changed, 45 insertions, 0 deletions
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 <stddef.h> +// 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 <asm/posix_types.h> +#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 <asm/stat.h> +#undef ino_t +#undef mode_t +#undef nlink_t +#undef uid_t +#undef gid_t +#undef off_t + #include <linux/aio_abi.h> #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; @@ -149,6 +164,9 @@ namespace __sanitizer { #ifndef _LP64 uptr __unused3; #endif + #ifdef __powerpc__ + uptr shm_segsz; + #endif int shm_cpid; int shm_lpid; uptr shm_nattch; @@ -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))]; |