aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-11-22 14:00:45 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-11-22 14:00:45 +0000
commitd7041c6617b10302be6849b55a88dc928fd7f6b8 (patch)
tree14f3f9033687dcf95291f5801cdbcd10fe20c565
parent43e7e4ec3743b46a1d2e8f268d02c976c9e8e5a6 (diff)
downloadcompiler-rt-d7041c6617b10302be6849b55a88dc928fd7f6b8.tar.gz
Merging r195434:
------------------------------------------------------------------------ r195434 | eugenis | 2013-11-22 13:32:39 +0400 (Fri, 22 Nov 2013) | 4 lines [sanitizer] Restore perf_event_attr handling. This time in a forward/backward compatible way. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/branches/release_34@195462 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/sanitizer_common/sanitizer_common_syscalls.inc10
-rw-r--r--lib/sanitizer_common/sanitizer_platform_limits_linux.cc7
-rw-r--r--lib/sanitizer_common/sanitizer_platform_limits_posix.h5
3 files changed, 18 insertions, 4 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_syscalls.inc b/lib/sanitizer_common/sanitizer_common_syscalls.inc
index 00a9c301d..958f12f84 100644
--- a/lib/sanitizer_common/sanitizer_common_syscalls.inc
+++ b/lib/sanitizer_common/sanitizer_common_syscalls.inc
@@ -2703,11 +2703,13 @@ PRE_SYSCALL(syncfs)(long fd) {}
POST_SYSCALL(syncfs)(long res, long fd) {}
-PRE_SYSCALL(perf_event_open)(void *attr_uptr, long pid, long cpu, long group_fd,
- long flags) {}
+PRE_SYSCALL(perf_event_open)(__sanitizer_perf_event_attr *attr_uptr, long pid,
+ long cpu, long group_fd, long flags) {
+ if (attr_uptr) PRE_READ(attr_uptr, attr_uptr->size);
+}
-POST_SYSCALL(perf_event_open)(long res, void *attr_uptr, long pid, long cpu,
- long group_fd, long flags) {}
+POST_SYSCALL(perf_event_open)(long res, __sanitizer_perf_event_attr *attr_uptr,
+ long pid, long cpu, long group_fd, long flags) {}
PRE_SYSCALL(mmap_pgoff)(long addr, long len, long prot, long flags, long fd,
long pgoff) {}
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_linux.cc b/lib/sanitizer_common/sanitizer_platform_limits_linux.cc
index c8f6c4005..bb9721b68 100644
--- a/lib/sanitizer_common/sanitizer_platform_limits_linux.cc
+++ b/lib/sanitizer_common/sanitizer_platform_limits_linux.cc
@@ -52,6 +52,13 @@ COMPILER_CHECK(struct_kernel_stat64_sz == sizeof(struct stat64));
COMPILER_CHECK(struct_io_event_sz == sizeof(struct io_event));
+#if !SANITIZER_ANDROID
+COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <=
+ sizeof(struct perf_event_attr));
+CHECK_SIZE_AND_OFFSET(perf_event_attr, type);
+CHECK_SIZE_AND_OFFSET(perf_event_attr, size);
+#endif
+
COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD);
COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE);
diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h
index 84f9d3b18..1c4962058 100644
--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h
@@ -59,6 +59,11 @@ namespace __sanitizer {
const unsigned struct_kernel_stat64_sz = 96;
#endif
const unsigned struct_io_event_sz = 32;
+ struct __sanitizer_perf_event_attr {
+ unsigned type;
+ unsigned size;
+ // More fields that vary with the kernel version.
+ };
extern unsigned struct_utimbuf_sz;
extern unsigned struct_new_utsname_sz;