[PATCH] D44161: [SampleFDO] Extend SampleProfReader to handle demangled names

Wei Mi via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 7 08:51:42 PST 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL326905: [SampleFDO] Extend SampleProfReader to handle demangled names. (authored by wmi, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D44161?vs=137216&id=137404#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D44161

Files:
  llvm/trunk/lib/ProfileData/SampleProfReader.cpp
  llvm/trunk/unittests/ProfileData/SampleProfTest.cpp


Index: llvm/trunk/lib/ProfileData/SampleProfReader.cpp
===================================================================
--- llvm/trunk/lib/ProfileData/SampleProfReader.cpp
+++ llvm/trunk/lib/ProfileData/SampleProfReader.cpp
@@ -127,19 +127,52 @@
       if (Rest.substr(0, n3).getAsInteger(10, NumSamples))
         return false;
     }
+    // Find call targets and their sample counts.
+    // Note: In some cases, there are symbols in the profile which are not
+    // mangled. To accommodate such cases, use colon + integer pairs as the
+    // anchor points.
+    // An example:
+    // _M_construct<char *>:1000 string_view<std::allocator<char> >:437
+    // ":1000" and ":437" are used as anchor points so the string above will
+    // be interpreted as
+    // target: _M_construct<char *>
+    // count: 1000
+    // target: string_view<std::allocator<char> >
+    // count: 437
     while (n3 != StringRef::npos) {
       n3 += Rest.substr(n3).find_first_not_of(' ');
       Rest = Rest.substr(n3);
-      n3 = Rest.find(' ');
-      StringRef pair = Rest;
-      if (n3 != StringRef::npos) {
-        pair = Rest.substr(0, n3);
-      }
-      size_t n4 = pair.find(':');
-      uint64_t count;
-      if (pair.substr(n4 + 1).getAsInteger(10, count))
+      n3 = Rest.find_first_of(':');
+      if (n3 == StringRef::npos || n3 == 0)
         return false;
-      TargetCountMap[pair.substr(0, n4)] = count;
+
+      StringRef Target;
+      uint64_t count, n4;
+      while (true) {
+        // Get the segment after the current colon.
+        StringRef AfterColon = Rest.substr(n3 + 1);
+        // Get the target symbol before the current colon.
+        Target = Rest.substr(0, n3);
+        // Check if the word after the current colon is an integer.
+        n4 = AfterColon.find_first_of(' ');
+        n4 = (n4 != StringRef::npos) ? n3 + n4 + 1 : Rest.size();
+        StringRef WordAfterColon = Rest.substr(n3 + 1, n4 - n3 - 1);
+        if (!WordAfterColon.getAsInteger(10, count))
+          break;
+
+        // Try to find the next colon.
+        uint64_t n5 = AfterColon.find_first_of(':');
+        if (n5 == StringRef::npos)
+          return false;
+        n3 += n5 + 1;
+      }
+
+      // An anchor point is found. Save the {target, count} pair
+      TargetCountMap[Target] = count;
+      if (n4 == Rest.size())
+        break;
+      // Change n3 to the next blank space after colon + integer pair.
+      n3 = n4;
     }
   } else {
     IsCallsite = true;
Index: llvm/trunk/unittests/ProfileData/SampleProfTest.cpp
===================================================================
--- llvm/trunk/unittests/ProfileData/SampleProfTest.cpp
+++ llvm/trunk/unittests/ProfileData/SampleProfTest.cpp
@@ -77,6 +77,9 @@
     BarSamples.addTotalSamples(20301);
     BarSamples.addHeadSamples(1437);
     BarSamples.addBodySamples(1, 0, 1437);
+    BarSamples.addCalledTargetSamples(1, 0, "_M_construct<char *>", 1000);
+    BarSamples.addCalledTargetSamples(
+        1, 0, "string_view<std::allocator<char> >", 437);
 
     StringMap<FunctionSamples> Profiles;
     Profiles[FooName] = std::move(FooSamples);
@@ -104,6 +107,11 @@
     FunctionSamples &ReadBarSamples = ReadProfiles[BarName];
     ASSERT_EQ(20301u, ReadBarSamples.getTotalSamples());
     ASSERT_EQ(1437u, ReadBarSamples.getHeadSamples());
+    ErrorOr<SampleRecord::CallTargetMap> CTMap =
+        ReadBarSamples.findCallTargetMapAt(1, 0);
+    ASSERT_FALSE(CTMap.getError());
+    ASSERT_EQ(1000u, CTMap.get()["_M_construct<char *>"]);
+    ASSERT_EQ(437u, CTMap.get()["string_view<std::allocator<char> >"]);
 
     auto VerifySummary = [](ProfileSummary &Summary) mutable {
       ASSERT_EQ(ProfileSummary::PSK_Sample, Summary.getKind());


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44161.137404.patch
Type: text/x-patch
Size: 3741 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180307/a0854751/attachment.bin>


More information about the llvm-commits mailing list