summaryrefslogtreecommitdiffstats
path: root/compiler-rt/SDKs/linux/usr/include/sys/mman.h
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-05-23 07:18:59 +0000
committerBill Wendling <isanbard@gmail.com>2013-05-23 07:18:59 +0000
commit353fbd35165360a47b310e2bbc4c15acc8d0c7e6 (patch)
tree1e57d172aaf7771f09896217196449635fff0402 /compiler-rt/SDKs/linux/usr/include/sys/mman.h
parenta76dd19507023d10f70b99809d2ce61a1a96d62e (diff)
downloadbcm5719-llvm-353fbd35165360a47b310e2bbc4c15acc8d0c7e6.tar.gz
bcm5719-llvm-353fbd35165360a47b310e2bbc4c15acc8d0c7e6.zip
Performance improvement.
Using fwrite and fread was very *very* slow. The resulting code was multiple times slower than GCC's implementation of gcov. Replace the fwrite/fread system with an mmap() version. If the `.gcda' file doesn't exist, we (re)allocate a buffer that we write into. That gets written to the `.gcda' file in one chunk. If the `.gcda' file already exists, we simply mmap() the file, modify the mapped data, and use msync() to write the contents out to disk. It's much easier than implementing our own buffering scheme, and we don't have to use fwrite's and fread's buffering. For those who are numbers-oriented, here are some timings: GCC Verison ----------- `.gcda' files don't exist: 23s `.gcda' files do exist: 14s LLVM Version (before this change) --------------------------------- `.gcda' files don't exist: 28s `.gcda' files do exist: 28s LLVM Version (with this change) ------------------------------- `.gcda' files don't exist: 18s `.gcda' files do exist: 4s It's a win-win-win-win-lose-win-win scenario! <rdar://problem/13466086> llvm-svn: 182563
Diffstat (limited to 'compiler-rt/SDKs/linux/usr/include/sys/mman.h')
-rw-r--r--compiler-rt/SDKs/linux/usr/include/sys/mman.h24
1 files changed, 21 insertions, 3 deletions
diff --git a/compiler-rt/SDKs/linux/usr/include/sys/mman.h b/compiler-rt/SDKs/linux/usr/include/sys/mman.h
index 7c4d05181f5..bfb7f8bb02d 100644
--- a/compiler-rt/SDKs/linux/usr/include/sys/mman.h
+++ b/compiler-rt/SDKs/linux/usr/include/sys/mman.h
@@ -19,10 +19,28 @@
typedef __SIZE_TYPE__ size_t;
-#define PROT_READ 0x1
-#define PROT_WRITE 0x2
-#define PROT_EXEC 0x4
+#define PROT_NONE 0x00
+#define PROT_READ 0x01
+#define PROT_WRITE 0x02
+#define PROT_EXEC 0x04
+#define MAP_SHARED 0x0001
+#define MAP_PRIVATE 0x0002
+
+#define MAP_FILE 0x0000
+#define MAP_ANON 0x1000
+
+#define MS_ASYNC 0x0001
+#define MS_INVALIDATE 0x0002
+#define MS_SYNC 0x0010
+
+extern void *mmap(void *addr, size_t len, int prot, int flags, int fd,
+ long long offset)
+ __attribute__((__nothrow__));
+extern int munmap(void *addr, size_t len)
+ __attribute__((__nothrow__));
+extern int msync(void *addr, size_t len, int flags)
+ __attribute__((__nothrow__));
extern int mprotect (void *__addr, size_t __len, int __prot)
__attribute__((__nothrow__));
OpenPOWER on IntegriCloud