[𝘀𝗽𝗿] changes introduced through rebase

Created using spr 1.3.4

[skip ci]
diff --git a/bolt/lib/Rewrite/PseudoProbeRewriter.cpp b/bolt/lib/Rewrite/PseudoProbeRewriter.cpp
index 37a5b93..886bbdb 100644
--- a/bolt/lib/Rewrite/PseudoProbeRewriter.cpp
+++ b/bolt/lib/Rewrite/PseudoProbeRewriter.cpp
@@ -143,6 +143,7 @@
   if (!ProbeDecoder.buildAddress2ProbeMap(
           reinterpret_cast<const uint8_t *>(Contents.data()), Contents.size(),
           GuidFilter, FuncStartAddrs)) {
+    ProbeDecoder.getAddress2ProbesMap().clear();
     errs() << "BOLT-WARNING: fail in building Address2ProbeMap\n";
     return;
   }
diff --git a/llvm/include/llvm/MC/MCPseudoProbe.h b/llvm/include/llvm/MC/MCPseudoProbe.h
index b42bbf2..54a7f83 100644
--- a/llvm/include/llvm/MC/MCPseudoProbe.h
+++ b/llvm/include/llvm/MC/MCPseudoProbe.h
@@ -369,11 +369,6 @@
   // Decode pseudo_probe_desc section to build GUID to PseudoProbeFuncDesc map.
   bool buildGUID2FuncDescMap(const uint8_t *Start, std::size_t Size);
 
-  // Decode pseudo_probe section to count the number of probes and inlined
-  // function records for each function record.
-  bool countRecords(bool IsTopLevelFunc, bool &Discard, uint32_t &ProbeCount,
-                    uint32_t &InlinedCount, const Uint64Set &GuidFilter);
-
   // Decode pseudo_probe section to build address to probes map for specifed
   // functions only.
   bool buildAddress2ProbeMap(const uint8_t *Start, std::size_t Size,
diff --git a/llvm/lib/MC/MCPseudoProbe.cpp b/llvm/lib/MC/MCPseudoProbe.cpp
index bb9538d..a5a030e 100644
--- a/llvm/lib/MC/MCPseudoProbe.cpp
+++ b/llvm/lib/MC/MCPseudoProbe.cpp
@@ -18,7 +18,6 @@
 #include "llvm/MC/MCObjectStreamer.h"
 #include "llvm/MC/MCSymbol.h"
 #include "llvm/Support/Endian.h"
-#include "llvm/Support/Error.h"
 #include "llvm/Support/LEB128.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Support/raw_ostream.h"
@@ -430,11 +429,17 @@
     Index = Cur->getChildren().size();
   } else {
     // Read inline site for inlinees
-    Index = cantFail(errorOrToExpected(readUnsignedNumber<uint32_t>()));
+    auto ErrorOrIndex = readUnsignedNumber<uint32_t>();
+    if (!ErrorOrIndex)
+      return false;
+    Index = std::move(*ErrorOrIndex);
   }
 
   // Read guid
-  uint64_t Guid = cantFail(errorOrToExpected(readUnencodedNumber<uint64_t>()));
+  auto ErrorOrCurGuid = readUnencodedNumber<uint64_t>();
+  if (!ErrorOrCurGuid)
+    return false;
+  uint64_t Guid = std::move(*ErrorOrCurGuid);
 
   // Decide if top-level node should be disgarded.
   if (IsTopLevelFunc && !GuidFilter.empty() && !GuidFilter.count(Guid))
@@ -452,27 +457,41 @@
   }
 
   // Read number of probes in the current node.
-  uint32_t NodeCount =
-      cantFail(errorOrToExpected(readUnsignedNumber<uint32_t>()));
+  auto ErrorOrNodeCount = readUnsignedNumber<uint32_t>();
+  if (!ErrorOrNodeCount)
+    return false;
+  uint32_t NodeCount = std::move(*ErrorOrNodeCount);
   // Read number of direct inlinees
