Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[esan|wset] Iterate all memory to compute the total working set
Summary: Adds iteration of all application memory in an efficient manner using shadow faults. Shadow memory starts out inaccessible and we mark it writable one page at a time on each fault when the instrumentation touches it. This allows iteration over just the mapped shadow memory, saving significant time. Adds a process-end iteration and pretty-printing of the final result. Adds a new test and updates the existing tests. Reviewers: aizatsky, filcab Subscribers: vitalybuka, zhaoqin, kcc, eugenis, llvm-commits, kubabrecka Differential Revision: http://reviews.llvm.org/D20578 llvm-svn: 271277
- Loading branch information
1 parent
659afd5
commit 8ef3f0f
Showing
6 changed files
with
125 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
// RUN: %clang_esan_wset -O0 %s -o %t 2>&1 | ||
// RUN: %run %t 2>&1 | FileCheck %s | ||
|
||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <sys/mman.h> | ||
#include <assert.h> | ||
|
||
const int size = 0x1 << 25; // 523288 cache lines | ||
const int line_size = 64; | ||
|
||
int main(int argc, char **argv) { | ||
char *bufA = (char *)malloc(sizeof(char) * line_size); | ||
char bufB[64]; | ||
char *bufC = (char *)mmap(0, size, PROT_READ | PROT_WRITE, | ||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); | ||
bufA[0] = 0; | ||
// This additional access to the same line should not increase the line | ||
// count: but it's difficult to make a non-flaky test that measures the | ||
// lines down to the ones digit so right now we're not really testing that. | ||
// If we add a heap-only mode we may be able to be more precise. | ||
bufA[1] = 0; | ||
bufB[33] = 1; | ||
for (int i = 0; i < size; i += line_size) | ||
bufC[i] = 0; | ||
free(bufA); | ||
munmap(bufC, 0x4000); | ||
// CHECK: {{.*}} EfficiencySanitizer: the total working set size: 32 MB (524{{[0-9][0-9][0-9]}} cache lines) | ||
return 0; | ||
} |