LLVM 18.0.0git
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | List of all members
llvm::sampleprof::FunctionSamples Class Reference

Representation of the samples collected for a function. More...

#include "llvm/ProfileData/SampleProf.h"

Public Member Functions

 FunctionSamples ()=default
 
void print (raw_ostream &OS=dbgs(), unsigned Indent=0) const
 Print the samples collected for a function on stream OS.
 
void dump () const
 
sampleprof_error addTotalSamples (uint64_t Num, uint64_t Weight=1)
 
void removeTotalSamples (uint64_t Num)
 
void setTotalSamples (uint64_t Num)
 
void setHeadSamples (uint64_t Num)
 
sampleprof_error addHeadSamples (uint64_t Num, uint64_t Weight=1)
 
sampleprof_error addBodySamples (uint32_t LineOffset, uint32_t Discriminator, uint64_t Num, uint64_t Weight=1)
 
sampleprof_error addCalledTargetSamples (uint32_t LineOffset, uint32_t Discriminator, StringRef FName, uint64_t Num, uint64_t Weight=1)
 
sampleprof_error addSampleRecord (LineLocation Location, const SampleRecord &SampleRecord, uint64_t Weight=1)
 
uint64_t removeCalledTargetAndBodySample (uint32_t LineOffset, uint32_t Discriminator, StringRef FName)
 
void removeAllCallsiteSamples ()
 
void updateCallsiteSamples ()
 
void updateTotalSamples ()
 
void SetContextSynthetic ()
 
const LineLocationmapIRLocToProfileLoc (const LineLocation &IRLoc) const
 
ErrorOr< uint64_tfindSamplesAt (uint32_t LineOffset, uint32_t Discriminator) const
 Return the number of samples collected at the given location.
 
ErrorOr< SampleRecord::CallTargetMapfindCallTargetMapAt (uint32_t LineOffset, uint32_t Discriminator) const
 Returns the call target map collected at a given location.
 
ErrorOr< SampleRecord::CallTargetMapfindCallTargetMapAt (const LineLocation &CallSite) const
 Returns the call target map collected at a given location specified by CallSite.
 
FunctionSamplesMapfunctionSamplesAt (const LineLocation &Loc)
 Return the function samples at the given callsite location.
 
const FunctionSamplesMapfindFunctionSamplesMapAt (const LineLocation &Loc) const
 Returns the FunctionSamplesMap at the given Loc.
 
const FunctionSamplesfindFunctionSamplesAt (const LineLocation &Loc, StringRef CalleeName, SampleProfileReaderItaniumRemapper *Remapper) const
 Returns a pointer to FunctionSamples at the given callsite location Loc with callee CalleeName.
 
bool empty () const
 
uint64_t getTotalSamples () const
 Return the total number of samples collected inside the function.
 
uint64_t getHeadSamples () const
 For top-level functions, return the total number of branch samples that have the function as the branch target (or 0 otherwise).
 
uint64_t getHeadSamplesEstimate () const
 Return an estimate of the sample count of the function entry basic block.
 
const BodySampleMapgetBodySamples () const
 Return all the samples collected in the body of the function.
 
const CallsiteSampleMapgetCallsiteSamples () const
 Return all the callsite samples collected in the body of the function.
 
uint64_t getMaxCountInside (bool SkipCallSite=false) const
 Return the maximum of sample counts in a function body.
 
sampleprof_error merge (const FunctionSamples &Other, uint64_t Weight=1)
 Merge the samples in Other into this one.
 
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 less than Threshold, add its corresponding GUID to S.
 
void setName (StringRef FunctionName)
 Set the name of the function.
 
StringRef getName () const
 Return the function name.
 
StringRef getFuncName () const
 Return the original function name.
 
void setFunctionHash (uint64_t Hash)
 
uint64_t getFunctionHash () const
 
void setIRToProfileLocationMap (const LocToLocMap *LTLM)
 
StringRef getFuncName (StringRef Name) const
 Translate Name into its original name.
 
