[Coverage] Strip <unknown> from PGO names if no filenames are available
authorVedant Kumar <vsk@apple.com>
Mon, 28 Mar 2016 15:49:08 +0000 (15:49 +0000)
committerVedant Kumar <vsk@apple.com>
Mon, 28 Mar 2016 15:49:08 +0000 (15:49 +0000)
Patch suggested by David Li!

llvm-svn: 264586

llvm/include/llvm/ProfileData/InstrProf.h
llvm/lib/ProfileData/CoverageMapping.cpp
llvm/lib/ProfileData/InstrProf.cpp
llvm/unittests/ProfileData/CoverageMappingTest.cpp

index 4e4d1cb..3bf0aa3 100644 (file)
@@ -188,7 +188,8 @@ StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar);
 
 /// Given a PGO function name, remove the filename prefix and return
 /// the original (static) function name.
-StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName);
+StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName,
+                                   StringRef FileName = "<unknown>");
 
 /// Given a vector of strings (function PGO names) \c NameStrs, the
 /// method generates a combined string \c Result thatis ready to be
index f5d477b..aa43019 100644 (file)
@@ -205,7 +205,9 @@ CoverageMapping::load(CoverageMappingReader &CoverageReader,
     assert(!Record.MappingRegions.empty() && "Function has no regions");
 
     StringRef OrigFuncName = Record.FunctionName;
-    if (!Record.Filenames.empty())
+    if (Record.Filenames.empty())
+      OrigFuncName = getFuncNameWithoutPrefix(OrigFuncName);
+    else
       OrigFuncName =
           getFuncNameWithoutPrefix(OrigFuncName, Record.Filenames[0]);
     FunctionRecord Function(OrigFuncName, Record.Filenames);
index 045ba1a..2446521 100644 (file)
@@ -90,7 +90,7 @@ std::string getPGOFuncName(const Function &F, uint64_t Version) {
 
 StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName) {
   if (FileName.empty())
-    FileName = "<unknown>";
+    return PGOFuncName;
   // Drop the file name including ':'. See also getPGOFuncName.
   if (PGOFuncName.startswith(FileName))
     PGOFuncName = PGOFuncName.drop_front(FileName.size() + 1);
index 7f80384..e1f0647 100644 (file)
@@ -141,13 +141,15 @@ struct CoverageMappingTest : ::testing::Test {
     ProfileReader = std::move(ReaderOrErr.get());
   }
 
-  void loadCoverageMapping(StringRef FuncName, uint64_t Hash) {
+  void loadCoverageMapping(StringRef FuncName, uint64_t Hash,
+                           bool EmitFilenames = true) {
     std::string Regions = writeCoverageRegions();
     readCoverageRegions(Regions);
 
     SmallVector<StringRef, 8> Filenames;
-    for (const auto &E : Files)
-      Filenames.push_back(E.getKey());
+    if (EmitFilenames)
+      for (const auto &E : Files)
+        Filenames.push_back(E.getKey());
     OneFunctionCoverageReader CovReader(FuncName, Hash, Filenames, OutputCMRs);
     auto CoverageOrErr = CoverageMapping::load(CovReader, *ProfileReader);
     ASSERT_TRUE(NoError(CoverageOrErr.getError()));
@@ -310,7 +312,7 @@ TEST_P(MaybeSparseCoverageMappingTest, strip_unknown_filename_prefix) {
   readProfCounts();
 
   addCMR(Counter::getCounter(0), "", 1, 1, 9, 9);
-  loadCoverageMapping("<unknown>:func", 0x1234);
+  loadCoverageMapping("<unknown>:func", 0x1234, /*EmitFilenames=*/false);
 
   std::vector<std::string> Names;
   for (const auto &Func : LoadedCoverage->getCoveredFunctions())