-  uint32_t ChildrenToProcess =
-      cantFail(errorOrToExpected(readUnsignedNumber<uint32_t>()));
+  auto ErrorOrCurChildrenToProcess = readUnsignedNumber<uint32_t>();
+  if (!ErrorOrCurChildrenToProcess)
+    return false;
   // Read all probes in this node
   for (std::size_t I = 0; I < NodeCount; I++) {
     // Read index
-    uint32_t Index =
-        cantFail(errorOrToExpected(readUnsignedNumber<uint32_t>()));
+    auto ErrorOrIndex = readUnsignedNumber<uint32_t>();
+    if (!ErrorOrIndex)
+      return false;
+    uint32_t Index = std::move(*ErrorOrIndex);
     // Read type | flag.
-    uint8_t Value = cantFail(errorOrToExpected(readUnencodedNumber<uint8_t>()));
+    auto ErrorOrValue = readUnencodedNumber<uint8_t>();
+    if (!ErrorOrValue)
+      return false;
+    uint8_t Value = std::move(*ErrorOrValue);
     uint8_t Kind = Value & 0xf;
     uint8_t Attr = (Value & 0x70) >> 4;
     // Read address
     uint64_t Addr = 0;
     if (Value & 0x80) {
-      int64_t Offset = cantFail(errorOrToExpected(readSignedNumber<int64_t>()));
+      auto ErrorOrOffset = readSignedNumber<int64_t>();
+      if (!ErrorOrOffset)
+        return false;
+      int64_t Offset = std::move(*ErrorOrOffset);
       Addr = LastAddr + Offset;
     } else {
-      Addr = cantFail(errorOrToExpected(readUnencodedNumber<int64_t>()));
+      auto ErrorOrAddr = readUnencodedNumber<int64_t>();
+      if (!ErrorOrAddr)
+        return false;
+      Addr = std::move(*ErrorOrAddr);
       if (isSentinelProbe(Attr)) {
         // For sentinel probe, the addr field actually stores the GUID of the
         // split function. Convert it to the real address.
@@ -489,8 +508,10 @@
 
     uint32_t Discriminator = 0;
     if (hasDiscriminator(Attr)) {
-      Discriminator =
-          cantFail(errorOrToExpected(readUnsignedNumber<uint32_t>()));
+      auto ErrorOrDiscriminator = readUnsignedNumber<uint32_t>();
+      if (!ErrorOrDiscriminator)
+        return false;
+      Discriminator = std::move(*ErrorOrDiscriminator);
     }
 
     if (Cur && !isSentinelProbe(Attr)) {
@@ -503,109 +524,17 @@
     LastAddr = Addr;
   }
 
+  uint32_t ChildrenToProcess = std::move(*ErrorOrCurChildrenToProcess);
   for (uint32_t I = 0; I < ChildrenToProcess; I++) {
     buildAddress2ProbeMap(Cur, LastAddr, GuidFilter, FuncStartAddrs);
   }
-  return true;
-}
 
-bool MCPseudoProbeDecoder::countRecords(bool IsTopLevelFunc, bool &Discard,
-                                        uint32_t &ProbeCount,
-                                        uint32_t &InlinedCount,
-                                        const Uint64Set &GuidFilter) {
-  if (!IsTopLevelFunc)
-    // Read inline site for inlinees
-    if (!readUnsignedNumber<uint32_t>())
-      return false;
-
-  // Read guid
-  auto ErrorOrCurGuid = readUnencodedNumber<uint64_t>();
-  if (!ErrorOrCurGuid)
-    return false;
-  uint64_t Guid = std::move(*ErrorOrCurGuid);
-
-  // Decide if top-level node should be disgarded.
-  if (IsTopLevelFunc) {
-    Discard = !GuidFilter.empty() && !GuidFilter.count(Guid);
-    if (!Discard)
-      // Allocate an entry for top-level function record.
-      ++InlinedCount;
-  }
-
-  // Read number of probes in the current node.
-  auto ErrorOrNodeCount = readUnsignedNumber<uint32_t>();
-  if (!ErrorOrNodeCount)
-    return false;
-  uint32_t NodeCount = std::move(*ErrorOrNodeCount);
-  uint32_t CurrentProbeCount = 0;
-
-  // Read number of direct inlinees
-  auto ErrorOrCurChildrenToProcess = readUnsignedNumber<uint32_t>();
-  if (!ErrorOrCurChildrenToProcess)
-    return false;
-  uint32_t ChildrenToProcess = std::move(*ErrorOrCurChildrenToProcess);
-
-  // Read all probes in this node
-  for (std::size_t I = 0; I < NodeCount; I++) {
-    // Read index
-    if (!readUnsignedNumber<uint32_t>())
-      return false;
-
-    // Read type | flag.
-    auto ErrorOrValue = readUnencodedNumber<uint8_t>();
-    if (!ErrorOrValue)
-      return false;
-    uint8_t Value = std::move(*ErrorOrValue);
-
-    uint8_t Attr = (Value & 0x70) >> 4;
-    if (Value & 0x80) {
-      // Offset
-      if (!readSignedNumber<int64_t>())
-        return false;
-    } else {
-      // Addr
-      if (!readUnencodedNumber<int64_t>())
-        return false;
-    }
-
-    if (hasDiscriminator(Attr))
-      // Discriminator
-      if (!readUnsignedNumber<uint32_t>())
-        return false;
-
-    if (!Discard && !isSentinelProbe(Attr))
-      ++CurrentProbeCount;
-  }
-
-  if (!Discard) {
-    ProbeCount += CurrentProbeCount;
-    InlinedCount += ChildrenToProcess;
-  }
-
-  for (uint32_t I = 0; I < ChildrenToProcess; I++)
-    if (!countRecords(false, Discard, ProbeCount, InlinedCount, GuidFilter))
-      return false;
   return true;
 }
 
 bool MCPseudoProbeDecoder::buildAddress2ProbeMap(
     const uint8_t *Start, std::size_t Size, const Uint64Set &GuidFilter,
     const Uint64Map &FuncStartAddrs) {
-  // For function records in the order of their appearance in the encoded data
-  // (DFS), count the number of contained probes and inlined function records.
-  uint32_t ProbeCount = 0;
-  uint32_t InlinedCount = 0;
-  uint32_t TopLevelFuncs = 0;
-  Data = Start;
-  End = Data + Size;
-  bool Discard = false;
-  while (Data < End) {
-    if (!countRecords(true, Discard, ProbeCount, InlinedCount, GuidFilter))
-      return false;
-    TopLevelFuncs += !Discard;
-  }
-  assert(Data == End && "Have unprocessed data in pseudo_probe section");
-
   Data = Start;
   End = Data + Size;
   uint64_t LastAddr = 0;