const FunctionSamplesfindFunctionSamples (const DILocation *DIL, SampleProfileReaderItaniumRemapper *Remapper=nullptr) const
 Get the FunctionSamples of the inline instance where DIL originates from.
 
SampleContextgetContext () const
 
void setContext (const SampleContext &FContext)
 
void findAllNames (DenseSet< StringRef > &NameSet) const
 
bool operator== (const FunctionSamples &Other) const
 
bool operator!= (const FunctionSamples &Other) const
 
template<typename T >
const TgetKey () const
 
template<>
const SampleContextgetKey () const
 

Static Public Member Functions

static StringRef getCanonicalFnName (const Function &F)
 Return the canonical name for a function, taking into account suffix elision policy attributes.
 
static StringRef getCanonicalFnName (StringRef FnName, StringRef Attr="selected")
 
static unsigned getOffset (const DILocation *DIL)
 Returns the line offset to the start line of the subprogram.
 
static LineLocation getCallSiteIdentifier (const DILocation *DIL, bool ProfileIsFS=false)
 Returns a unique call site identifier for a given debug location of a call instruction.
 
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.
 
static uint64_t getGUID (StringRef Name)
 

Public Attributes

DenseMap< uint64_t, StringRef > * GUIDToFuncNameMap = nullptr
 GUIDToFuncNameMap saves the mapping from GUID to the symbol name, for all the function symbols defined or declared in current module.
 

Static Public Attributes

static constexpr const charLLVMSuffix = ".llvm."
 Name suffixes which canonicalization should handle to avoid profile mismatch.
 
static constexpr const charPartSuffix = ".part."
 
static constexpr const charUniqSuffix = ".__uniq."
 
static bool ProfileIsProbeBased = false
 
static bool ProfileIsCS = false
 
static bool ProfileIsPreInlined = false
 
static bool UseMD5 = false
 Whether the profile uses MD5 to represent string.
 
static bool HasUniqSuffix = true
 Whether the profile contains any ".__uniq." suffix in a name.
 
static bool ProfileIsFS = false
 If this profile uses flow sensitive discriminators.
 

Detailed Description

Representation of the samples collected for a function.

This data structure contains all the collected samples for the body of a function. Each sample corresponds to a LineLocation instance within the body of the function.

Definition at line 751 of file SampleProf.h.

Constructor & Destructor Documentation

◆ FunctionSamples()

llvm::sampleprof::FunctionSamples::FunctionSamples ( )
default

Member Function Documentation

◆ addBodySamples()

sampleprof_error llvm::sampleprof::FunctionSamples::addBodySamples ( uint32_t  LineOffset,
uint32_t  Discriminator,
uint64_t  Num,
uint64_t  Weight = 1 
)
inline

◆ addCalledTargetSamples()

sampleprof_error llvm::sampleprof::FunctionSamples::addCalledTargetSamples ( uint32_t  LineOffset,
uint32_t  Discriminator,
StringRef  FName,
uint64_t  Num,
uint64_t  Weight = 1 
)
inline

◆ addHeadSamples()

sampleprof_error llvm::sampleprof::FunctionSamples::addHeadSamples ( uint64_t  Num,
uint64_t  Weight = 1 
)
inline

◆ addSampleRecord()

sampleprof_error llvm::sampleprof::FunctionSamples::addSampleRecord ( LineLocation  Location,
const SampleRecord SampleRecord,
uint64_t  Weight = 1 
)
inline

Definition at line 799 of file SampleProf.h.

◆ addTotalSamples()

sampleprof_error llvm::sampleprof::FunctionSamples::addTotalSamples ( uint64_t  Num,
uint64_t  Weight = 1 
)
inline

◆ dump()

LLVM_DUMP_METHOD void FunctionSamples::dump ( ) const

Definition at line 322 of file SampleProf.cpp.

References llvm::dbgs(), and print().

◆ empty()

bool llvm::sampleprof::FunctionSamples::empty ( ) const
inline

Definition at line 934 of file SampleProf.h.

