diff options
author | Mike Aizatsky <aizatsky@chromium.org> | 2015-12-14 23:55:04 +0000 |
---|---|---|
committer | Mike Aizatsky <aizatsky@chromium.org> | 2015-12-14 23:55:04 +0000 |
commit | efbe9367db777cb93b17de2e64b4c3df6d607fd4 (patch) | |
tree | 485f31cf69c2c254a78d7ab1b83249ba0baf95c8 /tools | |
parent | 969bf537ba6e2a29b613edef6298fd2a92fb96d7 (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.cc | 29 |
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); } |