summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorMike Aizatsky <aizatsky@chromium.org>2015-12-14 23:55:04 +0000
committerMike Aizatsky <aizatsky@chromium.org>2015-12-14 23:55:04 +0000
commitefbe9367db777cb93b17de2e64b4c3df6d607fd4 (patch)
tree485f31cf69c2c254a78d7ab1b83249ba0baf95c8 /tools
parent969bf537ba6e2a29b613edef6298fd2a92fb96d7 (diff)
sancov: coverage can be reported by multiple functions.
Differential Revision: http://reviews.llvm.org/D15430 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255582 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/sancov/sancov.cc29
1 files changed, 19 insertions, 10 deletions
diff --git a/tools/sancov/sancov.cc b/tools/sancov/sancov.cc
index 450c21bd169..94d8c4c7aab 100644
--- a/tools/sancov/sancov.cc
+++ b/tools/sancov/sancov.cc
@@ -207,21 +207,30 @@ std::set<FunctionLoc> computeFunctionLocs(const std::set<uint64_t> &Addrs) {
return result;
}
-// Locate __sanitizer_cov function address.
-static uint64_t findSanitizerCovFunction(const object::ObjectFile &O) {
+// Locate __sanitizer_cov* function addresses that are used for coverage
+// reporting.
+static std::set<uint64_t>
+findSanitizerCovFunctions(const object::ObjectFile &O) {
+ std::set<uint64_t> Result;
+
for (const object::SymbolRef &Symbol : O.symbols()) {
ErrorOr<uint64_t> AddressOrErr = Symbol.getAddress();
FailIfError(AddressOrErr);
- ErrorOr<StringRef> Name = Symbol.getName();
- FailIfError(Name);
+ ErrorOr<StringRef> NameOrErr = Symbol.getName();
+ FailIfError(NameOrErr);
+ StringRef Name = NameOrErr.get();
- if (Name.get() == "__sanitizer_cov") {
- return AddressOrErr.get();
+ if (Name == "__sanitizer_cov" || Name == "__sanitizer_cov_with_check" ||
+ Name == "__sanitizer_cov_trace_func_enter") {
+ Result.insert(AddressOrErr.get());
}
}
- FailIfNotEmpty("__sanitizer_cov not found");
- return 0; // not reachable.
+
+ if (Result.empty())
+ FailIfNotEmpty("__sanitizer_cov* functions not found");
+
+ return Result;
}
// Locate addresses of all coverage points in a file. Coverage point
@@ -262,7 +271,7 @@ static void getObjectCoveragePoints(const object::ObjectFile &O,
TheTarget->createMCInstrAnalysis(MII.get()));
FailIfEmpty(MIA, "no instruction analysis info for target " + TripleName);
- uint64_t SanCovAddr = findSanitizerCovFunction(O);
+ auto SanCovAddrs = findSanitizerCovFunctions(O);
for (const auto Section : O.sections()) {
if (Section.isVirtual() || !Section.isText()) // llvm-objdump does the same.
@@ -292,7 +301,7 @@ static void getObjectCoveragePoints(const object::ObjectFile &O,
uint64_t Target;
if (MIA->isCall(Inst) &&
MIA->evaluateBranch(Inst, SectionAddr + Index, Size, Target)) {
- if (Target == SanCovAddr) {
+ if (SanCovAddrs.find(Target) != SanCovAddrs.end()) {
// Sanitizer coverage uses the address of the next instruction - 1.
Addrs->insert(Index + SectionAddr + Size - 1);
}