Referenced by llvm::MIRProfileLoader::runOnFunction().

◆ findAllNames()

void FunctionSamples::findAllNames ( DenseSet< StringRef > &  NameSet) const

◆ findCallTargetMapAt() [1/2]

ErrorOr< SampleRecord::CallTargetMap > llvm::sampleprof::FunctionSamples::findCallTargetMapAt ( const LineLocation CallSite) const
inline

Returns the call target map collected at a given location specified by CallSite.

If the location is not found in profile, return error.

Definition at line 903 of file SampleProf.h.

References mapIRLocToProfileLoc().

◆ findCallTargetMapAt() [2/2]

ErrorOr< SampleRecord::CallTargetMap > llvm::sampleprof::FunctionSamples::findCallTargetMapAt ( uint32_t  LineOffset,
uint32_t  Discriminator 
) const
inline

Returns the call target map collected at a given location.

Each location is specified by LineOffset and Discriminator. If the location is not found in profile, return error.

Definition at line 892 of file SampleProf.h.

References mapIRLocToProfileLoc().

Referenced by llvm::sampleprof::ProfiledCallGraph::ProfiledCallGraph().

◆ findFunctionSamples()

const FunctionSamples * FunctionSamples::findFunctionSamples ( const DILocation DIL,
SampleProfileReaderItaniumRemapper Remapper = nullptr 
) const

Get the FunctionSamples of the inline instance where DIL originates from.

The FunctionSamples of the instruction (Machine or IR) associated to DIL is the inlined instance in which that instruction is coming from. We traverse the inline stack of that instruction, and match it with the tree nodes in the profile.

Returns
the FunctionSamples pointer to the inlined instance. If Remapper is not nullptr, it will be used to find matching FunctionSamples with not exactly the same but equivalent name.

Definition at line 245 of file SampleProf.cpp.

References assert(), llvm::SmallVectorImpl< T >::emplace_back(), getCallSiteIdentifier(), Name, ProfileIsFS, and llvm::SmallVectorBase< Size_T >::size().

◆ findFunctionSamplesAt()

const FunctionSamples * FunctionSamples::findFunctionSamplesAt ( const LineLocation Loc,
StringRef  CalleeName,
SampleProfileReaderItaniumRemapper Remapper 
) const

Returns a pointer to FunctionSamples at the given callsite location Loc with callee CalleeName.

If no callsite can be found, relax the restriction to return the FunctionSamples at callsite location Loc with the maximum total sample count. If Remapper is not nullptr, use Remapper to find FunctionSamples with equivalent name as CalleeName.

Definition at line 285 of file SampleProf.cpp.

References llvm::StringRef::empty(), getCanonicalFnName(), llvm::sampleprof::getRepInFormat(), llvm::sampleprof::SampleProfileReaderItaniumRemapper::lookUpNameInProfile(), mapIRLocToProfileLoc(), and UseMD5.

◆ findFunctionSamplesMapAt()

const FunctionSamplesMap * llvm::sampleprof::FunctionSamples::findFunctionSamplesMapAt ( const LineLocation Loc) const
inline

Returns the FunctionSamplesMap at the given Loc.

Definition at line 917 of file SampleProf.h.

References mapIRLocToProfileLoc().

◆ findInlinedFunctions()

void llvm::sampleprof::FunctionSamples::findInlinedFunctions ( DenseSet< GlobalValue::GUID > &  S,
const StringMap< Function * > &  SymbolMap,
uint64_t  Threshold 
) const
inline

Recursively traverses all children, if the total sample count of the corresponding function is no less than Threshold, add its corresponding GUID to S.

Also traverse the BodySamples to add hot CallTarget's GUID to S.

Definition at line 1041 of file SampleProf.h.

