LLVM 19.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"
16#include "llvm/ADT/SetVector.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Config/config.h"
21#include "llvm/IR/Constant.h"
22#include "llvm/IR/Constants.h"
23#include "llvm/IR/Function.h"
24#include "llvm/IR/GlobalValue.h"
26#include "llvm/IR/Instruction.h"
27#include "llvm/IR/LLVMContext.h"
28#include "llvm/IR/MDBuilder.h"
29#include "llvm/IR/Metadata.h"
30#include "llvm/IR/Module.h"
31#include "llvm/IR/Type.h"
37#include "llvm/Support/Debug.h"
38#include "llvm/Support/Endian.h"
39#include "llvm/Support/Error.h"
41#include "llvm/Support/LEB128.h"
43#include "llvm/Support/Path.h"
47#include <algorithm>
48#include <cassert>
49#include <cstddef>
50#include <cstdint>
51#include <cstring>
52#include <memory>
53#include <string>
54#include <system_error>
55#include <type_traits>
56#include <utility>
57#include <vector>
58
59using namespace llvm;
60
61#define DEBUG_TYPE "instrprof"
62
64 "static-func-full-module-prefix", cl::init(true), cl::Hidden,
65 cl::desc("Use full module build paths in the profile counter names for "
66 "static functions."));
67
68// This option is tailored to users that have different top-level directory in
69// profile-gen and profile-use compilation. Users need to specific the number
70// of levels to strip. A value larger than the number of directories in the
71// source file will strip all the directory names and only leave the basename.
72//
73// Note current ThinLTO module importing for the indirect-calls assumes
74// the source directory name not being stripped. A non-zero option value here
75// can potentially prevent some inter-module indirect-call-promotions.
77 "static-func-strip-dirname-prefix", cl::init(0), cl::Hidden,
78 cl::desc("Strip specified level of directory name from source path in "
79 "the profile counter name for static functions."));
80
82 const std::string &ErrMsg = "") {
83 std::string Msg;
85
86 switch (Err) {
87 case instrprof_error::success:
88 OS << "success";
89 break;
90 case instrprof_error::eof:
91 OS << "end of File";
92 break;
93 case instrprof_error::unrecognized_format:
94 OS << "unrecognized instrumentation profile encoding format";
95 break;
96 case instrprof_error::bad_magic:
97 OS << "invalid instrumentation profile data (bad magic)";
98 break;
99 case instrprof_error::bad_header:
100 OS << "invalid instrumentation profile data (file header is corrupt)";
101 break;
102 case instrprof_error::unsupported_version:
103 OS << "unsupported instrumentation profile format version";
104 break;
105 case instrprof_error::unsupported_hash_type:
106 OS << "unsupported instrumentation profile hash type";
107 break;
108 case instrprof_error::too_large:
109 OS << "too much profile data";
110 break;
111 case instrprof_error::truncated:
112 OS << "truncated profile data";
113 break;
114 case instrprof_error::malformed:
115 OS << "malformed instrumentation profile data";
116 break;
117 case instrprof_error::missing_correlation_info:
118 OS << "debug info/binary for correlation is required";
119 break;
120 case instrprof_error::unexpected_correlation_info:
121 OS << "debug info/binary for correlation is not necessary";
122 break;
123 case instrprof_error::unable_to_correlate_profile:
124 OS << "unable to correlate profile";
125 break;
126 case instrprof_error::invalid_prof:
127 OS << "invalid profile created. Please file a bug "
128 "at: " BUG_REPORT_URL
129 " and include the profraw files that caused this error.";
130 break;
131 case instrprof_error::unknown_function:
132 OS << "no profile data available for function";
133 break;
134 case instrprof_error::hash_mismatch:
135 OS << "function control flow change detected (hash mismatch)";
136 break;
137 case instrprof_error::count_mismatch:
138 OS << "function basic block count change detected (counter mismatch)";
139 break;
140 case instrprof_error::bitmap_mismatch:
141 OS << "function bitmap size change detected (bitmap size mismatch)";
142 break;
143 case instrprof_error::counter_overflow:
144 OS << "counter overflow";
145 break;
146 case instrprof_error::value_site_count_mismatch:
147 OS << "function value site count change detected (counter mismatch)";
148 break;
149 case instrprof_error::compress_failed:
150 OS << "failed to compress data (zlib)";
151 break;
152 case instrprof_error::uncompress_failed:
153 OS << "failed to uncompress data (zlib)";
154 break;
155 case instrprof_error::empty_raw_profile:
156 OS << "empty raw profile file";
157 break;
158 case instrprof_error::zlib_unavailable:
159 OS << "profile uses zlib compression but the profile reader was built "
160 "without zlib support";
161 break;
162 case instrprof_error::raw_profile_version_mismatch:
163 OS << "raw profile version mismatch";
164 break;
165 case instrprof_error::counter_value_too_large:
166 OS << "excessively large counter value suggests corrupted profile data";
167 break;
168 }
169
170 // If optional error message is not empty, append it to the message.
171 if (!ErrMsg.empty())
172 OS << ": " << ErrMsg;
173
174 return OS.str();
175}
176
177namespace {
178
179// FIXME: This class is only here to support the transition to llvm::Error. It
180// will be removed once this transition is complete. Clients should prefer to
181// deal with the Error value directly, rather than converting to error_code.
182class InstrProfErrorCategoryType : public std::error_category {
183 const char *name() const noexcept override { return "llvm.instrprof"; }
184
185 std::string message(int IE) const override {
186 return getInstrProfErrString(static_cast<instrprof_error>(IE));
187 }
188};
189
190} // end anonymous namespace
191
192const std::error_category &llvm::instrprof_category() {
193 static InstrProfErrorCategoryType ErrorCategory;
194 return ErrorCategory;
195}
196
197namespace {
198
199const char *InstrProfSectNameCommon[] = {
200#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
201 SectNameCommon,
203};
204
205const char *InstrProfSectNameCoff[] = {
206#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
207 SectNameCoff,
209};
210
211const char *InstrProfSectNamePrefix[] = {
212#define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
213 Prefix,
215};
216
217} // namespace
218
219namespace llvm {
220
222 "enable-name-compression",
223 cl::desc("Enable name/filename string compression"), cl::init(true));
224
226 "enable-vtable-value-profiling", cl::init(false),
227 cl::desc("If true, the virtual table address will be instrumented to know "
228 "the types of a C++ pointer. The information is used in indirect "
229 "call promotion to do selective vtable-based comparison."));
230
233 bool AddSegmentInfo) {
234 std::string SectName;
235
236 if (OF == Triple::MachO && AddSegmentInfo)
237 SectName = InstrProfSectNamePrefix[IPSK];
238
239 if (OF == Triple::COFF)
240 SectName += InstrProfSectNameCoff[IPSK];
241 else
242 SectName += InstrProfSectNameCommon[IPSK];
243
244 if (OF == Triple::MachO && IPSK == IPSK_data && AddSegmentInfo)
245 SectName += ",regular,live_support";
246
247 return SectName;
248}
249
250std::string InstrProfError::message() const {
251 return getInstrProfErrString(Err, Msg);
252}
253
254char InstrProfError::ID = 0;
255
257 StringRef FileName,
259 // Value names may be prefixed with a binary '1' to indicate
260 // that the backend should not modify the symbols due to any platform
261 // naming convention. Do not include that '1' in the PGO profile name.
262 if (Name[0] == '\1')
263 Name = Name.substr(1);
264
265 std::string NewName = std::string(Name);
267 // For local symbols, prepend the main file name to distinguish them.
268 // Do not include the full path in the file name since there's no guarantee
269 // that it will stay the same, e.g., if the files are checked out from
270 // version control in different locations.
271 if (FileName.empty())
272 NewName = NewName.insert(0, "<unknown>:");
273 else
274 NewName = NewName.insert(0, FileName.str() + ":");
275 }
276 return NewName;
277}
278
279// Strip NumPrefix level of directory name from PathNameStr. If the number of
280// directory separators is less than NumPrefix, strip all the directories and
281// leave base file name only.
282static StringRef stripDirPrefix(StringRef PathNameStr, uint32_t NumPrefix) {
283 uint32_t Count = NumPrefix;
284 uint32_t Pos = 0, LastPos = 0;
285 for (auto & CI : PathNameStr) {
286 ++Pos;
288 LastPos = Pos;
289 --Count;
290 }
291 if (Count == 0)
292 break;
293 }
294 return PathNameStr.substr(LastPos);
295}
296
298 StringRef FileName(GO.getParent()->getSourceFileName());
299 uint32_t StripLevel = StaticFuncFullModulePrefix ? 0 : (uint32_t)-1;
300 if (StripLevel < StaticFuncStripDirNamePrefix)
301 StripLevel = StaticFuncStripDirNamePrefix;
302 if (StripLevel)
303 FileName = stripDirPrefix(FileName, StripLevel);
304 return FileName;
305}
306
307// The PGO name has the format [<filepath>;]<mangled-name> where <filepath>; is
308// provided if linkage is local and is used to discriminate possibly identical
309// mangled names. ";" is used because it is unlikely to be found in either
310// <filepath> or <mangled-name>.
311//
312// Older compilers used getPGOFuncName() which has the format
313// [<filepath>:]<mangled-name>. This caused trouble for Objective-C functions
314// which commonly have :'s in their names. We still need to compute this name to
315// lookup functions from profiles built by older compilers.
316static std::string
319 StringRef FileName) {
320 return GlobalValue::getGlobalIdentifier(GO.getName(), Linkage, FileName);
321}
322
323static std::optional<std::string> lookupPGONameFromMetadata(MDNode *MD) {
324 if (MD != nullptr) {
325 StringRef S = cast<MDString>(MD->getOperand(0))->getString();
326 return S.str();
327 }
328 return {};
329}
330
331// Returns the PGO object name. This function has some special handling
332// when called in LTO optimization. The following only applies when calling in
333// LTO passes (when \c InLTO is true): LTO's internalization privatizes many
334// global linkage symbols. This happens after value profile annotation, but
335// those internal linkage functions should not have a source prefix.
336// Additionally, for ThinLTO mode, exported internal functions are promoted
337// and renamed. We need to ensure that the original internal PGO name is
338// used when computing the GUID that is compared against the profiled GUIDs.
339// To differentiate compiler generated internal symbols from original ones,
340// PGOFuncName meta data are created and attached to the original internal
341// symbols in the value profile annotation step
342// (PGOUseFunc::annotateIndirectCallSites). If a symbol does not have the meta
343// data, its original linkage must be non-internal.
344static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO,
345 MDNode *PGONameMetadata) {
346 if (!InLTO) {
347 auto FileName = getStrippedSourceFileName(GO);
348 return getIRPGONameForGlobalObject(GO, GO.getLinkage(), FileName);
349 }
350
351 // In LTO mode (when InLTO is true), first check if there is a meta data.
352 if (auto IRPGOFuncName = lookupPGONameFromMetadata(PGONameMetadata))
353 return *IRPGOFuncName;
354
355 // If there is no meta data, the function must be a global before the value
356 // profile annotation pass. Its current linkage may be internal if it is
357 // internalized in LTO mode.
359}
360
361// Returns the IRPGO function name and does special handling when called
362// in LTO optimization. See the comments of `getIRPGOObjectName` for details.
363std::string getIRPGOFuncName(const Function &F, bool InLTO) {
365}
366
367// Please use getIRPGOFuncName for LLVM IR instrumentation. This function is
368// for front-end (Clang, etc) instrumentation.
369// The implementation is kept for profile matching from older profiles.
370// This is similar to `getIRPGOFuncName` except that this function calls
371// 'getPGOFuncName' to get a name and `getIRPGOFuncName` calls
372// 'getIRPGONameForGlobalObject'. See the difference between two callees in the
373// comments of `getIRPGONameForGlobalObject`.
374std::string getPGOFuncName(const Function &F, bool InLTO, uint64_t Version) {
375 if (!InLTO) {
376 auto FileName = getStrippedSourceFileName(F);
377 return getPGOFuncName(F.getName(), F.getLinkage(), FileName, Version);
378 }
379
380 // In LTO mode (when InLTO is true), first check if there is a meta data.
381 if (auto PGOFuncName = lookupPGONameFromMetadata(getPGOFuncNameMetadata(F)))
382 return *PGOFuncName;
383
384 // If there is no meta data, the function must be a global before the value
385 // profile annotation pass. Its current linkage may be internal if it is
386 // internalized in LTO mode.
387 return getPGOFuncName(F.getName(), GlobalValue::ExternalLinkage, "");
388}
389
390std::string getPGOName(const GlobalVariable &V, bool InLTO) {
391 // PGONameMetadata should be set by compiler at profile use time
392 // and read by symtab creation to look up symbols corresponding to
393 // a MD5 hash.
394 return getIRPGOObjectName(V, InLTO, /*PGONameMetadata=*/nullptr);
395}
396
397// See getIRPGOObjectName() for a discription of the format.
398std::pair<StringRef, StringRef> getParsedIRPGOName(StringRef IRPGOName) {
399 auto [FileName, MangledName] = IRPGOName.split(kGlobalIdentifierDelimiter);
400 if (MangledName.empty())
401 return std::make_pair(StringRef(), IRPGOName);
402 return std::make_pair(FileName, MangledName);
403}
404
406 if (FileName.empty())
407 return PGOFuncName;
408 // Drop the file name including ':' or ';'. See getIRPGONameForGlobalObject as
409 // well.
410 if (PGOFuncName.starts_with(FileName))
411 PGOFuncName = PGOFuncName.drop_front(FileName.size() + 1);
412 return PGOFuncName;
413}
414
415// \p FuncName is the string used as profile lookup key for the function. A
416// symbol is created to hold the name. Return the legalized symbol name.
417std::string getPGOFuncNameVarName(StringRef FuncName,
419 std::string VarName = std::string(getInstrProfNameVarPrefix());
420 VarName += FuncName;
421
422 if (!GlobalValue::isLocalLinkage(Linkage))
423 return VarName;
424
425 // Now fix up illegal chars in local VarName that may upset the assembler.
426 const char InvalidChars[] = "-:;<>/\"'";
427 size_t found = VarName.find_first_of(InvalidChars);
428 while (found != std::string::npos) {
429 VarName[found] = '_';
430 found = VarName.find_first_of(InvalidChars, found + 1);
431 }
432 return VarName;
433}
434
437 StringRef PGOFuncName) {
438 // We generally want to match the function's linkage, but available_externally
439 // and extern_weak both have the wrong semantics, and anything that doesn't
440 // need to link across compilation units doesn't need to be visible at all.
443 else if (Linkage == GlobalValue::AvailableExternallyLinkage)
445 else if (Linkage == GlobalValue::InternalLinkage ||
448
449 auto *Value =
450 ConstantDataArray::getString(M.getContext(), PGOFuncName, false);
451 auto FuncNameVar =
452 new GlobalVariable(M, Value->getType(), true, Linkage, Value,
453 getPGOFuncNameVarName(PGOFuncName, Linkage));
454
455 // Hide the symbol so that we correctly get a copy for each executable.
456 if (!GlobalValue::isLocalLinkage(FuncNameVar->getLinkage()))
457 FuncNameVar->setVisibility(GlobalValue::HiddenVisibility);
458
459 return FuncNameVar;
460}
461
463 return createPGOFuncNameVar(*F.getParent(), F.getLinkage(), PGOFuncName);
464}
465
467 for (Function &F : M) {
468 // Function may not have a name: like using asm("") to overwrite the name.
469 // Ignore in this case.
470 if (!F.hasName())
471 continue;
472 if (Error E = addFuncWithName(F, getIRPGOFuncName(F, InLTO)))
473 return E;
474 // Also use getPGOFuncName() so that we can find records from older profiles
475 if (Error E = addFuncWithName(F, getPGOFuncName(F, InLTO)))
476 return E;
477 }
478
480 for (GlobalVariable &G : M.globals()) {
481 if (!G.hasName() || !G.hasMetadata(LLVMContext::MD_type))
482 continue;
483 if (Error E = addVTableWithName(
484 G, getIRPGOObjectName(G, InLTO, /* PGONameMetadata */ nullptr)))
485 return E;
486 }
487
488 Sorted = false;
489 finalizeSymtab();
490 return Error::success();
491}
492
493Error InstrProfSymtab::addVTableWithName(GlobalVariable &VTable,
494 StringRef VTablePGOName) {
495 auto mapName = [&](StringRef Name) -> Error {
496 if (Error E = addSymbolName(Name))
497 return E;
498
499 bool Inserted = true;
500 std::tie(std::ignore, Inserted) =
501 MD5VTableMap.try_emplace(GlobalValue::getGUID(Name), &VTable);
502 if (!Inserted)
503 LLVM_DEBUG(dbgs() << "GUID conflict within one module");
504 return Error::success();
505 };
506 if (Error E = mapName(VTablePGOName))
507 return E;
508
509 StringRef CanonicalName = getCanonicalName(VTablePGOName);
510 if (CanonicalName != VTablePGOName)
511 return mapName(CanonicalName);
512
513 return Error::success();
514}
515
516/// \c NameStrings is a string composed of one of more possibly encoded
517/// sub-strings. The substrings are separated by 0 or more zero bytes. This
518/// method decodes the string and calls `NameCallback` for each substring.
519static Error
521 std::function<Error(StringRef)> NameCallback) {
522 const uint8_t *P = NameStrings.bytes_begin();
523 const uint8_t *EndP = NameStrings.bytes_end();
524 while (P < EndP) {
525 uint32_t N;
526 uint64_t UncompressedSize = decodeULEB128(P, &N);
527 P += N;
528 uint64_t CompressedSize = decodeULEB128(P, &N);
529 P += N;
530 bool isCompressed = (CompressedSize != 0);
531 SmallVector<uint8_t, 128> UncompressedNameStrings;
532 StringRef NameStrings;
533 if (isCompressed) {
535 return make_error<InstrProfError>(instrprof_error::zlib_unavailable);
536
537 if (Error E = compression::zlib::decompress(ArrayRef(P, CompressedSize),
538 UncompressedNameStrings,
539 UncompressedSize)) {
540 consumeError(std::move(E));
541 return make_error<InstrProfError>(instrprof_error::uncompress_failed);
542 }
543 P += CompressedSize;
544 NameStrings = toStringRef(UncompressedNameStrings);
545 } else {
546 NameStrings =
547 StringRef(reinterpret_cast<const char *>(P), UncompressedSize);
548 P += UncompressedSize;
549 }
550 // Now parse the name strings.
552 NameStrings.split(Names, getInstrProfNameSeparator());
553 for (StringRef &Name : Names)
554 if (Error E = NameCallback(Name))
555 return E;
556
557 while (P < EndP && *P == 0)
558 P++;
559 }
560 return Error::success();
561}
562
565 NameStrings,
566 std::bind(&InstrProfSymtab::addFuncName, this, std::placeholders::_1));
567}
568
570 StringRef VTableNameStrings) {
571 if (Error E = readAndDecodeStrings(FuncNameStrings,
573 this, std::placeholders::_1)))
574 return E;
575
577 VTableNameStrings,
578 std::bind(&InstrProfSymtab::addVTableName, this, std::placeholders::_1));
579}
580
582 StringRef CompressedVTableStrings) {
584 CompressedVTableStrings,
585 std::bind(&InstrProfSymtab::addVTableName, this, std::placeholders::_1));
586}
587
588StringRef InstrProfSymtab::getCanonicalName(StringRef PGOName) {
589 // In ThinLTO, local function may have been promoted to global and have
590 // suffix ".llvm." added to the function name. We need to add the
591 // stripped function name to the symbol table so that we can find a match
592 // from profile.
593 //
594 // ".__uniq." suffix is used to differentiate internal linkage functions in
595 // different modules and should be kept. This is the only suffix with the
596 // pattern ".xxx" which is kept before matching, other suffixes similar as
597 // ".llvm." will be stripped.
598 const std::string UniqSuffix = ".__uniq.";
599 size_t pos = PGOName.find(UniqSuffix);
600 if (pos != StringRef::npos)
601 pos += UniqSuffix.length();
602 else
603 pos = 0;
604
605 // Search '.' after ".__uniq." if ".__uniq." exists, otherwise search '.' from
606 // the beginning.
607 pos = PGOName.find('.', pos);
608 if (pos != StringRef::npos && pos != 0)
609 return PGOName.substr(0, pos);
610
611 return PGOName;
612}
613
614Error InstrProfSymtab::addFuncWithName(Function &F, StringRef PGOFuncName) {
615 auto mapName = [&](StringRef Name) -> Error {
616 if (Error E = addFuncName(Name))
617 return E;
618 MD5FuncMap.emplace_back(Function::getGUID(Name), &F);
619 return Error::success();
620 };
621 if (Error E = mapName(PGOFuncName))
622 return E;
623
624 StringRef CanonicalFuncName = getCanonicalName(PGOFuncName);
625 if (CanonicalFuncName != PGOFuncName)
626 return mapName(CanonicalFuncName);
627
628 return Error::success();
629}
630
632 // Given a runtime address, look up the hash value in the interval map, and
633 // fallback to value 0 if a hash value is not found.
634 return VTableAddrMap.lookup(Address, 0);
635}
636
638 finalizeSymtab();
639 auto It = partition_point(AddrToMD5Map, [=](std::pair<uint64_t, uint64_t> A) {
640 return A.first < Address;
641 });
642 // Raw function pointer collected by value profiler may be from
643 // external functions that are not instrumented. They won't have
644 // mapping data to be used by the deserializer. Force the value to
645 // be 0 in this case.
646 if (It != AddrToMD5Map.end() && It->first == Address)
647 return (uint64_t)It->second;
648 return 0;
649}
650
652 SmallVector<StringRef, 0> Sorted(NameTab.keys());
653 llvm::sort(Sorted);
654 for (StringRef S : Sorted)
655 OS << S << '\n';
656}
657
659 bool doCompression, std::string &Result) {
660 assert(!NameStrs.empty() && "No name data to emit");
661
662 uint8_t Header[20], *P = Header;
663 std::string UncompressedNameStrings =
664 join(NameStrs.begin(), NameStrs.end(), getInstrProfNameSeparator());
665
666 assert(StringRef(UncompressedNameStrings)
667 .count(getInstrProfNameSeparator()) == (NameStrs.size() - 1) &&
668 "PGO name is invalid (contains separator token)");
669
670 unsigned EncLen = encodeULEB128(UncompressedNameStrings.length(), P);
671 P += EncLen;
672
673 auto WriteStringToResult = [&](size_t CompressedLen, StringRef InputStr) {
674 EncLen = encodeULEB128(CompressedLen, P);
675 P += EncLen;
676 char *HeaderStr = reinterpret_cast<char *>(&Header[0]);
677 unsigned HeaderLen = P - &Header[0];
678 Result.append(HeaderStr, HeaderLen);
679 Result += InputStr;
680 return Error::success();
681 };
682
683 if (!doCompression) {
684 return WriteStringToResult(0, UncompressedNameStrings);
685 }
686
687 SmallVector<uint8_t, 128> CompressedNameStrings;
688 compression::zlib::compress(arrayRefFromStringRef(UncompressedNameStrings),
689 CompressedNameStrings,
691
692 return WriteStringToResult(CompressedNameStrings.size(),
693 toStringRef(CompressedNameStrings));
694}
695
697 auto *Arr = cast<ConstantDataArray>(NameVar->getInitializer());
698 StringRef NameStr =
699 Arr->isCString() ? Arr->getAsCString() : Arr->getAsString();
700 return NameStr;
701}
702
704 std::string &Result, bool doCompression) {
705 std::vector<std::string> NameStrs;
706 for (auto *NameVar : NameVars) {
707 NameStrs.push_back(std::string(getPGOFuncNameVarInitializer(NameVar)));
708 }
710 NameStrs, compression::zlib::isAvailable() && doCompression, Result);
711}
712
714 std::string &Result, bool doCompression) {
715 std::vector<std::string> VTableNameStrs;
716 for (auto *VTable : VTables)
717 VTableNameStrs.push_back(getPGOName(*VTable));
719 VTableNameStrs, compression::zlib::isAvailable() && doCompression,
720 Result);
721}
722
724 uint64_t FuncSum = 0;
725 Sum.NumEntries += Counts.size();
726 for (uint64_t Count : Counts)
727 FuncSum += Count;
728 Sum.CountSum += FuncSum;
729
730 for (uint32_t VK = IPVK_First; VK <= IPVK_Last; ++VK) {
731 uint64_t KindSum = 0;
732 uint32_t NumValueSites = getNumValueSites(VK);
733 for (size_t I = 0; I < NumValueSites; ++I) {
735 std::unique_ptr<InstrProfValueData[]> VD = getValueForSite(VK, I);
736 for (uint32_t V = 0; V < NV; V++)
737 KindSum += VD[V].Count;
738 }
739 Sum.ValueCounts[VK] += KindSum;
740 }
741}
742
744 uint32_t ValueKind,
745 OverlapStats &Overlap,
746 OverlapStats &FuncLevelOverlap) {
747 this->sortByTargetValues();
748 Input.sortByTargetValues();
749 double Score = 0.0f, FuncLevelScore = 0.0f;
750 auto I = ValueData.begin();
751 auto IE = ValueData.end();
752 auto J = Input.ValueData.begin();
753 auto JE = Input.ValueData.end();
754 while (I != IE && J != JE) {
755 if (I->Value == J->Value) {
756 Score += OverlapStats::score(I->Count, J->Count,
757 Overlap.Base.ValueCounts[ValueKind],
758 Overlap.Test.ValueCounts[ValueKind]);
759 FuncLevelScore += OverlapStats::score(
760 I->Count, J->Count, FuncLevelOverlap.Base.ValueCounts[ValueKind],
761 FuncLevelOverlap.Test.ValueCounts[ValueKind]);
762 ++I;
763 } else if (I->Value < J->Value) {
764 ++I;
765 continue;
766 }
767 ++J;
768 }
769 Overlap.Overlap.ValueCounts[ValueKind] += Score;
770 FuncLevelOverlap.Overlap.ValueCounts[ValueKind] += FuncLevelScore;
771}
772
773// Return false on mismatch.
776 OverlapStats &Overlap,
777 OverlapStats &FuncLevelOverlap) {
778 uint32_t ThisNumValueSites = getNumValueSites(ValueKind);
779 assert(ThisNumValueSites == Other.getNumValueSites(ValueKind));
780 if (!ThisNumValueSites)
781 return;
782
783 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
784 getOrCreateValueSitesForKind(ValueKind);
786 Other.getValueSitesForKind(ValueKind);
787 for (uint32_t I = 0; I < ThisNumValueSites; I++)
788 ThisSiteRecords[I].overlap(OtherSiteRecords[I], ValueKind, Overlap,
789 FuncLevelOverlap);
790}
791
793 OverlapStats &FuncLevelOverlap,
794 uint64_t ValueCutoff) {
795 // FuncLevel CountSum for other should already computed and nonzero.
796 assert(FuncLevelOverlap.Test.CountSum >= 1.0f);
797 accumulateCounts(FuncLevelOverlap.Base);
798 bool Mismatch = (Counts.size() != Other.Counts.size());
799
800 // Check if the value profiles mismatch.
801 if (!Mismatch) {
802 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) {
803 uint32_t ThisNumValueSites = getNumValueSites(Kind);
804 uint32_t OtherNumValueSites = Other.getNumValueSites(Kind);
805 if (ThisNumValueSites != OtherNumValueSites) {
806 Mismatch = true;
807 break;
808 }
809 }
810 }
811 if (Mismatch) {
812 Overlap.addOneMismatch(FuncLevelOverlap.Test);
813 return;
814 }
815
816 // Compute overlap for value counts.
817 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
818 overlapValueProfData(Kind, Other, Overlap, FuncLevelOverlap);
819
820 double Score = 0.0;
821 uint64_t MaxCount = 0;
822 // Compute overlap for edge counts.
823 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I) {
824 Score += OverlapStats::score(Counts[I], Other.Counts[I],
825 Overlap.Base.CountSum, Overlap.Test.CountSum);
826 MaxCount = std::max(Other.Counts[I], MaxCount);
827 }
828 Overlap.Overlap.CountSum += Score;
829 Overlap.Overlap.NumEntries += 1;
830
831 if (MaxCount >= ValueCutoff) {
832 double FuncScore = 0.0;
833 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I)
834 FuncScore += OverlapStats::score(Counts[I], Other.Counts[I],
835 FuncLevelOverlap.Base.CountSum,
836 FuncLevelOverlap.Test.CountSum);
837 FuncLevelOverlap.Overlap.CountSum = FuncScore;
838 FuncLevelOverlap.Overlap.NumEntries = Other.Counts.size();
839 FuncLevelOverlap.Valid = true;
840 }
841}
842
844 uint64_t Weight,
845 function_ref<void(instrprof_error)> Warn) {
846 this->sortByTargetValues();
847 Input.sortByTargetValues();
848 auto I = ValueData.begin();
849 auto IE = ValueData.end();
850 for (const InstrProfValueData &J : Input.ValueData) {
851 while (I != IE && I->Value < J.Value)
852 ++I;
853 if (I != IE && I->Value == J.Value) {
854 bool Overflowed;
855 I->Count = SaturatingMultiplyAdd(J.Count, Weight, I->Count, &Overflowed);
856 if (Overflowed)
858 ++I;
859 continue;
860 }
861 ValueData.insert(I, J);
862 }
863}
864
866 function_ref<void(instrprof_error)> Warn) {
867 for (InstrProfValueData &I : ValueData) {
868 bool Overflowed;
869 I.Count = SaturatingMultiply(I.Count, N, &Overflowed) / D;
870 if (Overflowed)
872 }
873}
874
875// Merge Value Profile data from Src record to this record for ValueKind.
876// Scale merged value counts by \p Weight.
877void InstrProfRecord::mergeValueProfData(
878 uint32_t ValueKind, InstrProfRecord &Src, uint64_t Weight,
879 function_ref<void(instrprof_error)> Warn) {
880 uint32_t ThisNumValueSites = getNumValueSites(ValueKind);
881 uint32_t OtherNumValueSites = Src.getNumValueSites(ValueKind);
882 if (ThisNumValueSites != OtherNumValueSites) {
884 return;
885 }
886 if (!ThisNumValueSites)
887 return;
888 std::vector<InstrProfValueSiteRecord> &ThisSiteRecords =
889 getOrCreateValueSitesForKind(ValueKind);
891 Src.getValueSitesForKind(ValueKind);
892 for (uint32_t I = 0; I < ThisNumValueSites; I++)
893 ThisSiteRecords[I].merge(OtherSiteRecords[I], Weight, Warn);
894}
895
897 function_ref<void(instrprof_error)> Warn) {
898 // If the number of counters doesn't match we either have bad data
899 // or a hash collision.
900 if (Counts.size() != Other.Counts.size()) {
902 return;
903 }
904
905 // Special handling of the first count as the PseudoCount.
906 CountPseudoKind OtherKind = Other.getCountPseudoKind();
908 if (OtherKind != NotPseudo || ThisKind != NotPseudo) {
909 // We don't allow the merge of a profile with pseudo counts and
910 // a normal profile (i.e. without pesudo counts).
911 // Profile supplimenation should be done after the profile merge.
912 if (OtherKind == NotPseudo || ThisKind == NotPseudo) {
914 return;
915 }
916 if (OtherKind == PseudoHot || ThisKind == PseudoHot)
918 else
920 return;
921 }
922
923 for (size_t I = 0, E = Other.Counts.size(); I < E; ++I) {
924 bool Overflowed;
926 SaturatingMultiplyAdd(Other.Counts[I], Weight, Counts[I], &Overflowed);
929 Overflowed = true;
930 }
931 Counts[I] = Value;
932 if (Overflowed)
934 }
935
936 // If the number of bitmap bytes doesn't match we either have bad data
937 // or a hash collision.
938 if (BitmapBytes.size() != Other.BitmapBytes.size()) {
940 return;
941 }
942
943 // Bitmap bytes are merged by simply ORing them together.
944 for (size_t I = 0, E = Other.BitmapBytes.size(); I < E; ++I) {
945 BitmapBytes[I] = Other.BitmapBytes[I] | BitmapBytes[I];
946 }
947
948 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
949 mergeValueProfData(Kind, Other, Weight, Warn);
950}
951
952void InstrProfRecord::scaleValueProfData(
953 uint32_t ValueKind, uint64_t N, uint64_t D,
954 function_ref<void(instrprof_error)> Warn) {
955 for (auto &R : getValueSitesForKind(ValueKind))
956 R.scale(N, D, Warn);
957}
958
960 function_ref<void(instrprof_error)> Warn) {
961 assert(D != 0 && "D cannot be 0");
962 for (auto &Count : this->Counts) {
963 bool Overflowed;
964 Count = SaturatingMultiply(Count, N, &Overflowed) / D;
965 if (Count > getInstrMaxCountValue()) {
966 Count = getInstrMaxCountValue();
967 Overflowed = true;
968 }
969 if (Overflowed)
971 }
972 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
973 scaleValueProfData(Kind, N, D, Warn);
974}
975
976// Map indirect call target name hash to name string.
977uint64_t InstrProfRecord::remapValue(uint64_t Value, uint32_t ValueKind,
978 InstrProfSymtab *SymTab) {
979 if (!SymTab)
980 return Value;
981
982 if (ValueKind == IPVK_IndirectCallTarget)
983 return SymTab->getFunctionHashFromAddress(Value);
984
985 if (ValueKind == IPVK_VTableTarget)
986 return SymTab->getVTableHashFromAddress(Value);
987
988 return Value;
989}
990
992 InstrProfValueData *VData, uint32_t N,
994 for (uint32_t I = 0; I < N; I++) {
995 VData[I].Value = remapValue(VData[I].Value, ValueKind, ValueMap);
996 }
997 std::vector<InstrProfValueSiteRecord> &ValueSites =
998 getOrCreateValueSitesForKind(ValueKind);
999 if (N == 0)
1000 ValueSites.emplace_back();
1001 else
1002 ValueSites.emplace_back(VData, VData + N);
1003}
1004
1007 using IDT = BPFunctionNode::IDT;
1008 using UtilityNodeT = BPFunctionNode::UtilityNodeT;
1009 // Collect all function IDs ordered by their smallest timestamp. This will be
1010 // used as the initial FunctionNode order.
1011 SetVector<IDT> FunctionIds;
1012 size_t LargestTraceSize = 0;
1013 for (auto &Trace : Traces)
1014 LargestTraceSize =
1015 std::max(LargestTraceSize, Trace.FunctionNameRefs.size());
1016 for (size_t Timestamp = 0; Timestamp < LargestTraceSize; Timestamp++)
1017 for (auto &Trace : Traces)
1018 if (Timestamp < Trace.FunctionNameRefs.size())
1019 FunctionIds.insert(Trace.FunctionNameRefs[Timestamp]);
1020
1021 const int N = Log2_64(LargestTraceSize) + 1;
1022
1023 // TODO: We need to use the Trace.Weight field to give more weight to more
1024 // important utilities
1026 for (size_t TraceIdx = 0; TraceIdx < Traces.size(); TraceIdx++) {
1027 auto &Trace = Traces[TraceIdx].FunctionNameRefs;
1028 for (size_t Timestamp = 0; Timestamp < Trace.size(); Timestamp++) {
1029 for (int I = Log2_64(Timestamp + 1); I < N; I++) {
1030 auto FunctionId = Trace[Timestamp];
1031 UtilityNodeT GroupId = TraceIdx * N + I;
1032 FuncGroups[FunctionId].push_back(GroupId);
1033 }
1034 }
1035 }
1036
1037 std::vector<BPFunctionNode> Nodes;
1038 for (auto Id : FunctionIds) {
1039 auto &UNs = FuncGroups[Id];
1040 llvm::sort(UNs);
1041 UNs.erase(std::unique(UNs.begin(), UNs.end()), UNs.end());
1042 Nodes.emplace_back(Id, UNs);
1043 }
1044 return Nodes;
1045}
1046
1047#define INSTR_PROF_COMMON_API_IMPL
1049
1050/*!
1051 * ValueProfRecordClosure Interface implementation for InstrProfRecord
1052 * class. These C wrappers are used as adaptors so that C++ code can be
1053 * invoked as callbacks.
1054 */
1056 return reinterpret_cast<const InstrProfRecord *>(Record)->getNumValueKinds();
1057}
1058
1060 return reinterpret_cast<const InstrProfRecord *>(Record)
1061 ->getNumValueSites(VKind);
1062}
1063
1065 return reinterpret_cast<const InstrProfRecord *>(Record)
1066 ->getNumValueData(VKind);
1067}
1068
1070 uint32_t S) {
1071 return reinterpret_cast<const InstrProfRecord *>(R)
1072 ->getNumValueDataForSite(VK, S);
1073}
1074
1075void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst,
1076 uint32_t K, uint32_t S) {
1077 reinterpret_cast<const InstrProfRecord *>(R)->getValueForSite(Dst, K, S);
1078}
1079
1080ValueProfData *allocValueProfDataInstrProf(size_t TotalSizeInBytes) {
1081 ValueProfData *VD =
1082 (ValueProfData *)(new (::operator new(TotalSizeInBytes)) ValueProfData());
1083 memset(VD, 0, TotalSizeInBytes);
1084 return VD;
1085}
1086
1087static ValueProfRecordClosure InstrProfRecordClosure = {
1088 nullptr,
1093 nullptr,
1096
1097// Wrapper implementation using the closure mechanism.
1098uint32_t ValueProfData::getSize(const InstrProfRecord &Record) {
1099 auto Closure = InstrProfRecordClosure;
1100 Closure.Record = &Record;
1101 return getValueProfDataSize(&Closure);
1102}
1103
1104// Wrapper implementation using the closure mechanism.
1105std::unique_ptr<ValueProfData>
1106ValueProfData::serializeFrom(const InstrProfRecord &Record) {
1108
1109 std::unique_ptr<ValueProfData> VPD(
1110 serializeValueProfDataFrom(&InstrProfRecordClosure, nullptr));
1111 return VPD;
1112}
1113
1114void ValueProfRecord::deserializeTo(InstrProfRecord &Record,
1115 InstrProfSymtab *SymTab) {
1116 Record.reserveSites(Kind, NumValueSites);
1117
1118 InstrProfValueData *ValueData = getValueProfRecordValueData(this);
1119 for (uint64_t VSite = 0; VSite < NumValueSites; ++VSite) {
1120 uint8_t ValueDataCount = this->SiteCountArray[VSite];
1121 Record.addValueData(Kind, VSite, ValueData, ValueDataCount, SymTab);
1122 ValueData += ValueDataCount;
1123 }
1124}
1125
1126// For writing/serializing, Old is the host endianness, and New is
1127// byte order intended on disk. For Reading/deserialization, Old
1128// is the on-disk source endianness, and New is the host endianness.
1129void ValueProfRecord::swapBytes(llvm::endianness Old, llvm::endianness New) {
1130 using namespace support;
1131
1132 if (Old == New)
1133 return;
1134
1135 if (llvm::endianness::native != Old) {
1136 sys::swapByteOrder<uint32_t>(NumValueSites);
1137 sys::swapByteOrder<uint32_t>(Kind);
1138 }
1139 uint32_t ND = getValueProfRecordNumValueData(this);
1140 InstrProfValueData *VD = getValueProfRecordValueData(this);
1141
1142 // No need to swap byte array: SiteCountArrray.
1143 for (uint32_t I = 0; I < ND; I++) {
1144 sys::swapByteOrder<uint64_t>(VD[I].Value);
1145 sys::swapByteOrder<uint64_t>(VD[I].Count);
1146 }
1147 if (llvm::endianness::native == Old) {
1148 sys::swapByteOrder<uint32_t>(NumValueSites);
1149 sys::swapByteOrder<uint32_t>(Kind);
1150 }
1151}
1152
1153void ValueProfData::deserializeTo(InstrProfRecord &Record,
1154 InstrProfSymtab *SymTab) {
1155 if (NumValueKinds == 0)
1156 return;
1157
1158 ValueProfRecord *VR = getFirstValueProfRecord(this);
1159 for (uint32_t K = 0; K < NumValueKinds; K++) {
1160 VR->deserializeTo(Record, SymTab);
1161 VR = getValueProfRecordNext(VR);
1162 }
1163}
1164
1165template <class T>
1166static T swapToHostOrder(const unsigned char *&D, llvm::endianness Orig) {
1167 using namespace support;
1168
1169 if (Orig == llvm::endianness::little)
1170 return endian::readNext<T, llvm::endianness::little>(D);
1171 else
1172 return endian::readNext<T, llvm::endianness::big>(D);
1173}
1174
1175static std::unique_ptr<ValueProfData> allocValueProfData(uint32_t TotalSize) {
1176 return std::unique_ptr<ValueProfData>(new (::operator new(TotalSize))
1177 ValueProfData());
1178}
1179
1180Error ValueProfData::checkIntegrity() {
1181 if (NumValueKinds > IPVK_Last + 1)
1182 return make_error<InstrProfError>(
1183 instrprof_error::malformed, "number of value profile kinds is invalid");
1184 // Total size needs to be multiple of quadword size.
1185 if (TotalSize % sizeof(uint64_t))
1186 return make_error<InstrProfError>(
1187 instrprof_error::malformed, "total size is not multiples of quardword");
1188
1189 ValueProfRecord *VR = getFirstValueProfRecord(this);
1190 for (uint32_t K = 0; K < this->NumValueKinds; K++) {
1191 if (VR->Kind > IPVK_Last)
1192 return make_error<InstrProfError>(instrprof_error::malformed,
1193 "value kind is invalid");
1194 VR = getValueProfRecordNext(VR);
1195 if ((char *)VR - (char *)this > (ptrdiff_t)TotalSize)
1196 return make_error<InstrProfError>(
1198 "value profile address is greater than total size");
1199 }
1200 return Error::success();
1201}
1202
1204ValueProfData::getValueProfData(const unsigned char *D,
1205 const unsigned char *const BufferEnd,
1206 llvm::endianness Endianness) {
1207 using namespace support;
1208
1209 if (D + sizeof(ValueProfData) > BufferEnd)
1210 return make_error<InstrProfError>(instrprof_error::truncated);
1211
1212 const unsigned char *Header = D;
1213 uint32_t TotalSize = swapToHostOrder<uint32_t>(Header, Endianness);
1214 if (D + TotalSize > BufferEnd)
1215 return make_error<InstrProfError>(instrprof_error::too_large);
1216
1217 std::unique_ptr<ValueProfData> VPD = allocValueProfData(TotalSize);
1218 memcpy(VPD.get(), D, TotalSize);
1219 // Byte swap.
1220 VPD->swapBytesToHost(Endianness);
1221
1222 Error E = VPD->checkIntegrity();
1223 if (E)
1224 return std::move(E);
1225
1226 return std::move(VPD);
1227}
1228
1229void ValueProfData::swapBytesToHost(llvm::endianness Endianness) {
1230 using namespace support;
1231
1232 if (Endianness == llvm::endianness::native)
1233 return;
1234
1235 sys::swapByteOrder<uint32_t>(TotalSize);
1236 sys::swapByteOrder<uint32_t>(NumValueKinds);
1237
1238 ValueProfRecord *VR = getFirstValueProfRecord(this);
1239 for (uint32_t K = 0; K < NumValueKinds; K++) {
1240 VR->swapBytes(Endianness, llvm::endianness::native);
1241 VR = getValueProfRecordNext(VR);
1242 }
1243}
1244
1245void ValueProfData::swapBytesFromHost(llvm::endianness Endianness) {
1246 using namespace support;
1247
1248 if (Endianness == llvm::endianness::native)
1249 return;
1250
1251 ValueProfRecord *VR = getFirstValueProfRecord(this);
1252 for (uint32_t K = 0; K < NumValueKinds; K++) {
1253 ValueProfRecord *NVR = getValueProfRecordNext(VR);
1254 VR->swapBytes(llvm::endianness::native, Endianness);
1255 VR = NVR;
1256 }
1257 sys::swapByteOrder<uint32_t>(TotalSize);
1258 sys::swapByteOrder<uint32_t>(NumValueKinds);
1259}
1260
1262 const InstrProfRecord &InstrProfR,
1263 InstrProfValueKind ValueKind, uint32_t SiteIdx,
1264 uint32_t MaxMDCount) {
1265 uint32_t NV = InstrProfR.getNumValueDataForSite(ValueKind, SiteIdx);
1266 if (!NV)
1267 return;
1268
1269 uint64_t Sum = 0;
1270 std::unique_ptr<InstrProfValueData[]> VD =
1271 InstrProfR.getValueForSite(ValueKind, SiteIdx, &Sum);
1272
1273 ArrayRef<InstrProfValueData> VDs(VD.get(), NV);
1274 annotateValueSite(M, Inst, VDs, Sum, ValueKind, MaxMDCount);
1275}
1276
1279 uint64_t Sum, InstrProfValueKind ValueKind,
1280 uint32_t MaxMDCount) {
1281 if (VDs.empty())
1282 return;
1283 LLVMContext &Ctx = M.getContext();
1284 MDBuilder MDHelper(Ctx);
1286 // Tag
1287 Vals.push_back(MDHelper.createString("VP"));
1288 // Value Kind
1289 Vals.push_back(MDHelper.createConstant(
1290 ConstantInt::get(Type::getInt32Ty(Ctx), ValueKind)));
1291 // Total Count
1292 Vals.push_back(
1293 MDHelper.createConstant(ConstantInt::get(Type::getInt64Ty(Ctx), Sum)));
1294
1295 // Value Profile Data
1296 uint32_t MDCount = MaxMDCount;
1297 for (auto &VD : VDs) {
1298 Vals.push_back(MDHelper.createConstant(
1299 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Value)));
1300 Vals.push_back(MDHelper.createConstant(
1301 ConstantInt::get(Type::getInt64Ty(Ctx), VD.Count)));
1302 if (--MDCount == 0)
1303 break;
1304 }
1305 Inst.setMetadata(LLVMContext::MD_prof, MDNode::get(Ctx, Vals));
1306}
1307
1309 InstrProfValueKind ValueKind) {
1310 MDNode *MD = Inst.getMetadata(LLVMContext::MD_prof);
1311 if (!MD)
1312 return nullptr;
1313
1314 if (MD->getNumOperands() < 5)
1315 return nullptr;
1316
1317 MDString *Tag = cast<MDString>(MD->getOperand(0));
1318 if (!Tag || Tag->getString() != "VP")
1319 return nullptr;
1320
1321 // Now check kind:
1322 ConstantInt *KindInt = mdconst::dyn_extract<ConstantInt>(MD->getOperand(1));
1323 if (!KindInt)
1324 return nullptr;
1325 if (KindInt->getZExtValue() != ValueKind)
1326 return nullptr;
1327
1328 return MD;
1329}
1330
1331static bool getValueProfDataFromInstImpl(const MDNode *const MD,
1332 const uint32_t MaxNumDataWant,
1333 InstrProfValueData ValueData[],
1334 uint32_t &ActualNumValueData,
1335 uint64_t &TotalC, bool GetNoICPValue) {
1336 const unsigned NOps = MD->getNumOperands();
1337 // Get total count
1338 ConstantInt *TotalCInt = mdconst::dyn_extract<ConstantInt>(MD->getOperand(2));
1339 if (!TotalCInt)
1340 return false;
1341 TotalC = TotalCInt->getZExtValue();
1342 ActualNumValueData = 0;
1343
1344 for (unsigned I = 3; I < NOps; I += 2) {
1345 if (ActualNumValueData >= MaxNumDataWant)
1346 break;
1347 ConstantInt *Value = mdconst::dyn_extract<ConstantInt>(MD->getOperand(I));
1348 ConstantInt *Count =
1349 mdconst::dyn_extract<ConstantInt>(MD->getOperand(I + 1));
1350 if (!Value || !Count)
1351 return false;
1352 uint64_t CntValue = Count->getZExtValue();
1353 if (!GetNoICPValue && (CntValue == NOMORE_ICP_MAGICNUM))
1354 continue;
1355 ValueData[ActualNumValueData].Value = Value->getZExtValue();
1356 ValueData[ActualNumValueData].Count = CntValue;
1357 ActualNumValueData++;
1358 }
1359 return true;
1360}
1361
1362std::unique_ptr<InstrProfValueData[]>
1364 uint32_t MaxNumValueData, uint32_t &ActualNumValueData,
1365 uint64_t &TotalC, bool GetNoICPValue) {
1366 MDNode *MD = mayHaveValueProfileOfKind(Inst, ValueKind);
1367 if (!MD)
1368 return nullptr;
1369 auto ValueDataArray = std::make_unique<InstrProfValueData[]>(MaxNumValueData);
1370 if (!getValueProfDataFromInstImpl(MD, MaxNumValueData, ValueDataArray.get(),
1371 ActualNumValueData, TotalC, GetNoICPValue))
1372 return nullptr;
1373 return ValueDataArray;
1374}
1375
1376// FIXME: Migrate existing callers to the function above that returns an
1377// array.
1379 InstrProfValueKind ValueKind,
1380 uint32_t MaxNumValueData,
1381 InstrProfValueData ValueData[],
1382 uint32_t &ActualNumValueData, uint64_t &TotalC,
1383 bool GetNoICPValue) {
1384 MDNode *MD = mayHaveValueProfileOfKind(Inst, ValueKind);
1385 if (!MD)
1386 return false;
1387 return getValueProfDataFromInstImpl(MD, MaxNumValueData, ValueData,
1388 ActualNumValueData, TotalC,
1389 GetNoICPValue);
1390}
1391
1393 return F.getMetadata(getPGOFuncNameMetadataName());
1394}
1395
1397 // Only for internal linkage functions.
1398 if (PGOFuncName == F.getName())
1399 return;
1400 // Don't create duplicated meta-data.
1402 return;
1403 LLVMContext &C = F.getContext();
1404 MDNode *N = MDNode::get(C, MDString::get(C, PGOFuncName));
1405 F.setMetadata(getPGOFuncNameMetadataName(), N);
1406}
1407
1408bool needsComdatForCounter(const GlobalObject &GO, const Module &M) {
1409 if (GO.hasComdat())
1410 return true;
1411
1412 if (!Triple(M.getTargetTriple()).supportsCOMDAT())
1413 return false;
1414
1415 // See createPGOFuncNameVar for more details. To avoid link errors, profile
1416 // counters for function with available_externally linkage needs to be changed
1417 // to linkonce linkage. On ELF based systems, this leads to weak symbols to be
1418 // created. Without using comdat, duplicate entries won't be removed by the
1419 // linker leading to increased data segement size and raw profile size. Even
1420 // worse, since the referenced counter from profile per-function data object
1421 // will be resolved to the common strong definition, the profile counts for
1422 // available_externally functions will end up being duplicated in raw profile
1423 // data. This can result in distorted profile as the counts of those dups
1424 // will be accumulated by the profile merger.
1426 if (Linkage != GlobalValue::ExternalWeakLinkage &&
1428 return false;
1429
1430 return true;
1431}
1432
1433// Check if INSTR_PROF_RAW_VERSION_VAR is defined.
1434bool isIRPGOFlagSet(const Module *M) {
1435 auto IRInstrVar =
1436 M->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR));
1437 if (!IRInstrVar || IRInstrVar->hasLocalLinkage())
1438 return false;
1439
1440 // For CSPGO+LTO, this variable might be marked as non-prevailing and we only
1441 // have the decl.
1442 if (IRInstrVar->isDeclaration())
1443 return true;
1444
1445 // Check if the flag is set.
1446 if (!IRInstrVar->hasInitializer())
1447 return false;
1448
1449 auto *InitVal = dyn_cast_or_null<ConstantInt>(IRInstrVar->getInitializer());
1450 if (!InitVal)
1451 return false;
1452 return (InitVal->getZExtValue() & VARIANT_MASK_IR_PROF) != 0;
1453}
1454
1455// Check if we can safely rename this Comdat function.
1456bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken) {
1457 if (F.getName().empty())
1458 return false;
1459 if (!needsComdatForCounter(F, *(F.getParent())))
1460 return false;
1461 // Unsafe to rename the address-taken function (which can be used in
1462 // function comparison).
1463 if (CheckAddressTaken && F.hasAddressTaken())
1464 return false;
1465 // Only safe to do if this function may be discarded if it is not used
1466 // in the compilation unit.
1467 if (!GlobalValue::isDiscardableIfUnused(F.getLinkage()))
1468 return false;
1469
1470 // For AvailableExternallyLinkage functions.
1471 if (!F.hasComdat()) {
1473 return true;
1474 }
1475 return true;
1476}
1477
1478// Create the variable for the profile file name.
1479void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput) {
1480 if (InstrProfileOutput.empty())
1481 return;
1482 Constant *ProfileNameConst =
1483 ConstantDataArray::getString(M.getContext(), InstrProfileOutput, true);
1484 GlobalVariable *ProfileNameVar = new GlobalVariable(
1485 M, ProfileNameConst->getType(), true, GlobalValue::WeakAnyLinkage,
1486 ProfileNameConst, INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR));
1488 Triple TT(M.getTargetTriple());
1489 if (TT.supportsCOMDAT()) {
1491 ProfileNameVar->setComdat(M.getOrInsertComdat(
1492 StringRef(INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_NAME_VAR))));
1493 }
1494}
1495
1496Error OverlapStats::accumulateCounts(const std::string &BaseFilename,
1497 const std::string &TestFilename,
1498 bool IsCS) {
1499 auto getProfileSum = [IsCS](const std::string &Filename,
1500 CountSumOrPercent &Sum) -> Error {
1501 // This function is only used from llvm-profdata that doesn't use any kind
1502 // of VFS. Just create a default RealFileSystem to read profiles.
1503 auto FS = vfs::getRealFileSystem();
1504 auto ReaderOrErr = InstrProfReader::create(Filename, *FS);
1505 if (Error E = ReaderOrErr.takeError()) {
1506 return E;
1507 }
1508 auto Reader = std::move(ReaderOrErr.get());
1509 Reader->accumulateCounts(Sum, IsCS);
1510 return Error::success();
1511 };
1512 auto Ret = getProfileSum(BaseFilename, Base);
1513 if (Ret)
1514 return Ret;
1515 Ret = getProfileSum(TestFilename, Test);
1516 if (Ret)
1517 return Ret;
1518 this->BaseFilename = &BaseFilename;
1519 this->TestFilename = &TestFilename;
1520 Valid = true;
1521 return Error::success();
1522}
1523
1525 Mismatch.NumEntries += 1;
1526 Mismatch.CountSum += MismatchFunc.CountSum / Test.CountSum;
1527 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1528 if (Test.ValueCounts[I] >= 1.0f)
1530 MismatchFunc.ValueCounts[I] / Test.ValueCounts[I];
1531 }
1532}
1533
1535 Unique.NumEntries += 1;
1536 Unique.CountSum += UniqueFunc.CountSum / Test.CountSum;
1537 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1538 if (Test.ValueCounts[I] >= 1.0f)
1539 Unique.ValueCounts[I] += UniqueFunc.ValueCounts[I] / Test.ValueCounts[I];
1540 }
1541}
1542
1544 if (!Valid)
1545 return;
1546
1547 const char *EntryName =
1548 (Level == ProgramLevel ? "functions" : "edge counters");
1549 if (Level == ProgramLevel) {
1550 OS << "Profile overlap infomation for base_profile: " << *BaseFilename
1551 << " and test_profile: " << *TestFilename << "\nProgram level:\n";
1552 } else {
1553 OS << "Function level:\n"
1554 << " Function: " << FuncName << " (Hash=" << FuncHash << ")\n";
1555 }
1556
1557 OS << " # of " << EntryName << " overlap: " << Overlap.NumEntries << "\n";
1558 if (Mismatch.NumEntries)
1559 OS << " # of " << EntryName << " mismatch: " << Mismatch.NumEntries
1560 << "\n";
1561 if (Unique.NumEntries)
1562 OS << " # of " << EntryName
1563 << " only in test_profile: " << Unique.NumEntries << "\n";
1564
1565 OS << " Edge profile overlap: " << format("%.3f%%", Overlap.CountSum * 100)
1566 << "\n";
1567 if (Mismatch.NumEntries)
1568 OS << " Mismatched count percentage (Edge): "
1569 << format("%.3f%%", Mismatch.CountSum * 100) << "\n";
1570 if (Unique.NumEntries)
1571 OS << " Percentage of Edge profile only in test_profile: "
1572 << format("%.3f%%", Unique.CountSum * 100) << "\n";
1573 OS << " Edge profile base count sum: " << format("%.0f", Base.CountSum)
1574 << "\n"
1575 << " Edge profile test count sum: " << format("%.0f", Test.CountSum)
1576 << "\n";
1577
1578 for (unsigned I = 0; I < IPVK_Last - IPVK_First + 1; I++) {
1579 if (Base.ValueCounts[I] < 1.0f && Test.ValueCounts[I] < 1.0f)
1580 continue;
1581 char ProfileKindName[20] = {0};
1582 switch (I) {
1583 case IPVK_IndirectCallTarget:
1584 strncpy(ProfileKindName, "IndirectCall", 19);
1585 break;
1586 case IPVK_MemOPSize:
1587 strncpy(ProfileKindName, "MemOP", 19);
1588 break;
1589 case IPVK_VTableTarget:
1590 strncpy(ProfileKindName, "VTable", 19);
1591 break;
1592 default:
1593 snprintf(ProfileKindName, 19, "VP[%d]", I);
1594 break;
1595 }
1596 OS << " " << ProfileKindName
1597 << " profile overlap: " << format("%.3f%%", Overlap.ValueCounts[I] * 100)
1598 << "\n";
1599 if (Mismatch.NumEntries)
1600 OS << " Mismatched count percentage (" << ProfileKindName
1601 << "): " << format("%.3f%%", Mismatch.ValueCounts[I] * 100) << "\n";
1602 if (Unique.NumEntries)
1603 OS << " Percentage of " << ProfileKindName
1604 << " profile only in test_profile: "
1605 << format("%.3f%%", Unique.ValueCounts[I] * 100) << "\n";
1606 OS << " " << ProfileKindName
1607 << " profile base count sum: " << format("%.0f", Base.ValueCounts[I])
1608 << "\n"
1609 << " " << ProfileKindName
1610 << " profile test count sum: " << format("%.0f", Test.ValueCounts[I])
1611 << "\n";
1612 }
1613}
1614
1615namespace IndexedInstrProf {
1616// A C++14 compatible version of the offsetof macro.
1617template <typename T1, typename T2>
1618inline size_t constexpr offsetOf(T1 T2::*Member) {
1619 constexpr T2 Object{};
1620 return size_t(&(Object.*Member)) - size_t(&Object);
1621}
1622
1623static inline uint64_t read(const unsigned char *Buffer, size_t Offset) {
1624 return *reinterpret_cast<const uint64_t *>(Buffer + Offset);
1625}
1626
1628 using namespace support;
1629 return endian::byte_swap<uint64_t, llvm::endianness::little>(Version);
1630}
1631
1632Expected<Header> Header::readFromBuffer(const unsigned char *Buffer) {
1633 using namespace support;
1634 static_assert(std::is_standard_layout_v<Header>,
1635 "The header should be standard layout type since we use offset "
1636 "of fields to read.");
1637 Header H;
1638
1639 H.Magic = read(Buffer, offsetOf(&Header::Magic));
1640 // Check the magic number.
1641 uint64_t Magic =
1642 endian::byte_swap<uint64_t, llvm::endianness::little>(H.Magic);
1644 return make_error<InstrProfError>(instrprof_error::bad_magic);
1645
1646 // Read the version.
1647 H.Version = read(Buffer, offsetOf(&Header::Version));
1648 if (GET_VERSION(H.formatVersion()) >
1650 return make_error<InstrProfError>(instrprof_error::unsupported_version);
1651
1652 switch (GET_VERSION(H.formatVersion())) {
1653 // When a new field is added in the header add a case statement here to
1654 // populate it.
1655 static_assert(
1657 "Please update the reading code below if a new field has been added, "
1658 "if not add a case statement to fall through to the latest version.");
1659 case 12ull:
1660 H.VTableNamesOffset = read(Buffer, offsetOf(&Header::VTableNamesOffset));
1661 [[fallthrough]];
1662 case 11ull:
1663 [[fallthrough]];
1664 case 10ull:
1665 H.TemporalProfTracesOffset =
1667 [[fallthrough]];
1668 case 9ull:
1669 H.BinaryIdOffset = read(Buffer, offsetOf(&Header::BinaryIdOffset));
1670 [[fallthrough]];
1671 case 8ull:
1672 H.MemProfOffset = read(Buffer, offsetOf(&Header::MemProfOffset));
1673 [[fallthrough]];
1674 default: // Version7 (when the backwards compatible header was introduced).
1675 H.HashType = read(Buffer, offsetOf(&Header::HashType));
1676 H.HashOffset = read(Buffer, offsetOf(&Header::HashOffset));
1677 }
1678
1679 return H;
1680}
1681
1682size_t Header::size() const {
1683 switch (GET_VERSION(formatVersion())) {
1684 // When a new field is added to the header add a case statement here to
1685 // compute the size as offset of the new field + size of the new field. This
1686 // relies on the field being added to the end of the list.
1688 "Please update the size computation below if a new field has "
1689 "been added to the header, if not add a case statement to "
1690 "fall through to the latest version.");
1691 case 12ull:
1694 case 11ull:
1695 [[fallthrough]];
1696 case 10ull:
1699 case 9ull:
1701 case 8ull:
1703 default: // Version7 (when the backwards compatible header was introduced).
1705 }
1706}
1707
1708} // namespace IndexedInstrProf
1709
1710} // end namespace llvm
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")
#define LLVM_ATTRIBUTE_UNUSED
Definition: Compiler.h:203
This file contains the declarations for the subclasses of Constant, which represent the different fla...
#define LLVM_DEBUG(X)
Definition: Debug.h:101
std::string Name
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:81
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
#define H(x, y, z)
Definition: MD5.cpp:57
This file contains the declarations for metadata subclasses.
Module.h This file contains the declarations for the Module class.
#define P(N)
uint64_t Timestamp
Definition: Profile.cpp:320
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static const char * name
Definition: SMEABIPass.cpp:49
raw_pwrite_stream & OS
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
Defines the virtual file system interface vfs::FileSystem.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
iterator end() const
Definition: ArrayRef.h:154
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:165
iterator begin() const
Definition: ArrayRef.h:153
bool empty() const
empty - Check if the array is empty.
Definition: ArrayRef.h:160
static Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
Definition: Constants.cpp:2881
This is the shared class of boolean and integer constants.
Definition: Constants.h:80
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:154
This is an important base class in LLVM.
Definition: Constant.h:41
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:334
Tagged union holding either a T or a Error.
Definition: Error.h:474
void setComdat(Comdat *C)
Definition: Globals.cpp:197
bool hasComdat() const
Definition: GlobalObject.h:128
static bool isLocalLinkage(LinkageTypes Linkage)
Definition: GlobalValue.h:409
LinkageTypes getLinkage() const
Definition: GlobalValue.h:546
void setLinkage(LinkageTypes LT)
Definition: GlobalValue.h:537
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
Definition: GlobalValue.h:595
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:656
bool isDiscardableIfUnused() const
Definition: GlobalValue.h:548
@ HiddenVisibility
The GV is hidden.
Definition: GlobalValue.h:68
void setVisibility(VisibilityTypes V)
Definition: GlobalValue.h:254
std::string getGlobalIdentifier() const
Return the modified name for this global value suitable to be used as the key for a global lookup (e....
Definition: Globals.cpp:169
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition: GlobalValue.h:51
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition: GlobalValue.h:60
@ InternalLinkage
Rename collisions when linking (static functions).
Definition: GlobalValue.h:59
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition: GlobalValue.h:54
@ ExternalLinkage
Externally visible function.
Definition: GlobalValue.h:52
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition: GlobalValue.h:56
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition: GlobalValue.h:53
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition: GlobalValue.h:61
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition: GlobalValue.h:55
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
static char ID
Definition: InstrProf.h:428
std::string message() const override
Return the error message as a string.
Definition: InstrProf.cpp:250
static Expected< std::unique_ptr< InstrProfReader > > create(const Twine &Path, vfs::FileSystem &FS, const InstrProfCorrelator *Correlator=nullptr, std::function< void(Error)> Warn=nullptr)
Factory method to create an appropriately typed reader for the given instrprof file.
A symbol table used for function [IR]PGO name look-up with keys (such as pointers,...
Definition: InstrProf.h:452
uint64_t getFunctionHashFromAddress(uint64_t Address)
Return a function's hash, or 0, if the function isn't in this SymTab.
Definition: InstrProf.cpp:637
Error addSymbolName(StringRef SymbolName)
Definition: InstrProf.h:572
uint64_t getVTableHashFromAddress(uint64_t Address)
Return a vtable's hash, or 0 if the vtable doesn't exist in this SymTab.
Definition: InstrProf.cpp:631
Error addVTableName(StringRef VTableName)
Adds VTableName as a known symbol, and inserts it to a map that tracks all vtable names.
Definition: InstrProf.h:594
void dumpNames(raw_ostream &OS) const
Dump the symbols in this table.
Definition: InstrProf.cpp:651
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:590
Error initVTableNamesFromCompressedStrings(StringRef CompressedVTableNames)
Initialize 'this' with the set of vtable names encoded in CompressedVTableNames.
Definition: InstrProf.cpp:581
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
Definition: Instruction.h:359
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
Definition: Metadata.cpp:1635
ValT lookup(KeyT x, ValT NotFound=ValT()) const
lookup - Return the mapped value at x or NotFound.
Definition: IntervalMap.h:1119
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
ConstantAsMetadata * createConstant(Constant *C)
Return the given constant as metadata.
Definition: MDBuilder.cpp:24
MDString * createString(StringRef Str)
Return the given string as metadata.
Definition: MDBuilder.cpp:20
Metadata node.
Definition: Metadata.h:1067
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1428
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1541
unsigned getNumOperands() const
Return number of MDNode operands.
Definition: Metadata.h:1434
A single uniqued string.
Definition: Metadata.h:720
static MDString * get(LLVMContext &Context, StringRef Str)
Definition: Metadata.cpp:600
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
const std::string & getSourceFileName() const
Get the module's original source file name.
Definition: Module.h:278
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
A vector that has set insertion semantics.
Definition: SetVector.h:57
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition: SetVector.h:162
size_t size() const
Definition: SmallVector.h:91
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
iterator_range< StringMapKeyIterator< ValueTy > > keys() const
Definition: StringMap.h:228
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition: StringRef.h:692
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:222
const unsigned char * bytes_end() const
Definition: StringRef.h:118
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition: StringRef.h:563
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:257
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:134
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition: StringRef.h:601
constexpr size_t size() const
size - Get the string size.
Definition: StringRef.h:137
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Definition: StringRef.h:289
static constexpr size_t npos
Definition: StringRef.h:52
const unsigned char * bytes_begin() const
Definition: StringRef.h:115
unsigned size() const
Definition: Trace.h:95
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
bool supportsCOMDAT() const
Tests whether the target supports comdat.
Definition: Triple.h:1048
ObjectFormatType
Definition: Triple.h:297
static IntegerType * getInt32Ty(LLVMContext &C)
static IntegerType * getInt64Ty(LLVMContext &C)
See the file comment.
Definition: ValueMap.h:84
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
An efficient, type-erasing, non-owning reference to a callable.
A raw_ostream that writes to a file descriptor.
Definition: raw_ostream.h:470
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:660
This class represents a function that is read from a sample profile.
Definition: FunctionId.h:36
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
static uint64_t read(const unsigned char *Buffer, size_t Offset)
Definition: InstrProf.cpp:1623
const uint64_t Magic
Definition: InstrProf.h:1138
size_t constexpr offsetOf(T1 T2::*Member)
Definition: InstrProf.cpp:1618
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:450
void compress(ArrayRef< uint8_t > Input, SmallVectorImpl< uint8_t > &CompressedBuffer, int Level=DefaultCompression)
Error decompress(ArrayRef< uint8_t > Input, uint8_t *Output, size_t &UncompressedSize)
constexpr int BestSizeCompression
Definition: Compression.h:39
StringRef toStringRef(const std::optional< DWARFFormValue > &V, StringRef Default={})
Take an optional DWARFFormValue and try to extract a string value from it.
bool is_separator(char value, Style style=Style::native)
Check whether the given char is a path separator on the host OS.
Definition: Path.cpp:602
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: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:456
bool getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, uint32_t MaxNumValueData, InstrProfValueData ValueData[], uint32_t &ActualNumValueData, uint64_t &TotalC, bool GetNoICPValue=false)
Extract the value profile data from Inst which is annotated with value profile meta data.
Definition: InstrProf.cpp:1378
StringRef getInstrProfNameVarPrefix()
Return the name prefix of variables containing instrumented function names.
Definition: InstrProf.h:92
std::string getPGOFuncName(const Function &F, bool InLTO=false, uint64_t Version=INSTR_PROF_INDEX_VERSION)
Please use getIRPGOFuncName for LLVM IR instrumentation.
Definition: InstrProf.cpp:374
void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName)
Create the PGOFuncName meta data if PGOFuncName is different from function's raw name.
Definition: InstrProf.cpp:1396
std::string getIRPGOFuncName(const Function &F, bool InLTO=false)
Definition: InstrProf.cpp:363
StringRef getPGOFuncNameMetadataName()
Definition: InstrProf.h:307
void getValueForSiteInstrProf(const void *R, InstrProfValueData *Dst, uint32_t K, uint32_t S)
Definition: InstrProf.cpp:1075
cl::opt< bool > DoInstrProfNameCompression
StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, StringRef FileName="<unknown>")
Given a PGO function name, remove the filename prefix and return the original (static) function name.
Definition: InstrProf.cpp:405
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
Definition: STLExtras.h:2008
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:131
std::pair< StringRef, StringRef > getParsedIRPGOName(StringRef IRPGOName)
Definition: InstrProf.cpp:398
MDNode * getPGOFuncNameMetadata(const Function &F)
Return the PGOFuncName meta data associated with a function.
Definition: InstrProf.cpp:1392
static std::unique_ptr< ValueProfData > allocValueProfData(uint32_t TotalSize)
Definition: InstrProf.cpp:1175
MDNode * mayHaveValueProfileOfKind(const Instruction &Inst, InstrProfValueKind ValueKind)
Definition: InstrProf.cpp:1308
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition: MathExtras.h:330
std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
Definition: InstrProf.cpp:231
uint64_t getInstrMaxCountValue()
Return the max count value. We reserver a few large values for special use.
Definition: InstrProf.h:66
bool needsComdatForCounter(const GlobalObject &GV, const Module &M)
Check if we can use Comdat for profile variables.
Definition: InstrProf.cpp:1408
constexpr char kGlobalIdentifierDelimiter
Definition: GlobalValue.h:46
std::string getPGOName(const GlobalVariable &V, bool InLTO=false)
Definition: InstrProf.cpp:390
GlobalVariable * createPGOFuncNameVar(Function &F, StringRef PGOFuncName)
Create and return the global variable for function name used in PGO instrumentation.
Definition: InstrProf.cpp:462
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...
Definition: InstrProf.cpp:1261
Error collectPGOFuncNameStrings(ArrayRef< GlobalVariable * > NameVars, std::string &Result, bool doCompression=true)
Produce Result string with the same format described above.
Definition: InstrProf.cpp:703
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1647
InstrProfSectKind
Definition: InstrProf.h:60
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar)
Return the initializer in string of the PGO name var NameVar.
Definition: InstrProf.cpp:696
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:568
static T swapToHostOrder(const unsigned char *&D, llvm::endianness Orig)
Definition: InstrProf.cpp:1166
StringRef getInstrProfNameSeparator()
Return the marker used to separate PGO names during serialization.
Definition: InstrProf.h:178
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:125
static std::string getIRPGOObjectName(const GlobalObject &GO, bool InLTO, MDNode *PGONameMetadata)
Definition: InstrProf.cpp:344
@ Other
Any other memory.
instrprof_error
Definition: InstrProf.h:347
InstrProfValueKind
Definition: InstrProf.h:267
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:522
const std::error_category & instrprof_category()
Definition: InstrProf.cpp:192
Error collectVTableStrings(ArrayRef< GlobalVariable * > VTables, std::string &Result, bool doCompression)
Definition: InstrProf.cpp:713
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:1914
static StringRef getStrippedSourceFileName(const GlobalObject &GO)
Definition: InstrProf.cpp:297
uint32_t getNumValueSitesInstrProf(const void *Record, uint32_t VKind)
Definition: InstrProf.cpp:1059
bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken=false)
Check if we can safely rename this Comdat function.
Definition: InstrProf.cpp:1456
void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput)
Definition: InstrProf.cpp:1479
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,...
Definition: InstrProf.cpp:658
static bool getValueProfDataFromInstImpl(const MDNode *const MD, const uint32_t MaxNumDataWant, InstrProfValueData ValueData[], uint32_t &ActualNumValueData, uint64_t &TotalC, bool GetNoICPValue)
Definition: InstrProf.cpp:1331
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:80
uint32_t getNumValueDataForSiteInstrProf(const void *R, uint32_t VK, uint32_t S)
Definition: InstrProf.cpp:1069
static ValueProfRecordClosure InstrProfRecordClosure
Definition: InstrProf.cpp:1087
static Error readAndDecodeStrings(StringRef NameStrings, std::function< Error(StringRef)> NameCallback)
NameStrings is a string composed of one of more possibly encoded sub-strings.
Definition: InstrProf.cpp:520
std::string getPGOFuncNameVarName(StringRef FuncName, GlobalValue::LinkageTypes Linkage)
Return the name of the global variable used to store a function name in PGO instrumentation.
Definition: InstrProf.cpp:417
static StringRef stripDirPrefix(StringRef PathNameStr, uint32_t NumPrefix)
Definition: InstrProf.cpp:282
endianness
Definition: bit.h:70
static std::optional< std::string > lookupPGONameFromMetadata(MDNode *MD)
Definition: InstrProf.cpp:323
bool isIRPGOFlagSet(const Module *M)
Check if INSTR_PROF_RAW_VERSION_VAR is defined.
Definition: InstrProf.cpp:1434
void consumeError(Error Err)
Consume a Error without doing anything.
Definition: Error.h:1041
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:57
uint32_t getNumValueKindsInstrProf(const void *Record)
ValueProfRecordClosure Interface implementation for InstrProfRecord class.
Definition: InstrProf.cpp:1055
ValueProfData * allocValueProfDataInstrProf(size_t TotalSizeInBytes)
Definition: InstrProf.cpp:1080
uint32_t getNumValueDataInstrProf(const void *Record, uint32_t VKind)
Definition: InstrProf.cpp:1064
static std::string getIRPGONameForGlobalObject(const GlobalObject &GO, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Definition: InstrProf.cpp:317
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
double ValueCounts[IPVK_Last - IPVK_First+1]
Definition: InstrProf.h:741
uint64_t formatVersion() const
Definition: InstrProf.cpp:1627
static Expected< Header > readFromBuffer(const unsigned char *Buffer)
Definition: InstrProf.cpp:1632
Profiling information for a single function.
Definition: InstrProf.h:832
void overlapValueProfData(uint32_t ValueKind, InstrProfRecord &Src, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap)
Compute the overlap of value profile counts.
Definition: InstrProf.cpp:774
std::vector< uint64_t > Counts
Definition: InstrProf.h:833
CountPseudoKind getCountPseudoKind() const
Definition: InstrProf.h:943
void accumulateCounts(CountSumOrPercent &Sum) const
Compute the sums of all counts and store in Sum.
Definition: InstrProf.cpp:723
uint32_t getNumValueSites(uint32_t ValueKind) const
Return the number of instrumented sites for ValueKind.
Definition: InstrProf.h:1062
void setPseudoCount(CountPseudoKind Kind)
Definition: InstrProf.h:951
void merge(InstrProfRecord &Other, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge the counts in Other into this one.
Definition: InstrProf.cpp:896
void addValueData(uint32_t ValueKind, uint32_t Site, InstrProfValueData *VData, uint32_t N, InstrProfSymtab *SymTab)
Add ValueData for ValueKind at value Site.
Definition: InstrProf.cpp:991
uint32_t getNumValueDataForSite(uint32_t ValueKind, uint32_t Site) const
Return the number of value data collected for ValueKind at profiling site: Site.
Definition: InstrProf.h:1066
void overlap(InstrProfRecord &Other, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff)
Compute the overlap b/w this IntrprofRecord and Other.
Definition: InstrProf.cpp:792
std::vector< uint8_t > BitmapBytes
Definition: InstrProf.h:834
std::unique_ptr< InstrProfValueData[]> getValueForSite(uint32_t ValueKind, uint32_t Site, uint64_t *TotalC=nullptr) const
Return the array of profiled values at Site.
Definition: InstrProf.h:1072
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).
Definition: InstrProf.cpp:959
void sortByTargetValues()
Sort ValueData ascending by Value.
Definition: InstrProf.h:810
void merge(InstrProfValueSiteRecord &Input, uint64_t Weight, function_ref< void(instrprof_error)> Warn)
Merge data from another InstrProfValueSiteRecord Optionally scale merged counts by Weight.
Definition: InstrProf.cpp:843
void overlap(InstrProfValueSiteRecord &Input, uint32_t ValueKind, OverlapStats &Overlap, OverlapStats &FuncLevelOverlap)
Compute the overlap b/w this record and Input record.
Definition: InstrProf.cpp:743
std::list< InstrProfValueData > ValueData
Value profiling data pairs at a given value site.
Definition: InstrProf.h:802
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).
Definition: InstrProf.cpp:865
void addOneMismatch(const CountSumOrPercent &MismatchFunc)
Definition: InstrProf.cpp:1524
static double score(uint64_t Val1, uint64_t Val2, double Sum1, double Sum2)
Definition: InstrProf.h:785
Error accumulateCounts(const std::string &BaseFilename, const std::string &TestFilename, bool IsCS)
Definition: InstrProf.cpp:1496
void dump(raw_fd_ostream &OS) const
Definition: InstrProf.cpp:1543
CountSumOrPercent Overlap
Definition: InstrProf.h:759
CountSumOrPercent Base
Definition: InstrProf.h:755
uint64_t FuncHash
Definition: InstrProf.h:766
void addOneUnique(const CountSumOrPercent &UniqueFunc)
Definition: InstrProf.cpp:1534
const std::string * BaseFilename
Definition: InstrProf.h:763
const std::string * TestFilename
Definition: InstrProf.h:764
CountSumOrPercent Unique
Definition: InstrProf.h:761
CountSumOrPercent Mismatch
Definition: InstrProf.h:760
StringRef FuncName
Definition: InstrProf.h:765
CountSumOrPercent Test
Definition: InstrProf.h:757
static std::vector< BPFunctionNode > createBPFunctionNodes(ArrayRef< TemporalProfTraceTy > Traces)
Use a set of temporal profile traces to create a list of balanced partitioning function nodes used by...
Definition: InstrProf.cpp:1005