19#include "llvm/Config/config.h"
53#include <system_error>
60#define DEBUG_TYPE "instrprof"
64 cl::desc(
"Use full module build paths in the profile counter names for "
65 "static functions."));
77 cl::desc(
"Strip specified level of directory name from source path in "
78 "the profile counter name for static functions."));
81 const std::string &ErrMsg =
"") {
86 case instrprof_error::success:
89 case instrprof_error::eof:
92 case instrprof_error::unrecognized_format:
93 OS <<
"unrecognized instrumentation profile encoding format";
95 case instrprof_error::bad_magic:
96 OS <<
"invalid instrumentation profile data (bad magic)";
98 case instrprof_error::bad_header:
99 OS <<
"invalid instrumentation profile data (file header is corrupt)";
101 case instrprof_error::unsupported_version:
102 OS <<
"unsupported instrumentation profile format version";
104 case instrprof_error::unsupported_hash_type:
105 OS <<
"unsupported instrumentation profile hash type";
107 case instrprof_error::too_large:
108 OS <<
"too much profile data";
110 case instrprof_error::truncated:
111 OS <<
"truncated profile data";
113 case instrprof_error::malformed:
114 OS <<
"malformed instrumentation profile data";
116 case instrprof_error::missing_correlation_info:
117 OS <<
"debug info/binary for correlation is required";
119 case instrprof_error::unexpected_correlation_info:
120 OS <<
"debug info/binary for correlation is not necessary";
122 case instrprof_error::unable_to_correlate_profile:
123 OS <<
"unable to correlate profile";
125 case instrprof_error::invalid_prof:
126 OS <<
"invalid profile created. Please file a bug "
127 "at: " BUG_REPORT_URL
128 " and include the profraw files that caused this error.";
130 case instrprof_error::unknown_function:
131 OS <<
"no profile data available for function";
133 case instrprof_error::hash_mismatch:
134 OS <<
"function control flow change detected (hash mismatch)";
136 case instrprof_error::count_mismatch:
137 OS <<
"function basic block count change detected (counter mismatch)";
139 case instrprof_error::bitmap_mismatch:
140 OS <<
"function bitmap size change detected (bitmap size mismatch)";
142 case instrprof_error::counter_overflow:
143 OS <<
"counter overflow";
145 case instrprof_error::value_site_count_mismatch:
146 OS <<
"function value site count change detected (counter mismatch)";
148 case instrprof_error::compress_failed:
149 OS <<
"failed to compress data (zlib)";
151 case instrprof_error::uncompress_failed:
152 OS <<
"failed to uncompress data (zlib)";
154 case instrprof_error::empty_raw_profile:
155 OS <<
"empty raw profile file";
157 case instrprof_error::zlib_unavailable:
158 OS <<
"profile uses zlib compression but the profile reader was built "
159 "without zlib support";
161 case instrprof_error::raw_profile_version_mismatch:
162 OS <<
"raw profile version mismatch";
164 case instrprof_error::counter_value_too_large:
165 OS <<
"excessively large counter value suggests corrupted profile data";
171 OS <<
": " << ErrMsg;
181class InstrProfErrorCategoryType :
public std::error_category {
182 const char *
name()
const noexcept
override {
return "llvm.instrprof"; }
184 std::string message(
int IE)
const override {
192 static InstrProfErrorCategoryType ErrorCategory;
193 return ErrorCategory;
198const char *InstrProfSectNameCommon[] = {
199#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
204const char *InstrProfSectNameCoff[] = {
205#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
210const char *InstrProfSectNamePrefix[] = {
211#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
221 "enable-name-compression",
225 "enable-vtable-value-profiling",
cl::init(
false),
226 cl::desc(
"If true, the virtual table address will be instrumented to know "
227 "the types of a C++ pointer. The information is used in indirect "
228 "call promotion to do selective vtable-based comparison."));
231 "enable-vtable-profile-use",
cl::init(
false),
232 cl::desc(
"If ThinLTO and WPD is enabled and this option is true, vtable "
233 "profiles will be used by ICP pass for more efficient indirect "
234 "call sequence. If false, type profiles won't be used."));
238 bool AddSegmentInfo) {
239 std::string SectName;
242 SectName = InstrProfSectNamePrefix[IPSK];
245 SectName += InstrProfSectNameCoff[IPSK];
247 SectName += InstrProfSectNameCommon[IPSK];
249 if (OF ==
Triple::MachO && IPSK == IPSK_data && AddSegmentInfo)
250 SectName +=
",regular,live_support";
270 std::string NewName = std::string(
Name);
276 if (FileName.
empty())
277 NewName = NewName.insert(0,
"<unknown>:");
279 NewName = NewName.insert(0, FileName.
str() +
":");
290 for (
const auto &CI : PathNameStr) {
299 return PathNameStr.
substr(LastPos);
350 MDNode *PGONameMetadata) {
358 return *IRPGOFuncName;
405 if (MangledName.empty())
406 return std::make_pair(
StringRef(), IRPGOName);
407 return std::make_pair(FileName, MangledName);
411 if (FileName.
empty())
431 const char InvalidChars[] =
"-:;<>/\"'";
432 size_t FoundPos = VarName.find_first_of(InvalidChars);
433 while (FoundPos != std::string::npos) {
434 VarName[FoundPos] =
'_';
435 FoundPos = VarName.find_first_of(InvalidChars, FoundPos + 1);
486 if (!
G.hasName() || !
G.hasMetadata(LLVMContext::MD_type))
503 bool Inserted =
true;
504 std::tie(std::ignore, Inserted) =
510 if (
Error E = NameToGUIDMap(VTablePGOName))
513 StringRef CanonicalName = getCanonicalName(VTablePGOName);
514 if (CanonicalName != VTablePGOName)
515 return NameToGUIDMap(CanonicalName);
527 const uint8_t *EndP = NameStrings.
bytes_end();
534 const bool IsCompressed = (CompressedSize != 0);
542 UncompressedNameStrings,
548 NameStrings =
toStringRef(UncompressedNameStrings);
551 StringRef(
reinterpret_cast<const char *
>(
P), UncompressedSize);
552 P += UncompressedSize;
561 while (
P < EndP && *
P == 0)
577 this, std::placeholders::_1)))
588 CompressedVTableStrings,
602 const std::string UniqSuffix =
".__uniq.";
603 size_t Pos = PGOName.
find(UniqSuffix);
605 Pos += UniqSuffix.length();
611 Pos = PGOName.
find(
'.', Pos);
613 return PGOName.
substr(0, Pos);
625 if (
Error E = NameToGUIDMap(PGOFuncName))
628 StringRef CanonicalFuncName = getCanonicalName(PGOFuncName);
629 if (CanonicalFuncName != PGOFuncName)
630 return NameToGUIDMap(CanonicalFuncName);
638 return VTableAddrMap.
lookup(Address, 0);
643 auto It =
partition_point(AddrToMD5Map, [=](std::pair<uint64_t, uint64_t>
A) {
644 return A.first < Address;
650 if (It != AddrToMD5Map.end() && It->first == Address)
663 bool DoCompression, std::string &Result) {
664 assert(!NameStrs.
empty() &&
"No name data to emit");
666 uint8_t Header[20], *
P = Header;
667 std::string UncompressedNameStrings =
672 "PGO name is invalid (contains separator token)");
674 unsigned EncLen =
encodeULEB128(UncompressedNameStrings.length(),
P);
677 auto WriteStringToResult = [&](
size_t CompressedLen,
StringRef InputStr) {
680 char *HeaderStr =
reinterpret_cast<char *
>(&Header[0]);
681 unsigned HeaderLen =
P - &Header[0];
682 Result.append(HeaderStr, HeaderLen);
687 if (!DoCompression) {
688 return WriteStringToResult(0, UncompressedNameStrings);
693 CompressedNameStrings,
696 return WriteStringToResult(CompressedNameStrings.
size(),
703 Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
708 std::string &Result,
bool DoCompression) {
709 std::vector<std::string> NameStrs;
710 for (
auto *NameVar : NameVars) {
718 std::string &Result,
bool DoCompression) {
719 std::vector<std::string> VTableNameStrs;
720 for (
auto *VTable : VTables)
721 VTableNameStrs.push_back(
getPGOName(*VTable));
734 for (
uint32_t VK = IPVK_First; VK <= IPVK_Last; ++VK) {
737 for (
size_t I = 0;
I < NumValueSites; ++
I) {
751 double Score = 0.0f, FuncLevelScore = 0.0f;
756 while (
I != IE && J != JE) {
757 if (
I->Value == J->Value) {
765 }
else if (
I->Value < J->Value) {
781 assert(ThisNumValueSites ==
Other.getNumValueSites(ValueKind));
782 if (!ThisNumValueSites)
785 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
786 getOrCreateValueSitesForKind(ValueKind);
788 Other.getValueSitesForKind(ValueKind);
790 ThisSiteRecords[
I].
overlap(OtherSiteRecords[
I], ValueKind, Overlap,
800 bool Mismatch = (
Counts.size() !=
Other.Counts.size());
804 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) {
807 if (ThisNumValueSites != OtherNumValueSites) {
819 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
825 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I) {
828 MaxCount = std::max(
Other.Counts[
I], MaxCount);
833 if (MaxCount >= ValueCutoff) {
834 double FuncScore = 0.0;
835 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I)
841 FuncLevelOverlap.
Valid =
true;
852 std::vector<InstrProfValueData> Merged;
854 for (
const InstrProfValueData &J : Input.
ValueData) {
855 while (
I != IE &&
I->Value < J.Value) {
856 Merged.push_back(*
I);
859 if (
I != IE &&
I->Value == J.Value) {
864 Merged.push_back(*
I);
870 Merged.insert(Merged.end(),
I, IE);
886void InstrProfRecord::mergeValueProfData(
890 uint32_t OtherNumValueSites = Src.getNumValueSites(ValueKind);
891 if (ThisNumValueSites != OtherNumValueSites) {
895 if (!ThisNumValueSites)
897 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
898 getOrCreateValueSitesForKind(ValueKind);
900 Src.getValueSitesForKind(ValueKind);
902 ThisSiteRecords[
I].
merge(OtherSiteRecords[
I], Weight, Warn);
932 for (
size_t I = 0, E =
Other.Counts.size();
I < E; ++
I) {
953 for (
size_t I = 0, E =
Other.BitmapBytes.size();
I < E; ++
I) {
957 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
958 mergeValueProfData(Kind,
Other, Weight, Warn);
961void InstrProfRecord::scaleValueProfData(
964 for (
auto &R : getValueSitesForKind(ValueKind))
970 assert(
D != 0 &&
"D cannot be 0");
971 for (
auto &Count : this->
Counts) {
981 for (
uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
982 scaleValueProfData(Kind,
N,
D, Warn);
991 if (ValueKind == IPVK_IndirectCallTarget)
994 if (ValueKind == IPVK_VTableTarget)
1004 std::vector<InstrProfValueData> RemappedVD;
1005 RemappedVD.reserve(VData.
size());
1006 for (
const auto &V : VData) {
1008 RemappedVD.push_back({NewValue, V.Count});
1011 std::vector<InstrProfValueSiteRecord> &ValueSites =
1012 getOrCreateValueSitesForKind(ValueKind);
1013 assert(ValueSites.size() == Site);
1016 ValueSites.emplace_back(std::move(RemappedVD));
1021 bool RemoveOutlierUNs) {
1024 UtilityNodeT MaxUN = 0;
1030 for (
auto &
Trace : Traces) {
1031 size_t CutoffTimestamp = 1;
1037 It->getSecond() = std::min<size_t>(It->getSecond(),
Timestamp);
1044 for (
auto &[Id, FirstUN] : IdToFirstUN)
1045 for (
auto UN = FirstUN; UN <= MaxUN; ++UN)
1046 IdToUNs[Id].push_back(UN);
1048 IdToFirstUN.
clear();
1051 if (RemoveOutlierUNs) {
1053 for (
auto &[Id, UNs] : IdToUNs)
1054 for (
auto &UN : UNs)
1058 for (
auto &[Id, UNs] : IdToUNs)
1060 return UNFrequency[UN] <= 1 || 2 * UNFrequency[UN] > IdToUNs.
size();
1064 for (
auto &[Id, UNs] : IdToUNs)
1065 Nodes.emplace_back(Id, UNs);
1070 return std::make_pair(IdToFirstTimestamp[L.Id], L.Id) <
1071 std::make_pair(IdToFirstTimestamp[R.Id], R.Id);
1075#define INSTR_PROF_COMMON_API_IMPL
1089 ->getNumValueSites(VKind);
1094 ->getNumValueData(VKind);
1106 llvm::copy(IPR->getValueArrayForSite(K, S), Dst);
1111 (ValueProfData *)(
new (::operator
new(TotalSizeInBytes)) ValueProfData());
1112 memset(VD, 0, TotalSizeInBytes);
1129 Closure.Record = &
Record;
1130 return getValueProfDataSize(&Closure);
1134std::unique_ptr<ValueProfData>
1138 std::unique_ptr<ValueProfData> VPD(
1145 Record.reserveSites(Kind, NumValueSites);
1147 InstrProfValueData *ValueData = getValueProfRecordValueData(
this);
1148 for (
uint64_t VSite = 0; VSite < NumValueSites; ++VSite) {
1149 uint8_t ValueDataCount = this->SiteCountArray[VSite];
1151 Record.addValueData(Kind, VSite, VDs, SymTab);
1152 ValueData += ValueDataCount;
1160 using namespace support;
1166 sys::swapByteOrder<uint32_t>(NumValueSites);
1167 sys::swapByteOrder<uint32_t>(Kind);
1169 uint32_t ND = getValueProfRecordNumValueData(
this);
1170 InstrProfValueData *VD = getValueProfRecordValueData(
this);
1174 sys::swapByteOrder<uint64_t>(VD[
I].
Value);
1175 sys::swapByteOrder<uint64_t>(VD[
I].Count);
1178 sys::swapByteOrder<uint32_t>(NumValueSites);
1179 sys::swapByteOrder<uint32_t>(Kind);
1185 if (NumValueKinds == 0)
1188 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1189 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1190 VR->deserializeTo(
Record, SymTab);
1191 VR = getValueProfRecordNext(VR);
1196 return std::unique_ptr<ValueProfData>(
new (::operator
new(TotalSize))
1200Error ValueProfData::checkIntegrity() {
1201 if (NumValueKinds > IPVK_Last + 1)
1202 return make_error<InstrProfError>(
1206 return make_error<InstrProfError>(
1209 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1210 for (
uint32_t K = 0; K < this->NumValueKinds; K++) {
1211 if (VR->Kind > IPVK_Last)
1213 "value kind is invalid");
1214 VR = getValueProfRecordNext(VR);
1215 if ((
char *)VR - (
char *)
this > (
ptrdiff_t)TotalSize)
1216 return make_error<InstrProfError>(
1218 "value profile address is greater than total size");
1224ValueProfData::getValueProfData(
const unsigned char *
D,
1225 const unsigned char *
const BufferEnd,
1227 using namespace support;
1229 if (
D +
sizeof(ValueProfData) > BufferEnd)
1232 const unsigned char *Header =
D;
1233 uint32_t TotalSize = endian::readNext<uint32_t>(Header, Endianness);
1235 if (
D + TotalSize > BufferEnd)
1239 memcpy(VPD.get(),
D, TotalSize);
1241 VPD->swapBytesToHost(Endianness);
1243 Error E = VPD->checkIntegrity();
1245 return std::move(E);
1247 return std::move(VPD);
1251 using namespace support;
1256 sys::swapByteOrder<uint32_t>(TotalSize);
1257 sys::swapByteOrder<uint32_t>(NumValueKinds);
1259 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1260 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1262 VR = getValueProfRecordNext(VR);
1267 using namespace support;
1272 ValueProfRecord *VR = getFirstValueProfRecord(
this);
1273 for (
uint32_t K = 0;
K < NumValueKinds;
K++) {
1274 ValueProfRecord *NVR = getValueProfRecordNext(VR);
1278 sys::swapByteOrder<uint32_t>(TotalSize);
1279 sys::swapByteOrder<uint32_t>(NumValueKinds);
1290 for (
const InstrProfValueData &V : VDs)
1315 for (
const auto &VD : VDs) {
1336 if (!
Tag ||
Tag->getString() !=
"VP")
1352 bool GetNoICPValue) {
1366 ValueData.
reserve((NOps - 3) / 2);
1367 for (
unsigned I = 3;
I < NOps;
I += 2) {
1368 if (ValueData.
size() >= MaxNumValueData)
1372 mdconst::dyn_extract<ConstantInt>(MD->
getOperand(
I + 1));
1373 if (!
Value || !Count) {
1380 InstrProfValueData V;
1381 V.Value =
Value->getZExtValue();
1444 M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR));
1457 auto *InitVal = dyn_cast_or_null<ConstantInt>(IRInstrVar->
getInitializer());
1460 return (InitVal->getZExtValue() & VARIANT_MASK_IR_PROF) != 0;
1465 if (
F.getName().empty())
1471 if (CheckAddressTaken &&
F.hasAddressTaken())
1479 if (!
F.hasComdat()) {
1488 if (InstrProfileOutput.
empty())
1494 ProfileNameConst, INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR));
1496 Triple TT(M.getTargetTriple());
1497 if (TT.supportsCOMDAT()) {
1499 ProfileNameVar->
setComdat(M.getOrInsertComdat(
1500 StringRef(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR))));
1505 const std::string &TestFilename,
1507 auto GetProfileSum = [IsCS](
const std::string &Filename,
1513 if (
Error E = ReaderOrErr.takeError()) {
1516 auto Reader = std::move(ReaderOrErr.get());
1517 Reader->accumulateCounts(Sum, IsCS);
1535 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1545 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1555 const char *EntryName =
1556 (Level ==
ProgramLevel ?
"functions" :
"edge counters");
1558 OS <<
"Profile overlap infomation for base_profile: " << *
BaseFilename
1559 <<
" and test_profile: " << *
TestFilename <<
"\nProgram level:\n";
1561 OS <<
"Function level:\n"
1570 OS <<
" # of " << EntryName
1576 OS <<
" Mismatched count percentage (Edge): "
1579 OS <<
" Percentage of Edge profile only in test_profile: "
1586 for (
unsigned I = 0;
I < IPVK_Last - IPVK_First + 1;
I++) {
1589 char ProfileKindName[20] = {0};
1591 case IPVK_IndirectCallTarget:
1592 strncpy(ProfileKindName,
"IndirectCall", 19);
1594 case IPVK_MemOPSize:
1595 strncpy(ProfileKindName,
"MemOP", 19);
1597 case IPVK_VTableTarget:
1598 strncpy(ProfileKindName,
"VTable", 19);
1601 snprintf(ProfileKindName, 19,
"VP[%d]",
I);
1604 OS <<
" " << ProfileKindName
1608 OS <<
" Mismatched count percentage (" << ProfileKindName
1611 OS <<
" Percentage of " << ProfileKindName
1612 <<
" profile only in test_profile: "
1614 OS <<
" " << ProfileKindName
1617 <<
" " << ProfileKindName
1623namespace IndexedInstrProf {
1625 using namespace support;
1626 static_assert(std::is_standard_layout_v<Header>,
1627 "Use standard layout for Header for simplicity");
1630 H.Magic = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1636 H.Version = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1637 if (
H.getIndexedProfileVersion() >
1642 "Please update the reader as needed when a new field is added "
1643 "or when indexed profile version gets bumped.");
1646 H.HashType = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1647 H.HashOffset = endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1648 if (
H.getIndexedProfileVersion() >= 8)
1650 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1651 if (
H.getIndexedProfileVersion() >= 9)
1653 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1655 if (
H.getIndexedProfileVersion() >= 10)
1656 H.TemporalProfTracesOffset =
1657 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1658 if (
H.getIndexedProfileVersion() >= 12)
1659 H.VTableNamesOffset =
1660 endian::readNext<uint64_t, llvm::endianness::little>(Buffer);
1675 "Please update the size computation below if a new field has "
1676 "been added to the header; for a version bump without new "
1677 "fields, add a case statement to fall through to the latest version.");
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...
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="")
Module.h This file contains the declarations for the Module class.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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 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.
void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
void setComdat(Comdat *C)
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
static bool isLocalLinkage(LinkageTypes Linkage)
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)
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
Module * getParent()
Get the module that this global value is contained inside of...
bool isDiscardableIfUnused() const
@ HiddenVisibility
The GV is hidden.
void setVisibility(VisibilityTypes V)
std::string getGlobalIdentifier() const
Return the modified name for this global value suitable to be used as the key for a global lookup (e....
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 Expected< std::unique_ptr< InstrProfReader > > create(const Twine &Path, vfs::FileSystem &FS, const InstrProfCorrelator *Correlator=nullptr, 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,...
uint64_t getFunctionHashFromAddress(uint64_t Address)
Return a function's hash, or 0, if the function isn't in this SymTab.
Error addSymbolName(StringRef SymbolName)
uint64_t getVTableHashFromAddress(uint64_t Address)
Return a vtable's hash, or 0 if the vtable doesn't exist in this SymTab.
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
void dumpNames(raw_ostream &OS) const
Dump the symbols in this table.
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.
Error initVTableNamesFromCompressedStrings(StringRef CompressedVTableNames)
Initialize 'this' with the set of vtable names encoded in CompressedVTableNames.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
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.
ConstantAsMetadata * createConstant(Constant *C)
Return the given constant as metadata.
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 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...
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.
bool supportsCOMDAT() const
Tests whether the target supports comdat.
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVMContext & getContext() const
All values hold a context through their type.
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.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
@ C
The default llvm calling convention, compatible with C.
initializer< Ty > init(const Ty &Val)
void compress(ArrayRef< uint8_t > Input, SmallVectorImpl< uint8_t > &CompressedBuffer, int Level=DefaultCompression)
Error decompress(ArrayRef< uint8_t > Input, uint8_t *Output, size_t &UncompressedSize)
constexpr int BestSizeCompression
StringRef toStringRef(const std::optional< DWARFFormValue > &V, StringRef Default={})
Take an optional DWARFFormValue and try to extract a string value from it.
bool is_separator(char value, Style style=Style::native)
Check whether the given char is a path separator on the host OS.
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.
std::string getPGOFuncName(const Function &F, bool InLTO=false, uint64_t Version=INSTR_PROF_INDEX_VERSION)
Please use getIRPGOFuncName for LLVM IR instrumentation.
void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName)
Create the PGOFuncName meta data if PGOFuncName is different from function's raw name.
std::string getIRPGOFuncName(const Function &F, bool InLTO=false)
StringRef getPGOFuncNameMetadataName()
void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst, uint32_t K, uint32_t S)
cl::opt< bool > DoInstrProfNameCompression
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.
void createPGONameMetadata(GlobalObject &GO, StringRef PGOName)
Create the PGOName metadata if a global object's PGO name is different from its mangled name.
std::pair< StringRef, StringRef > getParsedIRPGOName(StringRef IRPGOName)
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)
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.
bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
std::string getPGOName(const GlobalVariable &V, bool InLTO=false)
GlobalVariable * createPGOFuncNameVar(Function &F, StringRef PGOFuncName)
Create and return the global variable for function name used in PGO instrumentation.
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...
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)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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.
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.
const std::error_category & instrprof_category()
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)
bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken=false)
Check if we can safely rename this Comdat function.
void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput)
constexpr char GlobalIdentifierDelimiter
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...
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
static Error readAndDecodeStrings(StringRef NameStrings, std::function< Error(StringRef)> NameCallback)
NameStrings is a string composed of one of more possibly encoded sub-strings.
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.
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.
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
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)
void merge(InstrProfRecord &Other, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge the counts in Other into this one.
void addValueData(uint32_t ValueKind, uint32_t Site, ArrayRef< InstrProfValueData > VData, InstrProfSymtab *SymTab)
Add ValueData for ValueKind at value Site.
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
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.
void merge(InstrProfValueSiteRecord &Input, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge data from another InstrProfValueSiteRecord Optionally scale merged counts by Weight.
void overlap(InstrProfValueSiteRecord &Input, uint32_t ValueKind, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap)
Compute the overlap b/w this record and Input record.
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).
void addOneMismatch(const CountSumOrPercent &MismatchFunc)
static double score(uint64_t Val1, uint64_t Val2, double Sum1, double Sum2)
Error accumulateCounts(const std::string &BaseFilename, const std::string &TestFilename, bool IsCS)
void dump(raw_fd_ostream &OS) const
CountSumOrPercent Overlap
void addOneUnique(const CountSumOrPercent &UniqueFunc)
const std::string * BaseFilename
const std::string * TestFilename
CountSumOrPercent Mismatch
static 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...