References F, getFuncName(), getGUID(), getName(), llvm::detail::DenseSetImpl< ValueT, MapTy, ValueInfoT >::insert(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup().

◆ findSamplesAt()

ErrorOr< uint64_t > llvm::sampleprof::FunctionSamples::findSamplesAt ( uint32_t  LineOffset,
uint32_t  Discriminator 
) const
inline

Return the number of samples collected at the given location.

Each location is specified by LineOffset and Discriminator. If the location is not found in profile, return error.

Definition at line 879 of file SampleProf.h.

References mapIRLocToProfileLoc().

◆ functionSamplesAt()

FunctionSamplesMap & llvm::sampleprof::FunctionSamples::functionSamplesAt ( const LineLocation Loc)
inline

◆ getBodySamples()

const BodySampleMap & llvm::sampleprof::FunctionSamples::getBodySamples ( ) const
inline

◆ getCallSiteHash()

uint64_t FunctionSamples::getCallSiteHash ( StringRef  CalleeName,
const LineLocation Callsite 
)
static

◆ getCallSiteIdentifier()

LineLocation FunctionSamples::getCallSiteIdentifier ( const DILocation DIL,
bool  ProfileIsFS = false 
)
static

Returns a unique call site identifier for a given debug location of a call instruction.

This is wrapper of two scenarios, the probe-based profile and regular profile, to hide implementation details from the sample loader and the context tracker.

Definition at line 220 of file SampleProf.cpp.

References llvm::PseudoProbeDwarfDiscriminator::extractProbeIndex(), llvm::DILocation::getBaseDiscriminator(), getOffset(), ProfileIsFS, and ProfileIsProbeBased.

Referenced by findFunctionSamples(), llvm::SampleContextTracker::getIndirectCalleeContextSamplesFor(), and llvm::SampleContextTracker::promoteMergeContextSamplesTree().

◆ getCallsiteSamples()

const CallsiteSampleMap & llvm::sampleprof::FunctionSamples::getCallsiteSamples ( ) const
inline

◆ getCanonicalFnName() [1/2]

static StringRef llvm::sampleprof::FunctionSamples::getCanonicalFnName ( const Function F)
inlinestatic

◆ getCanonicalFnName() [2/2]

static StringRef llvm::sampleprof::FunctionSamples::getCanonicalFnName ( StringRef  FnName,
StringRef  Attr = "selected" 
)
inlinestatic

◆ getContext()

SampleContext & llvm::sampleprof::FunctionSamples::getContext ( ) const
inline

◆ getFuncName() [1/2]

StringRef llvm::sampleprof::FunctionSamples::getFuncName ( ) const
inline

Return the original function name.

Definition at line 1074 of file SampleProf.h.

References getFuncName(), and getName().

Referenced by findInlinedFunctions(), and getFuncName().

◆ getFuncName() [2/2]

StringRef llvm::sampleprof::FunctionSamples::getFuncName ( StringRef  Name) const
inline

Translate Name into its original name.

When profile doesn't use MD5, Name needs no translation. When profile uses MD5, Name in current FunctionSamples is actually GUID of the original function name. getFuncName will translate Name in current FunctionSamples into its original name by looking up in the function map GUIDToFuncNameMap. If the original name doesn't exist in the map, return empty StringRef.

Definition at line 1138 of file SampleProf.h.

References assert(), GUIDToFuncNameMap, Name, and UseMD5.

◆ getFunctionHash()

uint64_t llvm::sampleprof::FunctionSamples::getFunctionHash ( ) const
inline

◆ getGUID()

static uint64_t llvm::sampleprof::FunctionSamples::getGUID ( StringRef  Name)
inlinestatic

Definition at line 1203 of file SampleProf.h.

References llvm::GlobalValue::getGUID(), Name, and UseMD5.

Referenced by findInlinedFunctions(), and GetSortedValueDataFromCallTargets().

◆ getHeadSamples()

uint64_t llvm::sampleprof::FunctionSamples::getHeadSamples ( ) const
inline

For top-level functions, return the total number of branch samples that have the function as the branch target (or 0 otherwise).

This is the raw data fetched from the profile. This should be equivalent to the sample of the first instruction of the symbol. But as we directly get this info for raw profile without referring to potentially inaccurate debug info, this gives more accurate profile data and is preferred for standalone symbols.

Definition at line 945 of file SampleProf.h.

Referenced by dumpFunctionProfileJson(), getHeadSamplesEstimate(), llvm::sampleprof::SampleProfileWriterText::writeSample(), llvm::sampleprof::SampleProfileWriterBinary::writeSample(), and llvm::sampleprof::SampleProfileWriterExtBinaryBase::writeSample().

◆ getHeadSamplesEstimate()

uint64_t llvm::sampleprof::FunctionSamples::getHeadSamplesEstimate ( ) const
inline

Return an estimate of the sample count of the function entry basic block.

The function can be either a standalone symbol or an inlined function. For Context-Sensitive profiles, this will prefer returning the head samples (i.e. getHeadSamples()), if non-zero. Otherwise it estimates from the function body's samples or callsite samples.

Definition at line 952 of file SampleProf.h.

References getHeadSamples(), and ProfileIsCS.

Referenced by llvm::sampleprof::ProfiledCallGraph::ProfiledCallGraph().

◆ getKey() [1/2]

template<typename T >
const T & llvm::sampleprof::FunctionSamples::getKey ( ) const

◆ getKey() [2/2]

template<>
const SampleContext & llvm::sampleprof::FunctionSamples::getKey ( ) const
inline

Definition at line 1293 of file SampleProf.h.

References getContext().

◆ getMaxCountInside()

uint64_t llvm::sampleprof::FunctionSamples::getMaxCountInside ( bool  SkipCallSite = false) const
inline

Return the maximum of sample counts in a function body.

When SkipCallSite is false, which is the default, the return count includes samples in the inlined functions. When SkipCallSite is true, the return count only considers the body samples.

Definition at line 987 of file SampleProf.h.

References llvm::CallingConv::C, F, getBodySamples(), and getCallsiteSamples().

◆ getName()

StringRef llvm::sampleprof::FunctionSamples::getName ( ) const
inline

◆ getOffset()

unsigned FunctionSamples::getOffset ( const DILocation DIL)
static

Returns the line offset to the start line of the subprogram.

We assume that a single function will not exceed 65535 LOC.

Definition at line 215 of file SampleProf.cpp.

Referenced by getCallSiteIdentifier(), and llvm::SampleProfileLoaderBaseImpl< FT >::getInstWeightImpl().

◆ getTotalSamples()

uint64_t llvm::sampleprof::FunctionSamples::getTotalSamples ( ) const
inline

◆ mapIRLocToProfileLoc()

const LineLocation & llvm::sampleprof::FunctionSamples::mapIRLocToProfileLoc ( const LineLocation IRLoc) const
inline

◆ merge()

sampleprof_error llvm::sampleprof::FunctionSamples::merge ( const FunctionSamples Other,
uint64_t  Weight = 1 
)
inline

◆ operator!=()

bool llvm::sampleprof::FunctionSamples::operator!= ( const FunctionSamples Other) const
inline

Definition at line 1222 of file SampleProf.h.

References llvm::Other.

◆ operator==()

bool llvm::sampleprof::FunctionSamples::operator== ( const FunctionSamples Other) const
inline

Definition at line 1211 of file SampleProf.h.

References GUIDToFuncNameMap, and llvm::Other.

◆ print()

void FunctionSamples::print ( raw_ostream OS = dbgs(),
unsigned  Indent = 0 
) const

Print the samples collected for a function on stream OS.

Definition at line 155 of file SampleProf.cpp.

References llvm::sampleprof::SampleSorter< LocationT, SampleT >::get(), getFunctionHash(), llvm::raw_ostream::indent(), and OS.

Referenced by dump().

◆ removeAllCallsiteSamples()

void llvm::sampleprof::FunctionSamples::removeAllCallsiteSamples ( )
inline

Definition at line 822 of file SampleProf.h.

◆ removeCalledTargetAndBodySample()

uint64_t llvm::sampleprof::FunctionSamples::removeCalledTargetAndBodySample ( uint32_t  LineOffset,
uint32_t  Discriminator,
StringRef  FName 
)
inline

Definition at line 806 of file SampleProf.h.

References I.

◆ removeTotalSamples()

void llvm::sampleprof::FunctionSamples::removeTotalSamples ( uint64_t  Num)
inline

Definition at line 766 of file SampleProf.h.

◆ setContext()

void llvm::sampleprof::FunctionSamples::setContext ( const SampleContext FContext)
inline

◆ SetContextSynthetic()

void llvm::sampleprof::FunctionSamples::SetContextSynthetic ( )
inline

◆ setFunctionHash()

void llvm::sampleprof::FunctionSamples::setFunctionHash ( uint64_t  Hash)
inline

◆ setHeadSamples()

void llvm::sampleprof::FunctionSamples::setHeadSamples ( uint64_t  Num)
inline

Definition at line 775 of file SampleProf.h.

◆ setIRToProfileLocationMap()

void llvm::sampleprof::FunctionSamples::setIRToProfileLocationMap ( const LocToLocMap LTLM)
inline

Definition at line 1080 of file SampleProf.h.

References assert().

◆ setName()

void llvm::sampleprof::FunctionSamples::setName ( StringRef  FunctionName)
inline

◆ setTotalSamples()

void llvm::sampleprof::FunctionSamples::setTotalSamples ( uint64_t  Num)
inline

Definition at line 773 of file SampleProf.h.

Referenced by updateTotalSamples().

◆ updateCallsiteSamples()

void llvm::sampleprof::FunctionSamples::updateCallsiteSamples ( )
inline

Definition at line 827 of file SampleProf.h.

References I.

◆ updateTotalSamples()

void llvm::sampleprof::FunctionSamples::updateTotalSamples ( )
inline

Definition at line 840 of file SampleProf.h.

References addTotalSamples(), I, and setTotalSamples().

Member Data Documentation

◆ GUIDToFuncNameMap

DenseMap<uint64_t, StringRef>* llvm::sampleprof::FunctionSamples::GUIDToFuncNameMap = nullptr

GUIDToFuncNameMap saves the mapping from GUID to the symbol name, for all the function symbols defined or declared in current module.

Definition at line 1198 of file SampleProf.h.

Referenced by getFuncName(), merge(), and operator==().

◆ HasUniqSuffix

bool llvm::sampleprof::FunctionSamples::HasUniqSuffix = true
static

Whether the profile contains any ".__uniq." suffix in a name.

Definition at line 1191 of file SampleProf.h.

Referenced by getCanonicalFnName(), and llvm::sampleprof::SampleProfileReaderExtBinaryBase::readOneSection().

◆ LLVMSuffix

constexpr const char* llvm::sampleprof::FunctionSamples::LLVMSuffix = ".llvm."
staticconstexpr

Name suffixes which canonicalization should handle to avoid profile mismatch.

Definition at line 1095 of file SampleProf.h.

Referenced by getCanonicalFnName().

◆ PartSuffix

constexpr const char* llvm::sampleprof::FunctionSamples::PartSuffix = ".part."
staticconstexpr

Definition at line 1096 of file SampleProf.h.

Referenced by getCanonicalFnName().

◆ ProfileIsCS

bool llvm::sampleprof::FunctionSamples::ProfileIsCS = false
static

◆ ProfileIsFS

bool llvm::sampleprof::FunctionSamples::ProfileIsFS = false
static

◆ ProfileIsPreInlined

bool llvm::sampleprof::FunctionSamples::ProfileIsPreInlined = false
static

◆ ProfileIsProbeBased

bool llvm::sampleprof::FunctionSamples::ProfileIsProbeBased = false
static

◆ UniqSuffix

constexpr const char* llvm::sampleprof::FunctionSamples::UniqSuffix = ".__uniq."
staticconstexpr

◆ UseMD5

bool llvm::sampleprof::FunctionSamples::UseMD5 = false
static

The documentation for this class was generated from the following files: