66 using namespace support;
71 for (
const auto &K :
P) {
72 FDOStream.
seek(K.Pos);
79 FDOStream.
seek(LastPos);
82 std::string &
Data = SOStream.
str();
83 for (
const auto &K :
P) {
84 for (
int I = 0, E = K.D.size();
I != E;
I++) {
86 endian::byte_swap<uint64_t, llvm::endianness::little>(K.D[
I]);
88 (
const char *)&Bytes,
sizeof(
uint64_t));
122 static std::pair<offset_type, offset_type>
124 using namespace support;
132 for (
const auto &ProfileData : *V) {
141 M += ValueProfData::getSize(ProfileData.second);
145 return std::make_pair(
N, M);
153 using namespace support;
156 for (
const auto &ProfileData : *V) {
163 LE.write<
uint64_t>(ProfileData.first);
173 std::unique_ptr<ValueProfData> VDataPtr =
174 ValueProfData::serializeFrom(ProfileData.second);
177 Out.
write((
const char *)VDataPtr.get(), S);
185 bool Sparse,
uint64_t TemporalProfTraceReservoirSize,
186 uint64_t MaxTemporalProfTraceLength,
bool WritePrevVersion,
188 : Sparse(Sparse), MaxTemporalProfTraceLength(MaxTemporalProfTraceLength),
189 TemporalProfTraceReservoirSize(TemporalProfTraceReservoirSize),
191 WritePrevVersion(WritePrevVersion),
192 MemProfVersionRequested(MemProfVersionRequested),
193 MemProfFullSchema(MemProfFullSchema) {}
203 this->Sparse = Sparse;
218 auto Hash =
Other.Hash;
219 Other.accumulateCounts(FuncLevelOverlap.
Test);
220 if (!FunctionData.contains(
Name)) {
228 auto &ProfileDataMap = FunctionData[
Name];
231 std::tie(Where, NewFunc) =
243 Dest.
overlap(
Other, Overlap, FuncLevelOverlap, ValueCutoff);
249 auto &ProfileDataMap = FunctionData[
Name];
253 std::tie(Where, NewFunc) =
258 Warn(make_error<InstrProfError>(E));
265 Dest.
scale(Weight, 1, MapWarn);
268 Dest.
merge(
I, Weight, MapWarn);
276 auto [Iter, Inserted] = MemProfData.
Records.insert({Id,
Record});
288 auto [Iter, Inserted] = MemProfData.
Frames.insert({Id, Frame});
293 if (!Inserted && Iter->second != Frame) {
295 "frame to id mapping mismatch"));
305 auto [Iter, Inserted] = MemProfData.
CallStacks.insert({CSId, CallStack});
310 if (!Inserted && Iter->second != CallStack) {
312 "call stack to id mapping mismatch"));
325 if (TemporalProfTraceStreamSize < TemporalProfTraceReservoirSize) {
327 TemporalProfTraces.push_back(std::move(
Trace));
330 std::uniform_int_distribution<uint64_t> Distribution(
331 0, TemporalProfTraceStreamSize);
332 uint64_t RandomIndex = Distribution(RNG);
333 if (RandomIndex < TemporalProfTraces.size())
334 TemporalProfTraces[RandomIndex] = std::move(
Trace);
336 ++TemporalProfTraceStreamSize;
341 for (
auto &
Trace : SrcTraces)
342 if (
Trace.FunctionNameRefs.
size() > MaxTemporalProfTraceLength)
343 Trace.FunctionNameRefs.resize(MaxTemporalProfTraceLength);
344 llvm::erase_if(SrcTraces, [](
auto &
T) {
return T.FunctionNameRefs.empty(); });
348 (TemporalProfTraceStreamSize > TemporalProfTraceReservoirSize);
349 bool IsSrcSampled = (SrcStreamSize > TemporalProfTraceReservoirSize);
350 if (!IsDestSampled && IsSrcSampled) {
352 std::swap(TemporalProfTraces, SrcTraces);
353 std::swap(TemporalProfTraceStreamSize, SrcStreamSize);
358 for (
auto &
Trace : SrcTraces)
359 addTemporalProfileTrace(std::move(
Trace));
366 std::uniform_int_distribution<uint64_t> Distribution(
367 0, TemporalProfTraceStreamSize);
368 uint64_t RandomIndex = Distribution(RNG);
369 if (RandomIndex < TemporalProfTraces.size())
370 IndicesToReplace.
insert(RandomIndex);
371 ++TemporalProfTraceStreamSize;
381 for (
auto &
I : IPW.FunctionData)
382 for (
auto &Func :
I.getValue())
383 addRecord(
I.getKey(), Func.first, std::move(Func.second), 1, Warn);
385 BinaryIds.reserve(BinaryIds.size() + IPW.BinaryIds.size());
386 for (
auto &
I : IPW.BinaryIds)
390 IPW.TemporalProfTraceStreamSize);
392 MemProfData.
Frames.reserve(IPW.MemProfData.Frames.size());
393 for (
auto &[FrameId, Frame] : IPW.MemProfData.Frames) {
400 MemProfData.
CallStacks.reserve(IPW.MemProfData.CallStacks.size());
401 for (
auto &[CSId, CallStack] : IPW.MemProfData.CallStacks) {
406 MemProfData.
Records.reserve(IPW.MemProfData.Records.size());
407 for (
auto &[GUID,
Record] : IPW.MemProfData.Records) {
412bool InstrProfWriter::shouldEncodeData(
const ProfilingData &PD) {
415 for (
const auto &Func : PD) {
427 using namespace IndexedInstrProf;
438 for (
unsigned I = 0;
I < Res.size();
I++)
446 for (
const auto Id : Schema)
457 *MemProfCallStackIndexes =
nullptr) {
459 MemProfCallStackIndexes);
461 RecordTableGenerator;
462 for (
auto &[GUID,
Record] : MemProfRecordData) {
464 RecordTableGenerator.insert(GUID,
Record, RecordWriter);
467 MemProfRecordData.
clear();
472 return RecordTableGenerator.
Emit(
OS.OS, RecordWriter);
481 for (
auto &[FrameId, Frame] : MemProfFrameData) {
483 FrameTableGenerator.insert(FrameId, Frame);
486 MemProfFrameData.
clear();
488 return FrameTableGenerator.
Emit(
OS.OS);
510 std::vector<std::pair<memprof::FrameId, const memprof::Frame *>> FrameIdOrder;
512 for (
const auto &[Id, Frame] : MemProfFrameData)
513 FrameIdOrder.emplace_back(Id, &Frame);
514 assert(MemProfFrameData.
size() == FrameIdOrder.size());
516 [&](
const std::pair<memprof::FrameId, const memprof::Frame *> &L,
517 const std::pair<memprof::FrameId, const memprof::Frame *> &R) {
518 const auto &SL = FrameHistogram[L.first];
519 const auto &SR = FrameHistogram[R.first];
521 if (SL.Count != SR.Count)
522 return SL.Count > SR.Count;
525 if (SL.PositionSum != SR.PositionSum)
526 return SL.PositionSum < SR.PositionSum;
528 return L.first < R.first;
533 MemProfFrameIndexes.
reserve(FrameIdOrder.size());
534 for (
const auto &[Id,
F] : FrameIdOrder) {
543 MemProfFrameData.
clear();
545 return MemProfFrameIndexes;
551 &MemProfCallStackData) {
553 CallStackTableGenerator;
554 for (
auto &[CSId, CallStack] : MemProfCallStackData)
555 CallStackTableGenerator.insert(CSId, CallStack);
557 MemProfCallStackData.clear();
559 return CallStackTableGenerator.
Emit(
OS.OS);
566 &MemProfCallStackData,
568 &MemProfFrameIndexes,
571 MemProfCallStackIndexes;
574 Builder.
build(std::move(MemProfCallStackData), MemProfFrameIndexes,
581 MemProfCallStackData.clear();
583 return MemProfCallStackIndexes;
613 uint64_t Header[] = {RecordTableOffset, FramePayloadOffset, FrameTableOffset};
614 OS.patch({{HeaderUpdatePos, Header}});
648 uint64_t Header[] = {RecordTableOffset, FramePayloadOffset, FrameTableOffset};
649 OS.patch({{HeaderUpdatePos, Header}});
671 bool MemProfFullSchema) {
681 if (MemProfFullSchema)
696 RecordTableOffset, FramePayloadOffset, FrameTableOffset,
697 CallStackPayloadOffset, CallStackTableOffset,
699 OS.patch({{HeaderUpdatePos, Header}});
719 bool MemProfFullSchema) {
727 if (MemProfFullSchema)
741 OS, MemProfData.
CallStacks, MemProfFrameIndexes, FrameHistogram);
746 &MemProfCallStackIndexes);
749 CallStackPayloadOffset,
753 OS.patch({{HeaderUpdatePos, Header}});
762 bool MemProfFullSchema) {
763 switch (MemProfVersionRequested) {
774 return make_error<InstrProfError>(
776 formatv(
"MemProf version {} not supported; "
777 "requires version between {} and {}, inclusive",
783 const bool WritePrevVersion,
786 for (
int I = 0;
I < 4;
I++)
790 auto BackPatchStartOffset =
OS.
tell();
797 if (!WritePrevVersion)
800 return BackPatchStartOffset;
804 std::vector<std::string> VTableNameStrs;
806 VTableNameStrs.push_back(VTableName.str());
808 std::string CompressedVTableNames;
809 if (!VTableNameStrs.empty())
812 CompressedVTableNames))
815 const uint64_t CompressedStringLen = CompressedVTableNames.length();
821 for (
auto &c : CompressedVTableNames)
822 OS.writeByte(
static_cast<uint8_t
>(c));
828 for (
uint64_t K = CompressedStringLen;
K < PaddedLength;
K++)
835 using namespace IndexedInstrProf;
836 using namespace support;
847 for (
const auto &
I : FunctionData)
848 if (shouldEncodeData(
I.getValue()))
851 for (
const auto &
I : OrderedData)
852 Generator.insert(
I.first,
I.second);
856 Header.Version = WritePrevVersion
864 Header.Version |= VARIANT_MASK_IR_PROF;
866 Header.Version |= VARIANT_MASK_CSIR_PROF;
867 if (
static_cast<bool>(ProfileKind &
869 Header.Version |= VARIANT_MASK_INSTR_ENTRY;
871 Header.Version |= VARIANT_MASK_BYTE_COVERAGE;
873 Header.Version |= VARIANT_MASK_FUNCTION_ENTRY_ONLY;
875 Header.Version |= VARIANT_MASK_MEMPROF;
877 Header.Version |= VARIANT_MASK_TEMPORAL_PROF;
879 const uint64_t BackPatchStartOffset =
880 writeHeader(Header, WritePrevVersion,
OS);
884 uint32_t SummarySize = Summary::getSize(Summary::NumKinds, NumEntries);
887 for (
unsigned I = 0;
I < SummarySize /
sizeof(
uint64_t);
I++)
892 CSSummaryOffset =
OS.
tell();
893 CSSummarySize = SummarySize /
sizeof(
uint64_t);
894 for (
unsigned I = 0;
I < CSSummarySize;
I++)
904 MemProfSectionStart =
OS.
tell();
905 if (
auto E =
writeMemProf(
OS, MemProfData, MemProfVersionRequested,
922 BinaryIds.erase(
llvm::unique(BinaryIds), BinaryIds.end());
924 for (
const auto &BI : BinaryIds) {
926 BinaryIdsSectionSize +=
sizeof(
uint64_t);
931 OS.
write(BinaryIdsSectionSize);
933 for (
const auto &BI : BinaryIds) {
938 for (
unsigned K = 0;
K < BILen;
K++)
942 for (
unsigned K = 0;
K < PaddingSize;
K++)
948 if (!WritePrevVersion)
949 if (
Error E = writeVTableNames(
OS))
952 uint64_t TemporalProfTracesSectionStart = 0;
954 TemporalProfTracesSectionStart =
OS.
tell();
955 OS.
write(TemporalProfTraces.size());
956 OS.
write(TemporalProfTraceStreamSize);
957 for (
auto &
Trace : TemporalProfTraces) {
960 for (
auto &NameRef :
Trace.FunctionNameRefs)
966 std::unique_ptr<IndexedInstrProf::Summary> TheSummary =
970 std::unique_ptr<ProfileSummary> PS = ISB.getSummary();
975 std::unique_ptr<IndexedInstrProf::Summary> TheCSSummary =
nullptr;
978 std::unique_ptr<ProfileSummary> CSPS = CSISB.getSummary();
984 BinaryIdSectionStart,
985 TemporalProfTracesSectionStart};
986 if (!WritePrevVersion)
987 HeaderOffsets.
push_back(VTableNamesSectionStart);
991 {BackPatchStartOffset, HeaderOffsets},
1000 OS.patch(PatchItems);
1002 for (
const auto &
I : FunctionData)
1003 for (
const auto &
F :
I.getValue())
1013 return writeImpl(POS);
1018 return writeImpl(POS);
1032#define VALUE_PROF_KIND(Enumerator, Value, Descr) #Enumerator,
1037 for (
uint32_t VK = 0; VK <= IPVK_Last; VK++) {
1038 if (VK == IPVK_IndirectCallTarget || VK == IPVK_VTableTarget)
1040 uint32_t NS = Func.getNumValueSites(VK);
1041 for (
uint32_t S = 0; S < NS; S++) {
1043 for (
const auto &V : Func.getValueArrayForSite(VK, S))
1044 if (!SeenValues.
insert(V.Value).second)
1057 OS <<
"# Func Hash:\n" << Hash <<
"\n";
1058 OS <<
"# Num Counters:\n" << Func.Counts.size() <<
"\n";
1059 OS <<
"# Counter Values:\n";
1061 OS << Count <<
"\n";
1063 if (Func.BitmapBytes.size() > 0) {
1064 OS <<
"# Num Bitmap Bytes:\n$" << Func.BitmapBytes.size() <<
"\n";
1065 OS <<
"# Bitmap Byte Values:\n";
1066 for (uint8_t Byte : Func.BitmapBytes) {
1074 uint32_t NumValueKinds = Func.getNumValueKinds();
1075 if (!NumValueKinds) {
1080 OS <<
"# Num Value Kinds:\n" << Func.getNumValueKinds() <<
"\n";
1081 for (
uint32_t VK = 0; VK < IPVK_Last + 1; VK++) {
1082 uint32_t NS = Func.getNumValueSites(VK);
1086 OS <<
"# NumValueSites:\n" << NS <<
"\n";
1087 for (
uint32_t S = 0; S < NS; S++) {
1088 auto VD = Func.getValueArrayForSite(VK, S);
1089 OS << VD.size() <<
"\n";
1090 for (
const auto &V : VD) {
1091 if (VK == IPVK_IndirectCallTarget || VK == IPVK_VTableTarget)
1095 OS << V.Value <<
":" << V.Count <<
"\n";
1106 OS <<
"# CSIR level Instrumentation Flag\n:csir\n";
1108 OS <<
"# IR level Instrumentation Flag\n:ir\n";
1110 if (
static_cast<bool>(ProfileKind &
1112 OS <<
"# Always instrument the function entry block\n:entry_first\n";
1114 OS <<
"# Instrument block coverage\n:single_byte_coverage\n";
1118 using RecordType = std::pair<StringRef, FuncPair>;
1121 for (
const auto &
I : FunctionData) {
1122 if (shouldEncodeData(
I.getValue())) {
1125 for (
const auto &Func :
I.getValue())
1126 OrderedFuncData.
push_back(std::make_pair(
I.getKey(), Func));
1130 for (
const auto &VTableName : VTableNames)
1138 return std::tie(
A.first,
A.second.first) <
1139 std::tie(
B.first,
B.second.first);
1142 for (
const auto &record : OrderedFuncData) {
1144 const FuncPair &Func = record.second;
1148 for (
const auto &record : OrderedFuncData) {
1149 const FuncPair &Func = record.second;
1159 OS <<
":temporal_prof_traces\n";
1160 OS <<
"# Num Temporal Profile Traces:\n" << TemporalProfTraces.
size() <<
"\n";
1161 OS <<
"# Temporal Profile Trace Stream Size:\n"
1162 << TemporalProfTraceStreamSize <<
"\n";
1163 for (
auto &
Trace : TemporalProfTraces) {
1164 OS <<
"# Weight:\n" <<
Trace.Weight <<
"\n";
1165 for (
auto &NameRef :
Trace.FunctionNameRefs)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static Error writeMemProfV0(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData)
static uint64_t writeMemProfRecords(ProfOStream &OS, llvm::MapVector< GlobalValue::GUID, memprof::IndexedMemProfRecord > &MemProfRecordData, memprof::MemProfSchema *Schema, memprof::IndexedVersion Version, llvm::DenseMap< memprof::CallStackId, memprof::LinearCallStackId > *MemProfCallStackIndexes=nullptr)
static Error writeMemProf(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, memprof::IndexedVersion MemProfVersionRequested, bool MemProfFullSchema)
static uint64_t writeMemProfCallStacks(ProfOStream &OS, llvm::MapVector< memprof::CallStackId, llvm::SmallVector< memprof::FrameId > > &MemProfCallStackData)
static Error writeMemProfV1(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData)
static Error writeMemProfV3(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, bool MemProfFullSchema)
static uint64_t writeMemProfFrames(ProfOStream &OS, llvm::MapVector< memprof::FrameId, memprof::Frame > &MemProfFrameData)
static Error writeMemProfV2(ProfOStream &OS, memprof::IndexedMemProfData &MemProfData, bool MemProfFullSchema)
static void setSummary(IndexedInstrProf::Summary *TheSummary, ProfileSummary &PS)
static const char * ValueProfKindStr[]
static llvm::DenseMap< memprof::FrameId, memprof::LinearFrameId > writeMemProfFrameArray(ProfOStream &OS, llvm::MapVector< memprof::FrameId, memprof::Frame > &MemProfFrameData, llvm::DenseMap< memprof::FrameId, memprof::FrameStat > &FrameHistogram)
static llvm::DenseMap< memprof::CallStackId, memprof::LinearCallStackId > writeMemProfCallStackArray(ProfOStream &OS, llvm::MapVector< memprof::CallStackId, llvm::SmallVector< memprof::FrameId > > &MemProfCallStackData, llvm::DenseMap< memprof::FrameId, memprof::LinearFrameId > &MemProfFrameIndexes, llvm::DenseMap< memprof::FrameId, memprof::FrameStat > &FrameHistogram)
static void writeMemProfSchema(ProfOStream &OS, const memprof::MemProfSchema &Schema)
Defines facilities for reading and writing on-disk hash tables.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements a set that has insertion order iteration characteristics.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
void reserve(size_type NumEntries)
Grow the densemap so that it can contain at least NumEntries items before resizing again.
Implements a dense probed hash-table based set.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
static std::pair< offset_type, offset_type > EmitKeyDataLength(raw_ostream &Out, key_type_ref K, data_type_ref V)
const InstrProfWriter::ProfilingData *const data_type_ref
InstrProfSummaryBuilder * SummaryBuilder
llvm::endianness ValueProfDataEndianness
static hash_value_type ComputeHash(key_type_ref K)
InstrProfSummaryBuilder * CSSummaryBuilder
InstrProfRecordWriterTrait()=default
void EmitKey(raw_ostream &Out, key_type_ref K, offset_type N)
void EmitData(raw_ostream &Out, key_type_ref, data_type_ref V, offset_type)
const InstrProfWriter::ProfilingData *const data_type
void addRecord(const InstrProfRecord &)
A symbol table used for function [IR]PGO name look-up with keys (such as pointers,...
StringRef getFuncOrVarName(uint64_t ValMD5Hash)
Return name of functions or global variables from the name's md5 hash value.
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
Error addFuncName(StringRef FuncName)
The method name is kept since there are many callers.
StringRef getFuncOrVarNameIfDefined(uint64_t ValMD5Hash)
Just like getFuncOrVarName, except that it will return literal string 'External Symbol' if the functi...
Error write(raw_fd_ostream &OS)
Write the profile to OS.
void addTemporalProfileTraces(SmallVectorImpl< TemporalProfTraceTy > &SrcTraces, uint64_t SrcStreamSize)
Add SrcTraces using reservoir sampling where SrcStreamSize is the total number of temporal profiling ...
void overlapRecord(NamedInstrProfRecord &&Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, const OverlapFuncFilters &FuncFilter)
Error writeText(raw_fd_ostream &OS)
Write the profile in text format to OS.
void addBinaryIds(ArrayRef< llvm::object::BuildID > BIs)
void addMemProfRecord(const GlobalValue::GUID Id, const memprof::IndexedMemProfRecord &Record)
Add a memprof record for a function identified by its Id.
static void writeRecordInText(StringRef Name, uint64_t Hash, const InstrProfRecord &Counters, InstrProfSymtab &Symtab, raw_fd_ostream &OS)
Write Record in text format to OS.
void setValueProfDataEndianness(llvm::endianness Endianness)
bool addMemProfCallStack(const memprof::CallStackId CSId, const llvm::SmallVector< memprof::FrameId > &CallStack, function_ref< void(Error)> Warn)
Add a call stack identified by the hash of the contents of the call stack in CallStack.
void addRecord(NamedInstrProfRecord &&I, uint64_t Weight, function_ref< void(Error)> Warn)
Add function counts for the given function.
InstrProfWriter(bool Sparse=false, uint64_t TemporalProfTraceReservoirSize=0, uint64_t MaxTemporalProfTraceLength=0, bool WritePrevVersion=false, memprof::IndexedVersion MemProfVersionRequested=memprof::Version0, bool MemProfFullSchema=false)
void mergeRecordsFromWriter(InstrProfWriter &&IPW, function_ref< void(Error)> Warn)
Merge existing function counts from the given writer.
void writeTextTemporalProfTraceData(raw_fd_ostream &OS, InstrProfSymtab &Symtab)
Write temporal profile trace data to the header in text format to OS.
std::unique_ptr< MemoryBuffer > writeBuffer()
Write the profile, returning the raw data. For testing.
bool addMemProfFrame(const memprof::FrameId, const memprof::Frame &F, function_ref< void(Error)> Warn)
Add a memprof frame identified by the hash of the contents of the frame in FrameId.
void setOutputSparse(bool Sparse)
Error validateRecord(const InstrProfRecord &Func)
This class implements a map that also provides access to all stored values in a deterministic order.
static std::unique_ptr< MemoryBuffer > getMemBufferCopy(StringRef InputData, const Twine &BufferName="")
Open the specified memory range as a MemoryBuffer, copying the contents and taking ownership of it.
Generates an on disk hash table.
offset_type Emit(raw_ostream &Out)
Emit the table to Out, which must not be at offset 0.
void writeByte(uint8_t V)
void patch(ArrayRef< PatchItem > P)
ProfOStream(raw_string_ostream &STR)
support::endian::Writer LE
ProfOStream(raw_fd_ostream &FD)
static const ArrayRef< uint32_t > DefaultCutoffs
A vector of useful cutoff values for detailed summary.
uint64_t getTotalCount() const
uint64_t getMaxCount() const
const SummaryEntryVector & getDetailedSummary()
uint32_t getNumCounts() const
uint64_t getMaxInternalCount() const
uint64_t getMaxFunctionCount() const
uint32_t getNumFunctions() const
bool insert(const value_type &X)
Insert a new element into the SetVector.
A SetVector that performs no allocations if smaller than a certain size.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
iterator_range< StringMapKeyIterator< ValueTy > > keys() const
StringRef - Represent a constant reference to a string, i.e.
std::pair< iterator, bool > insert(const ValueT &V)
An efficient, type-erasing, non-owning reference to a callable.
void build(llvm::MapVector< CallStackId, llvm::SmallVector< FrameId > > &&MemProfCallStackData, const llvm::DenseMap< FrameId, LinearFrameId > &MemProfFrameIndexes, llvm::DenseMap< FrameId, FrameStat > &FrameHistogram)
llvm::DenseMap< CallStackId, LinearCallStackId > takeCallStackPos()
const std::vector< LinearFrameId > & getRadixArray() const
A raw_ostream that writes to a file descriptor.
uint64_t seek(uint64_t off)
Flushes the stream and repositions the underlying file descriptor position to the offset specified fr...
This class implements an extremely fast bulk output stream that can only output to a stream.
uint64_t tell() const
tell - Return the current offset with the file.
raw_ostream & write_hex(unsigned long long N)
Output N in hexadecimal, without any prefix or padding.
raw_ostream & write(unsigned char C)
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
std::unique_ptr< Summary > allocSummary(uint32_t TotalSize)
uint64_t ComputeHash(StringRef K)
constexpr uint64_t MaximumSupportedVersion
MemProfSchema getHotColdSchema()
llvm::DenseMap< FrameId, FrameStat > computeFrameHistogram(llvm::MapVector< CallStackId, llvm::SmallVector< FrameId > > &MemProfCallStackData)
constexpr uint64_t MinimumSupportedVersion
MemProfSchema getFullSchema()
This is an optimization pass for GlobalISel generic memory operations.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
auto formatv(const char *Fmt, Ts &&...Vals) -> formatv_object< decltype(std::make_tuple(support::detail::build_format_adapter(std::forward< Ts >(Vals))...))>
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void shuffle(Iterator first, Iterator last, RNG &&g)
auto unique(Range &&R, Predicate P)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void sort(IteratorTy Start, IteratorTy End)
constexpr T alignToPowerOf2(U Value, V Align)
Will overflow only if result is not representable in T.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
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,...
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
@ FunctionEntryInstrumentation
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
void set(SummaryFieldKind K, uint64_t V)
void setEntry(uint32_t I, const ProfileSummaryEntry &E)
uint64_t NumSummaryFields
uint64_t NumCutoffEntries
Profiling information for a single function.
std::vector< uint64_t > Counts
void merge(InstrProfRecord &Other, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge the counts in Other into this one.
void overlap(InstrProfRecord &Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff)
Compute the overlap b/w this IntrprofRecord and Other.
void sortValueData()
Sort value profile data (per site) by count.
std::vector< uint8_t > BitmapBytes
void scale(uint64_t N, uint64_t D, function_ref< void(instrprof_error)> Warn)
Scale up profile counts (including value profile data) by a factor of (N / D).
static bool hasCSFlagInHash(uint64_t FuncHash)
const std::string NameFilter
void addOneMismatch(const CountSumOrPercent &MismatchFunc)
CountSumOrPercent Overlap
void addOneUnique(const CountSumOrPercent &UniqueFunc)
An ordered list of functions identified by their NameRef found in INSTR_PROF_DATA.
Function object to check whether the first component of a container supported by std::get (like std::...
llvm::MapVector< CallStackId, llvm::SmallVector< FrameId > > CallStacks
llvm::MapVector< GlobalValue::GUID, IndexedMemProfRecord > Records
llvm::MapVector< FrameId, Frame > Frames
void merge(const IndexedMemProfRecord &Other)
Adapter to write values to a stream in a particular byte order.
void write(ArrayRef< value_type > Val)