From 730ddb6f577299adff0b5a6a5cdf09ae4f235ac9 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Tue, 5 May 2015 23:44:48 +0000 Subject: [PATCH] InstrProf: Strip filename prefixes from the names we display for coverage For consumers of coverage data, any filename prefixes we store in the profile data are just noise. Strip this prefix if it exists. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236558 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/ProfileData/CoverageMapping.cpp | 16 +++++++++++++++- unittests/ProfileData/CoverageMappingTest.cpp | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/ProfileData/CoverageMapping.cpp b/lib/ProfileData/CoverageMapping.cpp index 46d494b82db..5f1d94af715 100644 --- a/lib/ProfileData/CoverageMapping.cpp +++ b/lib/ProfileData/CoverageMapping.cpp @@ -20,6 +20,7 @@ #include "llvm/ProfileData/InstrProfReader.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; @@ -178,6 +179,18 @@ void FunctionRecordIterator::skipOtherFiles() { *this = FunctionRecordIterator(); } +/// Get the function name from the record, removing the filename prefix if +/// necessary. +static StringRef getFuncNameWithoutPrefix(const CoverageMappingRecord &Record) { + StringRef FunctionName = Record.FunctionName; + if (Record.Filenames.empty()) + return FunctionName; + StringRef Filename = sys::path::filename(Record.Filenames[0]); + if (FunctionName.startswith(Filename)) + FunctionName = FunctionName.drop_front(Filename.size() + 1); + return FunctionName; +} + ErrorOr> CoverageMapping::load(CoverageMappingReader &CoverageReader, IndexedInstrProfReader &ProfileReader) { @@ -199,7 +212,8 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader, Ctx.setCounts(Counts); assert(!Record.MappingRegions.empty() && "Function has no regions"); - FunctionRecord Function(Record.FunctionName, Record.Filenames); + + FunctionRecord Function(getFuncNameWithoutPrefix(Record), Record.Filenames); for (const auto &Region : Record.MappingRegions) { ErrorOr ExecutionCount = Ctx.evaluate(Region.Count); if (!ExecutionCount) diff --git a/unittests/ProfileData/CoverageMappingTest.cpp b/unittests/ProfileData/CoverageMappingTest.cpp index 9fceacbec89..c82ed66e53e 100644 --- a/unittests/ProfileData/CoverageMappingTest.cpp +++ b/unittests/ProfileData/CoverageMappingTest.cpp @@ -259,4 +259,18 @@ TEST_F(CoverageMappingTest, dont_combine_expansions) { ASSERT_EQ(CoverageSegment(9, 9, false), Segments[3]); } +TEST_F(CoverageMappingTest, strip_filename_prefix) { + ProfileWriter.addFunctionCounts("file1:func", 0x1234, {10}); + readProfCounts(); + + addCMR(Counter::getCounter(0), "file1", 1, 1, 9, 9); + loadCoverageMapping("file1:func", 0x1234); + + std::vector Names; + for (const auto &Func : LoadedCoverage->getCoveredFunctions()) + Names.push_back(Func.Name); + ASSERT_EQ(1U, Names.size()); + ASSERT_EQ("func", Names[0]); +} + } // end anonymous namespace