forked from OSchip/llvm-project
[sancov] introducing SANCOV_OPTIONS
Reintroducing https://reviews.llvm.org/rL291068 Define options function everywhere but linux. llvm-svn: 291267
This commit is contained in:
parent
258b847c4f
commit
fb96e04efb
|
@ -52,6 +52,7 @@ set(SANITIZER_NOLIBC_SOURCES
|
||||||
|
|
||||||
set(SANITIZER_LIBCDEP_SOURCES
|
set(SANITIZER_LIBCDEP_SOURCES
|
||||||
sanitizer_common_libcdep.cc
|
sanitizer_common_libcdep.cc
|
||||||
|
sancov_flags.cc
|
||||||
sanitizer_coverage_libcdep.cc
|
sanitizer_coverage_libcdep.cc
|
||||||
sanitizer_coverage_libcdep_new.cc
|
sanitizer_coverage_libcdep_new.cc
|
||||||
sanitizer_coverage_mapping_libcdep.cc
|
sanitizer_coverage_mapping_libcdep.cc
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
//===-- sancov_flags.cc -----------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// Sanitizer Coverage runtime flags.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "sancov_flags.h"
|
||||||
|
#include "sanitizer_flag_parser.h"
|
||||||
|
#include "sanitizer_platform.h"
|
||||||
|
|
||||||
|
#if !SANITIZER_LINUX
|
||||||
|
// other platforms do not have weak symbols out of the box.
|
||||||
|
extern "C" const char* __sancov_default_options() { return ""; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using namespace __sanitizer;
|
||||||
|
|
||||||
|
namespace __sancov {
|
||||||
|
|
||||||
|
SancovFlags sancov_flags_dont_use_directly; // use via flags();
|
||||||
|
|
||||||
|
void SancovFlags::SetDefaults() {
|
||||||
|
#define SANCOV_FLAG(Type, Name, DefaultValue, Description) Name = DefaultValue;
|
||||||
|
#include "sancov_flags.inc"
|
||||||
|
#undef SANCOV_FLAG
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RegisterSancovFlags(FlagParser *parser, SancovFlags *f) {
|
||||||
|
#define SANCOV_FLAG(Type, Name, DefaultValue, Description) \
|
||||||
|
RegisterFlag(parser, #Name, Description, &f->Name);
|
||||||
|
#include "sancov_flags.inc"
|
||||||
|
#undef SANCOV_FLAG
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *MaybeCallSancovDefaultOptions() {
|
||||||
|
return (&__sancov_default_options) ? __sancov_default_options() : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeSancovFlags() {
|
||||||
|
SancovFlags *f = sancov_flags();
|
||||||
|
f->SetDefaults();
|
||||||
|
|
||||||
|
FlagParser parser;
|
||||||
|
RegisterSancovFlags(&parser, f);
|
||||||
|
|
||||||
|
parser.ParseString(MaybeCallSancovDefaultOptions());
|
||||||
|
parser.ParseString(GetEnv("SANCOV_OPTIONS"));
|
||||||
|
|
||||||
|
ReportUnrecognizedFlags();
|
||||||
|
if (f->help) parser.PrintFlagDescriptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace __sancov
|
|
@ -0,0 +1,40 @@
|
||||||
|
//===-- sancov_flags.h ------------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// Sanitizer Coverage runtime flags.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#ifndef SANCOV_FLAGS_H
|
||||||
|
#define SANCOV_FLAGS_H
|
||||||
|
|
||||||
|
#include "sanitizer_flag_parser.h"
|
||||||
|
#include "sanitizer_internal_defs.h"
|
||||||
|
|
||||||
|
namespace __sancov {
|
||||||
|
|
||||||
|
struct SancovFlags {
|
||||||
|
#define SANCOV_FLAG(Type, Name, DefaultValue, Description) Type Name;
|
||||||
|
#include "sancov_flags.inc"
|
||||||
|
#undef SANCOV_FLAG
|
||||||
|
|
||||||
|
void SetDefaults();
|
||||||
|
};
|
||||||
|
|
||||||
|
extern SancovFlags sancov_flags_dont_use_directly;
|
||||||
|
|
||||||
|
inline SancovFlags* sancov_flags() { return &sancov_flags_dont_use_directly; }
|
||||||
|
|
||||||
|
void InitializeSancovFlags();
|
||||||
|
|
||||||
|
extern "C" SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE const char*
|
||||||
|
__sancov_default_options();
|
||||||
|
|
||||||
|
} // namespace __sancov
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
//===-- sancov_flags.inc ----------------------------------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// Sanitizer Coverage runtime flags.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
#ifndef SANCOV_FLAG
|
||||||
|
#error "Defnine SANCOV_FLAG prior to including this file!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SANCOV_FLAG(bool, symbolize, true,
|
||||||
|
"If set, converage information will be symbolized by sancov tool "
|
||||||
|
"after dumping.")
|
||||||
|
|
||||||
|
SANCOV_FLAG(bool, help, false, "Print flags help.")
|
|
@ -8,6 +8,7 @@
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Sanitizer Coverage Controller for Trace PC Guard.
|
// Sanitizer Coverage Controller for Trace PC Guard.
|
||||||
|
|
||||||
|
#include "sancov_flags.h"
|
||||||
#include "sanitizer_allocator_internal.h"
|
#include "sanitizer_allocator_internal.h"
|
||||||
#include "sanitizer_atomic.h"
|
#include "sanitizer_atomic.h"
|
||||||
#include "sanitizer_common.h"
|
#include "sanitizer_common.h"
|
||||||
|
@ -17,6 +18,7 @@ using namespace __sanitizer;
|
||||||
|
|
||||||
using AddressRange = LoadedModule::AddressRange;
|
using AddressRange = LoadedModule::AddressRange;
|
||||||
|
|
||||||
|
namespace __sancov {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static const u64 Magic64 = 0xC0BFFFFFFFFFFF64ULL;
|
static const u64 Magic64 = 0xC0BFFFFFFFFFFF64ULL;
|
||||||
|
@ -96,6 +98,10 @@ static void SanitizerDumpCoverage(const uptr* unsorted_pcs, uptr len) {
|
||||||
InternalFree(file_path);
|
InternalFree(file_path);
|
||||||
InternalFree(module_name);
|
InternalFree(module_name);
|
||||||
InternalFree(pcs);
|
InternalFree(pcs);
|
||||||
|
|
||||||
|
if (sancov_flags()->symbolize) {
|
||||||
|
Printf("TODO(aizatsky): call sancov to symbolize\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collects trace-pc guard coverage.
|
// Collects trace-pc guard coverage.
|
||||||
|
@ -106,6 +112,8 @@ class TracePcGuardController {
|
||||||
CHECK(!initialized);
|
CHECK(!initialized);
|
||||||
|
|
||||||
initialized = true;
|
initialized = true;
|
||||||
|
InitializeSancovFlags();
|
||||||
|
|
||||||
pc_vector.Initialize(0);
|
pc_vector.Initialize(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,26 +148,27 @@ class TracePcGuardController {
|
||||||
static TracePcGuardController pc_guard_controller;
|
static TracePcGuardController pc_guard_controller;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
} // namespace __sancov
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage( // NOLINT
|
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_coverage( // NOLINT
|
||||||
const uptr* pcs, uptr len) {
|
const uptr* pcs, uptr len) {
|
||||||
return SanitizerDumpCoverage(pcs, len);
|
return __sancov::SanitizerDumpCoverage(pcs, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
|
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
|
||||||
__sanitizer_cov_trace_pc_guard(u32* guard) {
|
__sanitizer_cov_trace_pc_guard(u32* guard) {
|
||||||
if (!*guard) return;
|
if (!*guard) return;
|
||||||
pc_guard_controller.TracePcGuard(guard, GET_CALLER_PC() - 1);
|
__sancov::pc_guard_controller.TracePcGuard(guard, GET_CALLER_PC() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
|
SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE void
|
||||||
__sanitizer_cov_trace_pc_guard_init(u32* start, u32* end) {
|
__sanitizer_cov_trace_pc_guard_init(u32* start, u32* end) {
|
||||||
if (start == end || *start) return;
|
if (start == end || *start) return;
|
||||||
pc_guard_controller.InitTracePcGuard(start, end);
|
__sancov::pc_guard_controller.InitTracePcGuard(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_trace_pc_guard_coverage() {
|
SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_dump_trace_pc_guard_coverage() {
|
||||||
pc_guard_controller.Dump();
|
__sancov::pc_guard_controller.Dump();
|
||||||
}
|
}
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
// Tests trace pc guard coverage collection.
|
||||||
|
//
|
||||||
|
// REQUIRES: x86_64-linux
|
||||||
|
// XFAIL: tsan
|
||||||
|
//
|
||||||
|
// RUN: DIR=%t_workdir
|
||||||
|
// RUN: rm -rf $DIR
|
||||||
|
// RUN: mkdir -p $DIR
|
||||||
|
// RUN: cd $DIR
|
||||||
|
// RUN: %clangxx -O0 -fsanitize-coverage=trace-pc-guard %s -ldl -o %t
|
||||||
|
// RUN: %env_tool_opts=coverage=1 %t 2>&1 | FileCheck %s
|
||||||
|
// RUN: %env_tool_opts=coverage=1 SANCOV_OPTIONS=symbolize=0 %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOSYM
|
||||||
|
// RUN: rm -rf $DIR
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int foo() {
|
||||||
|
fprintf(stderr, "foo\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
fprintf(stderr, "main\n");
|
||||||
|
foo();
|
||||||
|
foo();
|
||||||
|
}
|
||||||
|
|
||||||
|
// CHECK: main
|
||||||
|
// CHECK: SanitizerCoverage: ./sanitizer_coverage_symbolize.{{.*}}.sancov 2 PCs written
|
||||||
|
// CHECK: call sancov
|
||||||
|
|
||||||
|
// CHECK-NOSYM: main
|
||||||
|
// CHECK-NOSYM: SanitizerCoverage: ./sanitizer_coverage_symbolize.{{.*}}.sancov 2 PCs written
|
||||||
|
// CHECK-NOSYM-NOT: call sancov
|
Loading…
Reference in New Issue