14#ifndef LLVM_PROFILEDATA_SAMPLEPROF_H
15#define LLVM_PROFILEDATA_SAMPLEPROF_H
35#include <system_error>
36#include <unordered_map>
83struct is_error_code_enum<
llvm::sampleprof_error> : std::true_type {};
109 std::string &GUIDBuf) {
110 if (
Name.empty() || !UseMD5)
137 return "InvalidSection";
139 return "ProfileSummarySection";
141 return "NameTableSection";
143 return "ProfileSymbolListSection";
145 return "FuncOffsetTableSection";
147 return "FunctionMetadata";
149 return "CSNameTableSection";
151 return "LBRProfileSection";
153 return "UnknownSection";
223template <
class SecFlagType>
226 if (std::is_same<SecCommonFlags, SecFlagType>())
230 bool IsFlagLegal =
false;
233 IsFlagLegal = std::is_same<SecNameTableFlags, SecFlagType>();
236 IsFlagLegal = std::is_same<SecProfSummaryFlags, SecFlagType>();
239 IsFlagLegal = std::is_same<SecFuncMetadataFlags, SecFlagType>();
243 IsFlagLegal = std::is_same<SecFuncOffsetFlags, SecFlagType>();
250template <
class SecFlagType>
253 auto FVal =
static_cast<uint64_t>(Flag);
254 bool IsCommon = std::is_same<SecCommonFlags, SecFlagType>();
255 Entry.Flags |= IsCommon ? FVal : (FVal << 32);
258template <
class SecFlagType>
261 auto FVal =
static_cast<uint64_t>(Flag);
262 bool IsCommon = std::is_same<SecCommonFlags, SecFlagType>();
263 Entry.Flags &= ~(IsCommon ? FVal : (FVal << 32));
266template <
class SecFlagType>
269 auto FVal =
static_cast<uint64_t>(Flag);
270 bool IsCommon = std::is_same<SecCommonFlags, SecFlagType>();
271 return Entry.Flags & (IsCommon ? FVal : (FVal << 32));
330 if (
LHS.second !=
RHS.second)
331 return LHS.second >
RHS.second;
333 return LHS.first <
RHS.first;
369 uint64_t &TargetSamples = CallTargets[
F];
381 auto I = CallTargets.
find(
F);
382 if (
I != CallTargets.
end()) {
400 for (
const auto &
I : CallTargets)
409 SortedTargets.emplace(
Target, Frequency);
411 return SortedTargets;
416 float DistributionFactor) {
419 AdjustedTargets[
Target] = Frequency * DistributionFactor;
421 return AdjustedTargets;
431 return NumSamples ==
Other.NumSamples && CallTargets ==
Other.CallTargets;
435 return !(*
this ==
Other);
478 return !(*
this == That);
481 std::string
toString(
bool OutputLineLocation)
const {
482 std::ostringstream OContextStr;
484 if (OutputLineLocation) {
489 return OContextStr.str();
535 std::list<SampleContextFrameVector> &CSNameTable,
546 CSNameTable.emplace_back();
558 ContextStr = ContextStr.
substr(1, ContextStr.
size() - 2);
562 while (!ContextRemain.
empty()) {
563 auto ContextSplit = ContextRemain.
split(
" @ ");
564 ChildContext = ContextSplit.first;
565 ContextRemain = ContextSplit.second;
568 Context.emplace_back(CalleeName, CallSiteLoc);
577 auto EntrySplit = ContextStr.
split(
':');
578 FName = EntrySplit.first;
581 if (!EntrySplit.second.empty()) {
585 auto LocSplit = EntrySplit.second.split(
'.');
586 LocSplit.first.getAsInteger(10, LineOffset);
590 if (!LocSplit.second.empty())
609 bool IncludeLeafLineLocation =
false) {
610 std::ostringstream OContextStr;
612 if (OContextStr.str().size()) {
613 OContextStr <<
" @ ";
616 IncludeLeafLineLocation);
618 return OContextStr.str();
643 Name =
Context.back().FuncName;
648 return State == That.State && Name == That.Name &&
649 FullContext == That.FullContext;
655 if (State != That.State)
656 return State < That.State;
659 return Name < That.Name;
663 while (
I < std::min(FullContext.
size(), That.FullContext.
size())) {
664 auto &Context1 = FullContext[
I];
665 auto &Context2 = That.FullContext[
I];
666 auto V = Context1.FuncName.compare(Context2.FuncName);
669 if (Context1.Location != Context2.Location)
670 return Context1.Location < Context2.Location;
674 return FullContext.
size() < That.FullContext.
size();
684 auto ThisContext = FullContext;
685 auto ThatContext = That.FullContext;
686 if (ThatContext.size() < ThisContext.size())
688 ThatContext = ThatContext.
take_front(ThisContext.size());
690 if (ThisContext.back().FuncName != ThatContext.back().FuncName)
742 if (TotalSamples < Num)
760 return BodySamples[
LineLocation(LineOffset, Discriminator)].addSamples(
768 return BodySamples[
LineLocation(LineOffset, Discriminator)].addCalledTarget(
778 auto I = BodySamples.find(
LineLocation(LineOffset, Discriminator));
779 if (
I != BodySamples.end()) {
780 Count =
I->second.removeCalledTarget(FName);
781 Count =
I->second.removeSamples(Count);
782 if (!
I->second.getSamples())
783 BodySamples.erase(
I);
797 for (
auto &
I : BodySamples) {
798 uint64_t TargetSamples =
I.second.getCallTargetSum();
803 if (TargetSamples >
I.second.getSamples())
804 I.second.addSamples(TargetSamples -
I.second.getSamples());
811 for (
const auto &
I : BodySamples)
814 for (
auto &
I : CallsiteSamples) {
815 for (
auto &CS :
I.second) {
816 CS.second.updateTotalSamples();
825 for (
auto &
I : CallsiteSamples) {
826 for (
auto &CS :
I.second) {
827 CS.second.SetContextSynthetic();
837 const auto &ret = BodySamples.find(
LineLocation(LineOffset, Discriminator));
838 if (ret == BodySamples.end())
839 return std::error_code();
840 return ret->second.getSamples();
848 const auto &ret = BodySamples.find(
LineLocation(LineOffset, Discriminator));
849 if (ret == BodySamples.end())
850 return std::error_code();
851 return ret->second.getCallTargets();
858 const auto &Ret = BodySamples.find(CallSite);
859 if (Ret == BodySamples.end())
860 return std::error_code();
861 return Ret->second.getCallTargets();
866 return CallsiteSamples[Loc];
872 auto iter = CallsiteSamples.find(Loc);
873 if (iter == CallsiteSamples.end())
875 return &iter->second;
888 bool empty()
const {
return TotalSamples == 0; }
915 if (!BodySamples.empty() &&
916 (CallsiteSamples.empty() ||
917 BodySamples.begin()->first < CallsiteSamples.begin()->first))
918 Count = BodySamples.begin()->second.getSamples();
919 else if (!CallsiteSamples.empty()) {
922 for (
const auto &N_FS : CallsiteSamples.begin()->second)
923 Count += N_FS.second.getHeadSamplesEstimate();
926 return Count ? Count : TotalSamples > 0;
934 return CallsiteSamples;
944 MaxCount = std::max(MaxCount, L.second.getSamples());
948 for (
const FunctionSamplesMap::value_type &
F :
C.second)
949 MaxCount = std::max(MaxCount,
F.second.getMaxCountInside());
960 Context =
Other.getContext();
961 if (FunctionHash == 0) {
963 FunctionHash =
Other.getFunctionHash();
964 }
else if (FunctionHash !=
Other.getFunctionHash()) {
977 for (
const auto &
I :
Other.getBodySamples()) {
982 for (
const auto &
I :
Other.getCallsiteSamples()) {
985 for (
const auto &Rec :
I.second)
986 MergeResult(Result, FSMap[Rec.first].merge(Rec.second, Weight));
998 if (TotalSamples <= Threshold)
1000 auto isDeclaration = [](
const Function *
F) {
1001 return !
F ||
F->isDeclaration();
1009 for (
const auto &BS : BodySamples)
1010 for (
const auto &TS : BS.second.getCallTargets())
1011 if (TS.getValue() > Threshold) {
1013 if (isDeclaration(
Callee))
1016 for (
const auto &CS : CallsiteSamples)
1017 for (
const auto &NameFS : CS.second)
1018 NameFS.second.findInlinedFunctions(S, SymbolMap, Threshold);
1037 auto AttrName =
"sample-profile-suffix-elision-policy";
1038 auto Attr =
F.getFnAttribute(AttrName).getValueAsString();
1054 if (Attr ==
"" || Attr ==
"all") {
1055 return FnName.
split(
'.').first;
1056 }
else if (Attr ==
"selected") {
1058 for (
const auto &Suf : knownSuffixes) {
1064 auto It = Cand.
rfind(Suffix);
1067 auto Dit = Cand.
rfind(
'.');
1068 if (Dit == It + Suffix.
size() - 1)
1069 Cand = Cand.
substr(0, It);
1072 }
else if (Attr ==
"none") {
1075 assert(
false &&
"internal error: unknown suffix elision policy");
1164 FunctionHash ==
Other.FunctionHash && Context ==
Other.Context &&
1165 TotalSamples ==
Other.TotalSamples &&
1166 TotalHeadSamples ==
Other.TotalHeadSamples &&
1167 BodySamples ==
Other.BodySamples &&
1168 CallsiteSamples ==
Other.CallsiteSamples;
1172 return !(*
this ==
Other);
1222 std::unordered_map<SampleContext, FunctionSamples, SampleContext::Hash>;
1227 std::vector<NameFunctionSamples> &SortedProfiles);
1239 for (
const auto &
I : Samples)
1242 return A->first <
B->first;
1266 bool TrimColdContext,
1267 bool MergeColdContext,
1269 bool TrimBaseProfileOnly);
1324 Syms.insert(
Name.copy(Allocator));
1330 for (
auto Sym :
List.Syms)
1334 unsigned size() {
return Syms.size(); }
1347 bool ToCompress =
false;
1354using namespace sampleprof;
1385 return toString(IntHash, 10,
false)
This file defines the StringMap class.
amdgpu Simplify well known AMD library false FunctionCallee Callee
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file defines the DenseSet and SmallDenseSet classes.
Provides ErrorOr<T> smart pointer.
static cl::opt< unsigned > ColdCountThreshold("mfs-count-threshold", cl::desc("Minimum number of times a block must be executed to be retained."), cl::init(1), cl::Hidden)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
Class for arbitrary precision integers.
ArrayRef< T > take_front(size_t N=1) const
Return a copy of *this with only the first N elements.
size_t size() const
size - Get the array size.
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
Allocate memory in an ever growing pool, as if by bump-pointer.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Implements a dense probed hash-table based set.
Represents either an error or a value T.
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
void update(ArrayRef< uint8_t > Data)
Updates the hash for the byte stream provided.
static void stringifyResult(MD5Result &Result, SmallVectorImpl< char > &Str)
Translates the bytes in Res to a hex string that is deposited into Str.
void final(MD5Result &Result)
Finishes off the hash and puts the result in result.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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 find(StringRef Key)
StringRef - Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
std::string str() const
str - Get the contents as an std::string.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
bool startswith(StringRef Prefix) const
size_t rfind(char C, size_t From=npos) const
Search for the last character C in the string.
static constexpr size_t npos
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
std::pair< iterator, bool > insert(const ValueT &V)
An opaque object representing a hash code.
This class implements an extremely fast bulk output stream that can only output to a stream.
Representation of the samples collected for a function.
void setTotalSamples(uint64_t Num)
static bool ProfileIsPreInlined
void setName(StringRef FunctionName)
Set the name of the function.
bool operator!=(const FunctionSamples &Other) const
void updateTotalSamples()
sampleprof_error addTotalSamples(uint64_t Num, uint64_t Weight=1)
static uint64_t getGUID(StringRef Name)
static constexpr const char * UniqSuffix
void updateCallsiteSamples()
static StringRef getCanonicalFnName(StringRef FnName, StringRef Attr="selected")
ErrorOr< SampleRecord::CallTargetMap > findCallTargetMapAt(uint32_t LineOffset, uint32_t Discriminator) const
Returns the call target map collected at a given location.
bool operator==(const FunctionSamples &Other) const
static constexpr const char * PartSuffix
const FunctionSamplesMap * findFunctionSamplesMapAt(const LineLocation &Loc) const
Returns the FunctionSamplesMap at the given Loc.
void findInlinedFunctions(DenseSet< GlobalValue::GUID > &S, const StringMap< Function * > &SymbolMap, uint64_t Threshold) const
Recursively traverses all children, if the total sample count of the corresponding function is no les...
uint64_t getMaxCountInside(bool SkipCallSite=false) const
Return the maximum of sample counts in a function body.
void removeTotalSamples(uint64_t Num)
uint64_t getHeadSamples() const
For top-level functions, return the total number of branch samples that have the function as the bran...
ErrorOr< uint64_t > findSamplesAt(uint32_t LineOffset, uint32_t Discriminator) const
Return the number of samples collected at the given location.
ErrorOr< SampleRecord::CallTargetMap > findCallTargetMapAt(const LineLocation &CallSite) const
Returns the call target map collected at a given location specified by CallSite.
uint64_t getFunctionHash() const
static constexpr const char * LLVMSuffix
Name suffixes which canonicalization should handle to avoid profile mismatch.
void findAllNames(DenseSet< StringRef > &NameSet) const
StringRef getFuncName(StringRef Name) const
Translate Name into its original name.
sampleprof_error addHeadSamples(uint64_t Num, uint64_t Weight=1)
const FunctionSamples * findFunctionSamplesAt(const LineLocation &Loc, StringRef CalleeName, SampleProfileReaderItaniumRemapper *Remapper) const
Returns a pointer to FunctionSamples at the given callsite location Loc with callee CalleeName.
DenseMap< uint64_t, StringRef > * GUIDToFuncNameMap
GUIDToFuncNameMap saves the mapping from GUID to the symbol name, for all the function symbols define...
FunctionSamplesMap & functionSamplesAt(const LineLocation &Loc)
Return the function samples at the given callsite location.
static bool ProfileIsProbeBased
static StringRef getCanonicalFnName(const Function &F)
Return the canonical name for a function, taking into account suffix elision policy attributes.
StringRef getFuncName() const
Return the original function name.
static uint64_t getCallSiteHash(StringRef CalleeName, const LineLocation &Callsite)
Returns a unique hash code for a combination of a callsite location and the callee function name.
sampleprof_error addBodySamples(uint32_t LineOffset, uint32_t Discriminator, uint64_t Num, uint64_t Weight=1)
static unsigned getOffset(const DILocation *DIL)
Returns the line offset to the start line of the subprogram.
void setFunctionHash(uint64_t Hash)
uint64_t removeCalledTargetAndBodySample(uint32_t LineOffset, uint32_t Discriminator, StringRef FName)
static bool ProfileIsFS
If this profile uses flow sensitive discriminators.
sampleprof_error addCalledTargetSamples(uint32_t LineOffset, uint32_t Discriminator, StringRef FName, uint64_t Num, uint64_t Weight=1)
SampleContext & getContext() const
static bool HasUniqSuffix
Whether the profile contains any ".__uniq." suffix in a name.
sampleprof_error addBodySamplesForProbe(uint32_t Index, uint64_t Num, uint64_t Weight=1)
uint64_t getTotalSamples() const
Return the total number of samples collected inside the function.
void print(raw_ostream &OS=dbgs(), unsigned Indent=0) const
Print the samples collected for a function on stream OS.
sampleprof_error merge(const FunctionSamples &Other, uint64_t Weight=1)
Merge the samples in Other into this one.
FunctionSamples()=default
const CallsiteSampleMap & getCallsiteSamples() const
Return all the callsite samples collected in the body of the function.
void setContext(const SampleContext &FContext)
void SetContextSynthetic()
static LineLocation getCallSiteIdentifier(const DILocation *DIL, bool ProfileIsFS=false)
Returns a unique call site identifier for a given debug location of a call instruction.
uint64_t getHeadSamplesEstimate() const
Return an estimate of the sample count of the function entry basic block.
const FunctionSamples * findFunctionSamples(const DILocation *DIL, SampleProfileReaderItaniumRemapper *Remapper=nullptr) const
Get the FunctionSamples of the inline instance where DIL originates from.
StringRef getName() const
Return the function name.
const BodySampleMap & getBodySamples() const
Return all the samples collected in the body of the function.
static bool UseMD5
Whether the profile uses MD5 to represent string.
ProfileSymbolList records the list of function symbols shown up in the binary used to generate the pr...
void setToCompress(bool TC)
std::error_code write(raw_ostream &OS)
void dump(raw_ostream &OS=dbgs()) const
void merge(const ProfileSymbolList &List)
bool contains(StringRef Name)
void add(StringRef Name, bool copy=false)
copy indicates whether we need to copy the underlying memory for the input Name.
std::error_code read(const uint8_t *Data, uint64_t ListSize)
SampleContextTrimmer impelements helper functions to trim, merge cold context profiles.
SampleContextTrimmer(SampleProfileMap &Profiles)
void trimAndMergeColdContextProfiles(uint64_t ColdCountThreshold, bool TrimColdContext, bool MergeColdContext, uint32_t ColdContextFrameLength, bool TrimBaseProfileOnly)
void canonicalizeContextProfiles()
static void createCtxVectorFromStr(StringRef ContextStr, SampleContextFrameVector &Context)
Create a context vector from a given context string and save it in Context.
bool operator==(const SampleContext &That) const
SampleContext(SampleContextFrames Context, ContextStateMask CState=RawContext)
bool operator<(const SampleContext &That) const
StringRef getName() const
SampleContext(StringRef ContextStr, std::list< SampleContextFrameVector > &CSNameTable, ContextStateMask CState=RawContext)
bool hasState(ContextStateMask S)
void clearState(ContextStateMask S)
void setName(StringRef FunctionName)
Set the name of the function and clear the current context.
SampleContextFrames getContextFrames() const
bool isBaseContext() const
static std::string getContextString(SampleContextFrames Context, bool IncludeLeafLineLocation=false)
bool operator!=(const SampleContext &That) const
void setState(ContextStateMask S)
void setAllAttributes(uint32_t A)
uint64_t getHashCode() const
void setContext(SampleContextFrames Context, ContextStateMask CState=RawContext)
static void decodeContextString(StringRef ContextStr, StringRef &FName, LineLocation &LineLoc)
uint32_t getAllAttributes()
void setAttribute(ContextAttributeMask A)
bool IsPrefixOf(const SampleContext &That) const
bool hasAttribute(ContextAttributeMask A)
std::string toString() const
SampleContext(StringRef Name)
SampleProfileReaderItaniumRemapper remaps the profile data from a sample profile data reader,...
Representation of a single sample record.
bool hasCalls() const
Return true if this sample record contains function calls.
sampleprof_error merge(const SampleRecord &Other, uint64_t Weight=1)
Merge the samples in Other into this record.
const CallTargetMap & getCallTargets() const
std::set< CallTarget, CallTargetComparator > SortedCallTargetSet
uint64_t getSamples() const
uint64_t getCallTargetSum() const
uint64_t removeSamples(uint64_t S)
Decrease the number of samples for this record by S.
sampleprof_error addSamples(uint64_t S, uint64_t Weight=1)
Increment the number of samples for this record by S.
sampleprof_error addCalledTarget(StringRef F, uint64_t S, uint64_t Weight=1)
Add called function F with samples S.
std::pair< StringRef, uint64_t > CallTarget
StringMap< uint64_t > CallTargetMap
static const SortedCallTargetSet SortCallTargets(const CallTargetMap &Targets)
Sort call targets in descending order of call frequency.
const SortedCallTargetSet getSortedCallTargets() const
static const CallTargetMap adjustCallTargets(const CallTargetMap &Targets, float DistributionFactor)
Prorate call targets by a distribution factor.
bool operator!=(const SampleRecord &Other) const
bool operator==(const SampleRecord &Other) const
uint64_t removeCalledTarget(StringRef F)
Remove called function from the call target map.
void print(raw_ostream &OS, unsigned Indent) const
Print the sample record to the stream OS indented by Indent.
Sort a LocationT->SampleT map by LocationT.
std::pair< const LocationT, SampleT > SamplesWithLoc
SampleSorter(const std::map< LocationT, SampleT > &Samples)
const SamplesWithLocList & get() const
SmallVector< const SamplesWithLoc *, 20 > SamplesWithLocList
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
std::optional< const char * > toString(const std::optional< DWARFFormValue > &V)
Take an optional DWARFFormValue and try to extract a string value from it.
static void verifySecFlag(SecType Type, SecFlagType Flag)
ArrayRef< SampleContextFrame > SampleContextFrames
void sortFuncProfiles(const SampleProfileMap &ProfileMap, std::vector< NameFunctionSamples > &SortedProfiles)
std::unordered_map< SampleContext, FunctionSamples, SampleContext::Hash > SampleProfileMap
static uint64_t SPMagic(SampleProfileFormat Format=SPF_Binary)
std::pair< SampleContext, const FunctionSamples * > NameFunctionSamples
static void addSecFlag(SecHdrTableEntry &Entry, SecFlagType Flag)
raw_ostream & operator<<(raw_ostream &OS, const LineLocation &Loc)
static bool hasSecFlag(const SecHdrTableEntry &Entry, SecFlagType Flag)
std::map< LineLocation, FunctionSamplesMap > CallsiteSampleMap
@ ContextDuplicatedIntoBase
static StringRef getRepInFormat(StringRef Name, bool UseMD5, std::string &GUIDBuf)
Get the proper representation of a string according to whether the current Format uses MD5 to represe...
std::map< LineLocation, SampleRecord > BodySampleMap
@ SecFlagIsPreInlined
SecFlagIsPreInlined means this profile contains ShouldBeInlined contexts thus this is CS preinliner c...
@ SecFlagPartial
SecFlagPartial means the profile is for common/shared code.
@ SecFlagFSDiscriminator
SecFlagFSDiscriminator means this profile uses flow-sensitive discriminators.
@ SecFlagFullContext
SecFlagContext means this is context-sensitive flat profile for CSSPGO.
static void removeSecFlag(SecHdrTableEntry &Entry, SecFlagType Flag)
static hash_code hash_value(const SampleContextFrame &arg)
static std::string getSecName(SecType Type)
std::map< std::string, FunctionSamples, std::less<> > FunctionSamplesMap
static uint64_t SPVersion()
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
std::error_code make_error_code(BitcodeError E)
@ unsupported_writing_format
@ ostream_seek_unsupported
std::enable_if_t< std::is_unsigned< T >::value, T > SaturatingMultiplyAdd(T X, T Y, T A, bool *ResultOverflowed=nullptr)
Multiply two unsigned integers, X and Y, and add the unsigned integer, A to the product.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
const std::error_category & sampleprof_category()
std::string getUniqueInternalLinkagePostfix(const StringRef &FName)
sampleprof_error MergeResult(sampleprof_error &Accumulator, sampleprof_error Result)
OutputIt copy(R &&Range, OutputIt Out)
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
static unsigned getHashValue(const SampleContext &Val)
static SampleContext getTombstoneKey()
static SampleContext getEmptyKey()
static bool isEqual(const SampleContext &LHS, const SampleContext &RHS)
An information struct used to provide DenseMap with the various necessary components for a given valu...
std::map< uint64_t, FrameNode > AllChildFrames
FrameNode * getOrCreateChildFrame(const LineLocation &CallSite, StringRef CalleeName)
FunctionSamples * FuncSamples
FrameNode(StringRef FName=StringRef(), FunctionSamples *FSamples=nullptr, LineLocation CallLoc={0, 0})
uint64_t operator()(const LineLocation &Loc) const
Represents the relative location of an instruction.
void print(raw_ostream &OS) const
LineLocation(uint32_t L, uint32_t D)
bool operator!=(const LineLocation &O) const
bool operator<(const LineLocation &O) const
bool operator==(const LineLocation &O) const
uint64_t operator()(const SampleContextFrameVector &S) const
bool operator==(const SampleContextFrame &That) const
bool operator!=(const SampleContextFrame &That) const
std::string toString(bool OutputLineLocation) const
SampleContextFrame(StringRef FuncName, LineLocation Location)
uint64_t operator()(const SampleContext &Context) const
bool operator()(const CallTarget &LHS, const CallTarget &RHS) const