LLVM 24.0.0git
SampleProfReader.h
Go to the documentation of this file.
1//===- SampleProfReader.h - Read LLVM sample profile data -------*- C++ -*-===//
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 definitions needed for reading sample profiles.
10//
11// NOTE: If you are making changes to this file format, please remember
12// to document them in the Clang documentation at
13// tools/clang/docs/UsersManual.rst.
14//
15// Text format
16// -----------
17//
18// Sample profiles are written as ASCII text. The file is divided into
19// sections, which correspond to each of the functions executed at runtime.
20// Each section has the following format
21//
22// function1:total_samples:total_head_samples
23// offset1[.discriminator]: number_of_samples [fn1:num fn2:num ... ]
24// offset2[.discriminator]: number_of_samples [fn3:num fn4:num ... ]
25// ...
26// offsetN[.discriminator]: number_of_samples [fn5:num fn6:num ... ]
27// offsetA[.discriminator]: fnA:num_of_total_samples
28// offsetA1[.discriminator]: number_of_samples [fn7:num fn8:num ... ]
29// ...
30// !CFGChecksum: num
31// !Attribute: flags
32//
33// This is a nested tree in which the indentation represents the nesting level
34// of the inline stack. There are no blank lines in the file. And the spacing
35// within a single line is fixed. Additional spaces will result in an error
36// while reading the file.
37//
38// Any line starting with the '#' character is completely ignored.
39//
40// Inlined calls are represented with indentation. The Inline stack is a
41// stack of source locations in which the top of the stack represents the
42// leaf function, and the bottom of the stack represents the actual
43// symbol to which the instruction belongs.
44//
45// Function names must be mangled in order for the profile loader to
46// match them in the current translation unit. The two numbers in the
47// function header specify how many total samples were accumulated in the
48// function (first number), and the total number of samples accumulated
49// in the prologue of the function (second number). This head sample
50// count provides an indicator of how frequently the function is invoked.
51//
52// There are three types of lines in the function body.
53//
54// * Sampled line represents the profile information of a source location.
55// * Callsite line represents the profile information of a callsite.
56// * Metadata line represents extra metadata of the function.
57//
58// Each sampled line may contain several items. Some are optional (marked
59// below):
60//
61// a. Source line offset. This number represents the line number
62// in the function where the sample was collected. The line number is
63// always relative to the line where symbol of the function is
64// defined. So, if the function has its header at line 280, the offset
65// 13 is at line 293 in the file.
66//
67// Note that this offset should never be a negative number. This could
68// happen in cases like macros. The debug machinery will register the
69// line number at the point of macro expansion. So, if the macro was
70// expanded in a line before the start of the function, the profile
71// converter should emit a 0 as the offset (this means that the optimizers
72// will not be able to associate a meaningful weight to the instructions
73// in the macro).
74//
75// b. [OPTIONAL] Discriminator. This is used if the sampled program
76// was compiled with DWARF discriminator support
77// (http://wiki.dwarfstd.org/index.php?title=Path_Discriminators).
78// DWARF discriminators are unsigned integer values that allow the
79// compiler to distinguish between multiple execution paths on the
80// same source line location.
81//
82// For example, consider the line of code ``if (cond) foo(); else bar();``.
83// If the predicate ``cond`` is true 80% of the time, then the edge
84// into function ``foo`` should be considered to be taken most of the
85// time. But both calls to ``foo`` and ``bar`` are at the same source
86// line, so a sample count at that line is not sufficient. The
87// compiler needs to know which part of that line is taken more
88// frequently.
89//
90// This is what discriminators provide. In this case, the calls to
91// ``foo`` and ``bar`` will be at the same line, but will have
92// different discriminator values. This allows the compiler to correctly
93// set edge weights into ``foo`` and ``bar``.
94//
95// c. Number of samples. This is an integer quantity representing the
96// number of samples collected by the profiler at this source
97// location.
98//
99// d. [OPTIONAL] Potential call targets and samples. If present, this
100// line contains a call instruction. This models both direct and
101// number of samples. For example,
102//
103// 130: 7 foo:3 bar:2 baz:7
104//
105// The above means that at relative line offset 130 there is a call
106// instruction that calls one of ``foo()``, ``bar()`` and ``baz()``,
107// with ``baz()`` being the relatively more frequently called target.
108//
109// Each callsite line may contain several items. Some are optional.
110//
111// a. Source line offset. This number represents the line number of the
112// callsite that is inlined in the profiled binary.
113//
114// b. [OPTIONAL] Discriminator. Same as the discriminator for sampled line.
115//
116// c. Number of samples. This is an integer quantity representing the
117// total number of samples collected for the inlined instance at this
118// callsite
119//
120// Metadata line can occur in lines with one indent only, containing extra
121// information for the top-level function. Furthermore, metadata can only
122// occur after all the body samples and callsite samples.
123// Each metadata line may contain a particular type of metadata, marked by
124// the starting characters annotated with !. We process each metadata line
125// independently, hence each metadata line has to form an independent piece
126// of information that does not require cross-line reference.
127// We support the following types of metadata:
128//
129// a. CFG Checksum (a.k.a. function hash):
130// !CFGChecksum: 12345
131// b. CFG Checksum (see ContextAttributeMask):
132// !Atribute: 1
133//
134//
135// Binary format
136// -------------
137//
138// This is a more compact encoding. Numbers are encoded as ULEB128 values
139// and all strings are encoded in a name table. The file is organized in
140// the following sections:
141//
142// MAGIC (uint64_t)
143// File identifier computed by function SPMagic() (0x5350524f463432ff)
144//
145// VERSION (uint32_t)
146// File format version number computed by SPVersion()
147//
148// SUMMARY
149// TOTAL_COUNT (uint64_t)
150// Total number of samples in the profile.
151// MAX_COUNT (uint64_t)
152// Maximum value of samples on a line.
153// MAX_FUNCTION_COUNT (uint64_t)
154// Maximum number of samples at function entry (head samples).
155// NUM_COUNTS (uint64_t)
156// Number of lines with samples.
157// NUM_FUNCTIONS (uint64_t)
158// Number of functions with samples.
159// NUM_DETAILED_SUMMARY_ENTRIES (size_t)
160// Number of entries in detailed summary
161// DETAILED_SUMMARY
162// A list of detailed summary entry. Each entry consists of
163// CUTOFF (uint32_t)
164// Required percentile of total sample count expressed as a fraction
165// multiplied by 1000000.
166// MIN_COUNT (uint64_t)
167// The minimum number of samples required to reach the target
168// CUTOFF.
169// NUM_COUNTS (uint64_t)
170// Number of samples to get to the desrired percentile.
171//
172// NAME TABLE
173// SIZE (uint64_t)
174// Number of entries in the name table.
175// NAMES
176// A NUL-separated list of SIZE strings.
177//
178// FUNCTION BODY (one for each uninlined function body present in the profile)
179// HEAD_SAMPLES (uint64_t) [only for top-level functions]
180// Total number of samples collected at the head (prologue) of the
181// function.
182// NOTE: This field should only be present for top-level functions
183// (i.e., not inlined into any caller). Inlined function calls
184// have no prologue, so they don't need this.
185// NAME_IDX (uint64_t)
186// Index into the name table indicating the function name.
187// SAMPLES (uint64_t)
188// Total number of samples collected in this function.
189// NRECS (uint32_t)
190// Total number of sampling records this function's profile.
191// BODY RECORDS
192// A list of NRECS entries. Each entry contains:
193// OFFSET (uint32_t)
194// Line offset from the start of the function.
195// DISCRIMINATOR (uint32_t)
196// Discriminator value (see description of discriminators
197// in the text format documentation above).
198// SAMPLES (uint64_t)
199// Number of samples collected at this location.
200// NUM_CALLS (uint32_t)
201// Number of non-inlined function calls made at this location. In the
202// case of direct calls, this number will always be 1. For indirect
203// calls (virtual functions and function pointers) this will
204// represent all the actual functions called at runtime.
205// CALL_TARGETS
206// A list of NUM_CALLS entries for each called function:
207// NAME_IDX (uint64_t)
208// Index into the name table with the callee name.
209// SAMPLES (uint64_t)
210// Number of samples collected at the call site.
211// NUM_INLINED_FUNCTIONS (uint32_t)
212// Number of callees inlined into this function.
213// INLINED FUNCTION RECORDS
214// A list of NUM_INLINED_FUNCTIONS entries describing each of the inlined
215// callees.
216// OFFSET (uint32_t)
217// Line offset from the start of the function.
218// DISCRIMINATOR (uint32_t)
219// Discriminator value (see description of discriminators
220// in the text format documentation above).
221// FUNCTION BODY
222// A FUNCTION BODY entry describing the inlined function.
223//===----------------------------------------------------------------------===//
224
225#ifndef LLVM_PROFILEDATA_SAMPLEPROFREADER_H
226#define LLVM_PROFILEDATA_SAMPLEPROFREADER_H
227
228#include "llvm/ADT/Eytzinger.h"
229#include "llvm/ADT/SmallVector.h"
230#include "llvm/ADT/StringRef.h"
231#include "llvm/ADT/StringSet.h"
233#include "llvm/IR/LLVMContext.h"
239#include "llvm/Support/Debug.h"
241#include "llvm/Support/ErrorOr.h"
244#include <array>
245#include <cstdint>
246#include <list>
247#include <memory>
248#include <optional>
249#include <string>
250#include <system_error>
251#include <vector>
252
253namespace llvm {
254
255class raw_ostream;
256class Twine;
257
258namespace vfs {
259class FileSystem;
260} // namespace vfs
261
262namespace sampleprof {
263
265
266/// SampleProfileReaderItaniumRemapper remaps the profile data from a
267/// sample profile data reader, by applying a provided set of equivalences
268/// between components of the symbol names in the profile.
270public:
271 SampleProfileReaderItaniumRemapper(std::unique_ptr<MemoryBuffer> B,
272 std::unique_ptr<SymbolRemappingReader> SRR,
274 : Buffer(std::move(B)), Remappings(std::move(SRR)), Reader(R) {
275 assert(Remappings && "Remappings cannot be nullptr");
276 }
277
278 /// Create a remapper from the given remapping file. The remapper will
279 /// be used for profile read in by Reader.
282 LLVMContext &C);
283
284 /// Create a remapper from the given Buffer. The remapper will
285 /// be used for profile read in by Reader.
287 create(std::unique_ptr<MemoryBuffer> &B, SampleProfileReader &Reader,
288 LLVMContext &C);
289
290 /// Apply remappings to the profile read by Reader.
292
293 bool hasApplied() { return RemappingApplied; }
294
295 /// Insert function name into remapper.
296 void insert(StringRef FunctionName) { Remappings->insert(FunctionName); }
297
298 /// Query whether there is equivalent in the remapper which has been
299 /// inserted.
300 bool exist(StringRef FunctionName) {
301 return Remappings->lookup(FunctionName);
302 }
303
304 /// Return the equivalent name in the profile for \p FunctionName if
305 /// it exists.
306 LLVM_ABI std::optional<StringRef> lookUpNameInProfile(StringRef FunctionName);
307
308private:
309 // The buffer holding the content read from remapping file.
310 std::unique_ptr<MemoryBuffer> Buffer;
311 std::unique_ptr<SymbolRemappingReader> Remappings;
312 // Map remapping key to the name in the profile. By looking up the
313 // key in the remapper, a given new name can be mapped to the
314 // cannonical name using the NameMap.
316 // The Reader the remapper is servicing.
317 SampleProfileReader &Reader;
318 // Indicate whether remapping has been applied to the profile read
319 // by Reader -- by calling applyRemapping.
320 bool RemappingApplied = false;
321};
322
323/// Sample-based profile reader.
324///
325/// Each profile contains sample counts for all the functions
326/// executed. Inside each function, statements are annotated with the
327/// collected samples on all the instructions associated with that
328/// statement.
329///
330/// For this to produce meaningful data, the program needs to be
331/// compiled with some debug information (at minimum, line numbers:
332/// -gline-tables-only). Otherwise, it will be impossible to match IR
333/// instructions to the line numbers collected by the profiler.
334///
335/// From the profile file, we are interested in collecting the
336/// following information:
337///
338/// * A list of functions included in the profile (mangled names).
339///
340/// * For each function F:
341/// 1. The total number of samples collected in F.
342///
343/// 2. The samples collected at each line in F. To provide some
344/// protection against source code shuffling, line numbers should
345/// be relative to the start of the function.
346///
347/// The reader supports two file formats: text and binary. The text format
348/// is useful for debugging and testing, while the binary format is more
349/// compact and I/O efficient. They can both be used interchangeably.
350
351/// Manages the sample profile name table, supporting both an eagerly loaded
352/// std::vector of FunctionId objects and lazy-loaded MD5 hashes read directly
353/// from the memory-mapped buffer. It enforces the exclusivity of these
354/// two formats and provides a unified read-only container interface.
356public:
358 : public llvm::iterator_facade_base<iterator, std::input_iterator_tag,
359 FunctionId, std::ptrdiff_t,
360 const FunctionId *, FunctionId> {
361 public:
362 iterator() = default;
363 iterator(const SampleProfileNameTable *Table, size_t Idx)
364 : Table(Table), Idx(Idx) {}
365
366 bool operator==(const iterator &RHS) const {
367 return Table == RHS.Table && Idx == RHS.Idx;
368 }
369
371 ++Idx;
372 return *this;
373 }
374
376 assert(Table && Idx < Table->size() &&
377 "Dereferencing invalid or out-of-bounds iterator");
378 return (*Table)[Idx];
379 }
380
381 private:
382 const SampleProfileNameTable *Table = nullptr;
383 size_t Idx = 0;
384 };
385
387
393 virtual ~SampleProfileNameTable() = default;
394
395 virtual size_t size() const = 0;
396 bool empty() const { return size() == 0; }
397 virtual FunctionId operator[](size_t Idx) const = 0;
398
399 iterator begin() const { return iterator(this, 0); }
400 iterator end() const { return iterator(this, size()); }
401};
402
404 const uint8_t *Start = nullptr;
405 size_t Size = 0;
406
407public:
408 LazySampleProfileNameTable(const uint8_t *Start, size_t Size)
409 : Start(Start), Size(Size) {}
410
411 size_t size() const override { return Size; }
412
413 FunctionId operator[](size_t Idx) const override {
414 assert(Idx < Size && "Index out of bounds");
415 using namespace support;
417 Start + Idx * sizeof(uint64_t), endianness::little));
418 }
419};
420
422 std::vector<FunctionId> Vec;
423
424public:
425 explicit StringSampleProfileNameTable(std::vector<FunctionId> &&Vec)
426 : Vec(std::move(Vec)) {}
427 explicit StringSampleProfileNameTable(const std::vector<FunctionId> &Vec)
428 : Vec(Vec) {}
429
430 size_t size() const override { return Vec.size(); }
431
432 FunctionId operator[](size_t Idx) const override {
433 assert(Idx < Vec.size() && "Index out of bounds");
434 return Vec[Idx];
435 }
436};
437
439 std::vector<FunctionId> Vec;
440
441public:
442 explicit MD5SampleProfileNameTable(std::vector<FunctionId> &&Vec)
443 : Vec(std::move(Vec)) {}
444 explicit MD5SampleProfileNameTable(const std::vector<FunctionId> &Vec)
445 : Vec(Vec) {}
446
447 size_t size() const override { return Vec.size(); }
448
449 FunctionId operator[](size_t Idx) const override {
450 assert(Idx < Vec.size() && "Index out of bounds");
451 return Vec[Idx];
452 }
453};
454
457
458public:
460 uint64_t NumCS, uint64_t NumFlat,
461 uint64_t NumInlinees)
462 : Array(Data, NumCS + NumFlat + NumInlinees) {}
463
464 size_t size() const override { return Array.size(); }
465
466 FunctionId operator[](size_t Idx) const override {
467 return FunctionId(Array[Idx]);
468 }
469};
470
472public:
473 SampleProfileReader(std::unique_ptr<MemoryBuffer> B, LLVMContext &C,
475 : Profiles(), Ctx(C), Buffer(std::move(B)), Format(Format) {}
476
477 virtual ~SampleProfileReader() = default;
478
479 /// Read and validate the file header.
480 virtual std::error_code readHeader() = 0;
481
482 /// Set the bits for FS discriminators. Parameter Pass specify the sequence
483 /// number, Pass == i is for the i-th round of adding FS discriminators.
484 /// Pass == 0 is for using base discriminators.
488
489 /// Get the bitmask the discriminators: For FS profiles, return the bit
490 /// mask for this pass. For non FS profiles, return (unsigned) -1.
492 if (!ProfileIsFS)
493 return 0xFFFFFFFF;
494 assert((MaskedBitFrom != 0) && "MaskedBitFrom is not set properly");
495 return getN1Bits(MaskedBitFrom);
496 }
497
498 /// The interface to read sample profiles from the associated file.
499 std::error_code read() {
500 if (std::error_code EC = readImpl())
501 return EC;
502 if (Remapper)
503 Remapper->applyRemapping(Ctx);
506 }
507
508 /// Read sample profiles for the given functions.
509 std::error_code read(const DenseSet<StringRef> &FuncsToUse) {
511 for (StringRef F : FuncsToUse)
512 if (Profiles.find(FunctionId(F)) == Profiles.end())
513 S.insert(F);
514 if (std::error_code EC = read(S, Profiles))
515 return EC;
517 }
518
519 /// The implementaion to read sample profiles from the associated file.
520 virtual std::error_code readImpl() = 0;
521
522 /// Print the profile for \p FunctionSamples on stream \p OS.
524 raw_ostream &OS = dbgs());
525
526 /// Collect functions with definitions in Module M. For reader which
527 /// support loading function profiles on demand, return true when the
528 /// reader has been given a module. Always return false for reader
529 /// which doesn't support loading function profiles on demand.
530 virtual bool collectFuncsFromModule() { return false; }
531
532 /// Print all the profiles on stream \p OS.
533 LLVM_ABI void dump(raw_ostream &OS = dbgs());
534
535 /// Print all the profiles on stream \p OS in the JSON format.
536 LLVM_ABI void dumpJson(raw_ostream &OS = dbgs());
537
538 /// Return the format version of the profile. For tests only.
540
541 /// Return the samples collected for function \p F.
543 // The function name may have been updated by adding suffix. Call
544 // a helper to (optionally) strip off suffixes so that we can
545 // match against the original function name in the profile.
547 return getSamplesFor(CanonName);
548 }
549
550 /// Return the samples collected for function \p F.
552 auto It = Profiles.find(FunctionId(Fname));
553 if (It != Profiles.end())
554 return &It->second;
555
557 auto R = FuncNameToProfNameMap->find(FunctionId(Fname));
558 if (R != FuncNameToProfNameMap->end()) {
559 Fname = R->second.stringRef();
560 auto It = Profiles.find(FunctionId(Fname));
561 if (It != Profiles.end())
562 return &It->second;
563 }
564 }
565
566 if (Remapper) {
567 if (auto NameInProfile = Remapper->lookUpNameInProfile(Fname)) {
568 auto It = Profiles.find(FunctionId(*NameInProfile));
569 if (It != Profiles.end())
570 return &It->second;
571 }
572 }
573 return nullptr;
574 }
575
576 /// Return all the profiles.
578
579 /// Report a parse error message.
580 void reportError(int64_t LineNumber, const Twine &Msg) const {
581 Ctx.diagnose(DiagnosticInfoSampleProfile(Buffer->getBufferIdentifier(),
582 LineNumber, Msg));
583 }
584
585 /// Create a sample profile reader appropriate to the file format.
586 /// Create a remapper underlying if RemapFilename is not empty.
587 /// Parameter P specifies the FSDiscriminatorPass.
591 StringRef RemapFilename = "");
592
593 /// Create a sample profile reader from the supplied memory buffer.
594 /// Create a remapper underlying if RemapFilename is not empty.
595 /// Parameter P specifies the FSDiscriminatorPass.
597 create(std::unique_ptr<MemoryBuffer> &B, LLVMContext &C, vfs::FileSystem &FS,
599 StringRef RemapFilename = "");
600
601 /// Return the profile summary.
602 ProfileSummary &getSummary() const { return *Summary; }
603
604 MemoryBuffer *getBuffer() const { return Buffer.get(); }
605
606 /// \brief Return the profile format.
608
609 /// Whether input profile is based on pseudo probes.
611
612 /// Whether input profile is fully context-sensitive.
613 bool profileIsCS() const { return ProfileIsCS; }
614
615 /// Whether input profile contains ShouldBeInlined contexts.
617
618 /// Whether input profile is flow-sensitive.
619 bool profileIsFS() const { return ProfileIsFS; }
620
621 virtual std::unique_ptr<ProfileSymbolList> getProfileSymbolList() {
622 return nullptr;
623 };
624
625 /// It includes all the names that have samples either in outline instance
626 /// or inline instance.
632 virtual bool dumpSectionInfo(raw_ostream &OS = dbgs()) { return false; };
633
634 /// Return whether names in the profile are all MD5 numbers.
635 bool useMD5() const { return ProfileIsMD5; }
636
637 /// Force the profile to use MD5 in Sample contexts, even if function names
638 /// are present.
639 virtual void setProfileUseMD5() { ProfileIsMD5 = true; }
640
641 /// Don't read profile without context if the flag is set.
642 void setSkipFlatProf(bool Skip) { SkipFlatProf = Skip; }
643
644 /// Return whether any name in the profile contains ".__uniq." suffix.
645 virtual bool hasUniqSuffix() { return false; }
646
648
649 void setModule(const Module *Mod) { M = Mod; }
650
655
656protected:
657 /// Map every function to its associated profile.
658 ///
659 /// The profile of every function executed at runtime is collected
660 /// in the structure FunctionSamples. This maps function objects
661 /// to their corresponding profiles.
663
664 /// LLVM context used to emit diagnostics.
666
667 /// Memory buffer holding the profile file.
668 std::unique_ptr<MemoryBuffer> Buffer;
669
670 /// Profile summary information.
671 std::unique_ptr<ProfileSummary> Summary;
672
673 /// Take ownership of the summary of this reader.
674 static std::unique_ptr<ProfileSummary>
676 return std::move(Reader.Summary);
677 }
678
679 /// Compute summary for this profile.
681
682 /// Read sample profiles for the given functions and write them to the given
683 /// profile map. Currently it's only used for extended binary format to load
684 /// the profiles on-demand.
685 virtual std::error_code read(const DenseSet<StringRef> &FuncsToUse,
688 }
689
690 std::unique_ptr<SampleProfileReaderItaniumRemapper> Remapper;
691
692 // A map pointer to the FuncNameToProfNameMap in SampleProfileLoader,
693 // which maps the function name to the matched profile name. This is used
694 // for sample loader to look up profile using the new name.
696 nullptr;
697
698 // A map from a function's context hash to its meta data section range, used
699 // for on-demand read function profile metadata.
702
703 std::pair<const uint8_t *, const uint8_t *> ProfileSecRange;
704
705 /// Whether the profile has attribute metadata.
707
708 /// \brief Whether samples are collected based on pseudo probes.
710
711 /// Whether function profiles are context-sensitive flat profiles.
712 bool ProfileIsCS = false;
713
714 /// Whether function profile contains ShouldBeInlined contexts.
716
717 /// Number of context-sensitive profiles.
719
720 /// Whether the function profiles use FS discriminators.
721 bool ProfileIsFS = false;
722
723 /// Format version of the profile.
725
726 /// If true, the profile has vtable profiles and reader should decode them
727 /// to parse profiles correctly.
728 bool ReadVTableProf = false;
729
730 /// \brief The format of sample.
732
733 /// \brief The current module being compiled if SampleProfileReader
734 /// is used by compiler. If SampleProfileReader is used by other
735 /// tools which are not compiler, M is usually nullptr.
736 const Module *M = nullptr;
737
738 /// Zero out the discriminator bits higher than bit MaskedBitFrom (0 based).
739 /// The default is to keep all the bits.
741
742 /// Whether the profile uses MD5 for Sample Contexts and function names. This
743 /// can be one-way overriden by the user to force use MD5.
744 bool ProfileIsMD5 = false;
745
746 /// If SkipFlatProf is true, skip functions marked with !Flat in text mode or
747 /// sections with SecFlagFlat flag in ExtBinary mode.
748 bool SkipFlatProf = false;
749};
750
752public:
753 SampleProfileReaderText(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
755
756 /// Read and validate the file header.
757 std::error_code readHeader() override { return sampleprof_error::success; }
758
759 /// Read sample profiles from the associated file.
760 std::error_code readImpl() override;
761
762 /// Return true if \p Buffer is in the format supported by this class.
763 static bool hasFormat(const MemoryBuffer &Buffer);
764
765 /// Text format sample profile does not support MD5 for now.
766 void setProfileUseMD5() override {}
767
768private:
769 /// CSNameTable is used to save full context vectors. This serves as an
770 /// underlying immutable buffer for all clients.
771 std::list<SampleContextFrameVector> CSNameTable;
772};
773
775public:
779
780 /// Read and validate the file header.
781 std::error_code readHeader() override;
782
783 /// Read sample profiles from the associated file.
784 std::error_code readImpl() override;
785
786 /// It includes all the names that have samples either in outline instance
787 /// or inline instance.
789 getNameTable() const override {
790 if (!NameTable)
793 return {NameTable->begin(), NameTable->end()};
794 }
795
796protected:
797 /// Read a numeric value of type T from the profile.
798 ///
799 /// If an error occurs during decoding, a diagnostic message is emitted and
800 /// EC is set.
801 ///
802 /// \returns the read value.
803 template <typename T> ErrorOr<T> readNumber();
804
805 /// Read a numeric value of type T from the profile. The value is saved
806 /// without encoded.
807 template <typename T> ErrorOr<T> readUnencodedNumber();
808
809 /// Read a string from the profile.
810 ///
811 /// If an error occurs during decoding, a diagnostic message is emitted and
812 /// EC is set.
813 ///
814 /// \returns the read value.
816
817 /// Read the string index and check whether it overflows the table.
818 template <typename T> inline ErrorOr<size_t> readStringIndex(T &Table);
819
820 /// Read the next function profile instance.
821 std::error_code readFuncProfile(const uint8_t *Start);
822 std::error_code readFuncProfile(const uint8_t *Start,
823 SampleProfileMap &Profiles);
824
825 /// Read the contents of the given profile instance.
826 std::error_code readProfile(FunctionSamples &FProfile);
827
828 /// Read the contents of Magic number and Version number.
829 std::error_code readMagicIdent();
830
831 /// Read profile summary.
832 std::error_code readSummary();
833
834 /// Read the whole name table.
835 std::error_code readNameTable();
836
837 /// Read a string indirectly via the name table. Optionally return the index.
838 ErrorOr<FunctionId> readStringFromTable(size_t *RetIdx = nullptr);
839
840 /// Read a context indirectly via the CSNameTable. Optionally return the
841 /// index.
842 ErrorOr<SampleContextFrames> readContextFromTable(size_t *RetIdx = nullptr);
843
844 /// Read a context indirectly via the CSNameTable if the profile has context,
845 /// otherwise same as readStringFromTable, also return its hash value.
846 ErrorOr<std::pair<SampleContext, uint64_t>> readSampleContextFromTable();
847
848 /// Read all virtual functions' vtable access counts for \p FProfile.
849 std::error_code readCallsiteVTableProf(FunctionSamples &FProfile);
850
851 /// Read bytes from the input buffer pointed by `Data` and decode them into
852 /// \p M. `Data` will be advanced to the end of the read bytes when this
853 /// function returns. Returns error if any.
854 std::error_code readVTableTypeCountMap(TypeCountMap &M);
855
856 /// Points to the current location in the buffer.
857 const uint8_t *Data = nullptr;
858
859 /// Points to the end of the buffer.
860 const uint8_t *End = nullptr;
861
862 /// Function name table.
863 std::unique_ptr<SampleProfileNameTable> NameTable;
864
865 /// CSNameTable is used to save full context vectors. It is the backing buffer
866 /// for SampleContextFrames.
867 std::vector<SampleContextFrameVector> CSNameTable;
868
869 /// Table to cache MD5 values of sample contexts corresponding to
870 /// readSampleContextFromTable(), used to index into Profiles or
871 /// FuncOffsetTable.
872 std::vector<uint64_t> MD5SampleContextTable;
873
874 /// The starting address of the table of MD5 values of sample contexts. For
875 /// fixed length MD5 non-CS profile it is same as MD5NameMemStart because
876 /// hashes of non-CS contexts are already in the profile. Otherwise it points
877 /// to the start of MD5SampleContextTable.
879
880private:
881 std::error_code readSummaryEntry(std::vector<ProfileSummaryEntry> &Entries);
882 virtual std::error_code verifySPMagic(uint64_t Magic) = 0;
883};
884
886private:
887 std::error_code verifySPMagic(uint64_t Magic) override;
888
889public:
893
894 /// \brief Return true if \p Buffer is in the format supported by this class.
895 static bool hasFormat(const MemoryBuffer &Buffer);
896};
897
898/// Trait class for reading the on-disk function offset hash table mapping
899/// function name GUIDs to their offsets in the SecLBRProfile section.
901public:
904 using data_type = uint32_t; // Offset
910
912 return static_cast<hash_value_type>(Key);
913 }
914
916 return LHS == RHS;
917 }
918
921
922 static std::pair<offset_type, offset_type>
923 ReadKeyDataLength(const unsigned char *&D) {
924 // Implicit lengths: do NOT read or advance pointer D.
925 return {sizeof(key_type), sizeof(data_type)};
926 }
927
928 static key_type ReadKey(const unsigned char *D, offset_type Len) {
929 assert(Len == sizeof(key_type) && "Key length mismatch");
931 }
932
933 static data_type ReadData(key_type_ref K, const unsigned char *D,
934 offset_type Len) {
935 assert(Len == sizeof(data_type) && "Data length mismatch");
937 }
938};
939
940/// Tags to select the initialization mode of SampleProfileFuncOffsetTable.
942struct OnDiskModeT {};
943inline constexpr InMemoryModeT InMemoryMode{};
944inline constexpr OnDiskModeT OnDiskMode{};
945
946/// A unified wrapper representing the function offset table.
947///
948/// This class abstracts away the physical representation of the offset table,
949/// which can either be:
950///
951/// - An llvm::DenseMap mapping function GUIDs (or context hashes) to their
952/// profile offsets, populated when reading the array of offsets in
953/// context-sensitive (CS) profiles or version 103 profiles.
954///
955/// - An OnDiskIterableChainedHashTable providing the same mapping directly from
956/// the file in (non-context-sensitive) version 104 profiles.
957///
958/// It exposes a single, type-agnostic lookup interface, shielding the reader
959/// from the underlying container types. To prevent hybrid-state corruption, the
960/// table's mode is locked at construction time, and assertions prevent
961/// modification in on-disk mode.
963public:
966
974
976 size_t InitialCapacity = 0) {
977 InMemoryTable.reserve(InitialCapacity);
978 }
979
980 /// Insert a function GUID and its profile offset into the in-memory map.
981 /// Enforces that the on-disk table must not have been set first.
983 assert(!OnDiskTable &&
984 "Cannot insert in-memory elements after on-disk table has been set");
985 InMemoryTable[GUID] = Offset;
986 }
987
988 /// Instantiate the on-disk chained hash table using raw stream pointers.
990 const uint8_t *Payload, const uint8_t *Base) {
991 OnDiskTable.reset(OnDiskTableType::Create(Buckets, Payload, Base));
992 }
993
994 /// Query the offset table for the profile offset associated with the given
995 /// GUID. Returns the offset if found, or std::nullopt if the key is missing.
996 std::optional<uint64_t> lookup(uint64_t GUID) const {
997 if (OnDiskTable) {
998 auto Iter = OnDiskTable->find(GUID);
999 if (Iter != OnDiskTable->end())
1000 return *Iter;
1001 } else {
1002 auto Iter = InMemoryTable.find(GUID);
1003 if (Iter != InMemoryTable.end())
1004 return Iter->second;
1005 }
1006 return std::nullopt;
1007 }
1008
1009private:
1011 std::unique_ptr<OnDiskTableType> OnDiskTable;
1012};
1013
1014/// SampleProfileReaderExtBinaryBase/SampleProfileWriterExtBinaryBase defines
1015/// the basic structure of the extensible binary format.
1016/// The format is organized in sections except the magic and version number
1017/// at the beginning. There is a section table before all the sections, and
1018/// each entry in the table describes the entry type, start, size and
1019/// attributes. The format in each section is defined by the section itself.
1020///
1021/// It is easy to add a new section while maintaining the backward
1022/// compatibility of the profile. Nothing extra needs to be done. If we want
1023/// to extend an existing section, like add cache misses information in
1024/// addition to the sample count in the profile body, we can add a new section
1025/// with the extension and retire the existing section, and we could choose
1026/// to keep the parser of the old section if we want the reader to be able
1027/// to read both new and old format profile.
1028///
1029/// SampleProfileReaderExtBinary/SampleProfileWriterExtBinary define the
1030/// commonly used sections of a profile in extensible binary format. It is
1031/// possible to define other types of profile inherited from
1032/// SampleProfileReaderExtBinaryBase/SampleProfileWriterExtBinaryBase.
1034 : public SampleProfileReaderBinary {
1035private:
1036 std::error_code decompressSection(const uint8_t *SecStart,
1037 const uint64_t SecSize,
1038 const uint8_t *&DecompressBuf,
1039 uint64_t &DecompressBufSize);
1040
1041 BumpPtrAllocator Allocator;
1042
1043protected:
1044 std::vector<SecHdrTableEntry> SecHdrTable;
1045 std::error_code readSecHdrTableEntry(uint64_t Idx);
1046 std::error_code readSecHdrTable();
1047
1049 std::error_code readFuncMetadata();
1050 std::error_code readFuncMetadata(FunctionSamples *FProfile);
1051 std::error_code readFuncOffsetTable();
1052 std::error_code readFuncProfiles();
1053 std::error_code readFuncProfiles(const DenseSet<StringRef> &FuncsToUse,
1055 std::error_code readNameTableSec(bool IsMD5, bool FixedLengthMD5,
1056 bool IsEytzinger = false);
1057 std::error_code readNameTableSecEytzinger(bool IsMD5, bool FixedLengthMD5);
1058 std::error_code readNameTableSecLegacy(bool IsMD5, bool FixedLengthMD5);
1059 std::error_code readCSNameTableSec();
1060 std::error_code readProfileSymbolList(bool IsMD5);
1061 std::error_code readStringBasedProfileSymbolList();
1062 std::error_code readMD5ProfileSymbolList();
1063
1064 std::error_code readHeader() override;
1065 std::error_code verifySPMagic(uint64_t Magic) override = 0;
1066 virtual std::error_code readOneSection(const uint8_t *Start, uint64_t Size,
1067 const SecHdrTableEntry &Entry);
1068 // placeholder for subclasses to dispatch their own section readers.
1069 virtual std::error_code readCustomSection(const SecHdrTableEntry &Entry) = 0;
1070
1071 /// Determine which container readFuncOffsetTable() should populate, the list
1072 /// FuncOffsetList or the map FuncOffsetTable.
1073 bool useFuncOffsetList() const;
1074
1075 std::unique_ptr<ProfileSymbolList> ProfSymList;
1076
1077 /// The table mapping from a function context's MD5 to the offset of its
1078 /// FunctionSample towards file start.
1079 /// At most one of FuncOffsetTable and FuncOffsetList is populated.
1080 std::optional<SampleProfileFuncOffsetTable> FuncOffsetTable;
1081
1082 /// The list version of FuncOffsetTable. This is used if every entry is
1083 /// being accessed.
1084 std::vector<std::pair<SampleContext, uint64_t>> FuncOffsetList;
1085
1086 /// The set containing the functions to use when compiling a module.
1088
1089public:
1095
1096 /// Read sample profiles in extensible format from the associated file.
1097 std::error_code readImpl() override;
1098
1099 /// Get the total size of all \p Type sections.
1100 uint64_t getSectionSize(SecType Type);
1101 /// Get the total size of header and all sections.
1102 uint64_t getFileSize();
1103 bool dumpSectionInfo(raw_ostream &OS = dbgs()) override;
1104
1105 /// Collect functions with definitions in Module M. Return true if
1106 /// the reader has been given a module.
1107 bool collectFuncsFromModule() override;
1108
1109 std::unique_ptr<ProfileSymbolList> getProfileSymbolList() override {
1110 return std::move(ProfSymList);
1111 };
1112
1113private:
1114 /// Read the profiles on-demand for the given functions. This is used after
1115 /// stale call graph matching finds new functions whose profiles aren't loaded
1116 /// at the beginning and we need to loaded the profiles explicitly for
1117 /// potential matching.
1118 std::error_code read(const DenseSet<StringRef> &FuncsToUse,
1119 SampleProfileMap &Profiles) override;
1120};
1121
1124private:
1125 std::error_code verifySPMagic(uint64_t Magic) override;
1126 std::error_code readCustomSection(const SecHdrTableEntry &Entry) override {
1127 // Update the data reader pointer to the end of the section.
1128 Data = End;
1130 };
1131
1132public:
1136
1137 /// \brief Return true if \p Buffer is in the format supported by this class.
1138 static bool hasFormat(const MemoryBuffer &Buffer);
1139};
1140
1142
1143// Supported histogram types in GCC. Currently, we only need support for
1144// call target histograms.
1155
1157public:
1158 SampleProfileReaderGCC(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
1160 GcovBuffer(Buffer.get()) {}
1161
1162 /// Read and validate the file header.
1163 std::error_code readHeader() override;
1164
1165 /// Read sample profiles from the associated file.
1166 std::error_code readImpl() override;
1167
1168 /// Return true if \p Buffer is in the format supported by this class.
1169 static bool hasFormat(const MemoryBuffer &Buffer);
1170
1171protected:
1172 std::error_code readNameTable();
1173 std::error_code readOneFunctionProfile(const InlineCallStack &InlineStack,
1174 bool Update, uint32_t Offset);
1175 std::error_code readFunctionProfiles();
1176 std::error_code skipNextWord();
1177 template <typename T> ErrorOr<T> readNumber();
1179
1180 /// Read the section tag and check that it's the same as \p Expected.
1181 std::error_code readSectionTag(uint32_t Expected);
1182
1183 /// GCOV buffer containing the profile.
1185
1186 /// Function names in this profile.
1187 std::vector<std::string> Names;
1188
1189 /// GCOV tags used to separate sections in the profile file.
1190 static const uint32_t GCOVTagAFDOFileNames = 0xaa000000;
1191 static const uint32_t GCOVTagAFDOFunction = 0xac000000;
1192};
1193
1194/// A helper class that wraps a local set of string names from NameTable.
1196 const SampleProfileReader &Reader;
1197 StringSet<> NamesInProfile;
1198
1199public:
1200 explicit SampleProfileNameSet(const SampleProfileReader &R) : Reader(R) {
1201 for (FunctionId Name : Reader.getNameTable())
1202 NamesInProfile.insert(Name.stringRef());
1203 }
1204
1205 /// Check if a canonical function name exists in the profile name table.
1206 bool contains(StringRef CanonName) const {
1207 return NamesInProfile.contains(CanonName);
1208 }
1209};
1210
1211} // end namespace sampleprof
1212
1213} // end namespace llvm
1214
1215#endif // LLVM_PROFILEDATA_SAMPLEPROFREADER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:215
Provides ErrorOr<T> smart pointer.
This file defines the EytzingerTableSpan class, a non-owning view of a buffer formatted as a complete...
#define F(x, y, z)
Definition MD5.cpp:54
#define T
static Error readString(StringRef Buffer, const char *&Src, size_t MaxSize, StringRef &Val, Twine Desc)
Read a null-terminated string at the position Src from Buffer, with maximum byte size of MaxSize (inc...
static constexpr StringLiteral Filename
Defines facilities for reading and writing on-disk hash tables.
#define P(N)
const char * Msg
This file defines the SmallVector class.
StringSet - A set-like wrapper for the StringMap.
Value * RHS
Value * LHS
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Diagnostic information for the sample profiler.
Represents either an error or a value T.
Definition ErrorOr.h:56
Tagged union holding either a T or a Error.
Definition Error.h:485
GCOVBuffer - A wrapper around MemoryBuffer to provide GCOV specific read operations.
Definition GCOV.h:74
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
This interface provides simple read-only access to a block of memory, and provides simple methods for...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Provides lookup and iteration over an on disk hash table.
static OnDiskIterableChainedHashTable * Create(const unsigned char *Buckets, const unsigned char *const Payload, const unsigned char *const Base, const FuncOffsetHashTableInfo &InfoObj=FuncOffsetHashTableInfo())
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition StringSet.h:25
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterator.h:80
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
FunctionId operator[](size_t Idx) const override
EytzingerSampleProfileNameTable(const support::ulittle64_t *Data, uint64_t NumCS, uint64_t NumFlat, uint64_t NumInlinees)
Trait class for reading the on-disk function offset hash table mapping function name GUIDs to their o...
static key_type GetInternalKey(key_type_ref Key)
static std::pair< offset_type, offset_type > ReadKeyDataLength(const unsigned char *&D)
static external_key_type GetExternalKey(internal_key_type Key)
static bool EqualKey(key_type_ref LHS, key_type_ref RHS)
static hash_value_type ComputeHash(key_type_ref Key)
static key_type ReadKey(const unsigned char *D, offset_type Len)
static data_type ReadData(key_type_ref K, const unsigned char *D, offset_type Len)
This class represents a function that is read from a sample profile.
Definition FunctionId.h:36
Representation of the samples collected for a function.
Definition SampleProf.h:815
static StringRef getCanonicalFnName(const Function &F)
Return the canonical name for a function, taking into account suffix elision policy attributes.
static LLVM_ABI bool UseMD5
Whether the profile uses MD5 to represent string.
This class is a wrapper to associative container MapT<KeyT, ValueT> using the hash value of the origi...
Definition HashKeyMap.h:52
LazySampleProfileNameTable(const uint8_t *Start, size_t Size)
FunctionId operator[](size_t Idx) const override
FunctionId operator[](size_t Idx) const override
MD5SampleProfileNameTable(const std::vector< FunctionId > &Vec)
MD5SampleProfileNameTable(std::vector< FunctionId > &&Vec)
std::optional< uint64_t > lookup(uint64_t GUID) const
Query the offset table for the profile offset associated with the given GUID.
SampleProfileFuncOffsetTable & operator=(SampleProfileFuncOffsetTable &&)=delete
void insert(uint64_t GUID, uint64_t Offset)
Insert a function GUID and its profile offset into the in-memory map.
SampleProfileFuncOffsetTable(InMemoryModeT, size_t InitialCapacity=0)
llvm::OnDiskIterableChainedHashTable< FuncOffsetHashTableInfo > OnDiskTableType
SampleProfileFuncOffsetTable(const SampleProfileFuncOffsetTable &)=delete
SampleProfileFuncOffsetTable & operator=(const SampleProfileFuncOffsetTable &)=delete
SampleProfileFuncOffsetTable(OnDiskModeT, const uint8_t *Buckets, const uint8_t *Payload, const uint8_t *Base)
Instantiate the on-disk chained hash table using raw stream pointers.
SampleProfileFuncOffsetTable(SampleProfileFuncOffsetTable &&)=delete
This class provides operator overloads to the map container using MD5 as the key type,...
bool contains(StringRef CanonName) const
Check if a canonical function name exists in the profile name table.
SampleProfileNameSet(const SampleProfileReader &R)
iterator(const SampleProfileNameTable *Table, size_t Idx)
SampleProfileNameTable(SampleProfileNameTable &&)=delete
SampleProfileNameTable(const SampleProfileNameTable &)=delete
SampleProfileNameTable & operator=(const SampleProfileNameTable &)=delete
virtual FunctionId operator[](size_t Idx) const =0
SampleProfileNameTable & operator=(SampleProfileNameTable &&)=delete
const uint8_t * Data
Points to the current location in the buffer.
std::unique_ptr< SampleProfileNameTable > NameTable
Function name table.
const uint64_t * MD5SampleContextStart
The starting address of the table of MD5 values of sample contexts.
std::vector< SampleContextFrameVector > CSNameTable
CSNameTable is used to save full context vectors.
SampleProfileReaderBinary(std::unique_ptr< MemoryBuffer > B, LLVMContext &C, SampleProfileFormat Format=SPF_None)
std::vector< uint64_t > MD5SampleContextTable
Table to cache MD5 values of sample contexts corresponding to readSampleContextFromTable(),...
llvm::iterator_range< SampleProfileNameTable::iterator > getNameTable() const override
It includes all the names that have samples either in outline instance or inline instance.
const uint8_t * End
Points to the end of the buffer.
std::error_code readNameTableSecEytzinger(bool IsMD5, bool FixedLengthMD5)
virtual std::error_code readCustomSection(const SecHdrTableEntry &Entry)=0
std::error_code readFuncMetadata(DenseSet< FunctionSamples * > &Profiles)
std::vector< std::pair< SampleContext, uint64_t > > FuncOffsetList
The list version of FuncOffsetTable.
DenseSet< StringRef > FuncsToUse
The set containing the functions to use when compiling a module.
std::unique_ptr< ProfileSymbolList > ProfSymList
std::optional< SampleProfileFuncOffsetTable > FuncOffsetTable
The table mapping from a function context's MD5 to the offset of its FunctionSample towards file star...
std::error_code readNameTableSec(bool IsMD5, bool FixedLengthMD5, bool IsEytzinger=false)
bool useFuncOffsetList() const
Determine which container readFuncOffsetTable() should populate, the list FuncOffsetList or the map F...
std::unique_ptr< ProfileSymbolList > getProfileSymbolList() override
virtual std::error_code readOneSection(const uint8_t *Start, uint64_t Size, const SecHdrTableEntry &Entry)
std::error_code verifySPMagic(uint64_t Magic) override=0
SampleProfileReaderExtBinaryBase(std::unique_ptr< MemoryBuffer > B, LLVMContext &C, SampleProfileFormat Format)
std::error_code readNameTableSecLegacy(bool IsMD5, bool FixedLengthMD5)
std::error_code readHeader() override
Read and validate the file header.
SampleProfileReaderExtBinary(std::unique_ptr< MemoryBuffer > B, LLVMContext &C, SampleProfileFormat Format=SPF_Ext_Binary)
GCOVBuffer GcovBuffer
GCOV buffer containing the profile.
std::vector< std::string > Names
Function names in this profile.
SampleProfileReaderGCC(std::unique_ptr< MemoryBuffer > B, LLVMContext &C)
static const uint32_t GCOVTagAFDOFileNames
GCOV tags used to separate sections in the profile file.
SampleProfileReaderItaniumRemapper remaps the profile data from a sample profile data reader,...
bool exist(StringRef FunctionName)
Query whether there is equivalent in the remapper which has been inserted.
static LLVM_ABI ErrorOr< std::unique_ptr< SampleProfileReaderItaniumRemapper > > create(StringRef Filename, vfs::FileSystem &FS, SampleProfileReader &Reader, LLVMContext &C)
Create a remapper from the given remapping file.
LLVM_ABI void applyRemapping(LLVMContext &Ctx)
Apply remappings to the profile read by Reader.
SampleProfileReaderItaniumRemapper(std::unique_ptr< MemoryBuffer > B, std::unique_ptr< SymbolRemappingReader > SRR, SampleProfileReader &R)
void insert(StringRef FunctionName)
Insert function name into remapper.
LLVM_ABI std::optional< StringRef > lookUpNameInProfile(StringRef FunctionName)
Return the equivalent name in the profile for FunctionName if it exists.
SampleProfileReaderRawBinary(std::unique_ptr< MemoryBuffer > B, LLVMContext &C, SampleProfileFormat Format=SPF_Binary)
SampleProfileReaderText(std::unique_ptr< MemoryBuffer > B, LLVMContext &C)
void setProfileUseMD5() override
Text format sample profile does not support MD5 for now.
std::error_code readHeader() override
Read and validate the file header.
uint32_t MaskedBitFrom
Zero out the discriminator bits higher than bit MaskedBitFrom (0 based).
std::pair< const uint8_t *, const uint8_t * > ProfileSecRange
bool ReadVTableProf
If true, the profile has vtable profiles and reader should decode them to parse profiles correctly.
bool ProfileIsPreInlined
Whether function profile contains ShouldBeInlined contexts.
DenseMap< uint64_t, std::pair< const uint8_t *, const uint8_t * > > FuncMetadataIndex
SampleProfileMap & getProfiles()
Return all the profiles.
uint32_t CSProfileCount
Number of context-sensitive profiles.
static LLVM_ABI ErrorOr< std::unique_ptr< SampleProfileReader > > create(StringRef Filename, LLVMContext &C, vfs::FileSystem &FS, FSDiscriminatorPass P=FSDiscriminatorPass::Base, StringRef RemapFilename="")
Create a sample profile reader appropriate to the file format.
bool profileIsProbeBased() const
Whether input profile is based on pseudo probes.
FunctionSamples * getSamplesFor(const Function &F)
Return the samples collected for function F.
LLVM_ABI void dump(raw_ostream &OS=dbgs())
Print all the profiles on stream OS.
bool useMD5() const
Return whether names in the profile are all MD5 numbers.
const Module * M
The current module being compiled if SampleProfileReader is used by compiler.
std::unique_ptr< MemoryBuffer > Buffer
Memory buffer holding the profile file.
std::unique_ptr< SampleProfileReaderItaniumRemapper > Remapper
bool ProfileHasAttribute
Whether the profile has attribute metadata.
void setFuncNameToProfNameMap(const HashKeyMap< DenseMap, FunctionId, FunctionId > &FPMap)
bool SkipFlatProf
If SkipFlatProf is true, skip functions marked with !Flat in text mode or sections with SecFlagFlat f...
bool profileIsPreInlined() const
Whether input profile contains ShouldBeInlined contexts.
std::error_code read()
The interface to read sample profiles from the associated file.
bool profileIsFS() const
Whether input profile is flow-sensitive.
SampleProfileReaderItaniumRemapper * getRemapper()
bool ProfileIsCS
Whether function profiles are context-sensitive flat profiles.
std::error_code read(const DenseSet< StringRef > &FuncsToUse)
Read sample profiles for the given functions.
bool ProfileIsMD5
Whether the profile uses MD5 for Sample Contexts and function names.
static std::unique_ptr< ProfileSummary > takeSummary(SampleProfileReader &Reader)
Take ownership of the summary of this reader.
virtual llvm::iterator_range< SampleProfileNameTable::iterator > getNameTable() const
It includes all the names that have samples either in outline instance or inline instance.
ProfileSummary & getSummary() const
Return the profile summary.
const HashKeyMap< DenseMap, FunctionId, FunctionId > * FuncNameToProfNameMap
SampleProfileFormat Format
The format of sample.
SampleProfileReader(std::unique_ptr< MemoryBuffer > B, LLVMContext &C, SampleProfileFormat Format=SPF_None)
std::unique_ptr< ProfileSummary > Summary
Profile summary information.
virtual bool hasUniqSuffix()
Return whether any name in the profile contains ".__uniq." suffix.
LLVM_ABI void computeSummary()
Compute summary for this profile.
uint32_t getDiscriminatorMask() const
Get the bitmask the discriminators: For FS profiles, return the bit mask for this pass.
uint64_t getFormatVersion() const
Return the format version of the profile. For tests only.
virtual bool dumpSectionInfo(raw_ostream &OS=dbgs())
SampleProfileFormat getFormat() const
Return the profile format.
virtual void setProfileUseMD5()
Force the profile to use MD5 in Sample contexts, even if function names are present.
void setDiscriminatorMaskedBitFrom(FSDiscriminatorPass P)
Set the bits for FS discriminators.
virtual std::error_code read(const DenseSet< StringRef > &FuncsToUse, SampleProfileMap &Profiles)
Read sample profiles for the given functions and write them to the given profile map.
bool profileIsCS() const
Whether input profile is fully context-sensitive.
bool ProfileIsFS
Whether the function profiles use FS discriminators.
virtual bool collectFuncsFromModule()
Collect functions with definitions in Module M.
FunctionSamples * getSamplesFor(StringRef Fname)
Return the samples collected for function F.
LLVM_ABI void dumpJson(raw_ostream &OS=dbgs())
Print all the profiles on stream OS in the JSON format.
SampleProfileMap Profiles
Map every function to its associated profile.
uint64_t FormatVersion
Format version of the profile.
virtual std::error_code readHeader()=0
Read and validate the file header.
void setSkipFlatProf(bool Skip)
Don't read profile without context if the flag is set.
LLVM_ABI void dumpFunctionProfile(const FunctionSamples &FS, raw_ostream &OS=dbgs())
Print the profile for FunctionSamples on stream OS.
bool ProfileIsProbeBased
Whether samples are collected based on pseudo probes.
void reportError(int64_t LineNumber, const Twine &Msg) const
Report a parse error message.
virtual std::unique_ptr< ProfileSymbolList > getProfileSymbolList()
LLVMContext & Ctx
LLVM context used to emit diagnostics.
virtual std::error_code readImpl()=0
The implementaion to read sample profiles from the associated file.
StringSampleProfileNameTable(const std::vector< FunctionId > &Vec)
StringSampleProfileNameTable(std::vector< FunctionId > &&Vec)
FunctionId operator[](size_t Idx) const override
The virtual file system interface.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
constexpr OnDiskModeT OnDiskMode
std::map< FunctionId, uint64_t > TypeCountMap
Key represents type of a C++ polymorphic class type by its vtable and value represents its counter.
Definition SampleProf.h:369
constexpr InMemoryModeT InMemoryMode
SmallVector< FunctionSamples *, 10 > InlineCallStack
uint64_t read64le(const void *P)
Definition Endian.h:435
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
Definition Endian.h:60
uint32_t read32le(const void *P)
Definition Endian.h:432
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, unaligned > ulittle64_t
Definition Endian.h:293
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
static unsigned getFSPassBitEnd(sampleprof::FSDiscriminatorPass P)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Mod
The access may modify the value stored in memory.
Definition ModRef.h:34
static unsigned getN1Bits(int N)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:390
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
Tags to select the initialization mode of SampleProfileFuncOffsetTable.