LLVM 24.0.0git
InstrProf.cpp
Go to the documentation of this file.
1//===- InstrProf.cpp - Instrumented profiling format support --------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains support for clang's instrumentation based PGO and
10// coverage.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/Config/config.h"
20#include "llvm/IR/Constant.h"
21#include "llvm/IR/Constants.h"
22#include "llvm/IR/Function.h"
23#include "llvm/IR/GlobalValue.h"
25#include "llvm/IR/Instruction.h"
26#include "llvm/IR/LLVMContext.h"
27#include "llvm/IR/MDBuilder.h"
28#include "llvm/IR/Metadata.h"
29#include "llvm/IR/Module.h"
31#include "llvm/IR/Type.h"
38#include "llvm/Support/Debug.h"
39#include "llvm/Support/Endian.h"
40#include "llvm/Support/Error.h"
42#include "llvm/Support/LEB128.h"
44#include "llvm/Support/Path.h"
49#include <algorithm>
50#include <cassert>
51#include <cstddef>
52#include <cstdint>
53#include <cstring>
54#include <memory>
55#include <string>
56#include <system_error>
57#include <type_traits>
58#include <utility>
59#include <vector>
60
61using namespace llvm;
62
63#define DEBUG_TYPE "instrprof"
64
66 "static-func-full-module-prefix", cl::init(true), cl::Hidden,
67 cl::desc("Use full module build paths in the profile counter names for "
68 "static functions."));
69
70// This option is tailored to users that have different top-level directory in
71// profile-gen and profile-use compilation. Users need to specific the number
72// of levels to strip. A value larger than the number of directories in the
73// source file will strip all the directory names and only leave the basename.
74//
75// Note current ThinLTO module importing for the indirect-calls assumes
76// the source directory name not being stripped. A non-zero option value here
77// can potentially prevent some inter-module indirect-call-promotions.
79 "static-func-strip-dirname-prefix", cl::init(0), cl::Hidden,
80 cl::desc("Strip specified level of directory name from source path in "
81 "the profile counter name for static functions."));
82
84 const std::string &ErrMsg = "") {
85 std::string Msg;
87
88 switch (Err) {
90 OS << "success";
91 break;
93 OS << "end of File";
94 break;
96 OS << "unrecognized instrumentation profile encoding format";
97 break;
99 OS << "invalid instrumentation profile data (bad magic)";
100 break;
102 OS << "invalid instrumentation profile data (file header is corrupt)";
103 break;
105 OS << "invalid instrumentation profile data (file is incomplete or header "
106 "is corrupt)";
107 break;
109 OS << "unsupported instrumentation profile format version";
110 break;
112 OS << "unsupported instrumentation profile hash type";
113 break;
115 OS << "too much profile data";
116 break;
118 OS << "truncated profile data";
119 break;
121 OS << "malformed instrumentation profile data";
122 break;
124 OS << "debug info/binary for correlation is required";
125 break;
127 OS << "debug info/binary for correlation is not necessary";
128 break;
130 OS << "unable to correlate profile";
131 break;
133 OS << "invalid profile created. Please file a bug "
134 "at: " BUG_REPORT_URL
135 " and include the profraw files that caused this error.";
136 break;
138 OS << "no profile data available for function";
139 break;
141 OS << "function control flow change detected (hash mismatch)";
142 break;
144 OS << "function basic block count change detected (counter mismatch)";
145 break;
147 OS << "function bitmap size change detected (bitmap size mismatch)";
148 break;
150 OS << "counter overflow";
151 break;
153 OS << "function value site count change detected (counter mismatch)";
154 break;
156 OS << "failed to compress data (zlib)";
157 break;
159 OS << "failed to uncompress data (zlib)";
160 break;
162 OS << "empty raw profile file";
163 break;
165 OS << "profile uses zlib compression but the profile reader was built "
166 "without zlib support";
167 break;
169 OS << "raw profile version mismatch";
170 break;
172 OS << "excessively large counter value suggests corrupted profile data";
173 break;
175 OS << "cannot merge single-byte and incrementing counter profiles";
176 break;
177 }
178
179 // If optional error message is not empty, append it to the message.
180 if (!ErrMsg.empty())
181 OS << ": " << ErrMsg;
182
183 return OS.str();
184}
185
186namespace {
187
188// FIXME: This class is only here to support the transition to llvm::Error. It
189// will be removed once this transition is complete. Clients should prefer to
190// deal with the Error value directly, rather than converting to error_code.
191class InstrProfErrorCategoryType : public std::error_category {
192 const char *name() const noexcept override { return "llvm.instrprof"; }
193
194 std::string message(int IE) const override {
195 return getInstrProfErrString(static_cast<instrprof_error>(IE));
196 }
197};
198
199} // end anonymous namespace
200
201const std::error_category &llvm::instrprof_category() {
202 static InstrProfErrorCategoryType ErrorCategory;
203 return ErrorCategory;
204}
205
206namespace {
207
208const char *InstrProfSectNameCommon[] = {
209#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
210 SectNameCommon,
212};
213
214const char *InstrProfSectNameCoff[] = {
215#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
216 SectNameCoff,
218};
219
220const char *InstrProfSectNamePrefix[] = {
221#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
222 Prefix,
224};
225
226} // namespace
227
228namespace llvm {
229
231 "enable-name-compression",
232 cl::desc("Enable name/filename string compression"), cl::init(true));
233
235 "enable-vtable-value-profiling", cl::init(false),
236 cl::desc("If true, the virtual table address will be instrumented to know "
237 "the types of a C++ pointer. The information is used in indirect "
238 "call promotion to do selective vtable-based comparison."));
239
241 "enable-vtable-profile-use", cl::init(false),
242 cl::desc("If ThinLTO and WPD is enabled and this option is true, vtable "
243 "profiles will be used by ICP pass for more efficient indirect "
244 "call sequence. If false, type profiles won't be used."));
245
248 bool AddSegmentInfo) {
249 std::string SectName;
250
251 if (OF == Triple::MachO && AddSegmentInfo)
252 SectName = InstrProfSectNamePrefix[IPSK];
253
254 if (OF == Triple::COFF)
255 SectName += InstrProfSectNameCoff[IPSK];
256 else
257 SectName += InstrProfSectNameCommon[IPSK];
258
259 if (OF == Triple::MachO && IPSK == IPSK_data && AddSegmentInfo)
260 SectName += ",regular,live_support";
261
262 return SectName;
263}
264
265std::string InstrProfError::message() const {
266 return getInstrProfErrString(Err, Msg);
267}
268
269char InstrProfError::ID = 0;
270
273
276
277uint64_t ProfOStream::tell() const { return OS.tell(); }
278void ProfOStream::write(uint64_t V) { LE.write<uint64_t>(V); }
281
283 using namespace support;
284
285 if (IsFDOStream) {
286 raw_fd_ostream &FDOStream = static_cast<raw_fd_ostream &>(OS);
287 const uint64_t LastPos = FDOStream.tell();
288 for (const auto &K : P) {
289 FDOStream.seek(K.Pos);
290 for (uint64_t Elem : K.D)
291 write(Elem);
292 }
293 // Reset the stream to the last position after patching so that users
294 // don't accidentally overwrite data. This makes it consistent with
295 // the string stream below which replaces the data directly.
296 FDOStream.seek(LastPos);
297 } else {
298 raw_string_ostream &SOStream = static_cast<raw_string_ostream &>(OS);
299 std::string &Data = SOStream.str(); // with flush
300 for (const auto &K : P) {
301 for (int I = 0, E = K.D.size(); I != E; I++) {
302 uint64_t Bytes =
304 Data.replace(K.Pos + I * sizeof(uint64_t), sizeof(uint64_t),
305 (const char *)&Bytes, sizeof(uint64_t));
306 }
307 }
308 }
309}
310
312 StringRef FileName,
313 [[maybe_unused]] uint64_t Version) {
314 // Value names may be prefixed with a binary '1' to indicate
315 // that the backend should not modify the symbols due to any platform
316 // naming convention. Do not include that '1' in the PGO profile name.
317 if (Name[0] == '\1')
318 Name = Name.substr(1);
319
320 std::string NewName = std::string(Name);
322 // For local symbols, prepend the main file name to distinguish them.
323 // Do not include the full path in the file name since there's no guarantee
324 // that it will stay the same, e.g., if the files are checked out from
325 // version control in different locations.
326 if (FileName.empty())
327 NewName = NewName.insert(0, "<unknown>:");
328 else
329 NewName = NewName.insert(0, FileName.str() + ":");
330 }
331 return NewName;
332}
333
334// Strip NumPrefix level of directory name from PathNameStr. If the number of
335// directory separators is less than NumPrefix, strip all the directories and
336// leave base file name only.
337static StringRef stripDirPrefix(StringRef PathNameStr, uint32_t NumPrefix) {
338 uint32_t Count = NumPrefix;
339 uint32_t Pos = 0, LastPos = 0;
340 for (const auto &CI : PathNameStr) {
341 ++Pos;
343 LastPos = Pos;
344 --Count;
345 }
346 if (Count == 0)
347 break;
348 }
349 return PathNameStr.substr(LastPos);
350}
351
353 StringRef FileName(GO.getParent()->getSourceFileName());
354 uint32_t StripLevel = StaticFuncFullModulePrefix ? 0 : (uint32_t)-1;
355 if (StripLevel < StaticFuncStripDirNamePrefix)
356 StripLevel = StaticFuncStripDirNamePrefix;
357 if (StripLevel)
358 FileName = stripDirPrefix(FileName, StripLevel);
359 return FileName;
360}
361
362// The PGO name has the format [<filepath>;]<mangled-name> where <filepath>; is
363// provided if linkage is local and is used to discriminate possibly identical
364// mangled names. ";" is used because it is unlikely to be found in either
365// <filepath> or <mangled-name>.
366//
367// Older compilers used getPGOFuncName() which has the format
368// [<filepath>:]<mangled-name>. This caused trouble for Objective-C functions
369// which commonly have :'s in their names. We still need to compute this name to
370// lookup functions from profiles built by older compilers.
371static std::string
374 StringRef FileName) {
375 return GlobalValue::getGlobalIdentifier(GO.getName(), Linkage, FileName);
376}
377
378static std::optional<std::string> lookupPGONameFromMetadata(MDNode *MD) {
379 if (MD != nullptr) {
380 StringRef S = cast<MDString>(MD->getOperand(0))->getString();
381 return S.str();
382 }
383 return {};
384}
385
386// Returns the PGO object name. This function has some special handling
387// when called in LTO optimization. The following only applies when calling in
388// LTO passes (when \c InLTO is true): LTO's internalization privatizes many
389// global linkage symbols. This happens after value profile annotation, but
390// those internal linkage functions should not have a source prefix.
391// Additionally, for ThinLTO mode, exported internal functions are promoted
392// and renamed. We need to ensure that the original internal PGO name is
393// used when computing the GUID that is compared against the profiled GUIDs.
394// To differentiate compiler generated internal symbols from original ones,
395// PGOFuncName meta data are created and attached to the original internal
396// symbols in the value profile annotation step
397// (PGOUseFunc::annotateIndirectCallSites). If a symbol does not have the meta
398// data, its original linkage must be non-internal.
399static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO,
400 MDNode *PGONameMetadata) {
401 if (!InLTO) {
402 auto FileName = getStrippedSourceFileName(GO);
403 return getIRPGONameForGlobalObject(GO, GO.getLinkage(), FileName);
404 }
405
406 // In LTO mode (when InLTO is true), first check if there is a meta data.
407 if (auto IRPGOFuncName = lookupPGONameFromMetadata(PGONameMetadata))
408 return *IRPGOFuncName;
409
410 // If there is no meta data, the function must be a global before the value
411 // profile annotation pass. Its current linkage may be internal if it is
412 // internalized in LTO mode.
414}
415
416// Returns the IRPGO function name and does special handling when called
417// in LTO optimization. See the comments of `getIRPGOObjectName` for details.
418std::string getIRPGOFuncName(const Function &F, bool InLTO) {
420}
421
422// Please use getIRPGOFuncName for LLVM IR instrumentation. This function is
423// for front-end (Clang, etc) instrumentation.
424// The implementation is kept for profile matching from older profiles.
425// This is similar to `getIRPGOFuncName` except that this function calls
426// 'getPGOFuncName' to get a name and `getIRPGOFuncName` calls
427// 'getIRPGONameForGlobalObject'. See the difference between two callees in the
428// comments of `getIRPGONameForGlobalObject`.
429std::string getPGOFuncName(const Function &F, bool InLTO, uint64_t Version) {
430 if (!InLTO) {
431 auto FileName = getStrippedSourceFileName(F);
432 return getPGOFuncName(F.getName(), F.getLinkage(), FileName, Version);
433 }
434
435 // In LTO mode (when InLTO is true), first check if there is a meta data.
436 if (auto PGOFuncName = lookupPGONameFromMetadata(getPGOFuncNameMetadata(F)))
437 return *PGOFuncName;
438
439 // If there is no meta data, the function must be a global before the value
440 // profile annotation pass. Its current linkage may be internal if it is
441 // internalized in LTO mode.
442 return getPGOFuncName(F.getName(), GlobalValue::ExternalLinkage, "");
443}
444
445std::string getPGOName(const GlobalVariable &V, bool InLTO) {
446 // PGONameMetadata should be set by compiler at profile use time
447 // and read by symtab creation to look up symbols corresponding to
448 // a MD5 hash.
449 return getIRPGOObjectName(V, InLTO, V.getMetadata(getPGONameMetadataName()));
450}
451
452// See getIRPGOObjectName() for a discription of the format.
453std::pair<StringRef, StringRef> getParsedIRPGOName(StringRef IRPGOName) {
454 auto [FileName, MangledName] = IRPGOName.split(GlobalIdentifierDelimiter);
455 if (MangledName.empty())
456 return std::make_pair(StringRef(), IRPGOName);
457 return std::make_pair(FileName, MangledName);
458}
459
461 if (FileName.empty())
462 return PGOFuncName;
463 // Drop the file name including ':' or ';'. See getIRPGONameForGlobalObject as
464 // well.
465 if (PGOFuncName.starts_with(FileName))
466 PGOFuncName = PGOFuncName.drop_front(FileName.size() + 1);
467 return PGOFuncName;
468}
469
470// \p FuncName is the string used as profile lookup key for the function. A
471// symbol is created to hold the name. Return the legalized symbol name.
472std::string getPGOFuncNameVarName(StringRef FuncName,
474 std::string VarName = std::string(getInstrProfNameVarPrefix());
475 VarName += FuncName;
476
477 if (!GlobalValue::isLocalLinkage(Linkage))
478 return VarName;
479
480 // Now fix up illegal chars in local VarName that may upset the assembler.
481 const char InvalidChars[] = "-:;<>/\"'";
482 size_t FoundPos = VarName.find_first_of(InvalidChars);
483 while (FoundPos != std::string::npos) {
484 VarName[FoundPos] = '_';
485 FoundPos = VarName.find_first_of(InvalidChars, FoundPos + 1);
486 }
487 return VarName;
488}
489
490bool isGPUProfTarget(const Module &M) {
491 const Triple &T = M.getTargetTriple();
492 return T.isGPU();
493}
494
496 // Hide the symbol so that we correctly get a copy for each executable.
497 if (!GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))
499}
500
503 StringRef PGOFuncName) {
504 // We generally want to match the function's linkage, but available_externally
505 // and extern_weak both have the wrong semantics, and anything that doesn't
506 // need to link across compilation units doesn't need to be visible at all.
509 else if (Linkage == GlobalValue::AvailableExternallyLinkage)
511 else if (Linkage == GlobalValue::InternalLinkage ||
514
515 auto *Value =
516 ConstantDataArray::getString(M.getContext(), PGOFuncName, false);
517 auto *FuncNameVar =
518 new GlobalVariable(M, Value->getType(), true, Linkage, Value,
519 getPGOFuncNameVarName(PGOFuncName, Linkage));
520
521 setPGOFuncVisibility(M, FuncNameVar);
522 return FuncNameVar;
523}
524
526 return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), PGOFuncName);
527}
528
529Error InstrProfSymtab::create(Module &M, bool InLTO, bool AddCanonical) {
530 for (Function &F : M) {
531 // Function may not have a name: like using asm("") to overwrite the name.
532 // Ignore in this case.
533 if (!F.hasName())
534 continue;
535 auto IRPGOFuncName = getIRPGOFuncName(F, InLTO);
536 if (Error E = addFuncWithName(F, IRPGOFuncName, AddCanonical))
537 return E;
538 // Also use getPGOFuncName() so that we can find records from older profiles
539 auto PGOFuncName = getPGOFuncName(F, InLTO);
540 if (PGOFuncName != IRPGOFuncName)
541 if (Error E = addFuncWithName(F, PGOFuncName, AddCanonical))
542 return E;
543 }
544
545 for (GlobalVariable &G : M.globals()) {
546 if (!G.hasName() || !G.hasMetadata(LLVMContext::MD_type))
547 continue;
548 if (Error E = addVTableWithName(G, getPGOName(G, InLTO)))
549 return E;
550 }
551
552 Sorted = false;
553 finalizeSymtab();
554 return Error::success();
555}
556
557Error InstrProfSymtab::addVTableWithName(GlobalVariable &VTable,
558 StringRef VTablePGOName) {
559 auto NameToGUIDMap = [&](StringRef Name) -> Error {
560 if (Error E = addSymbolName(Name))
561 return E;
562
563 bool Inserted = true;
564 std::tie(std::ignore, Inserted) = MD5VTableMap.try_emplace(
566 if (!Inserted)
567 LLVM_DEBUG(dbgs() << "GUID conflict within one module");
568 return Error::success();
569 };
570 if (Error E = NameToGUIDMap(VTablePGOName))
571 return E;
572
573 StringRef CanonicalName = getCanonicalName(VTablePGOName);
574 if (!CanonicalName.empty() && CanonicalName != VTablePGOName)
575 return NameToGUIDMap(CanonicalName);
576
577 return Error::success();
578}
579
581 std::function<Error(StringRef)> NameCallback) {
582 const uint8_t *P = NameStrings.bytes_begin();
583 const uint8_t *EndP = NameStrings.bytes_end();
584 while (P < EndP) {
585 uint32_t N;
586 uint64_t UncompressedSize = decodeULEB128(P, &N);
587 P += N;
588 uint64_t CompressedSize = decodeULEB128(P, &N);
589 P += N;
590 const bool IsCompressed = (CompressedSize != 0);
591 SmallVector<uint8_t, 128> UncompressedNameStrings;
592 StringRef NameStrings;
593 if (IsCompressed) {
596
597 if (Error E = compression::zlib::decompress(ArrayRef(P, CompressedSize),
598 UncompressedNameStrings,
599 UncompressedSize)) {
600 consumeError(std::move(E));
602 }
603 P += CompressedSize;
604 NameStrings = toStringRef(UncompressedNameStrings);
605 } else {
606 NameStrings =
607 StringRef(reinterpret_cast<const char *>(P), UncompressedSize);
608 P += UncompressedSize;
609 }
610 // Now parse the name strings.
612 NameStrings.split(Names, getInstrProfNameSeparator());
613 for (StringRef &Name : Names)
614 if (Error E = NameCallback(Name))
615 return E;
616
617 while (P < EndP && *P == 0)
618 P++;
619 }
620 return Error::success();
621}
622
624 return readAndDecodeStrings(NameStrings,
625 [&](StringRef S) { return addFuncName(S); });
626}
627
629 StringRef VTableNameStrings) {
631 FuncNameStrings, [&](StringRef S) { return addFuncName(S); }))
632 return E;
633
634 return readAndDecodeStrings(VTableNameStrings,
635 [&](StringRef S) { return addVTableName(S); });
636}
637
639 StringRef CompressedVTableStrings) {
640 return readAndDecodeStrings(CompressedVTableStrings,
641 [&](StringRef S) { return addVTableName(S); });
642}
645 // In ThinLTO, local function may have been promoted to global and have
646 // suffix ".llvm." added to the function name. We need to add the
647 // stripped function name to the symbol table so that we can find a match
648 // from profile.
649 //
650 // ".__uniq." suffix is used to differentiate internal linkage functions in
651 // different modules and should be kept. This is the only suffix with the
652 // pattern ".xxx" which is kept before matching, other suffixes ".llvm." and
653 // ".part" will be stripped.
654 //
655 // Leverage the common canonicalization logic from FunctionSamples. Instead of
656 // removing all suffixes except ".__uniq.", explicitly specify the ones to be
657 // removed. This avoids the issue of colliding the canonical names of
658 // coroutine function with its await suspend wrappers or with its post-split
659 // clones. i.e. coro function foo, its wrappers
660 // (foo.__await_suspend_wrapper__init, and foo.__await_suspend_wrapper__final)
661 // and its post-split clones (foo.resume, foo.cleanup) are all canonicalized
662 // to "foo" otherwise, which can make the symtab lookup return unexpected
663 // result.
664 const SmallVector<StringRef> SuffixesToRemove{".llvm.", ".part."};
665 return FunctionSamples::getCanonicalFnName(PGOName, SuffixesToRemove);
667
668Error InstrProfSymtab::addFuncWithName(Function &F, StringRef PGOFuncName,
669 bool AddCanonical) {
670 auto NameToGUIDMap = [&](StringRef Name) -> Error {
671 if (Error E = addFuncName(Name))
672 return E;
673 MD5FuncMap.emplace_back(Function::getGUIDAssumingExternalLinkage(Name), &F);
674 return Error::success();
675 };
676 if (Error E = NameToGUIDMap(PGOFuncName))
677 return E;
678
679 if (!AddCanonical)
680 return Error::success();
681
682 StringRef CanonicalFuncName = getCanonicalName(PGOFuncName);
683 if (!CanonicalFuncName.empty() && CanonicalFuncName != PGOFuncName)
684 return NameToGUIDMap(CanonicalFuncName);
685
686 return Error::success();
687}
688
689uint64_t InstrProfSymtab::getVTableHashFromAddress(uint64_t Address) const {
690 // Given a runtime address, look up the hash value in the interval map, and
691 // fallback to value 0 if a hash value is not found.
692 return VTableAddrMap.lookup(Address, 0);
693}
694
695uint64_t InstrProfSymtab::getFunctionHashFromAddress(uint64_t Address) const {
696 finalizeSymtab();
697 auto It = partition_point(AddrToMD5Map, [=](std::pair<uint64_t, uint64_t> A) {
698 return A.first < Address;
699 });
700 // Raw function pointer collected by value profiler may be from
701 // external functions that are not instrumented. They won't have
702 // mapping data to be used by the deserializer. Force the value to
703 // be 0 in this case.
704 if (It != AddrToMD5Map.end() && It->first == Address)
705 return (uint64_t)It->second;
706 return 0;
707}
708
710 SmallVector<StringRef, 0> Sorted(NameTab.keys());
711 llvm::sort(Sorted);
712 for (StringRef S : Sorted)
713 OS << S << '\n';
714}
715
717 bool DoCompression, std::string &Result) {
718 assert(!NameStrs.empty() && "No name data to emit");
719
720 uint8_t Header[20], *P = Header;
721 std::string UncompressedNameStrings =
722 join(NameStrs.begin(), NameStrs.end(), getInstrProfNameSeparator());
723
724 assert(StringRef(UncompressedNameStrings)
725 .count(getInstrProfNameSeparator()) == (NameStrs.size() - 1) &&
726 "PGO name is invalid (contains separator token)");
727
728 unsigned EncLen = encodeULEB128(UncompressedNameStrings.length(), P);
729 P += EncLen;
730
731 auto WriteStringToResult = [&](size_t CompressedLen, StringRef InputStr) {
732 EncLen = encodeULEB128(CompressedLen, P);
733 P += EncLen;
734 char *HeaderStr = reinterpret_cast<char *>(&Header[0]);
735 unsigned HeaderLen = P - &Header[0];
736 Result.append(HeaderStr, HeaderLen);
737 Result += InputStr;
738 return Error::success();
739 };
740
741 if (!DoCompression) {
742 return WriteStringToResult(0, UncompressedNameStrings);
743 }
744
745 SmallVector<uint8_t, 128> CompressedNameStrings;
746 compression::zlib::compress(arrayRefFromStringRef(UncompressedNameStrings),
747 CompressedNameStrings,
749
750 return WriteStringToResult(CompressedNameStrings.size(),
751 toStringRef(CompressedNameStrings));
752}
753
755 auto *Arr = cast<ConstantDataArray>(NameVar->getInitializer());
756 StringRef NameStr =
757 Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
758 return NameStr;
759}
760
762 std::string &Result, bool DoCompression) {
763 std::vector<std::string> NameStrs;
764 for (auto *NameVar : NameVars) {
765 NameStrs.push_back(std::string(getPGOFuncNameVarInitializer(NameVar)));
766 }
768 NameStrs, compression::zlib::isAvailable() && DoCompression, Result);
769}
770
772 std::string &Result, bool DoCompression) {
773 std::vector<std::string> VTableNameStrs;
774 for (auto *VTable : VTables)
775 VTableNameStrs.push_back(getPGOName(*VTable));
777 VTableNameStrs, compression::zlib::isAvailable() && DoCompression,
778 Result);
779}
780
782 uint64_t FuncSum = 0;
783 Sum.NumEntries += Counts.size();
784 for (uint64_t Count : Counts)
785 FuncSum += Count;
786 Sum.CountSum += FuncSum;
787
788 for (uint32_t VK = IPVK_First; VK <= IPVK_Last; ++VK) {
789 uint64_t KindSum = 0;
791 for (size_t I = 0; I < NumValueSites; ++I) {
792 for (const auto &V : getValueArrayForSite(VK, I))
793 KindSum += V.Count;
794 }
795 Sum.ValueCounts[VK] += KindSum;
796 }
797}
798
800 uint32_t ValueKind,
801 OverlapStats &Overlap,
802 OverlapStats &FuncLevelOverlap) {
803 this->sortByTargetValues();
804 Input.sortByTargetValues();
805 double Score = 0.0f, FuncLevelScore = 0.0f;
806 auto I = ValueData.begin();
807 auto IE = ValueData.end();
808 auto J = Input.ValueData.begin();
809 auto JE = Input.ValueData.end();
810 while (I != IE && J != JE) {
811 if (I->Value == J->Value) {
812 Score += OverlapStats::score(I->Count, J->Count,
813 Overlap.Base.ValueCounts[ValueKind],
814 Overlap.Test.ValueCounts[ValueKind]);
815 FuncLevelScore += OverlapStats::score(
816 I->Count, J->Count, FuncLevelOverlap.Base.ValueCounts[ValueKind],
817 FuncLevelOverlap.Test.ValueCounts[ValueKind]);
818 ++I;
819 } else if (I->Value < J->Value) {
820 ++I;
821 continue;
822 }
823 ++J;
824 }
825 Overlap.Overlap.ValueCounts[ValueKind] += Score;
826 FuncLevelOverlap.Overlap.ValueCounts[ValueKind] += FuncLevelScore;
827}
828
829// Return false on mismatch.
832 OverlapStats &Overlap,
833 OverlapStats &FuncLevelOverlap) {
834 uint32_t ThisNumValueSites = getNumValueSites(ValueKind);
835 assert(ThisNumValueSites == Other.getNumValueSites(ValueKind));
836 if (!ThisNumValueSites)
837 return;
838
839 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
840 getOrCreateValueSitesForKind(ValueKind);
842 Other.getValueSitesForKind(ValueKind);
843 for (uint32_t I = 0; I < ThisNumValueSites; I++)
844 ThisSiteRecords[I].overlap(OtherSiteRecords[I], ValueKind, Overlap,
845 FuncLevelOverlap);
846}
847
849 OverlapStats &FuncLevelOverlap,
850 uint64_t ValueCutoff) {
851 // FuncLevel CountSum for other should already computed and nonzero.
852 assert(FuncLevelOverlap.Test.CountSum >= 1.0f);
853 accumulateCounts(FuncLevelOverlap.Base);
854 bool Mismatch = (Counts.size() != Other.Counts.size());
855
856 // Check if the value profiles mismatch.
857 if (!Mismatch) {
858 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) {
859 uint32_t ThisNumValueSites = getNumValueSites(Kind);
860 uint32_t OtherNumValueSites = Other.getNumValueSites(Kind);
861 if (ThisNumValueSites != OtherNumValueSites) {
862 Mismatch = true;
863 break;
864 }
865 }
866 }
867 if (Mismatch) {
868 Overlap.addOneMismatch(FuncLevelOverlap.Test);
869 return;
870 }
871
872 // Compute overlap for value counts.
873 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
874 overlapValueProfData(Kind, Other, Overlap, FuncLevelOverlap);
875
876 double Score = 0.0;
877 uint64_t MaxCount = 0;
878 // Compute overlap for edge counts.
879 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I) {
880 Score += OverlapStats::score(Counts[I], Other.Counts[I],
881 Overlap.Base.CountSum, Overlap.Test.CountSum);
882 MaxCount = std::max(Other.Counts[I], MaxCount);
883 }
884 Overlap.Overlap.CountSum += Score;
885 Overlap.Overlap.NumEntries += 1;
886
887 if (MaxCount >= ValueCutoff) {
888 double FuncScore = 0.0;
889 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I)
890 FuncScore += OverlapStats::score(Counts[I], Other.Counts[I],
891 FuncLevelOverlap.Base.CountSum,
892 FuncLevelOverlap.Test.CountSum);
893 FuncLevelOverlap.Overlap.CountSum = FuncScore;
894 FuncLevelOverlap.Overlap.NumEntries = Other.Counts.size();
895 FuncLevelOverlap.Valid = true;
896 }
897}
898
900 uint64_t Weight,
901 function_ref<void(instrprof_error)> Warn) {
902 this->sortByTargetValues();
903 Input.sortByTargetValues();
904 auto I = ValueData.begin();
905 auto IE = ValueData.end();
906 std::vector<InstrProfValueData> Merged;
907 Merged.reserve(std::max(ValueData.size(), Input.ValueData.size()));
908 for (const InstrProfValueData &J : Input.ValueData) {
909 while (I != IE && I->Value < J.Value) {
910 Merged.push_back(*I);
911 ++I;
912 }
913 if (I != IE && I->Value == J.Value) {
914 bool Overflowed;
915 I->Count = SaturatingMultiplyAdd(J.Count, Weight, I->Count, &Overflowed);
916 if (Overflowed)
918 Merged.push_back(*I);
919 ++I;
920 continue;
921 }
922 Merged.push_back(J);
923 }
924 Merged.insert(Merged.end(), I, IE);
925 ValueData = std::move(Merged);
926}
927
928void InstrProfValueSiteRecord::scale(uint64_t N, uint64_t D,
929 function_ref<void(instrprof_error)> Warn) {
930 for (InstrProfValueData &I : ValueData) {
931 bool Overflowed;
932 I.Count = SaturatingMultiply(I.Count, N, &Overflowed) / D;
933 if (Overflowed)
935 }
936}
937
938// Merge Value Profile data from Src record to this record for ValueKind.
939// Scale merged value counts by \p Weight.
940void InstrProfRecord::mergeValueProfData(
941 uint32_t ValueKind, InstrProfRecord &Src, uint64_t Weight,
942 function_ref<void(instrprof_error)> Warn) {
943 uint32_t ThisNumValueSites = getNumValueSites(ValueKind);
944 uint32_t OtherNumValueSites = Src.getNumValueSites(ValueKind);
945 if (ThisNumValueSites != OtherNumValueSites) {
947 return;
948 }
949 if (!ThisNumValueSites)
950 return;
951 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
952 getOrCreateValueSitesForKind(ValueKind);
954 Src.getValueSitesForKind(ValueKind);
955 for (uint32_t I = 0; I < ThisNumValueSites; I++)
956 ThisSiteRecords[I].merge(OtherSiteRecords[I], Weight, Warn);
957}
958
960 if (UniformCounts.empty())
961 return;
962
963 if (UniformCounts.size() != Counts.size()) {
964 UniformityBits.clear();
965 return;
966 }
967
968 UniformityBits.assign((Counts.size() + 7) / 8, 0xFF);
969 for (size_t I = 0, E = Counts.size(); I < E; ++I) {
970 uint64_t TotalCount = Counts[I];
971 uint64_t UniformCount = UniformCounts[I];
972 uint64_t MinUniformCount = TotalCount - TotalCount / 10;
973 bool IsUniform = UniformCount >= MinUniformCount;
974 if (!IsUniform)
975 UniformityBits[I / 8] &= ~(1 << (I % 8));
976 }
977}
978
979static void mergeUniformityBits(std::vector<uint8_t> &Dst,
980 ArrayRef<uint8_t> Src) {
981 if (Dst.empty()) {
982 Dst.assign(Src.begin(), Src.end());
983 return;
984 }
985 if (Src.empty())
986 return;
987
988 if (Dst.size() != Src.size()) {
989 Dst.clear();
990 return;
991 }
992
993 for (size_t I = 0, E = Src.size(); I < E; ++I)
994 Dst[I] &= Src[I];
995}
996
998 function_ref<void(instrprof_error)> Warn) {
999 // If the number of counters doesn't match we either have bad data
1000 // or a hash collision.
1001 if (Counts.size() != Other.Counts.size()) {
1003 return;
1004 }
1005
1007 Other.computeBlockUniformity();
1008
1009 // Special handling of the first count as the PseudoCount.
1010 CountPseudoKind OtherKind = Other.getCountPseudoKind();
1012 if (OtherKind != NotPseudo || ThisKind != NotPseudo) {
1013 // We don't allow the merge of a profile with pseudo counts and
1014 // a normal profile (i.e. without pesudo counts).
1015 // Profile supplimenation should be done after the profile merge.
1016 if (OtherKind == NotPseudo || ThisKind == NotPseudo) {
1018 return;
1019 }
1020 if (OtherKind == PseudoHot || ThisKind == PseudoHot)
1022 else
1024 return;
1025 }
1026 OffloadDeviceWaveSize = Other.OffloadDeviceWaveSize;
1027 bool HasUniformCounts = !UniformCounts.empty();
1028 bool OtherHasUniformCounts = !Other.UniformCounts.empty();
1029 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I) {
1030 bool Overflowed;
1031 uint64_t Value =
1032 SaturatingMultiplyAdd(Other.Counts[I], Weight, Counts[I], &Overflowed);
1033 if (Value > getInstrMaxCountValue()) {
1035 Overflowed = true;
1036 }
1037 Counts[I] = Value;
1038 if (Overflowed)
1040 }
1041
1042 if (HasUniformCounts && OtherHasUniformCounts) {
1043 if (UniformCounts.size() != Other.UniformCounts.size()) {
1044 UniformCounts.clear();
1045 UniformityBits.clear();
1046 } else {
1047 for (size_t I = 0, E = Other.UniformCounts.size(); I < E; ++I) {
1048 bool Overflowed;
1049 UniformCounts[I] = SaturatingMultiplyAdd(Other.UniformCounts[I], Weight,
1050 UniformCounts[I], &Overflowed);
1053 Overflowed = true;
1054 }
1055 if (Overflowed)
1057 }
1059 }
1060 } else {
1061 UniformCounts.clear();
1062 mergeUniformityBits(UniformityBits, Other.UniformityBits);
1063 }
1064
1065 // If the number of bitmap bytes doesn't match we either have bad data
1066 // or a hash collision.
1067 if (BitmapBytes.size() != Other.BitmapBytes.size()) {
1069 return;
1070 }
1071
1072 // Bitmap bytes are merged by simply ORing them together.
1073 for (size_t I = 0, E = Other.BitmapBytes.size(); I < E; ++I) {
1074 BitmapBytes[I] = Other.BitmapBytes[I] | BitmapBytes[I];
1075 }
1076
1077 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1078 mergeValueProfData(Kind, Other, Weight, Warn);
1079}
1080
1081void InstrProfRecord::scaleValueProfData(
1082 uint32_t ValueKind, uint64_t N, uint64_t D,
1083 function_ref<void(instrprof_error)> Warn) {
1084 for (auto &R : getValueSitesForKind(ValueKind))
1085 R.scale(N, D, Warn);
1086}
1087
1088void InstrProfRecord::scale(uint64_t N, uint64_t D,
1089 function_ref<void(instrprof_error)> Warn) {
1090 assert(D != 0 && "D cannot be 0");
1091 for (auto &Count : this->Counts) {
1092 bool Overflowed;
1093 Count = SaturatingMultiply(Count, N, &Overflowed) / D;
1094 if (Count > getInstrMaxCountValue()) {
1096 Overflowed = true;
1097 }
1098 if (Overflowed)
1100 }
1101 for (auto &Count : this->UniformCounts) {
1102 bool Overflowed;
1103 Count = SaturatingMultiply(Count, N, &Overflowed) / D;
1104 if (Count > getInstrMaxCountValue()) {
1106 Overflowed = true;
1107 }
1108 if (Overflowed)
1110 }
1112 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1113 scaleValueProfData(Kind, N, D, Warn);
1114}
1115
1116// Map indirect call target name hash to name string.
1117uint64_t InstrProfRecord::remapValue(uint64_t Value, uint32_t ValueKind,
1118 InstrProfSymtab *SymTab) {
1119 if (!SymTab)
1120 return Value;
1121
1122 if (ValueKind == IPVK_IndirectCallTarget)
1123 return SymTab->getFunctionHashFromAddress(Value);
1124
1125 if (ValueKind == IPVK_VTableTarget)
1126 return SymTab->getVTableHashFromAddress(Value);
1127
1128 return Value;
1129}
1130
1134 // Remap values.
1135 std::vector<InstrProfValueData> RemappedVD;
1136 RemappedVD.reserve(VData.size());
1137 for (const auto &V : VData) {
1138 uint64_t NewValue = remapValue(V.Value, ValueKind, ValueMap);
1139 RemappedVD.push_back({NewValue, V.Count});
1140 }
1141
1142 std::vector<InstrProfValueSiteRecord> &ValueSites =
1143 getOrCreateValueSitesForKind(ValueKind);
1144 assert(ValueSites.size() == Site);
1145
1146 // Add a new value site with remapped value profiling data.
1147 ValueSites.emplace_back(std::move(RemappedVD));
1148}
1149
1151 ArrayRef<TemporalProfTraceTy> Traces, std::vector<BPFunctionNode> &Nodes,
1152 bool RemoveOutlierUNs) {
1153 using IDT = BPFunctionNode::IDT;
1154 using UtilityNodeT = BPFunctionNode::UtilityNodeT;
1155 UtilityNodeT MaxUN = 0;
1156 DenseMap<IDT, size_t> IdToFirstTimestamp;
1157 DenseMap<IDT, UtilityNodeT> IdToFirstUN;
1159 // TODO: We need to use the Trace.Weight field to give more weight to more
1160 // important utilities
1161 for (auto &Trace : Traces) {
1162 size_t CutoffTimestamp = 1;
1163 for (size_t Timestamp = 0; Timestamp < Trace.FunctionNameRefs.size();
1164 Timestamp++) {
1165 IDT Id = Trace.FunctionNameRefs[Timestamp];
1166 auto [It, WasInserted] = IdToFirstTimestamp.try_emplace(Id, Timestamp);
1167 if (!WasInserted)
1168 It->getSecond() = std::min<size_t>(It->getSecond(), Timestamp);
1169 if (Timestamp >= CutoffTimestamp) {
1170 ++MaxUN;
1171 CutoffTimestamp = 2 * Timestamp;
1172 }
1173 IdToFirstUN.try_emplace(Id, MaxUN);
1174 }
1175 for (auto &[Id, FirstUN] : IdToFirstUN)
1176 for (auto UN = FirstUN; UN <= MaxUN; ++UN)
1177 IdToUNs[Id].push_back(UN);
1178 ++MaxUN;
1179 IdToFirstUN.clear();
1180 }
1181
1182 if (RemoveOutlierUNs) {
1184 for (auto &[Id, UNs] : IdToUNs)
1185 for (auto &UN : UNs)
1186 ++UNFrequency[UN];
1187 // Filter out utility nodes that are too infrequent or too prevalent to make
1188 // BalancedPartitioning more effective.
1189 for (auto &[Id, UNs] : IdToUNs)
1190 llvm::erase_if(UNs, [&](auto &UN) {
1191 unsigned Freq = UNFrequency[UN];
1192 return Freq <= 1 || 2 * Freq > IdToUNs.size();
1193 });
1194 }
1195
1196 for (auto &[Id, UNs] : IdToUNs)
1197 Nodes.emplace_back(Id, UNs);
1198
1199 // Since BalancedPartitioning is sensitive to the initial order, we explicitly
1200 // order nodes by their earliest timestamp.
1201 llvm::sort(Nodes, [&](auto &L, auto &R) {
1202 return std::make_pair(IdToFirstTimestamp[L.Id], L.Id) <
1203 std::make_pair(IdToFirstTimestamp[R.Id], R.Id);
1204 });
1205}
1206
1207#define INSTR_PROF_COMMON_API_IMPL
1209
1210/*!
1211 * ValueProfRecordClosure Interface implementation for InstrProfRecord
1212 * class. These C wrappers are used as adaptors so that C++ code can be
1213 * invoked as callbacks.
1214 */
1216 return reinterpret_cast<const InstrProfRecord *>(Record)->getNumValueKinds();
1217}
1218
1220 return reinterpret_cast<const InstrProfRecord *>(Record)
1221 ->getNumValueSites(VKind);
1222}
1223
1225 return reinterpret_cast<const InstrProfRecord *>(Record)
1226 ->getNumValueData(VKind);
1227}
1228
1230 uint32_t S) {
1231 const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1232 return IPR->getValueArrayForSite(VK, S).size();
1233}
1234
1235void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst,
1236 uint32_t K, uint32_t S) {
1237 const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1238 llvm::copy(IPR->getValueArrayForSite(K, S), Dst);
1239}
1240
1242 ValueProfData *VD = new (::operator new(TotalSizeInBytes)) ValueProfData();
1243 memset(VD, 0, TotalSizeInBytes);
1244 return VD;
1245}
1246
1256
1257// Wrapper implementation using the closure mechanism.
1258uint32_t ValueProfData::getSize(const InstrProfRecord &Record) {
1259 auto Closure = InstrProfRecordClosure;
1260 Closure.Record = &Record;
1261 return getValueProfDataSize(&Closure);
1262}
1263
1264// Wrapper implementation using the closure mechanism.
1265std::unique_ptr<ValueProfData>
1266ValueProfData::serializeFrom(const InstrProfRecord &Record) {
1268
1269 std::unique_ptr<ValueProfData> VPD(
1271 return VPD;
1272}
1273
1274void ValueProfRecord::deserializeTo(InstrProfRecord &Record,
1275 InstrProfSymtab *SymTab) {
1276 Record.reserveSites(Kind, NumValueSites);
1277
1278 InstrProfValueData *ValueData = getValueProfRecordValueData(this);
1279 for (uint64_t VSite = 0; VSite < NumValueSites; ++VSite) {
1280 uint8_t ValueDataCount = this->SiteCountArray[VSite];
1281 ArrayRef<InstrProfValueData> VDs(ValueData, ValueDataCount);
1282 Record.addValueData(Kind, VSite, VDs, SymTab);
1283 ValueData += ValueDataCount;
1284 }
1285}
1286
1287// For writing/serializing, Old is the host endianness, and New is
1288// byte order intended on disk. For Reading/deserialization, Old
1289// is the on-disk source endianness, and New is the host endianness.
1290void ValueProfRecord::swapBytes(llvm::endianness Old, llvm::endianness New) {
1291 using namespace support;
1292
1293 if (Old == New)
1294 return;
1295
1296 if (llvm::endianness::native != Old) {
1299 }
1300 uint32_t ND = getValueProfRecordNumValueData(this);
1301 InstrProfValueData *VD = getValueProfRecordValueData(this);
1302
1303 // No need to swap byte array: SiteCountArrray.
1304 for (uint32_t I = 0; I < ND; I++) {
1307 }
1308 if (llvm::endianness::native == Old) {
1311 }
1312}
1313
1314void ValueProfData::deserializeTo(InstrProfRecord &Record,
1315 InstrProfSymtab *SymTab) {
1316 if (NumValueKinds == 0)
1317 return;
1318
1319 ValueProfRecord *VR = getFirstValueProfRecord(this);
1320 for (uint32_t K = 0; K < NumValueKinds; K++) {
1321 VR->deserializeTo(Record, SymTab);
1322 VR = getValueProfRecordNext(VR);
1323 }
1324}
1325
1326static std::unique_ptr<ValueProfData> allocValueProfData(uint32_t TotalSize) {
1327 return std::unique_ptr<ValueProfData>(new (::operator new(TotalSize))
1328 ValueProfData());
1329}
1330
1331Error ValueProfData::checkIntegrity() {
1332 if (NumValueKinds > IPVK_Last + 1)
1334 instrprof_error::malformed, "number of value profile kinds is invalid");
1335 // Total size needs to be multiple of quadword size.
1336 if (TotalSize % sizeof(uint64_t))
1338 instrprof_error::malformed, "total size is not multiples of quardword");
1339
1340 ValueProfRecord *VR = getFirstValueProfRecord(this);
1341 for (uint32_t K = 0; K < this->NumValueKinds; K++) {
1342 if (VR->Kind > IPVK_Last)
1344 "value kind is invalid");
1345 VR = getValueProfRecordNext(VR);
1346 if ((char *)VR - (char *)this > (ptrdiff_t)TotalSize)
1349 "value profile address is greater than total size");
1350 }
1351 return Error::success();
1352}
1353
1355ValueProfData::getValueProfData(const unsigned char *D,
1356 const unsigned char *const BufferEnd,
1357 llvm::endianness Endianness) {
1358 using namespace support;
1359
1360 if (D + sizeof(ValueProfData) > BufferEnd)
1362
1363 const unsigned char *Header = D;
1364 uint32_t TotalSize = endian::readNext<uint32_t>(Header, Endianness);
1365
1366 if (D + TotalSize > BufferEnd)
1368
1369 std::unique_ptr<ValueProfData> VPD = allocValueProfData(TotalSize);
1370 memcpy(VPD.get(), D, TotalSize);
1371 // Byte swap.
1372 VPD->swapBytesToHost(Endianness);
1373
1374 Error E = VPD->checkIntegrity();
1375 if (E)
1376 return std::move(E);
1377
1378 return std::move(VPD);
1379}
1380
1381void ValueProfData::swapBytesToHost(llvm::endianness Endianness) {
1382 using namespace support;
1383
1384 if (Endianness == llvm::endianness::native)
1385 return;
1386
1389
1390 ValueProfRecord *VR = getFirstValueProfRecord(this);
1391 for (uint32_t K = 0; K < NumValueKinds; K++) {
1392 VR->swapBytes(Endianness, llvm::endianness::native);
1393 VR = getValueProfRecordNext(VR);
1394 }
1395}
1396
1397void ValueProfData::swapBytesFromHost(llvm::endianness Endianness) {
1398 using namespace support;
1399
1400 if (Endianness == llvm::endianness::native)
1401 return;
1402
1403 ValueProfRecord *VR = getFirstValueProfRecord(this);
1404 for (uint32_t K = 0; K < NumValueKinds; K++) {
1405 ValueProfRecord *NVR = getValueProfRecordNext(VR);
1406 VR->swapBytes(llvm::endianness::native, Endianness);
1407 VR = NVR;
1408 }
1411}
1412
1414 const InstrProfRecord &InstrProfR,
1415 InstrProfValueKind ValueKind, uint32_t SiteIdx,
1416 uint32_t MaxMDCount) {
1417 auto VDs = InstrProfR.getValueArrayForSite(ValueKind, SiteIdx);
1418 if (VDs.empty())
1419 return;
1420 uint64_t Sum = 0;
1421 for (const InstrProfValueData &V : VDs)
1422 Sum = SaturatingAdd(Sum, V.Count);
1423 annotateValueSite(M, Inst, VDs, Sum, ValueKind, MaxMDCount);
1424}
1425
1428 uint64_t Sum, InstrProfValueKind ValueKind,
1429 uint32_t MaxMDCount) {
1430 if (VDs.empty())
1431 return;
1432 LLVMContext &Ctx = M.getContext();
1433 MDBuilder MDHelper(Ctx);
1435 // Tag
1437 // Value Kind
1438 Vals.push_back(MDHelper.createConstant(
1439 ConstantInt::get(Type::getInt32Ty(Ctx), ValueKind)));
1440 // Total Count
1441 Vals.push_back(
1442 MDHelper.createConstant(ConstantInt::get(Type::getInt64Ty(Ctx), Sum)));
1443
1444 // Value Profile Data
1445 uint32_t MDCount = MaxMDCount;
1446 // Zero values might occur multiple times (e.g., multiple functions that
1447 // cannot be remapped). Deduplicate them to enforce the variant that
1448 // values are unique, which allows passes to make some simplifying
1449 // assumptions.
1450 // TODO(boomanaiden154): This fits more naturally in addValueData, but
1451 // preserving the current behavior is necessary for some error handling
1452 // paths. When that gets cleaned up, we should move this there.
1453 // TODO(boomanaiden154): We are also deduplicating non-zero values.
1454 // These are rare and should only come from corrupted profiles, so we
1455 // just skip them. Remove this when they are fixed properly in
1456 // llvm-profdata.
1457 uint64_t ZeroCount = 0;
1458 DenseSet<uint64_t> VisitedValues;
1459 for (const auto &VD : VDs) {
1460 auto [_, ValueInserted] = VisitedValues.insert(VD.Value);
1461 if (VD.Value != 0 && !ValueInserted)
1462 continue;
1463 if (VD.Value == 0) {
1464 ZeroCount += VD.Count;
1465 } else {
1466 Vals.push_back(MDHelper.createConstant(
1467 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Value)));
1468 Vals.push_back(MDHelper.createConstant(
1469 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Count)));
1470 }
1471 if (--MDCount == 0)
1472 break;
1473 }
1474 if (ZeroCount != 0) {
1475 Vals.push_back(
1476 MDHelper.createConstant(ConstantInt::get(Type::getInt64Ty(Ctx), 0)));
1477 Vals.push_back(MDHelper.createConstant(
1478 ConstantInt::get(Type::getInt64Ty(Ctx), ZeroCount)));
1479 }
1480 // Only add metadata if we have at least one value. Otherwise we will end
1481 // up adding invalid metadata in the case where the profile only has a
1482 // zero value with a zero count.
1483 if (Vals.size() >= 5)
1484 Inst.setMetadata(LLVMContext::MD_prof, MDNode::get(Ctx, Vals));
1485}
1486
1488 InstrProfValueKind ValueKind) {
1489 MDNode *MD = Inst.getMetadata(LLVMContext::MD_prof);
1490 if (!MD)
1491 return nullptr;
1492
1493 if (MD->getNumOperands() < 5)
1494 return nullptr;
1495
1497 if (!Tag || Tag->getString() != MDProfLabels::ValueProfile)
1498 return nullptr;
1499
1500 // Now check kind:
1502 if (!KindInt)
1503 return nullptr;
1504 if (KindInt->getZExtValue() != ValueKind)
1505 return nullptr;
1506
1507 return MD;
1508}
1509
1512 uint32_t MaxNumValueData, uint64_t &TotalC,
1513 bool GetNoICPValue) {
1514 // Four inline elements seem to work well in practice. With MaxNumValueData,
1515 // this array won't grow very big anyway.
1517 MDNode *MD = mayHaveValueProfileOfKind(Inst, ValueKind);
1518 if (!MD)
1519 return ValueData;
1520 const unsigned NOps = MD->getNumOperands();
1521 // Get total count
1523 if (!TotalCInt)
1524 return ValueData;
1525 TotalC = TotalCInt->getZExtValue();
1526
1527 ValueData.reserve((NOps - 3) / 2);
1528 for (unsigned I = 3; I < NOps; I += 2) {
1529 if (ValueData.size() >= MaxNumValueData)
1530 break;
1534 if (!Value || !Count) {
1535 ValueData.clear();
1536 return ValueData;
1537 }
1538 uint64_t CntValue = Count->getZExtValue();
1539 if (!GetNoICPValue && (CntValue == NOMORE_ICP_MAGICNUM))
1540 continue;
1541 InstrProfValueData V;
1542 V.Value = Value->getZExtValue();
1543 V.Count = CntValue;
1544 ValueData.push_back(V);
1545 }
1546 return ValueData;
1547}
1548
1550 return F.getMetadata(getPGOFuncNameMetadataName());
1551}
1552
1553static void createPGONameMetadata(GlobalObject &GO, StringRef MetadataName,
1554 StringRef PGOName) {
1555 // Only for internal linkage functions or global variables. The name is not
1556 // the same as PGO name for these global objects.
1557 if (GO.getName() == PGOName)
1558 return;
1559
1560 // Don't create duplicated metadata.
1561 if (GO.getMetadata(MetadataName))
1562 return;
1563
1564 LLVMContext &C = GO.getContext();
1565 MDNode *N = MDNode::get(C, MDString::get(C, PGOName));
1566 GO.setMetadata(MetadataName, N);
1567}
1568
1570 return createPGONameMetadata(F, getPGOFuncNameMetadataName(), PGOFuncName);
1571}
1572
1574 return createPGONameMetadata(GO, getPGONameMetadataName(), PGOName);
1575}
1576
1577bool needsComdatForCounter(const GlobalObject &GO, const Module &M) {
1578 if (GO.hasComdat())
1579 return true;
1580
1581 if (!M.getTargetTriple().supportsCOMDAT())
1582 return false;
1583
1584 // See createPGOFuncNameVar for more details. To avoid link errors, profile
1585 // counters for function with available_externally linkage needs to be changed
1586 // to linkonce linkage. On ELF based systems, this leads to weak symbols to be
1587 // created. Without using comdat, duplicate entries won't be removed by the
1588 // linker leading to increased data segement size and raw profile size. Even
1589 // worse, since the referenced counter from profile per-function data object
1590 // will be resolved to the common strong definition, the profile counts for
1591 // available_externally functions will end up being duplicated in raw profile
1592 // data. This can result in distorted profile as the counts of those dups
1593 // will be accumulated by the profile merger.
1595 if (Linkage != GlobalValue::ExternalWeakLinkage &&
1597 return false;
1598
1599 return true;
1600}
1601
1602// Check if INSTR_PROF_RAW_VERSION_VAR is defined.
1603bool isIRPGOFlagSet(const Module *M) {
1604 const GlobalVariable *IRInstrVar =
1605 M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR));
1606 if (!IRInstrVar || IRInstrVar->hasLocalLinkage())
1607 return false;
1608
1609 // For CSPGO+LTO, this variable might be marked as non-prevailing and we only
1610 // have the decl.
1611 if (IRInstrVar->isDeclaration())
1612 return true;
1613
1614 // Check if the flag is set.
1615 if (!IRInstrVar->hasInitializer())
1616 return false;
1617
1618 auto *InitVal = dyn_cast_or_null<ConstantInt>(IRInstrVar->getInitializer());
1619 if (!InitVal)
1620 return false;
1621 return (InitVal->getZExtValue() & VARIANT_MASK_IR_PROF) != 0;
1622}
1623
1624// Check if we can safely rename this Comdat function.
1625bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken) {
1626 if (F.getName().empty())
1627 return false;
1628 if (!needsComdatForCounter(F, *(F.getParent())))
1629 return false;
1630 // Unsafe to rename the address-taken function (which can be used in
1631 // function comparison).
1632 if (CheckAddressTaken && F.hasAddressTaken())
1633 return false;
1634 // Only safe to do if this function may be discarded if it is not used
1635 // in the compilation unit.
1636 if (!GlobalValue::isDiscardableIfUnused(F.getLinkage()))
1637 return false;
1638
1639 // For AvailableExternallyLinkage functions.
1640 if (!F.hasComdat()) {
1642 return true;
1643 }
1644 return true;
1645}
1646
1647// Create the variable for the profile file name.
1648void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput) {
1649 if (InstrProfileOutput.empty())
1650 return;
1651 Constant *ProfileNameConst =
1652 ConstantDataArray::getString(M.getContext(), InstrProfileOutput, true);
1653 GlobalVariable *ProfileNameVar = new GlobalVariable(
1654 M, ProfileNameConst->getType(), true, GlobalValue::WeakAnyLinkage,
1657 Triple TT(M.getTargetTriple());
1658 if (TT.supportsCOMDAT()) {
1660 ProfileNameVar->setComdat(M.getOrInsertComdat(
1662 }
1663}
1664
1666 const std::string &TestFilename,
1667 bool IsCS) {
1668 auto GetProfileSum = [IsCS](const std::string &Filename,
1669 CountSumOrPercent &Sum) -> Error {
1670 // This function is only used from llvm-profdata that doesn't use any kind
1671 // of VFS. Just create a default RealFileSystem to read profiles.
1672 auto FS = vfs::getRealFileSystem();
1673 auto ReaderOrErr = InstrProfReader::create(Filename, *FS);
1674 if (Error E = ReaderOrErr.takeError()) {
1675 return E;
1676 }
1677 auto Reader = std::move(ReaderOrErr.get());
1678 Reader->accumulateCounts(Sum, IsCS);
1679 return Error::success();
1680 };
1681 auto Ret = GetProfileSum(BaseFilename, Base);
1682 if (Ret)
1683 return Ret;
1684 Ret = GetProfileSum(TestFilename, Test);
1685 if (Ret)
1686 return Ret;
1687 this->BaseFilename = &BaseFilename;
1688 this->TestFilename = &TestFilename;
1689 Valid = true;
1690 return Error::success();
1691}
1692
1694 Mismatch.NumEntries += 1;
1695 Mismatch.CountSum += MismatchFunc.CountSum / Test.CountSum;
1696 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1697 if (Test.ValueCounts[I] >= 1.0f)
1698 Mismatch.ValueCounts[I] +=
1699 MismatchFunc.ValueCounts[I] / Test.ValueCounts[I];
1700 }
1701}
1702
1704 Unique.NumEntries += 1;
1705 Unique.CountSum += UniqueFunc.CountSum / Test.CountSum;
1706 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1707 if (Test.ValueCounts[I] >= 1.0f)
1708 Unique.ValueCounts[I] += UniqueFunc.ValueCounts[I] / Test.ValueCounts[I];
1709 }
1710}
1711
1713 if (!Valid)
1714 return;
1715
1716 const char *EntryName =
1717 (Level == ProgramLevel ? "functions" : "edge counters");
1718 if (Level == ProgramLevel) {
1719 OS << "Profile overlap information for base_profile: " << *BaseFilename
1720 << " and test_profile: " << *TestFilename << "\nProgram level:\n";
1721 } else {
1722 OS << "Function level:\n"
1723 << " Function: " << FuncName << " (Hash=" << FuncHash << ")\n";
1724 }
1725
1726 OS << " # of " << EntryName << " overlap: " << Overlap.NumEntries << "\n";
1727 if (Mismatch.NumEntries)
1728 OS << " # of " << EntryName << " mismatch: " << Mismatch.NumEntries
1729 << "\n";
1730 if (Unique.NumEntries)
1731 OS << " # of " << EntryName
1732 << " only in test_profile: " << Unique.NumEntries << "\n";
1733
1734 OS << " Edge profile overlap: " << format("%.3f%%", Overlap.CountSum * 100)
1735 << "\n";
1736 if (Mismatch.NumEntries)
1737 OS << " Mismatched count percentage (Edge): "
1738 << format("%.3f%%", Mismatch.CountSum * 100) << "\n";
1739 if (Unique.NumEntries)
1740 OS << " Percentage of Edge profile only in test_profile: "
1741 << format("%.3f%%", Unique.CountSum * 100) << "\n";
1742 OS << " Edge profile base count sum: " << format("%.0f", Base.CountSum)
1743 << "\n"
1744 << " Edge profile test count sum: " << format("%.0f", Test.CountSum)
1745 << "\n";
1746
1747 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1748 if (Base.ValueCounts[I] < 1.0f && Test.ValueCounts[I] < 1.0f)
1749 continue;
1750 char ProfileKindName[20] = {0};
1751 switch (I) {
1752 case IPVK_IndirectCallTarget:
1753 strncpy(ProfileKindName, "IndirectCall", 19);
1754 break;
1755 case IPVK_MemOPSize:
1756 strncpy(ProfileKindName, "MemOP", 19);
1757 break;
1758 case IPVK_VTableTarget:
1759 strncpy(ProfileKindName, "VTable", 19);
1760 break;
1761 default:
1762 snprintf(ProfileKindName, 19, "VP[%d]", I);
1763 break;
1764 }
1765 OS << " " << ProfileKindName
1766 << " profile overlap: " << format("%.3f%%", Overlap.ValueCounts[I] * 100)
1767 << "\n";
1768 if (Mismatch.NumEntries)
1769 OS << " Mismatched count percentage (" << ProfileKindName
1770 << "): " << format("%.3f%%", Mismatch.ValueCounts[I] * 100) << "\n";
1771 if (Unique.NumEntries)
1772 OS << " Percentage of " << ProfileKindName
1773 << " profile only in test_profile: "
1774 << format("%.3f%%", Unique.ValueCounts[I] * 100) << "\n";
1775 OS << " " << ProfileKindName
1776 << " profile base count sum: " << format("%.0f", Base.ValueCounts[I])
1777 << "\n"
1778 << " " << ProfileKindName
1779 << " profile test count sum: " << format("%.0f", Test.ValueCounts[I])
1780 << "\n";
1781 }
1782}
1783
1784namespace IndexedInstrProf {
1785Expected<Header> Header::readFromBuffer(const unsigned char *Buffer) {
1786 using namespace support;
1787 static_assert(std::is_standard_layout_v<Header>,
1788 "Use standard layout for Header for simplicity");
1789 Header H;
1790
1792 // Check the magic number.
1793 if (H.Magic != IndexedInstrProf::Magic)
1795
1796 // Read the version.
1798 if (H.getIndexedProfileVersion() >
1801
1803 "Please update the reader as needed when a new field is added "
1804 "or when indexed profile version gets bumped.");
1805
1806 Buffer += sizeof(uint64_t); // Skip Header.Unused field.
1809 if (H.getIndexedProfileVersion() >= 8)
1810 H.MemProfOffset =
1812 if (H.getIndexedProfileVersion() >= 9)
1813 H.BinaryIdOffset =
1815 // Version 11 is handled by this condition.
1816 if (H.getIndexedProfileVersion() >= 10)
1817 H.TemporalProfTracesOffset =
1819 if (H.getIndexedProfileVersion() >= 12)
1820 H.VTableNamesOffset =
1822 return H;
1823}
1824
1826 return GET_VERSION(Version);
1827}
1828
1829size_t Header::size() const {
1830 switch (getIndexedProfileVersion()) {
1831 // To retain backward compatibility, new fields must be appended to the end
1832 // of the header, and byte offset of existing fields shouldn't change when
1833 // indexed profile version gets incremented.
1834 static_assert(
1836 "Please update the size computation below if a new field has "
1837 "been added to the header; for a version bump without new "
1838 "fields, add a case statement to fall through to the latest version.");
1839 case 14ull: // UniformityBits added in record data, no header change
1840 case 13ull:
1841 case 12ull:
1842 return 72;
1843 case 11ull:
1844 [[fallthrough]];
1845 case 10ull:
1846 return 64;
1847 case 9ull:
1848 return 56;
1849 case 8ull:
1850 return 48;
1851 default: // Version7 (when the backwards compatible header was introduced).
1852 return 40;
1853 }
1854}
1855
1856} // namespace IndexedInstrProf
1857
1858} // end namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
unsigned uint64_t
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define _
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="")
Definition InstrProf.cpp:83
#define INSTR_PROF_QUOTE(x)
#define GET_VERSION(V)
#define INSTR_PROF_PROFILE_NAME_VAR
#define INSTR_PROF_RAW_VERSION_VAR
#define VARIANT_MASK_IR_PROF
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define H(x, y, z)
Definition MD5.cpp:56
This file contains the declarations for metadata subclasses.
#define T
static constexpr StringLiteral Filename
#define P(N)
This file contains the declarations for profiling metadata utility functions.
const char * Msg
static const char * name
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
#define LLVM_DEBUG(...)
Definition Debug.h:119
Defines the virtual file system interface vfs::FileSystem.
The Input class is used to parse a yaml document into in-memory structs and vectors.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:130
size_t size() const
Get the array size.
Definition ArrayRef.h:141
iterator begin() const
Definition ArrayRef.h:129
bool empty() const
Check if the array is empty.
Definition ArrayRef.h:136
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:168
This is an important base class in LLVM.
Definition Constant.h:43
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition DenseMap.h:299
unsigned size() const
Definition DenseMap.h:172
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void setComdat(Comdat *C)
Definition Globals.cpp:287
bool hasComdat() const
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this GlobalObject.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:80
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...
Definition Globals.cpp:408
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
void setLinkage(LinkageTypes LT)
Module * getParent()
Get the module that this global value is contained inside of...
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
Definition Globals.cpp:234
void setVisibility(VisibilityTypes V)
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition GlobalValue.h:55
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:56
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,...
Definition InstrProf.h:519
static LLVM_ABI StringRef getCanonicalName(StringRef PGOName)
Error addSymbolName(StringRef SymbolName)
Definition InstrProf.h:649
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
Definition InstrProf.h:671
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.
Definition InstrProf.h:667
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.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI ConstantAsMetadata * createConstant(Constant *C)
Return the given constant as metadata.
Definition MDBuilder.cpp:25
LLVM_ABI MDString * createString(StringRef Str)
Return the given string as metadata.
Definition MDBuilder.cpp:21
Metadata node.
Definition Metadata.h:1069
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1426
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1432
A single uniqued string.
Definition Metadata.h:722
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:615
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
const std::string & getSourceFileName() const
Get the module's original source file name.
Definition Module.h:305
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
raw_ostream & OS
Definition InstrProf.h:87
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
Definition InstrProf.h:88
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:736
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
const unsigned char * bytes_end() const
Definition StringRef.h:125
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:597
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
constexpr bool empty() const
Check if the string is empty.
Definition StringRef.h:141
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:635
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
const unsigned char * bytes_begin() const
Definition StringRef.h:122
unsigned size() const
Definition Trace.h:96
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
See the file comment.
Definition ValueMap.h:84
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:255
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:258
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:319
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
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.
Definition raw_ostream.h:53
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.
static StringRef getCanonicalFnName(const Function &F)
Return the canonical name for a function, taking into account suffix elision policy attributes.
const uint64_t Magic
Definition InstrProf.h:1194
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
Definition Compression.h:40
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition Metadata.h:696
value_type byte_swap(value_type value, endianness endian)
Swap the bytes of value to match the given endianness.
Definition Endian.h:45
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
Definition Endian.h:67
LLVM_ABI bool is_separator(char value, Style style=Style::native)
Check whether the given char is a path separator on the host OS.
Definition Path.cpp:618
void swapByteOrder(T &Value)
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.
Definition InstrProf.h:131
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.
ArrayRef< CharT > arrayRefFromStringRef(StringRef Input)
Construct an array ref of bytes from a string ref.
LLVM_ABI std::string getIRPGOFuncName(const Function &F, bool InLTO=false)
StringRef getPGOFuncNameMetadataName()
Definition InstrProf.h:353
RelativeUniformCounterPtr ValuesPtrExpr NumValueSites[IPVK_Last+1]
Definition InstrProf.h:95
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.
Definition STLExtras.h:2129
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.
Definition LEB128.h:130
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.
INSTR_PROF_VISIBILITY ValueProfRecord * getValueProfRecordNext(ValueProfRecord *VPR)
Use this method to advance to the next This ValueProfRecord.
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)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr UniformCountersBegin(uintptr_t) UniformCountersBegin -(uintptr_t) DataBegin struct llvm::ValueProfData ValueProfData
This is the header of the data structure that defines the on-disk layout of the value profile data of...
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.
Definition InstrProf.h:97
LLVM_ABI bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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...
INSTR_PROF_VISIBILITY uint32_t getValueProfDataSize(ValueProfRecordClosure *Closure)
Return the total size in bytes of the on-disk value profile data given the data stored in Record.
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)
Definition STLExtras.h:1636
InstrProfSectKind
Definition InstrProf.h:91
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.
Definition Debug.cpp:209
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.
Definition MathExtras.h:679
INSTR_PROF_VISIBILITY ValueProfRecord * getFirstValueProfRecord(ValueProfData *VPD)
Return the first ValueProfRecord instance.
StringRef getInstrProfNameSeparator()
Return the marker used to separate PGO names during serialization.
Definition InstrProf.h:225
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...
INSTR_PROF_VISIBILITY ValueProfData * serializeValueProfDataFrom(ValueProfRecordClosure *Closure, ValueProfData *DstData)
Extract value profile data of a function from the Closure and serialize the data into DstData if it i...
INSTR_PROF_VISIBILITY InstrProfValueData * getValueProfRecordValueData(ValueProfRecord *VPR)
Return the pointer to the start of value data array.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition Format.h:102
static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO, MDNode *PGONameMetadata)
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
@ Other
Any other memory.
Definition ModRef.h:68
std::string join(IteratorT Begin, IteratorT End, StringRef Separator)
Joins the strings in the range [Begin, End), adding Separator between the elements.
instrprof_error
Definition InstrProf.h:410
InstrProfValueKind
Definition InstrProf.h:323
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.
Definition MathExtras.h:633
LLVM_ABI const std::error_category & instrprof_category()
LLVM_ABI Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
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...
Definition STLExtras.h:2012
static StringRef getStrippedSourceFileName(const GlobalObject &GO)
ArrayRef(const T &OneElt) -> ArrayRef< T >
uint32_t getNumValueSitesInstrProf(const void *Record, uint32_t VKind)
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1885
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
Definition GlobalValue.h:47
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,...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2192
void setPGOFuncVisibility(Module &M, GlobalVariable *FuncNameVar)
INSTR_PROF_VISIBILITY INSTR_PROF_INLINE uint32_t getValueProfRecordNumValueData(ValueProfRecord *This)
Return the total number of value data for This record.
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
Definition LEB128.h:79
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 void mergeUniformityBits(std::vector< uint8_t > &Dst, ArrayRef< uint8_t > Src)
endianness
Definition bit.h:71
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.
Definition MathExtras.h:604
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()
Definition InstrProf.h:355
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1106
const uint64_t NOMORE_ICP_MAGICNUM
Magic number in the value profile metadata showing a target has been promoted for the instruction and...
Definition Metadata.h:59
StringRef toStringRef(bool B)
Construct a string ref from a boolean.
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."))
#define N
std::array< double, IPVK_Last - IPVK_First+1 > ValueCounts
Definition InstrProf.h:820
LLVM_ABI uint64_t getIndexedProfileVersion() const
LLVM_ABI size_t size() const
static LLVM_ABI Expected< Header > readFromBuffer(const unsigned char *Buffer)
Profiling information for a single function.
Definition InstrProf.h:908
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
Definition InstrProf.h:909
ArrayRef< InstrProfValueData > getValueArrayForSite(uint32_t ValueKind, uint32_t Site) const
Return the array of profiled values at Site.
Definition InstrProf.h:1154
uint16_t OffloadDeviceWaveSize
Definition InstrProf.h:918
CountPseudoKind getCountPseudoKind() const
Definition InstrProf.h:1037
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.
Definition InstrProf.h:1149
std::vector< uint64_t > UniformCounts
For AMDGPU offload profiling: raw or merged uniform counters.
Definition InstrProf.h:913
void setPseudoCount(CountPseudoKind Kind)
Definition InstrProf.h:1045
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.
std::vector< uint8_t > UniformityBits
For AMDGPU offload profiling: 1 bit per basic block indicating whether the block is usually entered w...
Definition InstrProf.h:917
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
Definition InstrProf.h:910
LLVM_ABI void computeBlockUniformity()
Recompute uniformity metadata from raw uniform counters, when present.
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.
Definition InstrProf.h:885
std::vector< InstrProfValueData > ValueData
Value profiling data pairs at a given value site.
Definition InstrProf.h:878
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)
Definition InstrProf.h:861
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
Definition InstrProf.h:837
CountSumOrPercent Base
Definition InstrProf.h:833
LLVM_ABI void addOneUnique(const CountSumOrPercent &UniqueFunc)
const std::string * BaseFilename
Definition InstrProf.h:841
const std::string * TestFilename
Definition InstrProf.h:842
CountSumOrPercent Unique
Definition InstrProf.h:839
CountSumOrPercent Mismatch
Definition InstrProf.h:838
StringRef FuncName
Definition InstrProf.h:843
OverlapStatsLevel Level
Definition InstrProf.h:840
CountSumOrPercent Test
Definition InstrProf.h:835
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...
This is the header of the data structure that defines the on-disk layout of the value profile data of...
Definition InstrProf.h:477
uint32_t NumValueKinds
Definition InstrProf.h:491