17static std::pair<StringRef, uint64_t>
 
   20  auto [Iter, Inserted] = Map.try_emplace(Saver.
save(Str), Map.size());
 
 
   32std::optional<DataAccessProfRecord>
 
   35  if (std::holds_alternative<StringRef>(SymbolID)) {
 
   40          std::get<StringRef>(SymbolID).
empty() &&
 
   41          "Name canonicalization only fails when stringified string is empty.");
 
   47  auto It = Records.find(
Key);
 
   48  if (It != Records.end()) {
 
   50                                It->second.Locations);
 
 
   57  if (std::holds_alternative<uint64_t>(SymID))
 
   58    return KnownColdHashes.contains(std::get<uint64_t>(SymID));
 
   59  return KnownColdSymbols.contains(std::get<StringRef>(SymID));
 
 
   65  const bool IsStringLiteral = std::holds_alternative<uint64_t>(Symbol);
 
   67  if (IsStringLiteral) {
 
   68    RecordID = std::get<uint64_t>(Symbol);
 
   73      return CanonicalName.takeError();
 
   74    std::tie(
Key, RecordID) =
 
   78  auto [Iter, Inserted] =
 
   79      Records.try_emplace(
Key, RecordID, AccessCount, IsStringLiteral);
 
   82                                   "User of DataAccessProfData should " 
   83                                   "aggregate count for the same symbol. ",
 
 
   95  auto &
Record = Records.back().second;
 
   96  for (
const auto &Location : Locations)
 
   97    Record.Locations.push_back(
 
 
  106  if (std::holds_alternative<uint64_t>(SymbolID)) {
 
  107    KnownColdHashes.insert(std::get<uint64_t>(SymbolID));
 
  112    return CanonicalName.takeError();
 
  113  KnownColdSymbols.insert(
 
 
  123  if (
Error E = deserializeSymbolsAndFilenames(
Ptr, NumSampledSymbols,
 
  124                                               NumColdKnownSymbols))
 
  130    KnownColdHashes.insert(
 
  133  return deserializeRecords(
Ptr);
 
 
  136Error DataAccessProfData::serializeSymbolsAndFilenames(
ProfOStream &OS)
 const {
 
  138  OS.
write(KnownColdSymbols.size());
 
  140  std::vector<std::string> Strs;
 
  141  Strs.reserve(StrToIndexMap.
size() + KnownColdSymbols.size());
 
  142  for (
const auto &Str : StrToIndexMap)
 
  143    Strs.push_back(Str.first.str());
 
  144  for (
const auto &Str : KnownColdSymbols)
 
  145    Strs.push_back(Str.str());
 
  147  std::string CompressedStrings;
 
  152  const uint64_t CompressedStringLen = CompressedStrings.length();
 
  154  OS.
write(CompressedStringLen);
 
  156  for (
char C : CompressedStrings)
 
  161  for (
uint64_t K = CompressedStringLen; K < PaddedLength; K++)
 
  167DataAccessProfData::getEncodedIndex(
const SymbolHandleRef SymbolID)
 const {
 
  168  if (std::holds_alternative<uint64_t>(SymbolID))
 
  169    return std::get<uint64_t>(SymbolID);
 
  171  auto Iter = StrToIndexMap.find(std::get<StringRef>(SymbolID));
 
  172  assert(Iter != StrToIndexMap.end() &&
 
  173         "String literals not found in StrToIndexMap");
 
  178  if (
Error E = serializeSymbolsAndFilenames(OS))
 
  180  OS.
write(KnownColdHashes.size());
 
  181  for (
const auto &Hash : KnownColdHashes)
 
  184  for (
const auto &[
Key, Rec] : Records) {
 
  185    OS.
write(getEncodedIndex(Rec.SymbolID));
 
  187    OS.
write(Rec.AccessCount);
 
  188    OS.
write(Rec.Locations.size());
 
  189    for (
const auto &
Loc : Rec.Locations) {
 
  190      OS.
write(getEncodedIndex(
Loc.FileName));
 
 
  197Error DataAccessProfData::deserializeSymbolsAndFilenames(
 
  198    const unsigned char *&
Ptr, 
const uint64_t NumSampledSymbols,
 
  199    const uint64_t NumColdKnownSymbols) {
 
  207    if (StringCnt < NumSampledSymbols)
 
  210      KnownColdSymbols.insert(Saver.
save(Name));
 
  222Error DataAccessProfData::deserializeRecords(
const unsigned char *&
Ptr) {
 
  233    bool IsStringLiteral =
 
  243      SymbolID = Strings[
ID];
 
  247    auto &Record = Records.back().second;
 
  252    Record.Locations.reserve(NumLocations);
 
  253    for (
uint64_t J = 0; J < NumLocations; ++J) {
 
  258      Record.Locations.push_back({Strings[FileNameIndex], Line});
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
Lightweight error class with error context and mandatory checking.
 
static ErrorSuccess success()
Create a success value.
 
Tagged union holding either a T or a Error.
 
static LLVM_ABI StringRef getCanonicalName(StringRef PGOName)
 
LLVM_ABI void writeByte(uint8_t V)
 
LLVM_ABI void write32(uint32_t V)
 
LLVM_ABI void write(uint64_t V)
 
StringRef - Represent a constant reference to a string, i.e.
 
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
 
StringRef save(const char *S)
 
LLVM_ABI Error addKnownSymbolWithoutSamples(SymbolHandleRef SymbolID)
Add a symbol that's seen in the profiled binary without samples.
 
ArrayRef< StringToIndexMap::value_type > getStrToIndexMapRef() const
The following methods return array reference for various internal data structures.
 
LLVM_ABI Error serialize(ProfOStream &OS) const
Serialize profile data to the output stream.
 
LLVM_ABI std::optional< DataAccessProfRecord > getProfileRecord(const SymbolHandleRef SymID) const
Returns a profile record for SymbolID, or std::nullopt if there isn't a record.
 
LLVM_ABI Error deserialize(const unsigned char *&Ptr)
Deserialize this class from the given buffer.
 
LLVM_ABI bool isKnownColdSymbol(const SymbolHandleRef SymID) const
Returns true if SymID is seen in profiled binaries and cold.
 
LLVM_ABI Error setDataAccessProfile(SymbolHandleRef SymbolID, uint64_t AccessCount)
Methods to set symbolized data access profile.
 
llvm::MapVector< StringRef, uint64_t > StringToIndexMap
 
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
 
@ C
The default llvm calling convention, compatible with C.
 
LLVM_ABI bool isAvailable()
 
static Expected< StringRef > getCanonicalName(StringRef Name)
 
static std::pair< StringRef, uint64_t > saveStringToMap(DataAccessProfData::StringToIndexMap &Map, llvm::UniqueStringSaver &Saver, StringRef Str)
 
std::variant< StringRef, uint64_t > SymbolHandleRef
 
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
 
This is an optimization pass for GlobalISel generic memory operations.
 
LLVM_ABI Error readAndDecodeStrings(StringRef NameStrings, std::function< Error(StringRef)> NameCallback)
NameStrings is a string composed of one or more possibly encoded sub-strings.
 
auto make_first_range(ContainerTy &&c)
Given a container of pairs, return a range over the first elements.
 
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
 
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
 
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
 
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
 
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
 
LLVM_ABI Error collectGlobalObjectNameStrings(ArrayRef< std::string > NameStrs, bool doCompression, std::string &Result)
Given a vector of strings (names of global objects like functions or, virtual tables) NameStrs,...
 
The data access profiles for a symbol.