19#include "llvm/Config/config.h"
55#include <system_error>
62#define DEBUG_TYPE "instrprof"
66 cl::desc(
"Use full module build paths in the profile counter names for "
67 "static functions."));
79 cl::desc(
"Strip specified level of directory name from source path in "
80 "the profile counter name for static functions."));
83 const std::string &ErrMsg =
"") {
88 case instrprof_error::success:
91 case instrprof_error::eof:
94 case instrprof_error::unrecognized_format:
95 OS <<
"unrecognized instrumentation profile encoding format";
97 case instrprof_error::bad_magic:
98 OS <<
"invalid instrumentation profile data (bad magic)";
100 case instrprof_error::bad_header:
101 OS <<
"invalid instrumentation profile data (file header is corrupt)";
103 case instrprof_error::unsupported_version:
104 OS <<
"unsupported instrumentation profile format version";
106 case instrprof_error::unsupported_hash_type:
107 OS <<
"unsupported instrumentation profile hash type";
109 case instrprof_error::too_large:
110 OS <<
"too much profile data";
112 case instrprof_error::truncated:
113 OS <<
"truncated profile data";
115 case instrprof_error::malformed:
116 OS <<
"malformed instrumentation profile data";
118 case instrprof_error::missing_correlation_info:
119 OS <<
"debug info/binary for correlation is required";
121 case instrprof_error::unexpected_correlation_info:
122 OS <<
"debug info/binary for correlation is not necessary";
124 case instrprof_error::unable_to_correlate_profile:
125 OS <<
"unable to correlate profile";
127 case instrprof_error::invalid_prof:
128 OS <<
"invalid profile created. Please file a bug "
129 "at: " BUG_REPORT_URL
130 " and include the profraw files that caused this error.";
132 case instrprof_error::unknown_function:
133 OS <<
"no profile data available for function";
135 case instrprof_error::hash_mismatch:
136 OS <<
"function control flow change detected (hash mismatch)";
138 case instrprof_error::count_mismatch:
139 OS <<
"function basic block count change detected (counter mismatch)";
141 case instrprof_error::bitmap_mismatch:
142 OS <<
"function bitmap size change detected (bitmap size mismatch)";
144 case instrprof_error::counter_overflow:
145 OS <<
"counter overflow";
147 case instrprof_error::value_site_count_mismatch:
148 OS <<
"function value site count change detected (counter mismatch)";
150 case instrprof_error::compress_failed:
151 OS <<
"failed to compress data (zlib)";
153 case instrprof_error::uncompress_failed:
154 OS <<
"failed to uncompress data (zlib)";
156 case instrprof_error::empty_raw_profile:
157 OS <<
"empty raw profile file";
159 case instrprof_error::zlib_unavailable:
160 OS <<
"profile uses zlib compression but the profile reader was built "
161 "without zlib support";
163 case instrprof_error::raw_profile_version_mismatch:
164 OS <<
"raw profile version mismatch";
166 case instrprof_error::counter_value_too_large:
167 OS <<
"excessively large counter value suggests corrupted profile data";
173 OS <<
": " << ErrMsg;
183class InstrProfErrorCategoryType :
public std::error_category {
184 const char *
name()
const noexcept
override {
return "llvm.instrprof"; }
186 std::string message(
int IE)
const override {
194 static InstrProfErrorCategoryType ErrorCategory;
195 return ErrorCategory;
200const char *InstrProfSectNameCommon[] = {
201#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
206const char *InstrProfSectNameCoff[] = {
207#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
212const char *InstrProfSectNamePrefix[] = {
213#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
223 "enable-name-compression",
227 "enable-vtable-value-profiling",
cl::init(
false),
228 cl::desc(
"If true, the virtual table address will be instrumented to know "
229 "the types of a C++ pointer. The information is used in indirect "
230 "call promotion to do selective vtable-based comparison."));
233 "enable-vtable-profile-use",
cl::init(
false),
234 cl::desc(
"If ThinLTO and WPD is enabled and this option is true, vtable "
235 "profiles will be used by ICP pass for more efficient indirect "
236 "call sequence. If false, type profiles won't be used."));
240 bool AddSegmentInfo) {
241 std::string SectName;
244 SectName = InstrProfSectNamePrefix[IPSK];
247 SectName += InstrProfSectNameCoff[IPSK];
249 SectName += InstrProfSectNameCommon[IPSK];
251 if (OF ==
Triple::MachO && IPSK == IPSK_data && AddSegmentInfo)
252 SectName +=
",regular,live_support";
275 using namespace support;
280 for (
const auto &K :
P) {
281 FDOStream.
seek(K.Pos);
288 FDOStream.
seek(LastPos);
291 std::string &
Data = SOStream.
str();
292 for (
const auto &K :
P) {
293 for (
int I = 0, E = K.D.size();
I != E;
I++) {
295 endian::byte_swap<uint64_t, llvm::endianness::little>(K.D[
I]);
297 (
const char *)&Bytes,
sizeof(
uint64_t));
312 std::string NewName = std::string(
Name);
318 if (FileName.
empty())
319 NewName = NewName.insert(0,
"<unknown>:");
321 NewName = NewName.insert(0, FileName.
str() +
":");
332 for (
const auto &CI : PathNameStr) {
341 return PathNameStr.
substr(LastPos);
367 return GlobalValue::getGlobalIdentifier(GO.
getName(), Linkage, FileName);
392 MDNode *PGONameMetadata) {
400 return *IRPGOFuncName;
447 if (MangledName.empty())
448 return std::make_pair(
StringRef(), IRPGOName);
449 return std::make_pair(FileName, MangledName);
453 if (FileName.
empty())
473 const char InvalidChars[] =
"-:;<>/\"'";
474 size_t FoundPos = VarName.find_first_of(InvalidChars);
475 while (FoundPos != std::string::npos) {
476 VarName[FoundPos] =
'_';
477 FoundPos = VarName.find_first_of(InvalidChars, FoundPos + 1);
483 const Triple &
T = M.getTargetTriple();
542 if (!
G.hasName() || !
G.hasMetadata(LLVMContext::MD_type))
559 bool Inserted =
true;
560 std::tie(std::ignore, Inserted) = MD5VTableMap.try_emplace(
566 if (
Error E = NameToGUIDMap(VTablePGOName))
570 if (CanonicalName != VTablePGOName)
571 return NameToGUIDMap(CanonicalName);
586 const bool IsCompressed = (CompressedSize != 0);
594 UncompressedNameStrings,
600 NameStrings = toStringRef(UncompressedNameStrings);
603 StringRef(
reinterpret_cast<const char *
>(
P), UncompressedSize);
604 P += UncompressedSize;
613 while (
P < EndP && *
P == 0)
650 const std::string UniqSuffix =
".__uniq.";
651 size_t Pos = PGOName.
find(UniqSuffix);
653 Pos += UniqSuffix.length();
659 Pos = PGOName.
find(
'.', Pos);
661 return PGOName.
substr(0, Pos);
674 if (
Error E = NameToGUIDMap(PGOFuncName))
681 if (CanonicalFuncName != PGOFuncName)
682 return NameToGUIDMap(CanonicalFuncName);
695 auto It =
partition_point(AddrToMD5Map, [=](std::pair<uint64_t, uint64_t>
A) {
702 if (It != AddrToMD5Map.end() && It->first ==
Address)
715 bool DoCompression, std::string &Result) {
716 assert(!NameStrs.
empty() &&
"No name data to emit");
719 std::string UncompressedNameStrings =
724 "PGO name is invalid (contains separator token)");
726 unsigned EncLen =
encodeULEB128(UncompressedNameStrings.length(),
P);
729 auto WriteStringToResult = [&](
size_t CompressedLen,
StringRef InputStr) {
732 char *HeaderStr =
reinterpret_cast<char *
>(&Header[0]);
733 unsigned HeaderLen =
P - &Header[0];
734 Result.append(HeaderStr, HeaderLen);
739 if (!DoCompression) {
740 return WriteStringToResult(0, UncompressedNameStrings);
745 CompressedNameStrings,
748 return WriteStringToResult(CompressedNameStrings.
size(),
749 toStringRef(CompressedNameStrings));
755 Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
760 std::string &Result,
bool DoCompression) {
761 std::vector<std::string> NameStrs;
762 for (
auto *NameVar : NameVars) {
770 std::string &Result,
bool DoCompression) {
771 std::vector<std::string> VTableNameStrs;
772 for (
auto *VTable : VTables)
773 VTableNameStrs.push_back(
getPGOName(*VTable));
786 for (
uint32_t VK = IPVK_First; VK <= IPVK_Last; ++VK) {
789 for (
size_t I = 0;
I < NumValueSites; ++
I) {
803 double Score = 0.0f, FuncLevelScore = 0.0f;
808 while (
I != IE && J != JE) {
809 if (
I->Value == J->Value) {
817 }
else if (
I->Value < J->Value) {
833 assert(ThisNumValueSites ==
Other.getNumValueSites(ValueKind));
834 if (!ThisNumValueSites)
837 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
838 getOrCreateValueSitesForKind(ValueKind);
840 Other.getValueSitesForKind(ValueKind);
842 ThisSiteRecords[
I].
overlap(OtherSiteRecords[
I], ValueKind, Overlap,
852 bool Mismatch = (
Counts.size() !=
Other.Counts.size());
856 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) {
859 if (ThisNumValueSites != OtherNumValueSites) {
871 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
877 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I) {
880 MaxCount = std::max(
Other.Counts[
I], MaxCount);
885 if (MaxCount >= ValueCutoff) {
886 double FuncScore = 0.0;
887 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I)
893 FuncLevelOverlap.
Valid =
true;
904 std::vector<InstrProfValueData> Merged;
906 for (
const InstrProfValueData &J : Input.
ValueData) {
907 while (
I != IE &&
I->Value < J.Value) {
908 Merged.push_back(*
I);
911 if (
I != IE &&
I->Value == J.Value) {
916 Merged.push_back(*
I);
922 Merged.insert(Merged.end(),
I, IE);
938void InstrProfRecord::mergeValueProfData(
942 uint32_t OtherNumValueSites = Src.getNumValueSites(ValueKind);
943 if (ThisNumValueSites != OtherNumValueSites) {
947 if (!ThisNumValueSites)
949 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
950 getOrCreateValueSitesForKind(ValueKind);
952 Src.getValueSitesForKind(ValueKind);
954 ThisSiteRecords[
I].
merge(OtherSiteRecords[
I], Weight, Warn);
984 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I) {
1005 for (
size_t I = 0, E =
Other.BitmapBytes.size();
I < E; ++
I) {
1009 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1010 mergeValueProfData(Kind,
Other, Weight, Warn);
1013void InstrProfRecord::scaleValueProfData(
1016 for (
auto &R : getValueSitesForKind(ValueKind))
1017 R.scale(
N,
D, Warn);
1022 assert(
D != 0 &&
"D cannot be 0");
1023 for (
auto &Count : this->
Counts) {
1033 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1034 scaleValueProfData(Kind,
N,
D, Warn);
1043 if (ValueKind == IPVK_IndirectCallTarget)
1046 if (ValueKind == IPVK_VTableTarget)
1056 std::vector<InstrProfValueData> RemappedVD;
1057 RemappedVD.reserve(VData.
size());
1058 for (
const auto &V : VData) {
1060 RemappedVD.push_back({NewValue, V.Count});
1063 std::vector<InstrProfValueSiteRecord> &ValueSites =
1064 getOrCreateValueSitesForKind(ValueKind);
1065 assert(ValueSites.size() == Site);
1068 ValueSites.emplace_back(std::move(RemappedVD));
1073 bool RemoveOutlierUNs) {
1076 UtilityNodeT MaxUN = 0;
1082 for (
auto &
Trace : Traces) {
1083 size_t CutoffTimestamp = 1;
1089 It->getSecond() = std::min<size_t>(It->getSecond(),
Timestamp);
1096 for (
auto &[Id, FirstUN] : IdToFirstUN)
1097 for (
auto UN = FirstUN; UN <= MaxUN; ++UN)
1098 IdToUNs[Id].push_back(UN);
1100 IdToFirstUN.
clear();
1103 if (RemoveOutlierUNs) {
1105 for (
auto &[Id, UNs] : IdToUNs)
1106 for (
auto &UN : UNs)
1110 for (
auto &[Id, UNs] : IdToUNs)
1112 unsigned Freq = UNFrequency[UN];
1113 return Freq <= 1 || 2 * Freq > IdToUNs.
size();
1117 for (
auto &[Id, UNs] : IdToUNs)
1118 Nodes.emplace_back(Id, UNs);
1123 return std::make_pair(IdToFirstTimestamp[L.Id], L.Id) <
1124 std::make_pair(IdToFirstTimestamp[R.Id], R.Id);
1128#define INSTR_PROF_COMMON_API_IMPL
1142 ->getNumValueSites(VKind);
1147 ->getNumValueData(VKind);
1159 llvm::copy(IPR->getValueArrayForSite(K, S), Dst);
1163 ValueProfData *VD =
new (::operator
new(TotalSizeInBytes)) ValueProfData();
1164 memset(VD, 0, TotalSizeInBytes);
1181 Closure.Record = &
Record;
1182 return getValueProfDataSize(&Closure);
1186std::unique_ptr<ValueProfData>
1190 std::unique_ptr<ValueProfData> VPD(
1197 Record.reserveSites(Kind, NumValueSites);
1199 InstrProfValueData *ValueData = getValueProfRecordValueData(
this);
1200 for (
uint64_t VSite = 0; VSite < NumValueSites; ++VSite) {
1201 uint8_t ValueDataCount = this->SiteCountArray[VSite];
1203 Record.addValueData(Kind, VSite, VDs, SymTab);
1204 ValueData += ValueDataCount;
1212 using namespace support;
1218 sys::swapByteOrder<uint32_t>(NumValueSites);
1219 sys::swapByteOrder<uint32_t>(Kind);
1221 uint32_t ND = getValueProfRecordNumValueData(
this);
1222 InstrProfValueData *VD = getValueProfRecordValueData(
this);
1226 sys::swapByteOrder<uint64_t>(VD[
I].
Value);
1227 sys::swapByteOrder<uint64_t>(VD[
I].Count);
1230 sys::swapByteOrder<uint32_t>(NumValueSites);
1231 sys::swapByteOrder<uint32_t>(Kind);
1237 if (NumValueKinds == 0)
1240 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1241 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1242 VR->deserializeTo(
Record, SymTab);
1243 VR = getValueProfRecordNext(VR);
1248 return std::unique_ptr<ValueProfData>(
new (::operator
new(TotalSize))
1252Error ValueProfData::checkIntegrity() {
1253 if (NumValueKinds > IPVK_Last + 1)
1254 return make_error<InstrProfError>(
1258 return make_error<InstrProfError>(
1261 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1262 for (
uint32_t K = 0; K < this->NumValueKinds; K++) {
1263 if (VR->Kind > IPVK_Last)
1265 "value kind is invalid");
1266 VR = getValueProfRecordNext(VR);
1267 if ((
char *)VR - (
char *)
this > (
ptrdiff_t)TotalSize)
1268 return make_error<InstrProfError>(
1270 "value profile address is greater than total size");
1276ValueProfData::getValueProfData(
const unsigned char *
D,
1277 const unsigned char *
const BufferEnd,
1279 using namespace support;
1281 if (
D +
sizeof(ValueProfData) > BufferEnd)
1284 const unsigned char *Header =
D;
1285 uint32_t TotalSize = endian::readNext<uint32_t>(Header, Endianness);
1287 if (
D + TotalSize > BufferEnd)
1291 memcpy(VPD.get(),
D, TotalSize);
1293 VPD->swapBytesToHost(Endianness);
1295 Error E = VPD->checkIntegrity();
1297 return std::move(E);
1299 return std::move(VPD);
1303 using namespace support;
1308 sys::swapByteOrder<uint32_t>(TotalSize);
1309 sys::swapByteOrder<uint32_t>(NumValueKinds);
1311 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1312 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1314 VR = getValueProfRecordNext(VR);
1319 using namespace support;
1324 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1325 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1326 ValueProfRecord *NVR = getValueProfRecordNext(VR);
1330 sys::swapByteOrder<uint32_t>(TotalSize);
1331 sys::swapByteOrder<uint32_t>(NumValueKinds);
1342 for (
const InstrProfValueData &V : VDs)
1367 for (
const auto &VD : VDs) {
1404 bool GetNoICPValue) {
1418 ValueData.
reserve((NOps - 3) / 2);
1419 for (
unsigned I = 3;
I < NOps;
I += 2) {
1420 if (ValueData.
size() >= MaxNumValueData)
1424 mdconst::dyn_extract<ConstantInt>(MD->
getOperand(
I + 1));
1425 if (!
Value || !Count) {
1432 InstrProfValueData V;
1433 V.Value =
Value->getZExtValue();
1472 if (!M.getTargetTriple().supportsCOMDAT())
1496 M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR));
1509 auto *InitVal = dyn_cast_or_null<ConstantInt>(IRInstrVar->
getInitializer());
1512 return (InitVal->getZExtValue() & VARIANT_MASK_IR_PROF) != 0;
1517 if (
F.getName().empty())
1523 if (CheckAddressTaken &&
F.hasAddressTaken())
1531 if (!
F.hasComdat()) {
1540 if (InstrProfileOutput.
empty())
1546 ProfileNameConst, INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR));
1548 Triple TT(M.getTargetTriple());
1549 if (TT.supportsCOMDAT()) {
1551 ProfileNameVar->
setComdat(M.getOrInsertComdat(
1552 StringRef(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR))));
1557 const std::string &TestFilename,
1559 auto GetProfileSum = [IsCS](
const std::string &Filename,
1565 if (
Error E = ReaderOrErr.takeError()) {
1568 auto Reader = std::move(ReaderOrErr.get());
1569 Reader->accumulateCounts(Sum, IsCS);
1587 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1597 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1607 const char *EntryName =
1608 (Level ==
ProgramLevel ?
"functions" :
"edge counters");
1610 OS <<
"Profile overlap information for base_profile: " << *
BaseFilename
1611 <<
" and test_profile: " << *
TestFilename <<
"\nProgram level:\n";
1613 OS <<
"Function level:\n"
1622 OS <<
" # of " << EntryName
1628 OS <<
" Mismatched count percentage (Edge): "
1631 OS <<
" Percentage of Edge profile only in test_profile: "
1638 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1641 char ProfileKindName[20] = {0};
1643 case IPVK_IndirectCallTarget:
1644 strncpy(ProfileKindName,
"IndirectCall", 19);
1646 case IPVK_MemOPSize:
1647 strncpy(ProfileKindName,
"MemOP", 19);
1649 case IPVK_VTableTarget:
1650 strncpy(ProfileKindName,
"VTable", 19);
1653 snprintf(ProfileKindName, 19,
"VP[%d]",
I);
1656 OS <<
" " << ProfileKindName
1660 OS <<
" Mismatched count percentage (" << ProfileKindName
1663 OS <<
" Percentage of " << ProfileKindName
1664 <<
" profile only in test_profile: "
1666 OS <<
" " << ProfileKindName
1669 <<
" " << ProfileKindName
1675namespace IndexedInstrProf {
1677 using namespace support;
1678 static_assert(std::is_standard_layout_v<Header>,
1679 "Use standard layout for Header for simplicity");
1682 H.Magic = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1688 H.Version = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1689 if (
H.getIndexedProfileVersion() >
1694 "Please update the reader as needed when a new field is added "
1695 "or when indexed profile version gets bumped.");
1698 H.HashType = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1699 H.HashOffset = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1700 if (
H.getIndexedProfileVersion() >= 8)
1702 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1703 if (
H.getIndexedProfileVersion() >= 9)
1705 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1707 if (
H.getIndexedProfileVersion() >= 10)
1708 H.TemporalProfTracesOffset =
1709 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1710 if (
H.getIndexedProfileVersion() >= 12)
1711 H.VTableNamesOffset =
1712 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1727 "Please update the size computation below if a new field has "
1728 "been added to the header; for a version bump without new "
1729 "fields, add a case statement to fall through to the latest version.");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ATTRIBUTE_UNUSED
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
static cl::opt< bool > StaticFuncFullModulePrefix("static-func-full-module-prefix", cl::init(true), cl::Hidden, cl::desc("Use full module build paths in the profile counter names for " "static functions."))
static cl::opt< unsigned > StaticFuncStripDirNamePrefix("static-func-strip-dirname-prefix", cl::init(0), cl::Hidden, cl::desc("Strip specified level of directory name from source path in " "the profile counter name for static functions."))
static std::string getInstrProfErrString(instrprof_error Err, const std::string &ErrMsg="")
This file contains the declarations for profiling metadata utility functions.
This file defines the SmallVector class.
Defines the virtual file system interface vfs::FileSystem.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
This is an important base class in LLVM.
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void setComdat(Comdat *C)
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
void setLinkage(LinkageTypes LT)
Module * getParent()
Get the module that this global value is contained inside of...
bool isDiscardableIfUnused() const
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
void setVisibility(VisibilityTypes V)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
std::string message() const override
Return the error message as a string.
static LLVM_ABI Expected< std::unique_ptr< InstrProfReader > > create(const Twine &Path, vfs::FileSystem &FS, const InstrProfCorrelator *Correlator=nullptr, const object::BuildIDFetcher *BIDFetcher=nullptr, const InstrProfCorrelator::ProfCorrelatorKind BIDFetcherCorrelatorKind=InstrProfCorrelator::ProfCorrelatorKind::NONE, std::function< void(Error)> Warn=nullptr)
Factory method to create an appropriately typed reader for the given instrprof file.
A symbol table used for function [IR]PGO name look-up with keys (such as pointers,...
static LLVM_ABI StringRef getCanonicalName(StringRef PGOName)
Error addSymbolName(StringRef SymbolName)
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
LLVM_ABI void dumpNames(raw_ostream &OS) const
Dump the symbols in this table.
LLVM_ABI Error create(object::SectionRef &Section)
Create InstrProfSymtab from an object file section which contains function PGO names.
Error addFuncName(StringRef FuncName)
The method name is kept since there are many callers.
LLVM_ABI Error initVTableNamesFromCompressedStrings(StringRef CompressedVTableNames)
Initialize 'this' with the set of vtable names encoded in CompressedVTableNames.
LLVM_ABI uint64_t getVTableHashFromAddress(uint64_t Address) const
Return a vtable's hash, or 0 if the vtable doesn't exist in this SymTab.
LLVM_ABI uint64_t getFunctionHashFromAddress(uint64_t Address) const
Return a function's hash, or 0, if the function isn't in this SymTab.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
ValT lookup(KeyT x, ValT NotFound=ValT()) const
lookup - Return the mapped value at x or NotFound.
This is an important class for using LLVM in a threaded context.
LLVM_ABI ConstantAsMetadata * createConstant(Constant *C)
Return the given constant as metadata.
LLVM_ABI MDString * createString(StringRef Str)
Return the given string as metadata.
const MDOperand & getOperand(unsigned I) const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
unsigned getNumOperands() const
Return number of MDNode operands.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
A Module instance is used to store all the information related to an LLVM module.
const std::string & getSourceFileName() const
Get the module's original source file name.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
LLVM_ABI uint64_t tell() const
LLVM_ABI void writeByte(uint8_t V)
LLVM_ABI void patch(ArrayRef< PatchItem > P)
LLVM_ABI void write32(uint32_t V)
support::endian::Writer LE
LLVM_ABI ProfOStream(raw_fd_ostream &FD)
LLVM_ABI void write(uint64_t V)
void reserve(size_type N)
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< 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.
const unsigned char * bytes_end() const
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
constexpr size_t size() const
size - Get the string size.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
static constexpr size_t npos
const unsigned char * bytes_begin() const
Triple - Helper class for working with autoconf configuration names.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
An efficient, type-erasing, non-owning reference to a callable.
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.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
LLVM_ABI void compress(ArrayRef< uint8_t > Input, SmallVectorImpl< uint8_t > &CompressedBuffer, int Level=DefaultCompression)
LLVM_ABI Error decompress(ArrayRef< uint8_t > Input, uint8_t *Output, size_t &UncompressedSize)
LLVM_ABI bool isAvailable()
constexpr int BestSizeCompression
LLVM_ABI bool is_separator(char value, Style style=Style::native)
Check whether the given char is a path separator on the host OS.
LLVM_ABI IntrusiveRefCntPtr< FileSystem > getRealFileSystem()
Gets an vfs::FileSystem for the 'real' file system, as seen by the operating system.
This is an optimization pass for GlobalISel generic memory operations.
StringRef getInstrProfNameVarPrefix()
Return the name prefix of variables containing instrumented function names.
LLVM_ABI std::string getPGOFuncName(const Function &F, bool InLTO=false, uint64_t Version=INSTR_PROF_INDEX_VERSION)
Please use getIRPGOFuncName for LLVM IR instrumentation.
LLVM_ABI void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName)
Create the PGOFuncName meta data if PGOFuncName is different from function's raw name.
LLVM_ABI std::string getIRPGOFuncName(const Function &F, bool InLTO=false)
StringRef getPGOFuncNameMetadataName()
void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst, uint32_t K, uint32_t S)
LLVM_ABI cl::opt< bool > DoInstrProfNameCompression
LLVM_ABI StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName="<unknown>")
Given a PGO function name, remove the filename prefix and return the original (static) function name.
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
uint64_t decodeULEB128(const uint8_t *p, unsigned *n=nullptr, const uint8_t *end=nullptr, const char **error=nullptr)
Utility function to decode a ULEB128 value.
LLVM_ABI void createPGONameMetadata(GlobalObject &GO, StringRef PGOName)
Create the PGOName metadata if a global object's PGO name is different from its mangled name.
LLVM_ABI std::pair< StringRef, StringRef > getParsedIRPGOName(StringRef IRPGOName)
LLVM_ABI MDNode * getPGOFuncNameMetadata(const Function &F)
Return the PGOFuncName meta data associated with a function.
static std::unique_ptr< ValueProfData > allocValueProfData(uint32_t TotalSize)
MDNode * mayHaveValueProfileOfKind(const Instruction &Inst, InstrProfValueKind ValueKind)
LLVM_ABI std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
cl::opt< bool > EnableVTableProfileUse("enable-vtable-profile-use", cl::init(false), cl::desc("If ThinLTO and WPD is enabled and this option is true, vtable " "profiles will be used by ICP pass for more efficient indirect " "call sequence. If false, type profiles won't be used."))
uint64_t getInstrMaxCountValue()
Return the max count value. We reserver a few large values for special use.
LLVM_ABI bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
LLVM_ABI std::string getPGOName(const GlobalVariable &V, bool InLTO=false)
LLVM_ABI GlobalVariable * createPGOFuncNameVar(Function &F, StringRef PGOFuncName)
Create and return the global variable for function name used in PGO instrumentation.
LLVM_ABI void annotateValueSite(Module &M, Instruction &Inst, const InstrProfRecord &InstrProfR, InstrProfValueKind ValueKind, uint32_t SiteIndx, uint32_t MaxMDCount=3)
Get the value profile data for value site SiteIdx from InstrProfR and annotate the instruction Inst w...
LLVM_ABI Error collectPGOFuncNameStrings(ArrayRef< GlobalVariable * > NameVars, std::string &Result, bool doCompression=true)
Produce Result string with the same format described above.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI Error readAndDecodeStrings(StringRef NameStrings, std::function< Error(StringRef)> NameCallback)
NameStrings is a string composed of one or more possibly encoded sub-strings.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar)
Return the initializer in string of the PGO name var NameVar.
std::enable_if_t< std::is_unsigned_v< T >, 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.
StringRef getInstrProfNameSeparator()
Return the marker used to separate PGO names during serialization.
LLVM_ABI SmallVector< InstrProfValueData, 4 > getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)
Extract the value profile data from Inst and returns them if Inst is annotated with value profile dat...
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO, MDNode *PGONameMetadata)
@ value_site_count_mismatch
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingMultiply(T X, T Y, bool *ResultOverflowed=nullptr)
Multiply two unsigned integers, X and Y, of type T.
LLVM_ABI const std::error_category & instrprof_category()
LLVM_ABI Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
static StringRef getStrippedSourceFileName(const GlobalObject &GO)
uint32_t getNumValueSitesInstrProf(const void *Record, uint32_t VKind)
OutputIt copy(R &&Range, OutputIt Out)
LLVM_ABI bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken=false)
Check if we can safely rename this Comdat function.
LLVM_ABI void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput)
constexpr char GlobalIdentifierDelimiter
LLVM_ABI Error collectGlobalObjectNameStrings(ArrayRef< std::string > NameStrs, bool doCompression, std::string &Result)
Given a vector of strings (names of global objects like functions or, virtual tables) NameStrs,...
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
void setPGOFuncVisibility(Module &M, GlobalVariable *FuncNameVar)
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
uint32_t getNumValueDataForSiteInstrProf(const void *R, uint32_t VK, uint32_t S)
static ValueProfRecordClosure InstrProfRecordClosure
LLVM_ABI std::string getPGOFuncNameVarName(StringRef FuncName, GlobalValue::LinkageTypes Linkage)
Return the name of the global variable used to store a function name in PGO instrumentation.
static StringRef stripDirPrefix(StringRef PathNameStr, uint32_t NumPrefix)
static std::optional< std::string > lookupPGONameFromMetadata(MDNode *MD)
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)
Add two unsigned integers, X and Y, of type T.
LLVM_ABI bool isGPUProfTarget(const Module &M)
Determines whether module targets a GPU eligable for PGO instrumentation.
LLVM_ABI bool isIRPGOFlagSet(const Module *M)
Check if INSTR_PROF_RAW_VERSION_VAR is defined.
StringRef getPGONameMetadataName()
void consumeError(Error Err)
Consume a Error without doing anything.
const uint64_t NOMORE_ICP_MAGICNUM
Magic number in the value profile metadata showing a target has been promoted for the instruction and...
uint32_t getNumValueKindsInstrProf(const void *Record)
ValueProfRecordClosure Interface implementation for InstrProfRecord class.
ValueProfData * allocValueProfDataInstrProf(size_t TotalSizeInBytes)
uint32_t getNumValueDataInstrProf(const void *Record, uint32_t VKind)
static std::string getIRPGONameForGlobalObject(const GlobalObject &GO, GlobalValue::LinkageTypes Linkage, StringRef FileName)
cl::opt< bool > EnableVTableValueProfiling("enable-vtable-value-profiling", cl::init(false), cl::desc("If true, the virtual table address will be instrumented to know " "the types of a C++ pointer. The information is used in indirect " "call promotion to do selective vtable-based comparison."))
std::array< double, IPVK_Last - IPVK_First+1 > ValueCounts
Profiling information for a single function.
LLVM_ABI void overlapValueProfData(uint32_t ValueKind, InstrProfRecord &Src, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap)
Compute the overlap of value profile counts.
std::vector< uint64_t > Counts
ArrayRef< InstrProfValueData > getValueArrayForSite(uint32_t ValueKind, uint32_t Site) const
Return the array of profiled values at Site.
CountPseudoKind getCountPseudoKind() const
LLVM_ABI void accumulateCounts(CountSumOrPercent &Sum) const
Compute the sums of all counts and store in Sum.
uint32_t getNumValueSites(uint32_t ValueKind) const
Return the number of instrumented sites for ValueKind.
void setPseudoCount(CountPseudoKind Kind)
LLVM_ABI void merge(InstrProfRecord &Other, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge the counts in Other into this one.
LLVM_ABI void addValueData(uint32_t ValueKind, uint32_t Site, ArrayRef< InstrProfValueData > VData, InstrProfSymtab *SymTab)
Add ValueData for ValueKind at value Site.
LLVM_ABI void overlap(InstrProfRecord &Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff)
Compute the overlap b/w this IntrprofRecord and Other.
std::vector< uint8_t > BitmapBytes
LLVM_ABI 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).
void sortByTargetValues()
Sort ValueData ascending by Value.
std::vector< InstrProfValueData > ValueData
Value profiling data pairs at a given value site.
LLVM_ABI void merge(InstrProfValueSiteRecord &Input, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge data from another InstrProfValueSiteRecord Optionally scale merged counts by Weight.
LLVM_ABI void overlap(InstrProfValueSiteRecord &Input, uint32_t ValueKind, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap)
Compute the overlap b/w this record and Input record.
LLVM_ABI void scale(uint64_t N, uint64_t D, function_ref< void(instrprof_error)> Warn)
Scale up value profile data counts by N (Numerator) / D (Denominator).
static LLVM_ABI const char * ValueProfile
LLVM_ABI void addOneMismatch(const CountSumOrPercent &MismatchFunc)
static double score(uint64_t Val1, uint64_t Val2, double Sum1, double Sum2)
LLVM_ABI Error accumulateCounts(const std::string &BaseFilename, const std::string &TestFilename, bool IsCS)
LLVM_ABI void dump(raw_fd_ostream &OS) const
CountSumOrPercent Overlap
LLVM_ABI void addOneUnique(const CountSumOrPercent &UniqueFunc)
const std::string * BaseFilename
const std::string * TestFilename
CountSumOrPercent Mismatch
static LLVM_ABI void createBPFunctionNodes(ArrayRef< TemporalProfTraceTy > Traces, std::vector< BPFunctionNode > &Nodes, bool RemoveOutlierUNs=true)
Use a set of temporal profile traces to create a list of balanced partitioning function nodes used by...
void write(ArrayRef< value_type > Val)