LLVM 23.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;
86 raw_string_ostream OS(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 << "unsupported instrumentation profile format version";
106 break;
108 OS << "unsupported instrumentation profile hash type";
109 break;
111 OS << "too much profile data";
112 break;
114 OS << "truncated profile data";
115 break;
117 OS << "malformed instrumentation profile data";
118 break;
120 OS << "debug info/binary for correlation is required";
121 break;
123 OS << "debug info/binary for correlation is not necessary";
124 break;
126 OS << "unable to correlate profile";
127 break;
129 OS << "invalid profile created. Please file a bug "
130 "at: " BUG_REPORT_URL
131 " and include the profraw files that caused this error.";
132 break;
134 OS << "no profile data available for function";
135 break;
137 OS << "function control flow change detected (hash mismatch)";
138 break;
140 OS << "function basic block count change detected (counter mismatch)";
141 break;
143 OS << "function bitmap size change detected (bitmap size mismatch)";
144 break;
146 OS << "counter overflow";
147 break;
149 OS << "function value site count change detected (counter mismatch)";
150 break;
152 OS << "failed to compress data (zlib)";
153 break;
155 OS << "failed to uncompress data (zlib)";
156 break;
158 OS << "empty raw profile file";
159 break;
161 OS << "profile uses zlib compression but the profile reader was built "
162 "without zlib support";
163 break;
165 OS << "raw profile version mismatch";
166 break;
168 OS << "excessively large counter value suggests corrupted profile data";
169 break;
170 }
171
172 // If optional error message is not empty, append it to the message.
173 if (!ErrMsg.empty())
174 OS << ": " << ErrMsg;
175
176 return OS.str();
177}
178
179namespace {
180
181// FIXME: This class is only here to support the transition to llvm::Error. It
182// will be removed once this transition is complete. Clients should prefer to
183// deal with the Error value directly, rather than converting to error_code.
184class InstrProfErrorCategoryType : public std::error_category {
185 const char *name() const noexcept override { return "llvm.instrprof"; }
186
187 std::string message(int IE) const override {
188 return getInstrProfErrString(static_cast<instrprof_error>(IE));
189 }
190};
191
192} // end anonymous namespace
193
194const std::error_category &llvm::instrprof_category() {
195 static InstrProfErrorCategoryType ErrorCategory;
196 return ErrorCategory;
197}
198
199namespace {
200
201const char *InstrProfSectNameCommon[] = {
202#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
203 SectNameCommon,
205};
206
207const char *InstrProfSectNameCoff[] = {
208#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
209 SectNameCoff,
211};
212
213const char *InstrProfSectNamePrefix[] = {
214#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
215 Prefix,
217};
218
219} // namespace
220
221namespace llvm {
222
224 "enable-name-compression",
225 cl::desc("Enable name/filename string compression"), cl::init(true));
226
228 "enable-vtable-value-profiling", cl::init(false),
229 cl::desc("If true, the virtual table address will be instrumented to know "
230 "the types of a C++ pointer. The information is used in indirect "
231 "call promotion to do selective vtable-based comparison."));
232
234 "enable-vtable-profile-use", cl::init(false),
235 cl::desc("If ThinLTO and WPD is enabled and this option is true, vtable "
236 "profiles will be used by ICP pass for more efficient indirect "
237 "call sequence. If false, type profiles won't be used."));
238
241 bool AddSegmentInfo) {
242 std::string SectName;
243
244 if (OF == Triple::MachO && AddSegmentInfo)
245 SectName = InstrProfSectNamePrefix[IPSK];
246
247 if (OF == Triple::COFF)
248 SectName += InstrProfSectNameCoff[IPSK];
249 else
250 SectName += InstrProfSectNameCommon[IPSK];
251
252 if (OF == Triple::MachO && IPSK == IPSK_data && AddSegmentInfo)
253 SectName += ",regular,live_support";
254
255 return SectName;
256}
257
258std::string InstrProfError::message() const {
259 return getInstrProfErrString(Err, Msg);
260}
261
262char InstrProfError::ID = 0;
263
266
269
270uint64_t ProfOStream::tell() const { return OS.tell(); }
274
276 using namespace support;
277
278 if (IsFDOStream) {
279 raw_fd_ostream &FDOStream = static_cast<raw_fd_ostream &>(OS);
280 const uint64_t LastPos = FDOStream.tell();
281 for (const auto &K : P) {
282 FDOStream.seek(K.Pos);
283 for (uint64_t Elem : K.D)
284 write(Elem);
285 }
286 // Reset the stream to the last position after patching so that users
287 // don't accidentally overwrite data. This makes it consistent with
288 // the string stream below which replaces the data directly.
289 FDOStream.seek(LastPos);
290 } else {
291 raw_string_ostream &SOStream = static_cast<raw_string_ostream &>(OS);
292 std::string &Data = SOStream.str(); // with flush
293 for (const auto &K : P) {
294 for (int I = 0, E = K.D.size(); I != E; I++) {
295 uint64_t Bytes =
297 Data.replace(K.Pos + I * sizeof(uint64_t), sizeof(uint64_t),
298 (const char *)&Bytes, sizeof(uint64_t));
299 }
300 }
301 }
302}
303
305 StringRef FileName,
306 [[maybe_unused]] uint64_t Version) {
307 // Value names may be prefixed with a binary '1' to indicate
308 // that the backend should not modify the symbols due to any platform
309 // naming convention. Do not include that '1' in the PGO profile name.
310 if (Name[0] == '\1')
311 Name = Name.substr(1);
312
313 std::string NewName = std::string(Name);
315 // For local symbols, prepend the main file name to distinguish them.
316 // Do not include the full path in the file name since there's no guarantee
317 // that it will stay the same, e.g., if the files are checked out from
318 // version control in different locations.
319 if (FileName.empty())
320 NewName = NewName.insert(0, "<unknown>:");
321 else
322 NewName = NewName.insert(0, FileName.str() + ":");
323 }
324 return NewName;
325}
326
327// Strip NumPrefix level of directory name from PathNameStr. If the number of
328// directory separators is less than NumPrefix, strip all the directories and
329// leave base file name only.
330static StringRef stripDirPrefix(StringRef PathNameStr, uint32_t NumPrefix) {
331 uint32_t Count = NumPrefix;
332 uint32_t Pos = 0, LastPos = 0;
333 for (const auto &CI : PathNameStr) {
334 ++Pos;
336 LastPos = Pos;
337 --Count;
338 }
339 if (Count == 0)
340 break;
341 }
342 return PathNameStr.substr(LastPos);
343}
344
346 StringRef FileName(GO.getParent()->getSourceFileName());
347 uint32_t StripLevel = StaticFuncFullModulePrefix ? 0 : (uint32_t)-1;
348 if (StripLevel < StaticFuncStripDirNamePrefix)
349 StripLevel = StaticFuncStripDirNamePrefix;
350 if (StripLevel)
351 FileName = stripDirPrefix(FileName, StripLevel);
352 return FileName;
353}
354
355// The PGO name has the format [<filepath>;]<mangled-name> where <filepath>; is
356// provided if linkage is local and is used to discriminate possibly identical
357// mangled names. ";" is used because it is unlikely to be found in either
358// <filepath> or <mangled-name>.
359//
360// Older compilers used getPGOFuncName() which has the format
361// [<filepath>:]<mangled-name>. This caused trouble for Objective-C functions
362// which commonly have :'s in their names. We still need to compute this name to
363// lookup functions from profiles built by older compilers.
364static std::string
367 StringRef FileName) {
368 return GlobalValue::getGlobalIdentifier(GO.getName(), Linkage, FileName);
369}
370
371static std::optional<std::string> lookupPGONameFromMetadata(MDNode *MD) {
372 if (MD != nullptr) {
373 StringRef S = cast<MDString>(MD->getOperand(0))->getString();
374 return S.str();
375 }
376 return {};
377}
378
379// Returns the PGO object name. This function has some special handling
380// when called in LTO optimization. The following only applies when calling in
381// LTO passes (when \c InLTO is true): LTO's internalization privatizes many
382// global linkage symbols. This happens after value profile annotation, but
383// those internal linkage functions should not have a source prefix.
384// Additionally, for ThinLTO mode, exported internal functions are promoted
385// and renamed. We need to ensure that the original internal PGO name is
386// used when computing the GUID that is compared against the profiled GUIDs.
387// To differentiate compiler generated internal symbols from original ones,
388// PGOFuncName meta data are created and attached to the original internal
389// symbols in the value profile annotation step
390// (PGOUseFunc::annotateIndirectCallSites). If a symbol does not have the meta
391// data, its original linkage must be non-internal.
392static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO,
393 MDNode *PGONameMetadata) {
394 if (!InLTO) {
395 auto FileName = getStrippedSourceFileName(GO);
396 return getIRPGONameForGlobalObject(GO, GO.getLinkage(), FileName);
397 }
398
399 // In LTO mode (when InLTO is true), first check if there is a meta data.
400 if (auto IRPGOFuncName = lookupPGONameFromMetadata(PGONameMetadata))
401 return *IRPGOFuncName;
402
403 // If there is no meta data, the function must be a global before the value
404 // profile annotation pass. Its current linkage may be internal if it is
405 // internalized in LTO mode.
407}
408
409// Returns the IRPGO function name and does special handling when called
410// in LTO optimization. See the comments of `getIRPGOObjectName` for details.
411std::string getIRPGOFuncName(const Function &F, bool InLTO) {
413}
414
415// Please use getIRPGOFuncName for LLVM IR instrumentation. This function is
416// for front-end (Clang, etc) instrumentation.
417// The implementation is kept for profile matching from older profiles.
418// This is similar to `getIRPGOFuncName` except that this function calls
419// 'getPGOFuncName' to get a name and `getIRPGOFuncName` calls
420// 'getIRPGONameForGlobalObject'. See the difference between two callees in the
421// comments of `getIRPGONameForGlobalObject`.
422std::string getPGOFuncName(const Function &F, bool InLTO, uint64_t Version) {
423 if (!InLTO) {
424 auto FileName = getStrippedSourceFileName(F);
425 return getPGOFuncName(F.getName(), F.getLinkage(), FileName, Version);
426 }
427
428 // In LTO mode (when InLTO is true), first check if there is a meta data.
429 if (auto PGOFuncName = lookupPGONameFromMetadata(getPGOFuncNameMetadata(F)))
430 return *PGOFuncName;
431
432 // If there is no meta data, the function must be a global before the value
433 // profile annotation pass. Its current linkage may be internal if it is
434 // internalized in LTO mode.
435 return getPGOFuncName(F.getName(), GlobalValue::ExternalLinkage, "");
436}
437
438std::string getPGOName(const GlobalVariable &V, bool InLTO) {
439 // PGONameMetadata should be set by compiler at profile use time
440 // and read by symtab creation to look up symbols corresponding to
441 // a MD5 hash.
442 return getIRPGOObjectName(V, InLTO, V.getMetadata(getPGONameMetadataName()));
443}
444
445// See getIRPGOObjectName() for a discription of the format.
446std::pair<StringRef, StringRef> getParsedIRPGOName(StringRef IRPGOName) {
447 auto [FileName, MangledName] = IRPGOName.split(GlobalIdentifierDelimiter);
448 if (MangledName.empty())
449 return std::make_pair(StringRef(), IRPGOName);
450 return std::make_pair(FileName, MangledName);
451}
452
454 if (FileName.empty())
455 return PGOFuncName;
456 // Drop the file name including ':' or ';'. See getIRPGONameForGlobalObject as
457 // well.
458 if (PGOFuncName.starts_with(FileName))
459 PGOFuncName = PGOFuncName.drop_front(FileName.size() + 1);
460 return PGOFuncName;
461}
462
463// \p FuncName is the string used as profile lookup key for the function. A
464// symbol is created to hold the name. Return the legalized symbol name.
465std::string getPGOFuncNameVarName(StringRef FuncName,
467 std::string VarName = std::string(getInstrProfNameVarPrefix());
468 VarName += FuncName;
469
470 if (!GlobalValue::isLocalLinkage(Linkage))
471 return VarName;
472
473 // Now fix up illegal chars in local VarName that may upset the assembler.
474 const char InvalidChars[] = "-:;<>/\"'";
475 size_t FoundPos = VarName.find_first_of(InvalidChars);
476 while (FoundPos != std::string::npos) {
477 VarName[FoundPos] = '_';
478 FoundPos = VarName.find_first_of(InvalidChars, FoundPos + 1);
479 }
480 return VarName;
481}
482
483bool isGPUProfTarget(const Module &M) {
484 const Triple &T = M.getTargetTriple();
485 return T.isGPU();
486}
487
489 // If the target is a GPU, make the symbol protected so it can
490 // be read from the host device
491 if (isGPUProfTarget(M))
493 // Hide the symbol so that we correctly get a copy for each executable.
494 else if (!GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))
496}
497
500 StringRef PGOFuncName) {
501 // Ensure profiling variables on GPU are visible to be read from host
502 if (isGPUProfTarget(M))
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.
507 else if (Linkage == GlobalValue::ExternalWeakLinkage)
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;
573 StringRef CanonicalName = getCanonicalName(VTablePGOName);
574 if (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));
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}
643
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);
666}
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 != PGOFuncName)
684 return NameToGUIDMap(CanonicalFuncName);
685
686 return Error::success();
687}
688
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
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
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 function_ref<void(instrprof_error)> Warn) {
961 // If the number of counters doesn't match we either have bad data
962 // or a hash collision.
963 if (Counts.size() != Other.Counts.size()) {
965 return;
966 }
967
968 // Special handling of the first count as the PseudoCount.
969 CountPseudoKind OtherKind = Other.getCountPseudoKind();
971 if (OtherKind != NotPseudo || ThisKind != NotPseudo) {
972 // We don't allow the merge of a profile with pseudo counts and
973 // a normal profile (i.e. without pesudo counts).
974 // Profile supplimenation should be done after the profile merge.
975 if (OtherKind == NotPseudo || ThisKind == NotPseudo) {
977 return;
978 }
979 if (OtherKind == PseudoHot || ThisKind == PseudoHot)
981 else
983 return;
984 }
985
986 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I) {
987 bool Overflowed;
989 SaturatingMultiplyAdd(Other.Counts[I], Weight, Counts[I], &Overflowed);
992 Overflowed = true;
993 }
994 Counts[I] = Value;
995 if (Overflowed)
997 }
998
999 // If the number of bitmap bytes doesn't match we either have bad data
1000 // or a hash collision.
1001 if (BitmapBytes.size() != Other.BitmapBytes.size()) {
1003 return;
1004 }
1005
1006 // Bitmap bytes are merged by simply ORing them together.
1007 for (size_t I = 0, E = Other.BitmapBytes.size(); I < E; ++I) {
1008 BitmapBytes[I] = Other.BitmapBytes[I] | BitmapBytes[I];
1009 }
1010
1011 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1012 mergeValueProfData(Kind, Other, Weight, Warn);
1013}
1014
1015void InstrProfRecord::scaleValueProfData(
1016 uint32_t ValueKind, uint64_t N, uint64_t D,
1017 function_ref<void(instrprof_error)> Warn) {
1018 for (auto &R : getValueSitesForKind(ValueKind))
1019 R.scale(N, D, Warn);
1020}
1021
1023 function_ref<void(instrprof_error)> Warn) {
1024 assert(D != 0 && "D cannot be 0");
1025 for (auto &Count : this->Counts) {
1026 bool Overflowed;
1027 Count = SaturatingMultiply(Count, N, &Overflowed) / D;
1028 if (Count > getInstrMaxCountValue()) {
1030 Overflowed = true;
1031 }
1032 if (Overflowed)
1034 }
1035 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
1036 scaleValueProfData(Kind, N, D, Warn);
1037}
1038
1039// Map indirect call target name hash to name string.
1040uint64_t InstrProfRecord::remapValue(uint64_t Value, uint32_t ValueKind,
1041 InstrProfSymtab *SymTab) {
1042 if (!SymTab)
1043 return Value;
1044
1045 if (ValueKind == IPVK_IndirectCallTarget)
1046 return SymTab->getFunctionHashFromAddress(Value);
1047
1048 if (ValueKind == IPVK_VTableTarget)
1049 return SymTab->getVTableHashFromAddress(Value);
1050
1051 return Value;
1052}
1053
1057 // Remap values.
1058 std::vector<InstrProfValueData> RemappedVD;
1059 RemappedVD.reserve(VData.size());
1060 for (const auto &V : VData) {
1061 uint64_t NewValue = remapValue(V.Value, ValueKind, ValueMap);
1062 RemappedVD.push_back({NewValue, V.Count});
1063 }
1064
1065 std::vector<InstrProfValueSiteRecord> &ValueSites =
1066 getOrCreateValueSitesForKind(ValueKind);
1067 assert(ValueSites.size() == Site);
1068
1069 // Add a new value site with remapped value profiling data.
1070 ValueSites.emplace_back(std::move(RemappedVD));
1071}
1072
1074 ArrayRef<TemporalProfTraceTy> Traces, std::vector<BPFunctionNode> &Nodes,
1075 bool RemoveOutlierUNs) {
1076 using IDT = BPFunctionNode::IDT;
1077 using UtilityNodeT = BPFunctionNode::UtilityNodeT;
1078 UtilityNodeT MaxUN = 0;
1079 DenseMap<IDT, size_t> IdToFirstTimestamp;
1080 DenseMap<IDT, UtilityNodeT> IdToFirstUN;
1082 // TODO: We need to use the Trace.Weight field to give more weight to more
1083 // important utilities
1084 for (auto &Trace : Traces) {
1085 size_t CutoffTimestamp = 1;
1086 for (size_t Timestamp = 0; Timestamp < Trace.FunctionNameRefs.size();
1087 Timestamp++) {
1088 IDT Id = Trace.FunctionNameRefs[Timestamp];
1089 auto [It, WasInserted] = IdToFirstTimestamp.try_emplace(Id, Timestamp);
1090 if (!WasInserted)
1091 It->getSecond() = std::min<size_t>(It->getSecond(), Timestamp);
1092 if (Timestamp >= CutoffTimestamp) {
1093 ++MaxUN;
1094 CutoffTimestamp = 2 * Timestamp;
1095 }
1096 IdToFirstUN.try_emplace(Id, MaxUN);
1097 }
1098 for (auto &[Id, FirstUN] : IdToFirstUN)
1099 for (auto UN = FirstUN; UN <= MaxUN; ++UN)
1100 IdToUNs[Id].push_back(UN);
1101 ++MaxUN;
1102 IdToFirstUN.clear();
1103 }
1104
1105 if (RemoveOutlierUNs) {
1107 for (auto &[Id, UNs] : IdToUNs)
1108 for (auto &UN : UNs)
1109 ++UNFrequency[UN];
1110 // Filter out utility nodes that are too infrequent or too prevalent to make
1111 // BalancedPartitioning more effective.
1112 for (auto &[Id, UNs] : IdToUNs)
1113 llvm::erase_if(UNs, [&](auto &UN) {
1114 unsigned Freq = UNFrequency[UN];
1115 return Freq <= 1 || 2 * Freq > IdToUNs.size();
1116 });
1117 }
1118
1119 for (auto &[Id, UNs] : IdToUNs)
1120 Nodes.emplace_back(Id, UNs);
1121
1122 // Since BalancedPartitioning is sensitive to the initial order, we explicitly
1123 // order nodes by their earliest timestamp.
1124 llvm::sort(Nodes, [&](auto &L, auto &R) {
1125 return std::make_pair(IdToFirstTimestamp[L.Id], L.Id) <
1126 std::make_pair(IdToFirstTimestamp[R.Id], R.Id);
1127 });
1128}
1129
1130#define INSTR_PROF_COMMON_API_IMPL
1132
1133/*!
1134 * ValueProfRecordClosure Interface implementation for InstrProfRecord
1135 * class. These C wrappers are used as adaptors so that C++ code can be
1136 * invoked as callbacks.
1137 */
1139 return reinterpret_cast<const InstrProfRecord *>(Record)->getNumValueKinds();
1140}
1141
1143 return reinterpret_cast<const InstrProfRecord *>(Record)
1144 ->getNumValueSites(VKind);
1145}
1146
1148 return reinterpret_cast<const InstrProfRecord *>(Record)
1149 ->getNumValueData(VKind);
1150}
1151
1153 uint32_t S) {
1154 const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1155 return IPR->getValueArrayForSite(VK, S).size();
1156}
1157
1158void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst,
1159 uint32_t K, uint32_t S) {
1160 const auto *IPR = reinterpret_cast<const InstrProfRecord *>(R);
1161 llvm::copy(IPR->getValueArrayForSite(K, S), Dst);
1162}
1163
1165 ValueProfData *VD = new (::operator new(TotalSizeInBytes)) ValueProfData();
1166 memset(VD, 0, TotalSizeInBytes);
1167 return VD;
1168}
1169
1179
1180// Wrapper implementation using the closure mechanism.
1181uint32_t ValueProfData::getSize(const InstrProfRecord &Record) {
1182 auto Closure = InstrProfRecordClosure;
1183 Closure.Record = &Record;
1184 return getValueProfDataSize(&Closure);
1185}
1186
1187// Wrapper implementation using the closure mechanism.
1188std::unique_ptr<ValueProfData>
1189ValueProfData::serializeFrom(const InstrProfRecord &Record) {
1191
1192 std::unique_ptr<ValueProfData> VPD(
1194 return VPD;
1195}
1196
1197void ValueProfRecord::deserializeTo(InstrProfRecord &Record,
1198 InstrProfSymtab *SymTab) {
1199 Record.reserveSites(Kind, NumValueSites);
1200
1201 InstrProfValueData *ValueData = getValueProfRecordValueData(this);
1202 for (uint64_t VSite = 0; VSite < NumValueSites; ++VSite) {
1203 uint8_t ValueDataCount = this->SiteCountArray[VSite];
1204 ArrayRef<InstrProfValueData> VDs(ValueData, ValueDataCount);
1205 Record.addValueData(Kind, VSite, VDs, SymTab);
1206 ValueData += ValueDataCount;
1207 }
1208}
1209
1210// For writing/serializing, Old is the host endianness, and New is
1211// byte order intended on disk. For Reading/deserialization, Old
1212// is the on-disk source endianness, and New is the host endianness.
1213void ValueProfRecord::swapBytes(llvm::endianness Old, llvm::endianness New) {
1214 using namespace support;
1215
1216 if (Old == New)
1217 return;
1218
1219 if (llvm::endianness::native != Old) {
1222 }
1223 uint32_t ND = getValueProfRecordNumValueData(this);
1224 InstrProfValueData *VD = getValueProfRecordValueData(this);
1225
1226 // No need to swap byte array: SiteCountArrray.
1227 for (uint32_t I = 0; I < ND; I++) {
1230 }
1231 if (llvm::endianness::native == Old) {
1234 }
1235}
1236
1237void ValueProfData::deserializeTo(InstrProfRecord &Record,
1238 InstrProfSymtab *SymTab) {
1239 if (NumValueKinds == 0)
1240 return;
1241
1243 for (uint32_t K = 0; K < NumValueKinds; K++) {
1244 VR->deserializeTo(Record, SymTab);
1245 VR = getValueProfRecordNext(VR);
1246 }
1247}
1248
1249static std::unique_ptr<ValueProfData> allocValueProfData(uint32_t TotalSize) {
1250 return std::unique_ptr<ValueProfData>(new (::operator new(TotalSize))
1251 ValueProfData());
1252}
1253
1254Error ValueProfData::checkIntegrity() {
1255 if (NumValueKinds > IPVK_Last + 1)
1257 instrprof_error::malformed, "number of value profile kinds is invalid");
1258 // Total size needs to be multiple of quadword size.
1259 if (TotalSize % sizeof(uint64_t))
1261 instrprof_error::malformed, "total size is not multiples of quardword");
1262
1264 for (uint32_t K = 0; K < this->NumValueKinds; K++) {
1265 if (VR->Kind > IPVK_Last)
1267 "value kind is invalid");
1268 VR = getValueProfRecordNext(VR);
1269 if ((char *)VR - (char *)this > (ptrdiff_t)TotalSize)
1272 "value profile address is greater than total size");
1273 }
1274 return Error::success();
1275}
1276
1278ValueProfData::getValueProfData(const unsigned char *D,
1279 const unsigned char *const BufferEnd,
1280 llvm::endianness Endianness) {
1281 using namespace support;
1282
1283 if (D + sizeof(ValueProfData) > BufferEnd)
1285
1286 const unsigned char *Header = D;
1287 uint32_t TotalSize = endian::readNext<uint32_t>(Header, Endianness);
1288
1289 if (D + TotalSize > BufferEnd)
1291
1292 std::unique_ptr<ValueProfData> VPD = allocValueProfData(TotalSize);
1293 memcpy(VPD.get(), D, TotalSize);
1294 // Byte swap.
1295 VPD->swapBytesToHost(Endianness);
1296
1297 Error E = VPD->checkIntegrity();
1298 if (E)
1299 return std::move(E);
1300
1301 return std::move(VPD);
1302}
1303
1304void ValueProfData::swapBytesToHost(llvm::endianness Endianness) {
1305 using namespace support;
1306
1307 if (Endianness == llvm::endianness::native)
1308 return;
1309
1312
1314 for (uint32_t K = 0; K < NumValueKinds; K++) {
1315 VR->swapBytes(Endianness, llvm::endianness::native);
1316 VR = getValueProfRecordNext(VR);
1317 }
1318}
1319
1320void ValueProfData::swapBytesFromHost(llvm::endianness Endianness) {
1321 using namespace support;
1322
1323 if (Endianness == llvm::endianness::native)
1324 return;
1325
1327 for (uint32_t K = 0; K < NumValueKinds; K++) {
1329 VR->swapBytes(llvm::endianness::native, Endianness);
1330 VR = NVR;
1331 }
1334}
1335
1337 const InstrProfRecord &InstrProfR,
1338 InstrProfValueKind ValueKind, uint32_t SiteIdx,
1339 uint32_t MaxMDCount) {
1340 auto VDs = InstrProfR.getValueArrayForSite(ValueKind, SiteIdx);
1341 if (VDs.empty())
1342 return;
1343 uint64_t Sum = 0;
1344 for (const InstrProfValueData &V : VDs)
1345 Sum = SaturatingAdd(Sum, V.Count);
1346 annotateValueSite(M, Inst, VDs, Sum, ValueKind, MaxMDCount);
1347}
1348
1351 uint64_t Sum, InstrProfValueKind ValueKind,
1352 uint32_t MaxMDCount) {
1353 if (VDs.empty())
1354 return;
1355 LLVMContext &Ctx = M.getContext();
1356 MDBuilder MDHelper(Ctx);
1358 // Tag
1360 // Value Kind
1361 Vals.push_back(MDHelper.createConstant(
1362 ConstantInt::get(Type::getInt32Ty(Ctx), ValueKind)));
1363 // Total Count
1364 Vals.push_back(
1365 MDHelper.createConstant(ConstantInt::get(Type::getInt64Ty(Ctx), Sum)));
1366
1367 // Value Profile Data
1368 uint32_t MDCount = MaxMDCount;
1369 for (const auto &VD : VDs) {
1370 Vals.push_back(MDHelper.createConstant(
1371 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Value)));
1372 Vals.push_back(MDHelper.createConstant(
1373 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Count)));
1374 if (--MDCount == 0)
1375 break;
1376 }
1377 Inst.setMetadata(LLVMContext::MD_prof, MDNode::get(Ctx, Vals));
1378}
1379
1381 InstrProfValueKind ValueKind) {
1382 MDNode *MD = Inst.getMetadata(LLVMContext::MD_prof);
1383 if (!MD)
1384 return nullptr;
1385
1386 if (MD->getNumOperands() < 5)
1387 return nullptr;
1388
1390 if (!Tag || Tag->getString() != MDProfLabels::ValueProfile)
1391 return nullptr;
1392
1393 // Now check kind:
1395 if (!KindInt)
1396 return nullptr;
1397 if (KindInt->getZExtValue() != ValueKind)
1398 return nullptr;
1399
1400 return MD;
1401}
1402
1405 uint32_t MaxNumValueData, uint64_t &TotalC,
1406 bool GetNoICPValue) {
1407 // Four inline elements seem to work well in practice. With MaxNumValueData,
1408 // this array won't grow very big anyway.
1410 MDNode *MD = mayHaveValueProfileOfKind(Inst, ValueKind);
1411 if (!MD)
1412 return ValueData;
1413 const unsigned NOps = MD->getNumOperands();
1414 // Get total count
1416 if (!TotalCInt)
1417 return ValueData;
1418 TotalC = TotalCInt->getZExtValue();
1419
1420 ValueData.reserve((NOps - 3) / 2);
1421 for (unsigned I = 3; I < NOps; I += 2) {
1422 if (ValueData.size() >= MaxNumValueData)
1423 break;
1427 if (!Value || !Count) {
1428 ValueData.clear();
1429 return ValueData;
1430 }
1431 uint64_t CntValue = Count->getZExtValue();
1432 if (!GetNoICPValue && (CntValue == NOMORE_ICP_MAGICNUM))
1433 continue;
1434 InstrProfValueData V;
1435 V.Value = Value->getZExtValue();
1436 V.Count = CntValue;
1437 ValueData.push_back(V);
1438 }
1439 return ValueData;
1440}
1441
1443 return F.getMetadata(getPGOFuncNameMetadataName());
1444}
1445
1446static void createPGONameMetadata(GlobalObject &GO, StringRef MetadataName,
1447 StringRef PGOName) {
1448 // Only for internal linkage functions or global variables. The name is not
1449 // the same as PGO name for these global objects.
1450 if (GO.getName() == PGOName)
1451 return;
1452
1453 // Don't create duplicated metadata.
1454 if (GO.getMetadata(MetadataName))
1455 return;
1456
1457 LLVMContext &C = GO.getContext();
1458 MDNode *N = MDNode::get(C, MDString::get(C, PGOName));
1459 GO.setMetadata(MetadataName, N);
1460}
1461
1463 return createPGONameMetadata(F, getPGOFuncNameMetadataName(), PGOFuncName);
1464}
1465
1467 return createPGONameMetadata(GO, getPGONameMetadataName(), PGOName);
1468}
1469
1470bool needsComdatForCounter(const GlobalObject &GO, const Module &M) {
1471 if (GO.hasComdat())
1472 return true;
1473
1474 if (!M.getTargetTriple().supportsCOMDAT())
1475 return false;
1476
1477 // See createPGOFuncNameVar for more details. To avoid link errors, profile
1478 // counters for function with available_externally linkage needs to be changed
1479 // to linkonce linkage. On ELF based systems, this leads to weak symbols to be
1480 // created. Without using comdat, duplicate entries won't be removed by the
1481 // linker leading to increased data segement size and raw profile size. Even
1482 // worse, since the referenced counter from profile per-function data object
1483 // will be resolved to the common strong definition, the profile counts for
1484 // available_externally functions will end up being duplicated in raw profile
1485 // data. This can result in distorted profile as the counts of those dups
1486 // will be accumulated by the profile merger.
1488 if (Linkage != GlobalValue::ExternalWeakLinkage &&
1490 return false;
1491
1492 return true;
1493}
1494
1495// Check if INSTR_PROF_RAW_VERSION_VAR is defined.
1496bool isIRPGOFlagSet(const Module *M) {
1497 const GlobalVariable *IRInstrVar =
1498 M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR));
1499 if (!IRInstrVar || IRInstrVar->hasLocalLinkage())
1500 return false;
1501
1502 // For CSPGO+LTO, this variable might be marked as non-prevailing and we only
1503 // have the decl.
1504 if (IRInstrVar->isDeclaration())
1505 return true;
1506
1507 // Check if the flag is set.
1508 if (!IRInstrVar->hasInitializer())
1509 return false;
1510
1511 auto *InitVal = dyn_cast_or_null<ConstantInt>(IRInstrVar->getInitializer());
1512 if (!InitVal)
1513 return false;
1514 return (InitVal->getZExtValue() & VARIANT_MASK_IR_PROF) != 0;
1515}
1516
1517// Check if we can safely rename this Comdat function.
1518bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken) {
1519 if (F.getName().empty())
1520 return false;
1521 if (!needsComdatForCounter(F, *(F.getParent())))
1522 return false;
1523 // Unsafe to rename the address-taken function (which can be used in
1524 // function comparison).
1525 if (CheckAddressTaken && F.hasAddressTaken())
1526 return false;
1527 // Only safe to do if this function may be discarded if it is not used
1528 // in the compilation unit.
1529 if (!GlobalValue::isDiscardableIfUnused(F.getLinkage()))
1530 return false;
1531
1532 // For AvailableExternallyLinkage functions.
1533 if (!F.hasComdat()) {
1535 return true;
1536 }
1537 return true;
1538}
1539
1540// Create the variable for the profile file name.
1541void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput) {
1542 if (InstrProfileOutput.empty())
1543 return;
1544 Constant *ProfileNameConst =
1545 ConstantDataArray::getString(M.getContext(), InstrProfileOutput, true);
1546 GlobalVariable *ProfileNameVar = new GlobalVariable(
1547 M, ProfileNameConst->getType(), true, GlobalValue::WeakAnyLinkage,
1550 Triple TT(M.getTargetTriple());
1551 if (TT.supportsCOMDAT()) {
1553 ProfileNameVar->setComdat(M.getOrInsertComdat(
1555 }
1556}
1557
1559 const std::string &TestFilename,
1560 bool IsCS) {
1561 auto GetProfileSum = [IsCS](const std::string &Filename,
1562 CountSumOrPercent &Sum) -> Error {
1563 // This function is only used from llvm-profdata that doesn't use any kind
1564 // of VFS. Just create a default RealFileSystem to read profiles.
1565 auto FS = vfs::getRealFileSystem();
1566 auto ReaderOrErr = InstrProfReader::create(Filename, *FS);
1567 if (Error E = ReaderOrErr.takeError()) {
1568 return E;
1569 }
1570 auto Reader = std::move(ReaderOrErr.get());
1571 Reader->accumulateCounts(Sum, IsCS);
1572 return Error::success();
1573 };
1574 auto Ret = GetProfileSum(BaseFilename, Base);
1575 if (Ret)
1576 return Ret;
1577 Ret = GetProfileSum(TestFilename, Test);
1578 if (Ret)
1579 return Ret;
1580 this->BaseFilename = &BaseFilename;
1581 this->TestFilename = &TestFilename;
1582 Valid = true;
1583 return Error::success();
1584}
1585
1587 Mismatch.NumEntries += 1;
1588 Mismatch.CountSum += MismatchFunc.CountSum / Test.CountSum;
1589 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1590 if (Test.ValueCounts[I] >= 1.0f)
1591 Mismatch.ValueCounts[I] +=
1592 MismatchFunc.ValueCounts[I] / Test.ValueCounts[I];
1593 }
1594}
1595
1597 Unique.NumEntries += 1;
1598 Unique.CountSum += UniqueFunc.CountSum / Test.CountSum;
1599 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1600 if (Test.ValueCounts[I] >= 1.0f)
1601 Unique.ValueCounts[I] += UniqueFunc.ValueCounts[I] / Test.ValueCounts[I];
1602 }
1603}
1604
1606 if (!Valid)
1607 return;
1608
1609 const char *EntryName =
1610 (Level == ProgramLevel ? "functions" : "edge counters");
1611 if (Level == ProgramLevel) {
1612 OS << "Profile overlap information for base_profile: " << *BaseFilename
1613 << " and test_profile: " << *TestFilename << "\nProgram level:\n";
1614 } else {
1615 OS << "Function level:\n"
1616 << " Function: " << FuncName << " (Hash=" << FuncHash << ")\n";
1617 }
1618
1619 OS << " # of " << EntryName << " overlap: " << Overlap.NumEntries << "\n";
1620 if (Mismatch.NumEntries)
1621 OS << " # of " << EntryName << " mismatch: " << Mismatch.NumEntries
1622 << "\n";
1623 if (Unique.NumEntries)
1624 OS << " # of " << EntryName
1625 << " only in test_profile: " << Unique.NumEntries << "\n";
1626
1627 OS << " Edge profile overlap: " << format("%.3f%%", Overlap.CountSum * 100)
1628 << "\n";
1629 if (Mismatch.NumEntries)
1630 OS << " Mismatched count percentage (Edge): "
1631 << format("%.3f%%", Mismatch.CountSum * 100) << "\n";
1632 if (Unique.NumEntries)
1633 OS << " Percentage of Edge profile only in test_profile: "
1634 << format("%.3f%%", Unique.CountSum * 100) << "\n";
1635 OS << " Edge profile base count sum: " << format("%.0f", Base.CountSum)
1636 << "\n"
1637 << " Edge profile test count sum: " << format("%.0f", Test.CountSum)
1638 << "\n";
1639
1640 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1641 if (Base.ValueCounts[I] < 1.0f && Test.ValueCounts[I] < 1.0f)
1642 continue;
1643 char ProfileKindName[20] = {0};
1644 switch (I) {
1645 case IPVK_IndirectCallTarget:
1646 strncpy(ProfileKindName, "IndirectCall", 19);
1647 break;
1648 case IPVK_MemOPSize:
1649 strncpy(ProfileKindName, "MemOP", 19);
1650 break;
1651 case IPVK_VTableTarget:
1652 strncpy(ProfileKindName, "VTable", 19);
1653 break;
1654 default:
1655 snprintf(ProfileKindName, 19, "VP[%d]", I);
1656 break;
1657 }
1658 OS << " " << ProfileKindName
1659 << " profile overlap: " << format("%.3f%%", Overlap.ValueCounts[I] * 100)
1660 << "\n";
1661 if (Mismatch.NumEntries)
1662 OS << " Mismatched count percentage (" << ProfileKindName
1663 << "): " << format("%.3f%%", Mismatch.ValueCounts[I] * 100) << "\n";
1664 if (Unique.NumEntries)
1665 OS << " Percentage of " << ProfileKindName
1666 << " profile only in test_profile: "
1667 << format("%.3f%%", Unique.ValueCounts[I] * 100) << "\n";
1668 OS << " " << ProfileKindName
1669 << " profile base count sum: " << format("%.0f", Base.ValueCounts[I])
1670 << "\n"
1671 << " " << ProfileKindName
1672 << " profile test count sum: " << format("%.0f", Test.ValueCounts[I])
1673 << "\n";
1674 }
1675}
1676
1677namespace IndexedInstrProf {
1678Expected<Header> Header::readFromBuffer(const unsigned char *Buffer) {
1679 using namespace support;
1680 static_assert(std::is_standard_layout_v<Header>,
1681 "Use standard layout for Header for simplicity");
1682 Header H;
1683
1685 // Check the magic number.
1686 if (H.Magic != IndexedInstrProf::Magic)
1688
1689 // Read the version.
1691 if (H.getIndexedProfileVersion() >
1694
1696 "Please update the reader as needed when a new field is added "
1697 "or when indexed profile version gets bumped.");
1698
1699 Buffer += sizeof(uint64_t); // Skip Header.Unused field.
1702 if (H.getIndexedProfileVersion() >= 8)
1703 H.MemProfOffset =
1705 if (H.getIndexedProfileVersion() >= 9)
1706 H.BinaryIdOffset =
1708 // Version 11 is handled by this condition.
1709 if (H.getIndexedProfileVersion() >= 10)
1710 H.TemporalProfTracesOffset =
1712 if (H.getIndexedProfileVersion() >= 12)
1713 H.VTableNamesOffset =
1715 return H;
1716}
1717
1721
1722size_t Header::size() const {
1723 switch (getIndexedProfileVersion()) {
1724 // To retain backward compatibility, new fields must be appended to the end
1725 // of the header, and byte offset of existing fields shouldn't change when
1726 // indexed profile version gets incremented.
1727 static_assert(
1729 "Please update the size computation below if a new field has "
1730 "been added to the header; for a version bump without new "
1731 "fields, add a case statement to fall through to the latest version.");
1732 case 13ull:
1733 case 12ull:
1734 return 72;
1735 case 11ull:
1736 [[fallthrough]];
1737 case 10ull:
1738 return 64;
1739 case 9ull:
1740 return 56;
1741 case 8ull:
1742 return 48;
1743 default: // Version7 (when the backwards compatible header was introduced).
1744 return 40;
1745 }
1746}
1747
1748} // namespace IndexedInstrProf
1749
1750} // end namespace llvm
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
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...
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.
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:114
Defines the virtual file system interface vfs::FileSystem.
The Input class is used to parse a yaml document into in-memory structs and vectors.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
iterator end() const
Definition ArrayRef.h:131
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
iterator begin() const
Definition ArrayRef.h:130
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
This is the shared class of boolean and integer constants.
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:256
unsigned size() const
Definition DenseMap.h:110
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:214
bool hasComdat() const
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition Value.h:576
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:77
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:328
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
@ ProtectedVisibility
The GV is protected.
Definition GlobalValue.h:70
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:161
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:505
static LLVM_ABI StringRef getCanonicalName(StringRef PGOName)
Error addSymbolName(StringRef SymbolName)
Definition InstrProf.h:635
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
Definition InstrProf.h:657
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:653
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:1078
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1442
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1448
A single uniqued string.
Definition Metadata.h:721
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:614
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:263
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition ArrayRef.h:298
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.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:712
std::string str() const
str - Get the contents as an std::string.
Definition StringRef.h:225
const unsigned char * bytes_end() const
Definition StringRef.h:127
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:573
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:261
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:611
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
const unsigned char * bytes_begin() const
Definition StringRef.h:124
unsigned size() const
Definition Trace.h:95
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:297
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:296
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:256
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
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.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
const uint64_t Magic
Definition InstrProf.h:1142
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:695
value_type byte_swap(value_type value, endianness endian)
Definition Endian.h:44
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:81
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:602
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.
Definition Types.h:26
StringRef getInstrProfNameVarPrefix()
Return the name prefix of variables containing instrumented function names.
Definition InstrProf.h:123
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 a string ref from an array ref of unsigned chars.
LLVM_ABI std::string getIRPGOFuncName(const Function &F, bool InLTO=false)
StringRef getPGOFuncNameMetadataName()
Definition InstrProf.h:341
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:2119
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)
MDNode * mayHaveValueProfileOfKind(const Instruction &Inst, InstrProfValueKind ValueKind)
struct llvm::ValueProfData ValueProfData
Per-function header/control data structure for value profiling data in indexed format.
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Definition InstrProf.h:302
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:1634
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:207
FunctionAddr NumValueSites[IPVK_Last+1]
Definition InstrProf.h:93
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
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:684
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:213
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:129
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
instrprof_error
Definition InstrProf.h:398
InstrProfValueKind
Definition InstrProf.h:311
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:638
LLVM_ABI const std::error_category & instrprof_category()
LLVM_ABI Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
Definition STLExtras.h:2002
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:1883
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:2182
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)
ValueProfRecord
Definition InstrProf.h:418
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)
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:609
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:343
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1083
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:806
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:894
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:895
ArrayRef< InstrProfValueData > getValueArrayForSite(uint32_t ValueKind, uint32_t Site) const
Return the array of profiled values at Site.
Definition InstrProf.h:1102
CountPseudoKind getCountPseudoKind() const
Definition InstrProf.h:993
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:1097
void setPseudoCount(CountPseudoKind Kind)
Definition InstrProf.h:1001
LLVM_ABI void merge(InstrProfRecord &Other, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge the counts in Other into this one.
LLVM_ABI void addValueData(uint32_t ValueKind, uint32_t Site, ArrayRef< InstrProfValueData > VData, InstrProfSymtab *SymTab)
Add ValueData for ValueKind at value Site.
LLVM_ABI void overlap(InstrProfRecord &Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff)
Compute the overlap b/w this IntrprofRecord and Other.
std::vector< uint8_t > BitmapBytes
Definition InstrProf.h:896
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:871
std::vector< InstrProfValueData > ValueData
Value profiling data pairs at a given value site.
Definition InstrProf.h:864
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:847
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:823
CountSumOrPercent Base
Definition InstrProf.h:819
LLVM_ABI void addOneUnique(const CountSumOrPercent &UniqueFunc)
const std::string * BaseFilename
Definition InstrProf.h:827
const std::string * TestFilename
Definition InstrProf.h:828
CountSumOrPercent Unique
Definition InstrProf.h:825
CountSumOrPercent Mismatch
Definition InstrProf.h:824
StringRef FuncName
Definition InstrProf.h:829
OverlapStatsLevel Level
Definition InstrProf.h:826
CountSumOrPercent Test
Definition InstrProf.h:821
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...
Per-function header/control data structure for value profiling data in indexed format.
Definition InstrProf.h:424
uint32_t NumValueKinds
Definition InstrProf.h:438