summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-29 14:33:16 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-29 14:33:16 +0000
commit26cd9dd04ce6698cc1c5d472c9164b31e5d19614 (patch)
treee990ebbb5a16d926dec6b593bccfef6ad99e7ce7 /lib
parentbee6df6a9fd2fa30b607135febeacec030e00691 (diff)
[sanitizer] Add coverage_dir flag.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@209815 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/sanitizer_common/sanitizer_coverage_libcdep.cc23
-rw-r--r--lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc18
-rw-r--r--lib/sanitizer_common/sanitizer_flags.cc4
-rw-r--r--lib/sanitizer_common/sanitizer_flags.h1
4 files changed, 29 insertions, 17 deletions
diff --git a/lib/sanitizer_common/sanitizer_coverage_libcdep.cc b/lib/sanitizer_common/sanitizer_coverage_libcdep.cc
index 64861d044..e1fa05d50 100644
--- a/lib/sanitizer_common/sanitizer_coverage_libcdep.cc
+++ b/lib/sanitizer_common/sanitizer_coverage_libcdep.cc
@@ -91,9 +91,9 @@ class CoverageData {
static CoverageData coverage_data;
void CoverageData::DirectInit() {
- InternalScopedString path(64);
- internal_snprintf((char *)path.data(), path.size(), "%zd.sancov.raw",
- internal_getpid());
+ InternalScopedString path(1024);
+ internal_snprintf((char *)path.data(), path.size(), "%s/%zd.sancov.raw",
+ common_flags()->coverage_dir, internal_getpid());
pc_fd = OpenFile(path.data(), true);
if (internal_iserror(pc_fd)) {
Report(" Coverage: failed to open %s for writing\n", path.data());
@@ -221,15 +221,17 @@ static int CovOpenFile(bool packed, const char* name) {
InternalScopedBuffer<char> path(1024);
if (!packed) {
CHECK(name);
- internal_snprintf((char *)path.data(), path.size(), "%s.%zd.sancov",
- name, internal_getpid());
+ Printf("%s\n", common_flags()->coverage_dir);
+ internal_snprintf((char *)path.data(), path.size(), "%s/%s.%zd.sancov",
+ common_flags()->coverage_dir, name, internal_getpid());
} else {
if (!name)
- internal_snprintf((char *)path.data(), path.size(), "%zd.sancov.packed",
+ internal_snprintf((char *)path.data(), path.size(),
+ "%s/%zd.sancov.packed", common_flags()->coverage_dir,
internal_getpid());
else
- internal_snprintf((char *)path.data(), path.size(), "%s.sancov.packed",
- name);
+ internal_snprintf((char *)path.data(), path.size(), "%s/%s.sancov.packed",
+ common_flags()->coverage_dir, name);
}
uptr fd = OpenFile(path.data(), true);
if (internal_iserror(fd)) {
@@ -279,8 +281,9 @@ static void CovDump() {
}
} else {
// One file per module per process.
- internal_snprintf((char *)path.data(), path.size(), "%s.%zd.sancov",
- module_name, internal_getpid());
+ internal_snprintf((char *)path.data(), path.size(), "%s/%s.%zd.sancov",
+ common_flags()->coverage_dir, module_name,
+ internal_getpid());
int fd = CovOpenFile(false /* packed */, module_name);
if (fd > 0) {
internal_write(fd, offsets.data(), offsets.size() * sizeof(u32));
diff --git a/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc b/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc
index 75f6162d1..e814c2e5e 100644
--- a/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc
+++ b/lib/sanitizer_common/sanitizer_coverage_mapping_libcdep.cc
@@ -41,9 +41,12 @@ void CovUpdateMapping() {
if (!common_flags()->coverage || !common_flags()->coverage_direct) return;
int err;
- InternalScopedString tmp_path(64);
- internal_snprintf((char *)tmp_path.data(), tmp_path.size(),
- "%zd.sancov.map.tmp", internal_getpid());
+ InternalScopedString tmp_path(64 +
+ internal_strlen(common_flags()->coverage_dir));
+ uptr res = internal_snprintf((char *)tmp_path.data(), tmp_path.size(),
+ "%s/%zd.sancov.map.tmp", common_flags()->coverage_dir,
+ internal_getpid());
+ CHECK_LE(res, tmp_path.size());
uptr map_fd = OpenFile(tmp_path.data(), true);
if (internal_iserror(map_fd)) {
Report(" Coverage: failed to open %s for writing\n", tmp_path.data());
@@ -59,7 +62,7 @@ void CovUpdateMapping() {
InternalScopedString line(4096);
line.append("%d\n", sizeof(uptr) * 8);
- uptr res = internal_write(map_fd, line.data(), line.length());
+ res = internal_write(map_fd, line.data(), line.length());
if (internal_iserror(res, &err)) {
Printf("sancov.map write failed: %d\n", err);
Die();
@@ -84,9 +87,10 @@ void CovUpdateMapping() {
internal_close(map_fd);
- InternalScopedString path(64);
- internal_snprintf((char *)path.data(), path.size(), "%zd.sancov.map",
- internal_getpid());
+ InternalScopedString path(64 + internal_strlen(common_flags()->coverage_dir));
+ res = internal_snprintf((char *)path.data(), path.size(), "%s/%zd.sancov.map",
+ common_flags()->coverage_dir, internal_getpid());
+ CHECK_LE(res, path.size());
res = internal_rename(tmp_path.data(), path.data());
if (internal_iserror(res, &err)) {
Printf("sancov.map rename failed: %d\n", err);
diff --git a/lib/sanitizer_common/sanitizer_flags.cc b/lib/sanitizer_common/sanitizer_flags.cc
index 83bdb1cda..e8f288f62 100644
--- a/lib/sanitizer_common/sanitizer_flags.cc
+++ b/lib/sanitizer_common/sanitizer_flags.cc
@@ -56,6 +56,7 @@ void SetCommonFlagsDefaults(CommonFlags *f) {
f->intercept_tls_get_addr = false;
f->coverage = false;
f->coverage_direct = false;
+ f->coverage_dir = ".";
f->full_address_space = false;
}
@@ -132,6 +133,9 @@ void ParseCommonFlagsFromString(CommonFlags *f, const char *str) {
"If set, coverage information will be dumped directly to a memory "
"mapped file. This way data is not lost even if the process is "
"suddenly killed.");
+ ParseFlag(str, &f->coverage_dir, "coverage_dir",
+ "Target directory for coverage dumps. Defaults to the current "
+ "directory.");
ParseFlag(str, &f->full_address_space, "full_address_space",
"Sanitize complete address space; "
"by default kernel area on 32-bit platforms will not be sanitized");
diff --git a/lib/sanitizer_common/sanitizer_flags.h b/lib/sanitizer_common/sanitizer_flags.h
index 1ad53dc67..41dc21888 100644
--- a/lib/sanitizer_common/sanitizer_flags.h
+++ b/lib/sanitizer_common/sanitizer_flags.h
@@ -55,6 +55,7 @@ struct CommonFlags {
uptr mmap_limit_mb;
bool coverage;
bool coverage_direct;
+ const char *coverage_dir;
bool full_address_space;
};