summaryrefslogtreecommitdiffstats
path: root/compiler-rt
diff options
context:
space:
mode:
authorAlexander Potapenko <glider@google.com>2012-09-11 09:26:35 +0000
committerAlexander Potapenko <glider@google.com>2012-09-11 09:26:35 +0000
commit1a471772b019b528f7f4c09b02ede47f65dd0824 (patch)
tree99fc4cdc384d7edaf11f5dcd2cb6ab164e8cefaa /compiler-rt
parent69a56fffae3b16f72991eca3fe2f51f8806b1593 (diff)
downloadbcm5719-llvm-1a471772b019b528f7f4c09b02ede47f65dd0824.tar.gz
bcm5719-llvm-1a471772b019b528f7f4c09b02ede47f65dd0824.zip
Interceptors for lockf and lockf64, minor calloc() fix.
llvm-svn: 163602
Diffstat (limited to 'compiler-rt')
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_interceptors.cc42
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_stat.cc2
-rw-r--r--compiler-rt/lib/tsan/rtl/tsan_stat.h2
3 files changed, 45 insertions, 1 deletions
diff --git a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
index f0a46ac618f..2e024a87e4e 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc
@@ -68,6 +68,12 @@ const int PTHREAD_BARRIER_SERIAL_THREAD = -1;
const int MAP_FIXED = 0x10;
typedef long long_t; // NOLINT
+// From /usr/include/unistd.h
+# define F_ULOCK 0 /* Unlock a previously locked region. */
+# define F_LOCK 1 /* Lock a region for exclusive use. */
+# define F_TLOCK 2 /* Test and lock a region for exclusive use. */
+# define F_TEST 3 /* Test a region for other processes locks. */
+
typedef void (*sighandler_t)(int sig);
#define errno (*__errno_location())
@@ -353,7 +359,7 @@ TSAN_INTERCEPTOR(void*, calloc, uptr size, uptr n) {
{
SCOPED_INTERCEPTOR_RAW(calloc, size, n);
p = user_alloc(thr, pc, n * size);
- internal_memset(p, 0, n * size);
+ if (p) internal_memset(p, 0, n * size);
}
invoke_malloc_hook(p, n * size);
return p;
@@ -1198,6 +1204,38 @@ TSAN_INTERCEPTOR(long_t, pwritev64, int fd, void *vec, int cnt, u64 off) {
return res;
}
+// |func| is either lockf or lockf64.
+#define LOCKF_BODY(func) \
+ SCOPED_TSAN_INTERCEPTOR(func, fd, cmd, len); \
+ int res = -1; \
+ switch (cmd) { \
+ case F_ULOCK: { \
+ Release(thr, pc, fd2addr(fd)); \
+ res = REAL(func)(fd, cmd, len); \
+ break; \
+ } \
+ case F_LOCK: \
+ case F_TLOCK: { \
+ res = REAL(func)(fd, cmd, len); \
+ if (res != -1) Acquire(thr, pc, fd2addr(fd)); \
+ break; \
+ } \
+ default: { \
+ res = REAL(func)(fd, cmd, len); \
+ break; \
+ } \
+ } \
+ return res; \
+/**/
+
+TSAN_INTERCEPTOR(int, lockf, int fd, int cmd, unsigned len) {
+ LOCKF_BODY(lockf);
+}
+
+TSAN_INTERCEPTOR(int, lockf64, int fd, int cmd, u64 len) {
+ LOCKF_BODY(lockf64);
+}
+
TSAN_INTERCEPTOR(long_t, send, int fd, void *buf, long_t len, int flags) {
SCOPED_TSAN_INTERCEPTOR(send, fd, buf, len, flags);
Release(thr, pc, fd2addr(fd));
@@ -1571,6 +1609,8 @@ void InitializeInterceptors() {
TSAN_INTERCEPT(pwrite64);
TSAN_INTERCEPT(writev);
TSAN_INTERCEPT(pwritev64);
+ TSAN_INTERCEPT(lockf);
+ TSAN_INTERCEPT(lockf64);
TSAN_INTERCEPT(send);
TSAN_INTERCEPT(sendmsg);
TSAN_INTERCEPT(recv);
diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.cc b/compiler-rt/lib/tsan/rtl/tsan_stat.cc
index a7c33a5de76..671ae564265 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_stat.cc
+++ b/compiler-rt/lib/tsan/rtl/tsan_stat.cc
@@ -183,6 +183,8 @@ void StatOutput(u64 *stat) {
name[StatInt_pwrite64] = " pwrite64 ";
name[StatInt_writev] = " writev ";
name[StatInt_pwritev64] = " pwritev64 ";
+ name[StatInt_lockf] = " lockf ";
+ name[StatInt_lockf64] = " lockf64 ";
name[StatInt_send] = " send ";
name[StatInt_sendmsg] = " sendmsg ";
name[StatInt_recv] = " recv ";
diff --git a/compiler-rt/lib/tsan/rtl/tsan_stat.h b/compiler-rt/lib/tsan/rtl/tsan_stat.h
index d99491f745a..08cd1ded820 100644
--- a/compiler-rt/lib/tsan/rtl/tsan_stat.h
+++ b/compiler-rt/lib/tsan/rtl/tsan_stat.h
@@ -181,6 +181,8 @@ enum StatType {
StatInt_pwrite64,
StatInt_writev,
StatInt_pwritev64,
+ StatInt_lockf,
+ StatInt_lockf64,
StatInt_send,
StatInt_sendmsg,
StatInt_recv,
OpenPOWER on IntegriCloud