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)
408 for (
const auto &[
Target, Frequency] : Targets) {
409 SortedTargets.emplace(
Target, Frequency);
411 return SortedTargets;
416 float DistributionFactor) {
418 for (
const auto &[
Target, Frequency] : Targets) {
419 AdjustedTargets[
Target] = Frequency * DistributionFactor;
421 return AdjustedTargets;
470 return !(*
this == That);
473 std::string
toString(
bool OutputLineLocation)
const {
474 std::ostringstream OContextStr;
476 if (OutputLineLocation) {
481 return OContextStr.str();
527 std::list<SampleContextFrameVector> &CSNameTable,
538 CSNameTable.emplace_back();
550 ContextStr = ContextStr.
substr(1, ContextStr.
size() - 2);
554 while (!ContextRemain.
empty()) {
555 auto ContextSplit = ContextRemain.
split(
" @ ");
556 ChildContext = ContextSplit.first;
557 ContextRemain = ContextSplit.second;
560 Context.emplace_back(CalleeName, CallSiteLoc);
569 auto EntrySplit = ContextStr.
split(
':');
570 FName = EntrySplit.first;
573 if (!EntrySplit.second.empty()) {
577 auto LocSplit = EntrySplit.second.split(
'.');
578 LocSplit.first.getAsInteger(10, LineOffset);
582 if (!LocSplit.second.empty())
601 bool IncludeLeafLineLocation =
false) {
602 std::ostringstream OContextStr;
604 if (OContextStr.str().size()) {
605 OContextStr <<
" @ ";
608 IncludeLeafLineLocation);
610 return OContextStr.str();
635 Name =
Context.back().FuncName;
640 return State == That.State && Name == That.Name &&
641 FullContext == That.FullContext;
647 if (State != That.State)
648 return State < That.State;
651 return Name < That.Name;
655 while (
I < std::min(FullContext.
size(), That.FullContext.
size())) {
656 auto &Context1 = FullContext[
I];
657 auto &Context2 = That.FullContext[
I];
658 auto V = Context1.FuncName.compare(Context2.FuncName);
661 if (Context1.Location != Context2.Location)
662 return Context1.Location < Context2.Location;
666 return FullContext.
size() < That.FullContext.
size();
676 auto ThisContext = FullContext;
677 auto ThatContext = That.FullContext;
678 if (ThatContext.size() < ThisContext.size())
680 ThatContext = ThatContext.
take_front(ThisContext.size());
682 if (ThisContext.back().FuncName != ThatContext.back().FuncName)
734 if (TotalSamples < Num)
752 return BodySamples[
LineLocation(LineOffset, Discriminator)].addSamples(
760 return BodySamples[
LineLocation(LineOffset, Discriminator)].addCalledTarget(
770 auto I = BodySamples.find(
LineLocation(LineOffset, Discriminator));
771 if (
I != BodySamples.end()) {
772 Count =
I->second.removeCalledTarget(FName);
773 Count =
I->second.removeSamples(Count);
774 if (!
I->second.getSamples())
775 BodySamples.erase(
I);
789 for (
auto &
I : BodySamples) {
790 uint64_t TargetSamples =
I.second.getCallTargetSum();
795 if (TargetSamples >
I.second.getSamples())
796 I.second.addSamples(TargetSamples -
I.second.getSamples());
803 for (
const auto &
I : BodySamples)
806 for (
auto &
I : CallsiteSamples) {
807 for (
auto &CS :
I.second) {
808 CS.second.updateTotalSamples();
817 for (
auto &
I : CallsiteSamples) {
818 for (
auto &CS :
I.second) {
819 CS.second.SetContextSynthetic();
829 const auto &ret = BodySamples.find(
LineLocation(LineOffset, Discriminator));
830 if (ret == BodySamples.end())
831 return std::error_code();
832 return ret->second.getSamples();
840 const auto &ret = BodySamples.find(
LineLocation(LineOffset, Discriminator));
841 if (ret == BodySamples.end())
842 return std::error_code();
843 return ret->second.getCallTargets();
850 const auto &Ret = BodySamples.find(CallSite);
851 if (Ret == BodySamples.end())
852 return std::error_code();
853 return Ret->second.getCallTargets();
858 return CallsiteSamples[Loc];
864 auto iter = CallsiteSamples.find(Loc);
865 if (iter == CallsiteSamples.end())
867 return &iter->second;
880 bool empty()
const {
return TotalSamples == 0; }
907 if (!BodySamples.empty() &&
908 (CallsiteSamples.empty() ||
909 BodySamples.begin()->first < CallsiteSamples.begin()->first))
910 Count = BodySamples.begin()->second.getSamples();
911 else if (!CallsiteSamples.empty()) {
914 for (
const auto &N_FS : CallsiteSamples.begin()->second)
915 Count += N_FS.second.getHeadSamplesEstimate();
918 return Count ? Count : TotalSamples > 0;
926 return CallsiteSamples;
936 MaxCount = std::max(MaxCount, L.second.getSamples());
940 for (
const FunctionSamplesMap::value_type &
F :
C.second)
941 MaxCount = std::max(MaxCount,
F.second.getMaxCountInside());
952 Context =
Other.getContext();
953 if (FunctionHash == 0) {
955 FunctionHash =
Other.getFunctionHash();
956 }
else if (FunctionHash !=
Other.getFunctionHash()) {
969 for (
const auto &
I :
Other.getBodySamples()) {
974 for (
const auto &
I :
Other.getCallsiteSamples()) {
977 for (
const auto &Rec :
I.second)
978 MergeResult(Result, FSMap[Rec.first].merge(Rec.second, Weight));
990 if (TotalSamples <= Threshold)
992 auto isDeclaration = [](
const Function *
F) {
993 return !
F ||
F->isDeclaration();
1001 for (
const auto &BS : BodySamples)
1002 for (
const auto &TS : BS.second.getCallTargets())
1003 if (TS.getValue() > Threshold) {
1005 if (isDeclaration(
Callee))
1008 for (
const auto &CS : CallsiteSamples)
1009 for (
const auto &NameFS : CS.second)
1010 NameFS.second.findInlinedFunctions(S, SymbolMap, Threshold);
1029 auto AttrName =
"sample-profile-suffix-elision-policy";
1030 auto Attr =
F.getFnAttribute(AttrName).getValueAsString();
1046 if (Attr ==
"" || Attr ==
"all") {
1047 return FnName.
split(
'.').first;
1048 }
else if (Attr ==
"selected") {
1050 for (
const auto &Suf : knownSuffixes) {
1056 auto It = Cand.
rfind(Suffix);
1059 auto Dit = Cand.
rfind(
'.');
1060 if (Dit == It + Suffix.
size() - 1)
1061 Cand = Cand.
substr(0, It);
1064 }
else if (Attr ==
"none") {
1067 assert(
false &&
"internal error: unknown suffix elision policy");
1199 std::unordered_map<SampleContext, FunctionSamples, SampleContext::Hash>;
1204 std::vector<NameFunctionSamples> &SortedProfiles);
1216 for (
const auto &
I : Samples)
1219 return A->first <
B->first;
1243 bool TrimColdContext,
1244 bool MergeColdContext,
1246 bool TrimBaseProfileOnly);
1301 Syms.insert(
Name.copy(Allocator));
1307 for (
auto Sym :
List.Syms)
1311 unsigned size() {
return Syms.size(); }
1324 bool ToCompress =
false;
1331using namespace sampleprof;
1362 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.
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.
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.
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