LLVM 23.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/SmallVector.h"
229#include "llvm/ADT/StringRef.h"
231#include "llvm/IR/LLVMContext.h"
237#include "llvm/Support/Debug.h"
239#include "llvm/Support/ErrorOr.h"
242#include <cstdint>
243#include <list>
244#include <memory>
245#include <optional>
246#include <string>
247#include <system_error>
248#include <vector>
249
250namespace llvm {
251
252class raw_ostream;
253class Twine;
254
255namespace vfs {
256class FileSystem;
257} // namespace vfs
258
259namespace sampleprof {
260
262
263/// SampleProfileReaderItaniumRemapper remaps the profile data from a
264/// sample profile data reader, by applying a provided set of equivalences
265/// between components of the symbol names in the profile.
267public:
268 SampleProfileReaderItaniumRemapper(std::unique_ptr<MemoryBuffer> B,
269 std::unique_ptr<SymbolRemappingReader> SRR,
271 : Buffer(std::move(B)), Remappings(std::move(SRR)), Reader(R) {
272 assert(Remappings && "Remappings cannot be nullptr");
273 }
274
275 /// Create a remapper from the given remapping file. The remapper will
276 /// be used for profile read in by Reader.
279 LLVMContext &C);
280
281 /// Create a remapper from the given Buffer. The remapper will
282 /// be used for profile read in by Reader.
284 create(std::unique_ptr<MemoryBuffer> &B, SampleProfileReader &Reader,
285 LLVMContext &C);
286
287 /// Apply remappings to the profile read by Reader.
289
290 bool hasApplied() { return RemappingApplied; }
291
292 /// Insert function name into remapper.
293 void insert(StringRef FunctionName) { Remappings->insert(FunctionName); }
294
295 /// Query whether there is equivalent in the remapper which has been
296 /// inserted.
297 bool exist(StringRef FunctionName) {
298 return Remappings->lookup(FunctionName);
299 }
300
301 /// Return the equivalent name in the profile for \p FunctionName if
302 /// it exists.
303 LLVM_ABI std::optional<StringRef> lookUpNameInProfile(StringRef FunctionName);
304
305private:
306 // The buffer holding the content read from remapping file.
307 std::unique_ptr<MemoryBuffer> Buffer;
308 std::unique_ptr<SymbolRemappingReader> Remappings;
309 // Map remapping key to the name in the profile. By looking up the
310 // key in the remapper, a given new name can be mapped to the
311 // cannonical name using the NameMap.
313 // The Reader the remapper is servicing.
314 SampleProfileReader &Reader;
315 // Indicate whether remapping has been applied to the profile read
316 // by Reader -- by calling applyRemapping.
317 bool RemappingApplied = false;
318};
319
320/// Sample-based profile reader.
321///
322/// Each profile contains sample counts for all the functions
323/// executed. Inside each function, statements are annotated with the
324/// collected samples on all the instructions associated with that
325/// statement.
326///
327/// For this to produce meaningful data, the program needs to be
328/// compiled with some debug information (at minimum, line numbers:
329/// -gline-tables-only). Otherwise, it will be impossible to match IR
330/// instructions to the line numbers collected by the profiler.
331///
332/// From the profile file, we are interested in collecting the
333/// following information:
334///
335/// * A list of functions included in the profile (mangled names).
336///
337/// * For each function F:
338/// 1. The total number of samples collected in F.
339///
340/// 2. The samples collected at each line in F. To provide some
341/// protection against source code shuffling, line numbers should
342/// be relative to the start of the function.
343///
344/// The reader supports two file formats: text and binary. The text format
345/// is useful for debugging and testing, while the binary format is more
346/// compact and I/O efficient. They can both be used interchangeably.
347
348/// Manages the sample profile name table, supporting both an eagerly loaded
349/// std::vector of FunctionId objects and lazy-loaded MD5 hashes read directly
350/// from the memory-mapped buffer. It enforces the exclusivity of these
351/// two formats and provides a unified read-only container interface.
353 const uint8_t *Start = nullptr;
354 size_t Size = 0;
355 std::vector<FunctionId> Vec;
356
357 /// Helper function to read a FunctionId (MD5 hash) from a raw buffer.
358 static FunctionId readFunctionIdFromMD5(const uint8_t *Ptr) {
359 using namespace support;
360 return FunctionId(
362 }
363
364public:
365 /// iterator is a lightweight, self-contained input iterator designed
366 /// to stream FunctionId symbols from either the memory-mapped
367 /// file buffer (lazy loading from the FixedMD5 layout) or from an eagerly
368 /// loaded vector of FunctionId objects (fallback).
370 : public llvm::iterator_facade_base<iterator, std::input_iterator_tag,
371 FunctionId, std::ptrdiff_t,
372 const FunctionId *, FunctionId> {
373 public:
374 // Tag type to indicate the lazy name table layout.
375 struct UseLazy_t {};
376 static constexpr UseLazy_t UseLazy{};
377 iterator() = default;
378
379 // Constructor for lazy loading.
380 iterator(const uint8_t *P, UseLazy_t) : Ptr(P), IsLazy(true) {}
381
382 // Constructor for eagerly loaded name table.
384 : Ptr(reinterpret_cast<const uint8_t *>(P)), IsLazy(false) {}
385
386 bool operator==(const iterator &RHS) const { return Ptr == RHS.Ptr; }
387
389 Ptr += IsLazy ? sizeof(uint64_t) : sizeof(FunctionId);
390 return *this;
391 }
392
394 return IsLazy ? readFunctionIdFromMD5(Ptr)
395 : *reinterpret_cast<const FunctionId *>(Ptr);
396 }
397
398 private:
399 const uint8_t *Ptr = nullptr;
400 bool IsLazy = false;
401 };
402
404
406
407 void clear() {
408 Start = nullptr;
409 Size = 0;
410 Vec.clear();
411 }
412
413 /// Transitions the table to lazy-loading mode, pointing directly to a
414 /// contiguous buffer of little-endian 64-bit MD5 hashes.
415 void setLazy(const uint8_t *S, size_t Sz) {
416 clear();
417 Start = S;
418 Size = Sz;
419 }
420
421 /// Transitions the table to eager-loading mode by clearing previous state and
422 /// returning a mutable reference to the underlying vector for population.
423 std::vector<FunctionId> &setToEager() {
424 clear();
425 return Vec;
426 }
427
428 size_t size() const { return Start ? Size : Vec.size(); }
429 bool empty() const { return size() == 0; }
430
431 FunctionId operator[](size_t Idx) const {
432 assert(Idx < size());
433 if (Start)
434 return readFunctionIdFromMD5(Start + Idx * sizeof(uint64_t));
435 return Vec[Idx];
436 }
437
438 iterator begin() const {
439 if (Start)
440 return {Start, iterator::UseLazy};
441 return {Vec.data()};
442 }
443
444 iterator end() const {
445 if (Start)
446 return {Start + Size * sizeof(uint64_t), iterator::UseLazy};
447 return {Vec.data() + Vec.size()};
448 }
449};
450
452public:
453 SampleProfileReader(std::unique_ptr<MemoryBuffer> B, LLVMContext &C,
455 : Profiles(), Ctx(C), Buffer(std::move(B)), Format(Format) {}
456
457 virtual ~SampleProfileReader() = default;
458
459 /// Read and validate the file header.
460 virtual std::error_code readHeader() = 0;
461
462 /// Set the bits for FS discriminators. Parameter Pass specify the sequence
463 /// number, Pass == i is for the i-th round of adding FS discriminators.
464 /// Pass == 0 is for using base discriminators.
468
469 /// Get the bitmask the discriminators: For FS profiles, return the bit
470 /// mask for this pass. For non FS profiles, return (unsigned) -1.
472 if (!ProfileIsFS)
473 return 0xFFFFFFFF;
474 assert((MaskedBitFrom != 0) && "MaskedBitFrom is not set properly");
475 return getN1Bits(MaskedBitFrom);
476 }
477
478 /// The interface to read sample profiles from the associated file.
479 std::error_code read() {
480 if (std::error_code EC = readImpl())
481 return EC;
482 if (Remapper)
483 Remapper->applyRemapping(Ctx);
486 }
487
488 /// Read sample profiles for the given functions.
489 std::error_code read(const DenseSet<StringRef> &FuncsToUse) {
491 for (StringRef F : FuncsToUse)
492 if (Profiles.find(FunctionId(F)) == Profiles.end())
493 S.insert(F);
494 if (std::error_code EC = read(S, Profiles))
495 return EC;
497 }
498
499 /// The implementaion to read sample profiles from the associated file.
500 virtual std::error_code readImpl() = 0;
501
502 /// Print the profile for \p FunctionSamples on stream \p OS.
504 raw_ostream &OS = dbgs());
505
506 /// Collect functions with definitions in Module M. For reader which
507 /// support loading function profiles on demand, return true when the
508 /// reader has been given a module. Always return false for reader
509 /// which doesn't support loading function profiles on demand.
510 virtual bool collectFuncsFromModule() { return false; }
511
512 /// Print all the profiles on stream \p OS.
513 LLVM_ABI void dump(raw_ostream &OS = dbgs());
514
515 /// Print all the profiles on stream \p OS in the JSON format.
516 LLVM_ABI void dumpJson(raw_ostream &OS = dbgs());
517
518 /// Return the samples collected for function \p F.
520 // The function name may have been updated by adding suffix. Call
521 // a helper to (optionally) strip off suffixes so that we can
522 // match against the original function name in the profile.
524 return getSamplesFor(CanonName);
525 }
526
527 /// Return the samples collected for function \p F.
529 auto It = Profiles.find(FunctionId(Fname));
530 if (It != Profiles.end())
531 return &It->second;
532
534 auto R = FuncNameToProfNameMap->find(FunctionId(Fname));
535 if (R != FuncNameToProfNameMap->end()) {
536 Fname = R->second.stringRef();
537 auto It = Profiles.find(FunctionId(Fname));
538 if (It != Profiles.end())
539 return &It->second;
540 }
541 }
542
543 if (Remapper) {
544 if (auto NameInProfile = Remapper->lookUpNameInProfile(Fname)) {
545 auto It = Profiles.find(FunctionId(*NameInProfile));
546 if (It != Profiles.end())
547 return &It->second;
548 }
549 }
550 return nullptr;
551 }
552
553 /// Return all the profiles.
555
556 /// Report a parse error message.
557 void reportError(int64_t LineNumber, const Twine &Msg) const {
558 Ctx.diagnose(DiagnosticInfoSampleProfile(Buffer->getBufferIdentifier(),
559 LineNumber, Msg));
560 }
561
562 /// Create a sample profile reader appropriate to the file format.
563 /// Create a remapper underlying if RemapFilename is not empty.
564 /// Parameter P specifies the FSDiscriminatorPass.
568 StringRef RemapFilename = "");
569
570 /// Create a sample profile reader from the supplied memory buffer.
571 /// Create a remapper underlying if RemapFilename is not empty.
572 /// Parameter P specifies the FSDiscriminatorPass.
574 create(std::unique_ptr<MemoryBuffer> &B, LLVMContext &C, vfs::FileSystem &FS,
576 StringRef RemapFilename = "");
577
578 /// Return the profile summary.
579 ProfileSummary &getSummary() const { return *Summary; }
580
581 MemoryBuffer *getBuffer() const { return Buffer.get(); }
582
583 /// \brief Return the profile format.
585
586 /// Whether input profile is based on pseudo probes.
588
589 /// Whether input profile is fully context-sensitive.
590 bool profileIsCS() const { return ProfileIsCS; }
591
592 /// Whether input profile contains ShouldBeInlined contexts.
594
595 /// Whether input profile is flow-sensitive.
596 bool profileIsFS() const { return ProfileIsFS; }
597
598 virtual std::unique_ptr<ProfileSymbolList> getProfileSymbolList() {
599 return nullptr;
600 };
601
602 /// It includes all the names that have samples either in outline instance
603 /// or inline instance.
609 virtual bool dumpSectionInfo(raw_ostream &OS = dbgs()) { return false; };
610
611 /// Return whether names in the profile are all MD5 numbers.
612 bool useMD5() const { return ProfileIsMD5; }
613
614 /// Force the profile to use MD5 in Sample contexts, even if function names
615 /// are present.
616 virtual void setProfileUseMD5() { ProfileIsMD5 = true; }
617
618 /// Don't read profile without context if the flag is set.
619 void setSkipFlatProf(bool Skip) { SkipFlatProf = Skip; }
620
621 /// Return whether any name in the profile contains ".__uniq." suffix.
622 virtual bool hasUniqSuffix() { return false; }
623
625
626 void setModule(const Module *Mod) { M = Mod; }
627
632
633protected:
634 /// Map every function to its associated profile.
635 ///
636 /// The profile of every function executed at runtime is collected
637 /// in the structure FunctionSamples. This maps function objects
638 /// to their corresponding profiles.
640
641 /// LLVM context used to emit diagnostics.
643
644 /// Memory buffer holding the profile file.
645 std::unique_ptr<MemoryBuffer> Buffer;
646
647 /// Profile summary information.
648 std::unique_ptr<ProfileSummary> Summary;
649
650 /// Take ownership of the summary of this reader.
651 static std::unique_ptr<ProfileSummary>
653 return std::move(Reader.Summary);
654 }
655
656 /// Compute summary for this profile.
658
659 /// Read sample profiles for the given functions and write them to the given
660 /// profile map. Currently it's only used for extended binary format to load
661 /// the profiles on-demand.
662 virtual std::error_code read(const DenseSet<StringRef> &FuncsToUse,
665 }
666
667 std::unique_ptr<SampleProfileReaderItaniumRemapper> Remapper;
668
669 // A map pointer to the FuncNameToProfNameMap in SampleProfileLoader,
670 // which maps the function name to the matched profile name. This is used
671 // for sample loader to look up profile using the new name.
673 nullptr;
674
675 // A map from a function's context hash to its meta data section range, used
676 // for on-demand read function profile metadata.
679
680 std::pair<const uint8_t *, const uint8_t *> ProfileSecRange;
681
682 /// Whether the profile has attribute metadata.
684
685 /// \brief Whether samples are collected based on pseudo probes.
687
688 /// Whether function profiles are context-sensitive flat profiles.
689 bool ProfileIsCS = false;
690
691 /// Whether function profile contains ShouldBeInlined contexts.
693
694 /// Number of context-sensitive profiles.
696
697 /// Whether the function profiles use FS discriminators.
698 bool ProfileIsFS = false;
699
700 /// If true, the profile has vtable profiles and reader should decode them
701 /// to parse profiles correctly.
702 bool ReadVTableProf = false;
703
704 /// \brief The format of sample.
706
707 /// \brief The current module being compiled if SampleProfileReader
708 /// is used by compiler. If SampleProfileReader is used by other
709 /// tools which are not compiler, M is usually nullptr.
710 const Module *M = nullptr;
711
712 /// Zero out the discriminator bits higher than bit MaskedBitFrom (0 based).
713 /// The default is to keep all the bits.
715
716 /// Whether the profile uses MD5 for Sample Contexts and function names. This
717 /// can be one-way overriden by the user to force use MD5.
718 bool ProfileIsMD5 = false;
719
720 /// If SkipFlatProf is true, skip functions marked with !Flat in text mode or
721 /// sections with SecFlagFlat flag in ExtBinary mode.
722 bool SkipFlatProf = false;
723};
724
726public:
727 SampleProfileReaderText(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
729
730 /// Read and validate the file header.
731 std::error_code readHeader() override { return sampleprof_error::success; }
732
733 /// Read sample profiles from the associated file.
734 std::error_code readImpl() override;
735
736 /// Return true if \p Buffer is in the format supported by this class.
737 static bool hasFormat(const MemoryBuffer &Buffer);
738
739 /// Text format sample profile does not support MD5 for now.
740 void setProfileUseMD5() override {}
741
742private:
743 /// CSNameTable is used to save full context vectors. This serves as an
744 /// underlying immutable buffer for all clients.
745 std::list<SampleContextFrameVector> CSNameTable;
746};
747
749public:
753
754 /// Read and validate the file header.
755 std::error_code readHeader() override;
756
757 /// Read sample profiles from the associated file.
758 std::error_code readImpl() override;
759
760 /// It includes all the names that have samples either in outline instance
761 /// or inline instance.
763 getNameTable() const override {
764 return {NameTable.begin(), NameTable.end()};
765 }
766
767protected:
768 /// Read a numeric value of type T from the profile.
769 ///
770 /// If an error occurs during decoding, a diagnostic message is emitted and
771 /// EC is set.
772 ///
773 /// \returns the read value.
774 template <typename T> ErrorOr<T> readNumber();
775
776 /// Read a numeric value of type T from the profile. The value is saved
777 /// without encoded.
778 template <typename T> ErrorOr<T> readUnencodedNumber();
779
780 /// Read a string from the profile.
781 ///
782 /// If an error occurs during decoding, a diagnostic message is emitted and
783 /// EC is set.
784 ///
785 /// \returns the read value.
787
788 /// Read the string index and check whether it overflows the table.
789 template <typename T> inline ErrorOr<size_t> readStringIndex(T &Table);
790
791 /// Read the next function profile instance.
792 std::error_code readFuncProfile(const uint8_t *Start);
793 std::error_code readFuncProfile(const uint8_t *Start,
794 SampleProfileMap &Profiles);
795
796 /// Read the contents of the given profile instance.
797 std::error_code readProfile(FunctionSamples &FProfile);
798
799 /// Read the contents of Magic number and Version number.
800 std::error_code readMagicIdent();
801
802 /// Read profile summary.
803 std::error_code readSummary();
804
805 /// Read the whole name table.
806 std::error_code readNameTable();
807
808 /// Read a string indirectly via the name table. Optionally return the index.
809 ErrorOr<FunctionId> readStringFromTable(size_t *RetIdx = nullptr);
810
811 /// Read a context indirectly via the CSNameTable. Optionally return the
812 /// index.
813 ErrorOr<SampleContextFrames> readContextFromTable(size_t *RetIdx = nullptr);
814
815 /// Read a context indirectly via the CSNameTable if the profile has context,
816 /// otherwise same as readStringFromTable, also return its hash value.
817 ErrorOr<std::pair<SampleContext, uint64_t>> readSampleContextFromTable();
818
819 /// Read all virtual functions' vtable access counts for \p FProfile.
820 std::error_code readCallsiteVTableProf(FunctionSamples &FProfile);
821
822 /// Read bytes from the input buffer pointed by `Data` and decode them into
823 /// \p M. `Data` will be advanced to the end of the read bytes when this
824 /// function returns. Returns error if any.
825 std::error_code readVTableTypeCountMap(TypeCountMap &M);
826
827 /// Points to the current location in the buffer.
828 const uint8_t *Data = nullptr;
829
830 /// Points to the end of the buffer.
831 const uint8_t *End = nullptr;
832
833 /// Function name table.
835
836 /// CSNameTable is used to save full context vectors. It is the backing buffer
837 /// for SampleContextFrames.
838 std::vector<SampleContextFrameVector> CSNameTable;
839
840 /// Table to cache MD5 values of sample contexts corresponding to
841 /// readSampleContextFromTable(), used to index into Profiles or
842 /// FuncOffsetTable.
843 std::vector<uint64_t> MD5SampleContextTable;
844
845 /// The starting address of the table of MD5 values of sample contexts. For
846 /// fixed length MD5 non-CS profile it is same as MD5NameMemStart because
847 /// hashes of non-CS contexts are already in the profile. Otherwise it points
848 /// to the start of MD5SampleContextTable.
850
851private:
852 std::error_code readSummaryEntry(std::vector<ProfileSummaryEntry> &Entries);
853 virtual std::error_code verifySPMagic(uint64_t Magic) = 0;
854};
855
857private:
858 std::error_code verifySPMagic(uint64_t Magic) override;
859
860public:
864
865 /// \brief Return true if \p Buffer is in the format supported by this class.
866 static bool hasFormat(const MemoryBuffer &Buffer);
867};
868
869/// Trait class for reading the on-disk function offset hash table mapping
870/// function name GUIDs to their offsets in the SecLBRProfile section.
872public:
875 using data_type = uint32_t; // Offset
881
883 return static_cast<hash_value_type>(Key);
884 }
885
887 return LHS == RHS;
888 }
889
892
893 static std::pair<offset_type, offset_type>
894 ReadKeyDataLength(const unsigned char *&D) {
895 // Implicit lengths: do NOT read or advance pointer D.
896 return {sizeof(key_type), sizeof(data_type)};
897 }
898
899 static key_type ReadKey(const unsigned char *D, offset_type Len) {
900 assert(Len == sizeof(key_type) && "Key length mismatch");
902 }
903
904 static data_type ReadData(key_type_ref K, const unsigned char *D,
905 offset_type Len) {
906 assert(Len == sizeof(data_type) && "Data length mismatch");
908 }
909};
910
911/// SampleProfileReaderExtBinaryBase/SampleProfileWriterExtBinaryBase defines
912/// the basic structure of the extensible binary format.
913/// The format is organized in sections except the magic and version number
914/// at the beginning. There is a section table before all the sections, and
915/// each entry in the table describes the entry type, start, size and
916/// attributes. The format in each section is defined by the section itself.
917///
918/// It is easy to add a new section while maintaining the backward
919/// compatibility of the profile. Nothing extra needs to be done. If we want
920/// to extend an existing section, like add cache misses information in
921/// addition to the sample count in the profile body, we can add a new section
922/// with the extension and retire the existing section, and we could choose
923/// to keep the parser of the old section if we want the reader to be able
924/// to read both new and old format profile.
925///
926/// SampleProfileReaderExtBinary/SampleProfileWriterExtBinary define the
927/// commonly used sections of a profile in extensible binary format. It is
928/// possible to define other types of profile inherited from
929/// SampleProfileReaderExtBinaryBase/SampleProfileWriterExtBinaryBase.
932private:
933 std::error_code decompressSection(const uint8_t *SecStart,
934 const uint64_t SecSize,
935 const uint8_t *&DecompressBuf,
936 uint64_t &DecompressBufSize);
937
938 BumpPtrAllocator Allocator;
939
940protected:
941 std::vector<SecHdrTableEntry> SecHdrTable;
942 std::error_code readSecHdrTableEntry(uint64_t Idx);
943 std::error_code readSecHdrTable();
944
945 std::error_code readFuncMetadata(bool ProfileHasAttribute,
947 std::error_code readFuncMetadata(bool ProfileHasAttribute);
948 std::error_code readFuncMetadata(bool ProfileHasAttribute,
949 FunctionSamples *FProfile);
950 std::error_code readFuncOffsetTable();
951 std::error_code readFuncProfiles();
952 std::error_code readFuncProfiles(const DenseSet<StringRef> &FuncsToUse,
954 std::error_code readNameTableSec(bool IsMD5, bool FixedLengthMD5);
955 std::error_code readCSNameTableSec();
956 std::error_code readProfileSymbolList();
957
958 std::error_code readHeader() override;
959 std::error_code verifySPMagic(uint64_t Magic) override = 0;
960 virtual std::error_code readOneSection(const uint8_t *Start, uint64_t Size,
961 const SecHdrTableEntry &Entry);
962 // placeholder for subclasses to dispatch their own section readers.
963 virtual std::error_code readCustomSection(const SecHdrTableEntry &Entry) = 0;
964
965 /// Determine which container readFuncOffsetTable() should populate, the list
966 /// FuncOffsetList or the map FuncOffsetTable.
967 bool useFuncOffsetList() const;
968
969 std::unique_ptr<ProfileSymbolList> ProfSymList;
970
971 /// The table mapping from a function context's MD5 to the offset of its
972 /// FunctionSample towards file start.
973 /// At most one of FuncOffsetTable and FuncOffsetList is populated.
975
976 /// The list version of FuncOffsetTable. This is used if every entry is
977 /// being accessed.
978 std::vector<std::pair<SampleContext, uint64_t>> FuncOffsetList;
979
980 /// The set containing the functions to use when compiling a module.
982
983public:
987
988 /// Read sample profiles in extensible format from the associated file.
989 std::error_code readImpl() override;
990
991 /// Get the total size of all \p Type sections.
992 uint64_t getSectionSize(SecType Type);
993 /// Get the total size of header and all sections.
994 uint64_t getFileSize();
995 bool dumpSectionInfo(raw_ostream &OS = dbgs()) override;
996
997 /// Collect functions with definitions in Module M. Return true if
998 /// the reader has been given a module.
999 bool collectFuncsFromModule() override;
1000
1001 std::unique_ptr<ProfileSymbolList> getProfileSymbolList() override {
1002 return std::move(ProfSymList);
1003 };
1004
1005private:
1006 /// Read the profiles on-demand for the given functions. This is used after
1007 /// stale call graph matching finds new functions whose profiles aren't loaded
1008 /// at the beginning and we need to loaded the profiles explicitly for
1009 /// potential matching.
1010 std::error_code read(const DenseSet<StringRef> &FuncsToUse,
1011 SampleProfileMap &Profiles) override;
1012};
1013
1016private:
1017 std::error_code verifySPMagic(uint64_t Magic) override;
1018 std::error_code readCustomSection(const SecHdrTableEntry &Entry) override {
1019 // Update the data reader pointer to the end of the section.
1020 Data = End;
1022 };
1023
1024public:
1028
1029 /// \brief Return true if \p Buffer is in the format supported by this class.
1030 static bool hasFormat(const MemoryBuffer &Buffer);
1031};
1032
1034
1035// Supported histogram types in GCC. Currently, we only need support for
1036// call target histograms.
1047
1049public:
1050 SampleProfileReaderGCC(std::unique_ptr<MemoryBuffer> B, LLVMContext &C)
1052 GcovBuffer(Buffer.get()) {}
1053
1054 /// Read and validate the file header.
1055 std::error_code readHeader() override;
1056
1057 /// Read sample profiles from the associated file.
1058 std::error_code readImpl() override;
1059
1060 /// Return true if \p Buffer is in the format supported by this class.
1061 static bool hasFormat(const MemoryBuffer &Buffer);
1062
1063protected:
1064 std::error_code readNameTable();
1065 std::error_code readOneFunctionProfile(const InlineCallStack &InlineStack,
1066 bool Update, uint32_t Offset);
1067 std::error_code readFunctionProfiles();
1068 std::error_code skipNextWord();
1069 template <typename T> ErrorOr<T> readNumber();
1071
1072 /// Read the section tag and check that it's the same as \p Expected.
1073 std::error_code readSectionTag(uint32_t Expected);
1074
1075 /// GCOV buffer containing the profile.
1077
1078 /// Function names in this profile.
1079 std::vector<std::string> Names;
1080
1081 /// GCOV tags used to separate sections in the profile file.
1082 static const uint32_t GCOVTagAFDOFileNames = 0xaa000000;
1083 static const uint32_t GCOVTagAFDOFunction = 0xac000000;
1084};
1085
1086} // end namespace sampleprof
1087
1088} // end namespace llvm
1089
1090#endif // LLVM_PROFILEDATA_SAMPLEPROFREADER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
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.
#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)
This file defines the SmallVector class.
Value * RHS
Value * LHS
Implements a dense probed hash-table based set.
Definition DenseSet.h:289
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
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
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:212
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
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:792
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
This class provides operator overloads to the map container using MD5 as the key type,...
iterator is a lightweight, self-contained input iterator designed to stream FunctionId symbols from e...
FunctionId operator[](size_t Idx) const
void setLazy(const uint8_t *S, size_t Sz)
Transitions the table to lazy-loading mode, pointing directly to a contiguous buffer of little-endian...
std::vector< FunctionId > & setToEager()
Transitions the table to eager-loading mode by clearing previous state and returning a mutable refere...
const uint8_t * Data
Points to the current location in the buffer.
const uint64_t * MD5SampleContextStart
The starting address of the table of MD5 values of sample contexts.
SampleProfileNameTable NameTable
Function name table.
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.
virtual std::error_code readCustomSection(const SecHdrTableEntry &Entry)=0
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
bool useFuncOffsetList() const
Determine which container readFuncOffsetTable() should populate, the list FuncOffsetList or the map F...
std::error_code readNameTableSec(bool IsMD5, bool FixedLengthMD5)
std::unique_ptr< ProfileSymbolList > getProfileSymbolList() override
std::error_code readFuncMetadata(bool ProfileHasAttribute, DenseSet< FunctionSamples * > &Profiles)
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)
DenseMap< hash_code, uint64_t > FuncOffsetTable
The table mapping from a function context's MD5 to the offset of its FunctionSample towards file star...
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.
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.
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.
The virtual file system interface.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
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:340
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
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:558
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:1916
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:860