LLVM 20.0.0git
ModuleSummaryIndex.h
Go to the documentation of this file.
1//===- llvm/ModuleSummaryIndex.h - Module Summary Index ---------*- 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/// @file
10/// ModuleSummaryIndex.h This file contains the declarations the classes that
11/// hold the module index and summary for function importing.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_IR_MODULESUMMARYINDEX_H
16#define LLVM_IR_MODULESUMMARYINDEX_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/DenseMap.h"
20#include "llvm/ADT/STLExtras.h"
24#include "llvm/ADT/StringMap.h"
25#include "llvm/ADT/StringRef.h"
27#include "llvm/IR/GlobalValue.h"
28#include "llvm/IR/Module.h"
34#include <algorithm>
35#include <array>
36#include <cassert>
37#include <cstddef>
38#include <cstdint>
39#include <map>
40#include <memory>
41#include <optional>
42#include <set>
43#include <string>
44#include <unordered_set>
45#include <utility>
46#include <vector>
47
48namespace llvm {
49
50template <class GraphType> struct GraphTraits;
51
52namespace yaml {
53
54template <typename T> struct MappingTraits;
55
56} // end namespace yaml
57
58/// Class to accumulate and hold information about a callee.
59struct CalleeInfo {
60 enum class HotnessType : uint8_t {
61 Unknown = 0,
62 Cold = 1,
63 None = 2,
64 Hot = 3,
65 Critical = 4
66 };
67
68 // The size of the bit-field might need to be adjusted if more values are
69 // added to HotnessType enum.
71
72 // True if at least one of the calls to the callee is a tail call.
73 bool HasTailCall : 1;
74
75 /// The value stored in RelBlockFreq has to be interpreted as the digits of
76 /// a scaled number with a scale of \p -ScaleShift.
77 static constexpr unsigned RelBlockFreqBits = 28;
79 static constexpr int32_t ScaleShift = 8;
80 static constexpr uint64_t MaxRelBlockFreq = (1 << RelBlockFreqBits) - 1;
81
83 : Hotness(static_cast<uint32_t>(HotnessType::Unknown)),
85 explicit CalleeInfo(HotnessType Hotness, bool HasTC, uint64_t RelBF)
86 : Hotness(static_cast<uint32_t>(Hotness)), HasTailCall(HasTC),
87 RelBlockFreq(RelBF) {}
88
89 void updateHotness(const HotnessType OtherHotness) {
90 Hotness = std::max(Hotness, static_cast<uint32_t>(OtherHotness));
91 }
92
93 bool hasTailCall() const { return HasTailCall; }
94
95 void setHasTailCall(const bool HasTC) { HasTailCall = HasTC; }
96
98
99 /// Update \p RelBlockFreq from \p BlockFreq and \p EntryFreq
100 ///
101 /// BlockFreq is divided by EntryFreq and added to RelBlockFreq. To represent
102 /// fractional values, the result is represented as a fixed point number with
103 /// scale of -ScaleShift.
104 void updateRelBlockFreq(uint64_t BlockFreq, uint64_t EntryFreq) {
105 if (EntryFreq == 0)
106 return;
107 using Scaled64 = ScaledNumber<uint64_t>;
108 Scaled64 Temp(BlockFreq, ScaleShift);
109 Temp /= Scaled64::get(EntryFreq);
110
111 uint64_t Sum =
112 SaturatingAdd<uint64_t>(Temp.toInt<uint64_t>(), RelBlockFreq);
113 Sum = std::min(Sum, uint64_t(MaxRelBlockFreq));
114 RelBlockFreq = static_cast<uint32_t>(Sum);
115 }
116};
117
119 switch (HT) {
121 return "unknown";
123 return "cold";
125 return "none";
127 return "hot";
129 return "critical";
130 }
131 llvm_unreachable("invalid hotness");
132}
133
134class GlobalValueSummary;
135
136using GlobalValueSummaryList = std::vector<std::unique_ptr<GlobalValueSummary>>;
137
138struct alignas(8) GlobalValueSummaryInfo {
139 union NameOrGV {
140 NameOrGV(bool HaveGVs) {
141 if (HaveGVs)
142 GV = nullptr;
143 else
144 Name = "";
145 }
146
147 /// The GlobalValue corresponding to this summary. This is only used in
148 /// per-module summaries and when the IR is available. E.g. when module
149 /// analysis is being run, or when parsing both the IR and the summary
150 /// from assembly.
152
153 /// Summary string representation. This StringRef points to BC module
154 /// string table and is valid until module data is stored in memory.
155 /// This is guaranteed to happen until runThinLTOBackend function is
156 /// called, so it is safe to use this field during thin link. This field
157 /// is only valid if summary index was loaded from BC file.
159 } U;
160
161 inline GlobalValueSummaryInfo(bool HaveGVs);
162
163 /// List of global value summary structures for a particular value held
164 /// in the GlobalValueMap. Requires a vector in the case of multiple
165 /// COMDAT values of the same name.
167};
168
169/// Map from global value GUID to corresponding summary structures. Use a
170/// std::map rather than a DenseMap so that pointers to the map's value_type
171/// (which are used by ValueInfo) are not invalidated by insertion. Also it will
172/// likely incur less overhead, as the value type is not very small and the size
173/// of the map is unknown, resulting in inefficiencies due to repeated
174/// insertions and resizing.
176 std::map<GlobalValue::GUID, GlobalValueSummaryInfo>;
177
178/// Struct that holds a reference to a particular GUID in a global value
179/// summary.
180struct ValueInfo {
181 enum Flags { HaveGV = 1, ReadOnly = 2, WriteOnly = 4 };
184
185 ValueInfo() = default;
186 ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R) {
188 RefAndFlags.setInt(HaveGVs);
189 }
190
191 explicit operator bool() const { return getRef(); }
192
193 GlobalValue::GUID getGUID() const { return getRef()->first; }
194 const GlobalValue *getValue() const {
195 assert(haveGVs());
196 return getRef()->second.U.GV;
197 }
198
200 return getRef()->second.SummaryList;
201 }
202
203 // Even if the index is built with GVs available, we may not have one for
204 // summary entries synthesized for profiled indirect call targets.
205 bool hasName() const { return !haveGVs() || getValue(); }
206
207 StringRef name() const {
208 assert(!haveGVs() || getRef()->second.U.GV);
209 return haveGVs() ? getRef()->second.U.GV->getName()
210 : getRef()->second.U.Name;
211 }
212
213 bool haveGVs() const { return RefAndFlags.getInt() & HaveGV; }
214 bool isReadOnly() const {
216 return RefAndFlags.getInt() & ReadOnly;
217 }
218 bool isWriteOnly() const {
220 return RefAndFlags.getInt() & WriteOnly;
221 }
222 unsigned getAccessSpecifier() const {
224 return RefAndFlags.getInt() & (ReadOnly | WriteOnly);
225 }
227 unsigned BadAccessMask = ReadOnly | WriteOnly;
228 return (RefAndFlags.getInt() & BadAccessMask) != BadAccessMask;
229 }
230 void setReadOnly() {
231 // We expect ro/wo attribute to set only once during
232 // ValueInfo lifetime.
235 }
239 }
240
241 const GlobalValueSummaryMapTy::value_type *getRef() const {
242 return RefAndFlags.getPointer();
243 }
244
245 /// Returns the most constraining visibility among summaries. The
246 /// visibilities, ordered from least to most constraining, are: default,
247 /// protected and hidden.
249
250 /// Checks if all summaries are DSO local (have the flag set). When DSOLocal
251 /// propagation has been done, set the parameter to enable fast check.
252 bool isDSOLocal(bool WithDSOLocalPropagation = false) const;
253
254 /// Checks if all copies are eligible for auto-hiding (have flag set).
255 bool canAutoHide() const;
256};
257
259 OS << VI.getGUID();
260 if (!VI.name().empty())
261 OS << " (" << VI.name() << ")";
262 return OS;
263}
264
265inline bool operator==(const ValueInfo &A, const ValueInfo &B) {
266 assert(A.getRef() && B.getRef() &&
267 "Need ValueInfo with non-null Ref for comparison");
268 return A.getRef() == B.getRef();
269}
270
271inline bool operator!=(const ValueInfo &A, const ValueInfo &B) {
272 assert(A.getRef() && B.getRef() &&
273 "Need ValueInfo with non-null Ref for comparison");
274 return A.getRef() != B.getRef();
275}
276
277inline bool operator<(const ValueInfo &A, const ValueInfo &B) {
278 assert(A.getRef() && B.getRef() &&
279 "Need ValueInfo with non-null Ref to compare GUIDs");
280 return A.getGUID() < B.getGUID();
281}
282
283template <> struct DenseMapInfo<ValueInfo> {
284 static inline ValueInfo getEmptyKey() {
285 return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8);
286 }
287
288 static inline ValueInfo getTombstoneKey() {
289 return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-16);
290 }
291
292 static inline bool isSpecialKey(ValueInfo V) {
293 return V == getTombstoneKey() || V == getEmptyKey();
294 }
295
296 static bool isEqual(ValueInfo L, ValueInfo R) {
297 // We are not supposed to mix ValueInfo(s) with different HaveGVs flag
298 // in a same container.
299 assert(isSpecialKey(L) || isSpecialKey(R) || (L.haveGVs() == R.haveGVs()));
300 return L.getRef() == R.getRef();
301 }
302 static unsigned getHashValue(ValueInfo I) { return (uintptr_t)I.getRef(); }
303};
304
305// For optional hinted size reporting, holds a pair of the full stack id
306// (pre-trimming, from the full context in the profile), and the associated
307// total profiled size.
311};
312
313/// Summary of memprof callsite metadata.
315 // Actual callee function.
317
318 // Used to record whole program analysis cloning decisions.
319 // The ThinLTO backend will need to create as many clones as there are entries
320 // in the vector (it is expected and should be confirmed that all such
321 // summaries in the same FunctionSummary have the same number of entries).
322 // Each index records version info for the corresponding clone of this
323 // function. The value is the callee clone it calls (becomes the appended
324 // suffix id). Index 0 is the original version, and a value of 0 calls the
325 // original callee.
327
328 // Represents stack ids in this context, recorded as indices into the
329 // StackIds vector in the summary index, which in turn holds the full 64-bit
330 // stack ids. This reduces memory as there are in practice far fewer unique
331 // stack ids than stack id references.
333
340};
341
343 OS << "Callee: " << SNI.Callee;
344 bool First = true;
345 OS << " Clones: ";
346 for (auto V : SNI.Clones) {
347 if (!First)
348 OS << ", ";
349 First = false;
350 OS << V;
351 }
352 First = true;
353 OS << " StackIds: ";
354 for (auto Id : SNI.StackIdIndices) {
355 if (!First)
356 OS << ", ";
357 First = false;
358 OS << Id;
359 }
360 return OS;
361}
362
363// Allocation type assigned to an allocation reached by a given context.
364// More can be added, now this is cold, notcold and hot.
365// Values should be powers of two so that they can be ORed, in particular to
366// track allocations that have different behavior with different calling
367// contexts.
369 None = 0,
370 NotCold = 1,
371 Cold = 2,
372 Hot = 4,
373 All = 7 // This should always be set to the OR of all values.
374};
375
376/// Summary of a single MIB in a memprof metadata on allocations.
377struct MIBInfo {
378 // The allocation type for this profiled context.
380
381 // Represents stack ids in this context, recorded as indices into the
382 // StackIds vector in the summary index, which in turn holds the full 64-bit
383 // stack ids. This reduces memory as there are in practice far fewer unique
384 // stack ids than stack id references.
386
389};
390
392 OS << "AllocType " << (unsigned)MIB.AllocType;
393 bool First = true;
394 OS << " StackIds: ";
395 for (auto Id : MIB.StackIdIndices) {
396 if (!First)
397 OS << ", ";
398 First = false;
399 OS << Id;
400 }
401 return OS;
402}
403
404/// Summary of memprof metadata on allocations.
405struct AllocInfo {
406 // Used to record whole program analysis cloning decisions.
407 // The ThinLTO backend will need to create as many clones as there are entries
408 // in the vector (it is expected and should be confirmed that all such
409 // summaries in the same FunctionSummary have the same number of entries).
410 // Each index records version info for the corresponding clone of this
411 // function. The value is the allocation type of the corresponding allocation.
412 // Index 0 is the original version. Before cloning, index 0 may have more than
413 // one allocation type.
415
416 // Vector of MIBs in this memprof metadata.
417 std::vector<MIBInfo> MIBs;
418
419 // If requested, keep track of full stack contexts and total profiled sizes
420 // for each MIB. This will be a vector of the same length and order as the
421 // MIBs vector, if non-empty. Note that each MIB in the summary can have
422 // multiple of these as we trim the contexts when possible during matching.
423 // For hinted size reporting we, however, want the original pre-trimmed full
424 // stack context id for better correlation with the profile.
425 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
426
427 AllocInfo(std::vector<MIBInfo> MIBs) : MIBs(std::move(MIBs)) {
429 }
432};
433
435 bool First = true;
436 OS << "Versions: ";
437 for (auto V : AE.Versions) {
438 if (!First)
439 OS << ", ";
440 First = false;
441 OS << (unsigned)V;
442 }
443 OS << " MIB:\n";
444 for (auto &M : AE.MIBs) {
445 OS << "\t\t" << M << "\n";
446 }
447 if (!AE.ContextSizeInfos.empty()) {
448 OS << "\tContextSizeInfo per MIB:\n";
449 for (auto Infos : AE.ContextSizeInfos) {
450 OS << "\t\t";
451 bool FirstInfo = true;
452 for (auto [FullStackId, TotalSize] : Infos) {
453 if (!FirstInfo)
454 OS << ", ";
455 FirstInfo = false;
456 OS << "{ " << FullStackId << ", " << TotalSize << " }";
457 }
458 OS << "\n";
459 }
460 }
461 return OS;
462}
463
464/// Function and variable summary information to aid decisions and
465/// implementation of importing.
467public:
468 /// Sububclass discriminator (for dyn_cast<> et al.)
470
471 enum ImportKind : unsigned {
472 // The global value definition corresponding to the summary should be
473 // imported from source module
475
476 // When its definition doesn't exist in the destination module and not
477 // imported (e.g., function is too large to be inlined), the global value
478 // declaration corresponding to the summary should be imported, or the
479 // attributes from summary should be annotated on the function declaration.
481 };
482
483 /// Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
484 struct GVFlags {
485 /// The linkage type of the associated global value.
486 ///
487 /// One use is to flag values that have local linkage types and need to
488 /// have module identifier appended before placing into the combined
489 /// index, to disambiguate from other values with the same name.
490 /// In the future this will be used to update and optimize linkage
491 /// types based on global summary-based analysis.
492 unsigned Linkage : 4;
493
494 /// Indicates the visibility.
495 unsigned Visibility : 2;
496
497 /// Indicate if the global value cannot be imported (e.g. it cannot
498 /// be renamed or references something that can't be renamed).
500
501 /// In per-module summary, indicate that the global value must be considered
502 /// a live root for index-based liveness analysis. Used for special LLVM
503 /// values such as llvm.global_ctors that the linker does not know about.
504 ///
505 /// In combined summary, indicate that the global value is live.
506 unsigned Live : 1;
507
508 /// Indicates that the linker resolved the symbol to a definition from
509 /// within the same linkage unit.
510 unsigned DSOLocal : 1;
511
512 /// In the per-module summary, indicates that the global value is
513 /// linkonce_odr and global unnamed addr (so eligible for auto-hiding
514 /// via hidden visibility). In the combined summary, indicates that the
515 /// prevailing linkonce_odr copy can be auto-hidden via hidden visibility
516 /// when it is upgraded to weak_odr in the backend. This is legal when
517 /// all copies are eligible for auto-hiding (i.e. all copies were
518 /// linkonce_odr global unnamed addr. If any copy is not (e.g. it was
519 /// originally weak_odr, we cannot auto-hide the prevailing copy as it
520 /// means the symbol was externally visible.
521 unsigned CanAutoHide : 1;
522
523 /// This field is written by the ThinLTO indexing step to postlink combined
524 /// summary. The value is interpreted as 'ImportKind' enum defined above.
525 unsigned ImportType : 1;
526
527 /// Convenience Constructors
530 bool NotEligibleToImport, bool Live, bool IsLocal,
535 ImportType(static_cast<unsigned>(ImportType)) {}
536 };
537
538private:
539 /// Kind of summary for use in dyn_cast<> et al.
540 SummaryKind Kind;
541
542 GVFlags Flags;
543
544 /// This is the hash of the name of the symbol in the original file. It is
545 /// identical to the GUID for global symbols, but differs for local since the
546 /// GUID includes the module level id in the hash.
547 GlobalValue::GUID OriginalName = 0;
548
549 /// Path of module IR containing value's definition, used to locate
550 /// module during importing.
551 ///
552 /// This is only used during parsing of the combined index, or when
553 /// parsing the per-module index for creation of the combined summary index,
554 /// not during writing of the per-module index which doesn't contain a
555 /// module path string table.
556 StringRef ModulePath;
557
558 /// List of values referenced by this global value's definition
559 /// (either by the initializer of a global variable, or referenced
560 /// from within a function). This does not include functions called, which
561 /// are listed in the derived FunctionSummary object.
562 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
563 /// smaller memory footprint.
564 SmallVector<ValueInfo, 0> RefEdgeList;
565
566protected:
569 : Kind(K), Flags(Flags), RefEdgeList(std::move(Refs)) {
570 assert((K != AliasKind || Refs.empty()) &&
571 "Expect no references for AliasSummary");
572 }
573
574public:
575 virtual ~GlobalValueSummary() = default;
576
577 /// Returns the hash of the original name, it is identical to the GUID for
578 /// externally visible symbols, but not for local ones.
579 GlobalValue::GUID getOriginalName() const { return OriginalName; }
580
581 /// Initialize the original name hash in this summary.
582 void setOriginalName(GlobalValue::GUID Name) { OriginalName = Name; }
583
584 /// Which kind of summary subclass this is.
585 SummaryKind getSummaryKind() const { return Kind; }
586
587 /// Set the path to the module containing this function, for use in
588 /// the combined index.
589 void setModulePath(StringRef ModPath) { ModulePath = ModPath; }
590
591 /// Get the path to the module containing this function.
592 StringRef modulePath() const { return ModulePath; }
593
594 /// Get the flags for this GlobalValue (see \p struct GVFlags).
595 GVFlags flags() const { return Flags; }
596
597 /// Return linkage type recorded for this global value.
599 return static_cast<GlobalValue::LinkageTypes>(Flags.Linkage);
600 }
601
602 /// Sets the linkage to the value determined by global summary-based
603 /// optimization. Will be applied in the ThinLTO backends.
605 Flags.Linkage = Linkage;
606 }
607
608 /// Return true if this global value can't be imported.
609 bool notEligibleToImport() const { return Flags.NotEligibleToImport; }
610
611 bool isLive() const { return Flags.Live; }
612
613 void setLive(bool Live) { Flags.Live = Live; }
614
615 void setDSOLocal(bool Local) { Flags.DSOLocal = Local; }
616
617 bool isDSOLocal() const { return Flags.DSOLocal; }
618
619 void setCanAutoHide(bool CanAutoHide) { Flags.CanAutoHide = CanAutoHide; }
620
621 bool canAutoHide() const { return Flags.CanAutoHide; }
622
623 bool shouldImportAsDecl() const {
624 return Flags.ImportType == GlobalValueSummary::ImportKind::Declaration;
625 }
626
627 void setImportKind(ImportKind IK) { Flags.ImportType = IK; }
628
630 return static_cast<ImportKind>(Flags.ImportType);
631 }
632
634 return (GlobalValue::VisibilityTypes)Flags.Visibility;
635 }
637 Flags.Visibility = (unsigned)Vis;
638 }
639
640 /// Flag that this global value cannot be imported.
641 void setNotEligibleToImport() { Flags.NotEligibleToImport = true; }
642
643 /// Return the list of values referenced by this global value definition.
644 ArrayRef<ValueInfo> refs() const { return RefEdgeList; }
645
646 /// If this is an alias summary, returns the summary of the aliased object (a
647 /// global variable or function), otherwise returns itself.
649 const GlobalValueSummary *getBaseObject() const;
650
651 friend class ModuleSummaryIndex;
652};
653
655
656/// Alias summary information.
658 ValueInfo AliaseeValueInfo;
659
660 /// This is the Aliasee in the same module as alias (could get from VI, trades
661 /// memory for time). Note that this pointer may be null (and the value info
662 /// empty) when we have a distributed index where the alias is being imported
663 /// (as a copy of the aliasee), but the aliasee is not.
664 GlobalValueSummary *AliaseeSummary = nullptr;
665
666public:
669
670 /// Check if this is an alias summary.
671 static bool classof(const GlobalValueSummary *GVS) {
672 return GVS->getSummaryKind() == AliasKind;
673 }
674
675 void setAliasee(ValueInfo &AliaseeVI, GlobalValueSummary *Aliasee) {
676 AliaseeValueInfo = AliaseeVI;
677 AliaseeSummary = Aliasee;
678 }
679
680 bool hasAliasee() const {
681 assert(!!AliaseeSummary == (AliaseeValueInfo &&
682 !AliaseeValueInfo.getSummaryList().empty()) &&
683 "Expect to have both aliasee summary and summary list or neither");
684 return !!AliaseeSummary;
685 }
686
688 assert(AliaseeSummary && "Unexpected missing aliasee summary");
689 return *AliaseeSummary;
690 }
691
693 return const_cast<GlobalValueSummary &>(
694 static_cast<const AliasSummary *>(this)->getAliasee());
695 }
697 assert(AliaseeValueInfo && "Unexpected missing aliasee");
698 return AliaseeValueInfo;
699 }
701 assert(AliaseeValueInfo && "Unexpected missing aliasee");
702 return AliaseeValueInfo.getGUID();
703 }
704};
705
707 if (auto *AS = dyn_cast<AliasSummary>(this))
708 return &AS->getAliasee();
709 return this;
710}
711
713 if (auto *AS = dyn_cast<AliasSummary>(this))
714 return &AS->getAliasee();
715 return this;
716}
717
718/// Function summary information to aid decisions and implementation of
719/// importing.
721public:
722 /// <CalleeValueInfo, CalleeInfo> call edge pair.
723 using EdgeTy = std::pair<ValueInfo, CalleeInfo>;
724
725 /// Types for -force-summary-edges-cold debugging option.
726 enum ForceSummaryHotnessType : unsigned {
730 };
731
732 /// An "identifier" for a virtual function. This contains the type identifier
733 /// represented as a GUID and the offset from the address point to the virtual
734 /// function pointer, where "address point" is as defined in the Itanium ABI:
735 /// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-general
736 struct VFuncId {
739 };
740
741 /// A specification for a virtual function call with all constant integer
742 /// arguments. This is used to perform virtual constant propagation on the
743 /// summary.
744 struct ConstVCall {
746 std::vector<uint64_t> Args;
747 };
748
749 /// All type identifier related information. Because these fields are
750 /// relatively uncommon we only allocate space for them if necessary.
751 struct TypeIdInfo {
752 /// List of type identifiers used by this function in llvm.type.test
753 /// intrinsics referenced by something other than an llvm.assume intrinsic,
754 /// represented as GUIDs.
755 std::vector<GlobalValue::GUID> TypeTests;
756
757 /// List of virtual calls made by this function using (respectively)
758 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics that do
759 /// not have all constant integer arguments.
761
762 /// List of virtual calls made by this function using (respectively)
763 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics with
764 /// all constant integer arguments.
765 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
767 };
768
769 /// Flags specific to function summaries.
770 struct FFlags {
771 // Function attribute flags. Used to track if a function accesses memory,
772 // recurses or aliases.
773 unsigned ReadNone : 1;
774 unsigned ReadOnly : 1;
775 unsigned NoRecurse : 1;
776 unsigned ReturnDoesNotAlias : 1;
777
778 // Indicate if the global value cannot be inlined.
779 unsigned NoInline : 1;
780 // Indicate if function should be always inlined.
781 unsigned AlwaysInline : 1;
782 // Indicate if function never raises an exception. Can be modified during
783 // thinlink function attribute propagation
784 unsigned NoUnwind : 1;
785 // Indicate if function contains instructions that mayThrow
786 unsigned MayThrow : 1;
787
788 // If there are calls to unknown targets (e.g. indirect)
789 unsigned HasUnknownCall : 1;
790
791 // Indicate if a function must be an unreachable function.
792 //
793 // This bit is sufficient but not necessary;
794 // if this bit is on, the function must be regarded as unreachable;
795 // if this bit is off, the function might be reachable or unreachable.
796 unsigned MustBeUnreachable : 1;
797
799 this->ReadNone &= RHS.ReadNone;
800 this->ReadOnly &= RHS.ReadOnly;
801 this->NoRecurse &= RHS.NoRecurse;
803 this->NoInline &= RHS.NoInline;
804 this->AlwaysInline &= RHS.AlwaysInline;
805 this->NoUnwind &= RHS.NoUnwind;
806 this->MayThrow &= RHS.MayThrow;
807 this->HasUnknownCall &= RHS.HasUnknownCall;
809 return *this;
810 }
811
812 bool anyFlagSet() {
813 return this->ReadNone | this->ReadOnly | this->NoRecurse |
814 this->ReturnDoesNotAlias | this->NoInline | this->AlwaysInline |
815 this->NoUnwind | this->MayThrow | this->HasUnknownCall |
816 this->MustBeUnreachable;
817 }
818
819 operator std::string() {
820 std::string Output;
821 raw_string_ostream OS(Output);
822 OS << "funcFlags: (";
823 OS << "readNone: " << this->ReadNone;
824 OS << ", readOnly: " << this->ReadOnly;
825 OS << ", noRecurse: " << this->NoRecurse;
826 OS << ", returnDoesNotAlias: " << this->ReturnDoesNotAlias;
827 OS << ", noInline: " << this->NoInline;
828 OS << ", alwaysInline: " << this->AlwaysInline;
829 OS << ", noUnwind: " << this->NoUnwind;
830 OS << ", mayThrow: " << this->MayThrow;
831 OS << ", hasUnknownCall: " << this->HasUnknownCall;
832 OS << ", mustBeUnreachable: " << this->MustBeUnreachable;
833 OS << ")";
834 return Output;
835 }
836 };
837
838 /// Describes the uses of a parameter by the function.
839 struct ParamAccess {
840 static constexpr uint32_t RangeWidth = 64;
841
842 /// Describes the use of a value in a call instruction, specifying the
843 /// call's target, the value's parameter number, and the possible range of
844 /// offsets from the beginning of the value that are passed.
845 struct Call {
848 ConstantRange Offsets{/*BitWidth=*/RangeWidth, /*isFullSet=*/true};
849
850 Call() = default;
853 };
854
856 /// The range contains byte offsets from the parameter pointer which
857 /// accessed by the function. In the per-module summary, it only includes
858 /// accesses made by the function instructions. In the combined summary, it
859 /// also includes accesses by nested function calls.
860 ConstantRange Use{/*BitWidth=*/RangeWidth, /*isFullSet=*/true};
861 /// In the per-module summary, it summarizes the byte offset applied to each
862 /// pointer parameter before passing to each corresponding callee.
863 /// In the combined summary, it's empty and information is propagated by
864 /// inter-procedural analysis and applied to the Use field.
865 std::vector<Call> Calls;
866
867 ParamAccess() = default;
869 : ParamNo(ParamNo), Use(Use) {}
870 };
871
872 /// Create an empty FunctionSummary (with specified call edges).
873 /// Used to represent external nodes and the dummy root node.
874 static FunctionSummary
876 return FunctionSummary(
880 /*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
881 /*CanAutoHide=*/false, GlobalValueSummary::ImportKind::Definition),
883 std::move(Edges), std::vector<GlobalValue::GUID>(),
884 std::vector<FunctionSummary::VFuncId>(),
885 std::vector<FunctionSummary::VFuncId>(),
886 std::vector<FunctionSummary::ConstVCall>(),
887 std::vector<FunctionSummary::ConstVCall>(),
888 std::vector<FunctionSummary::ParamAccess>(),
889 std::vector<CallsiteInfo>(), std::vector<AllocInfo>());
890 }
891
892 /// A dummy node to reference external functions that aren't in the index
894
895private:
896 /// Number of instructions (ignoring debug instructions, e.g.) computed
897 /// during the initial compile step when the summary index is first built.
898 unsigned InstCount;
899
900 /// Function summary specific flags.
901 FFlags FunFlags;
902
903 /// List of <CalleeValueInfo, CalleeInfo> call edge pairs from this function.
904 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
905 /// smaller memory footprint.
906 SmallVector<EdgeTy, 0> CallGraphEdgeList;
907
908 std::unique_ptr<TypeIdInfo> TIdInfo;
909
910 /// Uses for every parameter to this function.
911 using ParamAccessesTy = std::vector<ParamAccess>;
912 std::unique_ptr<ParamAccessesTy> ParamAccesses;
913
914 /// Optional list of memprof callsite metadata summaries. The correspondence
915 /// between the callsite summary and the callsites in the function is implied
916 /// by the order in the vector (and can be validated by comparing the stack
917 /// ids in the CallsiteInfo to those in the instruction callsite metadata).
918 /// As a memory savings optimization, we only create these for the prevailing
919 /// copy of a symbol when creating the combined index during LTO.
920 using CallsitesTy = std::vector<CallsiteInfo>;
921 std::unique_ptr<CallsitesTy> Callsites;
922
923 /// Optional list of allocation memprof metadata summaries. The correspondence
924 /// between the alloc memprof summary and the allocation callsites in the
925 /// function is implied by the order in the vector (and can be validated by
926 /// comparing the stack ids in the AllocInfo to those in the instruction
927 /// memprof metadata).
928 /// As a memory savings optimization, we only create these for the prevailing
929 /// copy of a symbol when creating the combined index during LTO.
930 using AllocsTy = std::vector<AllocInfo>;
931 std::unique_ptr<AllocsTy> Allocs;
932
933public:
934 FunctionSummary(GVFlags Flags, unsigned NumInsts, FFlags FunFlags,
936 SmallVectorImpl<EdgeTy> &&CGEdges,
937 std::vector<GlobalValue::GUID> TypeTests,
938 std::vector<VFuncId> TypeTestAssumeVCalls,
939 std::vector<VFuncId> TypeCheckedLoadVCalls,
940 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
941 std::vector<ConstVCall> TypeCheckedLoadConstVCalls,
942 std::vector<ParamAccess> Params, CallsitesTy CallsiteList,
943 AllocsTy AllocList)
944 : GlobalValueSummary(FunctionKind, Flags, std::move(Refs)),
945 InstCount(NumInsts), FunFlags(FunFlags),
946 CallGraphEdgeList(std::move(CGEdges)) {
947 if (!TypeTests.empty() || !TypeTestAssumeVCalls.empty() ||
948 !TypeCheckedLoadVCalls.empty() || !TypeTestAssumeConstVCalls.empty() ||
949 !TypeCheckedLoadConstVCalls.empty())
950 TIdInfo = std::make_unique<TypeIdInfo>(
951 TypeIdInfo{std::move(TypeTests), std::move(TypeTestAssumeVCalls),
952 std::move(TypeCheckedLoadVCalls),
953 std::move(TypeTestAssumeConstVCalls),
954 std::move(TypeCheckedLoadConstVCalls)});
955 if (!Params.empty())
956 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(Params));
957 if (!CallsiteList.empty())
958 Callsites = std::make_unique<CallsitesTy>(std::move(CallsiteList));
959 if (!AllocList.empty())
960 Allocs = std::make_unique<AllocsTy>(std::move(AllocList));
961 }
962 // Gets the number of readonly and writeonly refs in RefEdgeList
963 std::pair<unsigned, unsigned> specialRefCounts() const;
964
965 /// Check if this is a function summary.
966 static bool classof(const GlobalValueSummary *GVS) {
967 return GVS->getSummaryKind() == FunctionKind;
968 }
969
970 /// Get function summary flags.
971 FFlags fflags() const { return FunFlags; }
972
973 void setNoRecurse() { FunFlags.NoRecurse = true; }
974
975 void setNoUnwind() { FunFlags.NoUnwind = true; }
976
977 /// Get the instruction count recorded for this function.
978 unsigned instCount() const { return InstCount; }
979
980 /// Return the list of <CalleeValueInfo, CalleeInfo> pairs.
981 ArrayRef<EdgeTy> calls() const { return CallGraphEdgeList; }
982
983 SmallVector<EdgeTy, 0> &mutableCalls() { return CallGraphEdgeList; }
984
985 void addCall(EdgeTy E) { CallGraphEdgeList.push_back(E); }
986
987 /// Returns the list of type identifiers used by this function in
988 /// llvm.type.test intrinsics other than by an llvm.assume intrinsic,
989 /// represented as GUIDs.
991 if (TIdInfo)
992 return TIdInfo->TypeTests;
993 return {};
994 }
995
996 /// Returns the list of virtual calls made by this function using
997 /// llvm.assume(llvm.type.test) intrinsics that do not have all constant
998 /// integer arguments.
1000 if (TIdInfo)
1001 return TIdInfo->TypeTestAssumeVCalls;
1002 return {};
1003 }
1004
1005 /// Returns the list of virtual calls made by this function using
1006 /// llvm.type.checked.load intrinsics that do not have all constant integer
1007 /// arguments.
1009 if (TIdInfo)
1010 return TIdInfo->TypeCheckedLoadVCalls;
1011 return {};
1012 }
1013
1014 /// Returns the list of virtual calls made by this function using
1015 /// llvm.assume(llvm.type.test) intrinsics with all constant integer
1016 /// arguments.
1018 if (TIdInfo)
1019 return TIdInfo->TypeTestAssumeConstVCalls;
1020 return {};
1021 }
1022
1023 /// Returns the list of virtual calls made by this function using
1024 /// llvm.type.checked.load intrinsics with all constant integer arguments.
1026 if (TIdInfo)
1027 return TIdInfo->TypeCheckedLoadConstVCalls;
1028 return {};
1029 }
1030
1031 /// Returns the list of known uses of pointer parameters.
1033 if (ParamAccesses)
1034 return *ParamAccesses;
1035 return {};
1036 }
1037
1038 /// Sets the list of known uses of pointer parameters.
1039 void setParamAccesses(std::vector<ParamAccess> NewParams) {
1040 if (NewParams.empty())
1041 ParamAccesses.reset();
1042 else if (ParamAccesses)
1043 *ParamAccesses = std::move(NewParams);
1044 else
1045 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(NewParams));
1046 }
1047
1048 /// Add a type test to the summary. This is used by WholeProgramDevirt if we
1049 /// were unable to devirtualize a checked call.
1051 if (!TIdInfo)
1052 TIdInfo = std::make_unique<TypeIdInfo>();
1053 TIdInfo->TypeTests.push_back(Guid);
1054 }
1055
1056 const TypeIdInfo *getTypeIdInfo() const { return TIdInfo.get(); };
1057
1059 if (Callsites)
1060 return *Callsites;
1061 return {};
1062 }
1063
1064 CallsitesTy &mutableCallsites() {
1065 assert(Callsites);
1066 return *Callsites;
1067 }
1068
1069 void addCallsite(CallsiteInfo &Callsite) {
1070 if (!Callsites)
1071 Callsites = std::make_unique<CallsitesTy>();
1072 Callsites->push_back(Callsite);
1073 }
1074
1076 if (Allocs)
1077 return *Allocs;
1078 return {};
1079 }
1080
1081 AllocsTy &mutableAllocs() {
1082 assert(Allocs);
1083 return *Allocs;
1084 }
1085
1086 friend struct GraphTraits<ValueInfo>;
1087};
1088
1089template <> struct DenseMapInfo<FunctionSummary::VFuncId> {
1090 static FunctionSummary::VFuncId getEmptyKey() { return {0, uint64_t(-1)}; }
1091
1093 return {0, uint64_t(-2)};
1094 }
1095
1097 return L.GUID == R.GUID && L.Offset == R.Offset;
1098 }
1099
1100 static unsigned getHashValue(FunctionSummary::VFuncId I) { return I.GUID; }
1101};
1102
1103template <> struct DenseMapInfo<FunctionSummary::ConstVCall> {
1105 return {{0, uint64_t(-1)}, {}};
1106 }
1107
1109 return {{0, uint64_t(-2)}, {}};
1110 }
1111
1114 return DenseMapInfo<FunctionSummary::VFuncId>::isEqual(L.VFunc, R.VFunc) &&
1115 L.Args == R.Args;
1116 }
1117
1119 return I.VFunc.GUID;
1120 }
1121};
1122
1123/// The ValueInfo and offset for a function within a vtable definition
1124/// initializer array.
1127 : FuncVI(VI), VTableOffset(Offset) {}
1128
1131};
1132/// List of functions referenced by a particular vtable definition.
1133using VTableFuncList = std::vector<VirtFuncOffset>;
1134
1135/// Global variable summary information to aid decisions and
1136/// implementation of importing.
1137///
1138/// Global variable summary has two extra flag, telling if it is
1139/// readonly or writeonly. Both readonly and writeonly variables
1140/// can be optimized in the backed: readonly variables can be
1141/// const-folded, while writeonly vars can be completely eliminated
1142/// together with corresponding stores. We let both things happen
1143/// by means of internalizing such variables after ThinLTO import.
1145private:
1146 /// For vtable definitions this holds the list of functions and
1147 /// their corresponding offsets within the initializer array.
1148 std::unique_ptr<VTableFuncList> VTableFuncs;
1149
1150public:
1151 struct GVarFlags {
1152 GVarFlags(bool ReadOnly, bool WriteOnly, bool Constant,
1154 : MaybeReadOnly(ReadOnly), MaybeWriteOnly(WriteOnly),
1156
1157 // If true indicates that this global variable might be accessed
1158 // purely by non-volatile load instructions. This in turn means
1159 // it can be internalized in source and destination modules during
1160 // thin LTO import because it neither modified nor its address
1161 // is taken.
1162 unsigned MaybeReadOnly : 1;
1163 // If true indicates that variable is possibly only written to, so
1164 // its value isn't loaded and its address isn't taken anywhere.
1165 // False, when 'Constant' attribute is set.
1166 unsigned MaybeWriteOnly : 1;
1167 // Indicates that value is a compile-time constant. Global variable
1168 // can be 'Constant' while not being 'ReadOnly' on several occasions:
1169 // - it is volatile, (e.g mapped device address)
1170 // - its address is taken, meaning that unlike 'ReadOnly' vars we can't
1171 // internalize it.
1172 // Constant variables are always imported thus giving compiler an
1173 // opportunity to make some extra optimizations. Readonly constants
1174 // are also internalized.
1175 unsigned Constant : 1;
1176 // Set from metadata on vtable definitions during the module summary
1177 // analysis.
1178 unsigned VCallVisibility : 2;
1180
1183 : GlobalValueSummary(GlobalVarKind, Flags, std::move(Refs)),
1184 VarFlags(VarFlags) {}
1185
1186 /// Check if this is a global variable summary.
1187 static bool classof(const GlobalValueSummary *GVS) {
1188 return GVS->getSummaryKind() == GlobalVarKind;
1189 }
1190
1191 GVarFlags varflags() const { return VarFlags; }
1192 void setReadOnly(bool RO) { VarFlags.MaybeReadOnly = RO; }
1193 void setWriteOnly(bool WO) { VarFlags.MaybeWriteOnly = WO; }
1194 bool maybeReadOnly() const { return VarFlags.MaybeReadOnly; }
1195 bool maybeWriteOnly() const { return VarFlags.MaybeWriteOnly; }
1196 bool isConstant() const { return VarFlags.Constant; }
1199 }
1202 }
1203
1205 assert(!VTableFuncs);
1206 VTableFuncs = std::make_unique<VTableFuncList>(std::move(Funcs));
1207 }
1208
1210 if (VTableFuncs)
1211 return *VTableFuncs;
1212 return {};
1213 }
1214};
1215
1217 /// Specifies which kind of type check we should emit for this byte array.
1218 /// See http://clang.llvm.org/docs/ControlFlowIntegrityDesign.html for full
1219 /// details on each kind of check; the enumerators are described with
1220 /// reference to that document.
1221 enum Kind {
1222 Unsat, ///< Unsatisfiable type (i.e. no global has this type metadata)
1223 ByteArray, ///< Test a byte array (first example)
1224 Inline, ///< Inlined bit vector ("Short Inline Bit Vectors")
1225 Single, ///< Single element (last example in "Short Inline Bit Vectors")
1226 AllOnes, ///< All-ones bit vector ("Eliminating Bit Vector Checks for
1227 /// All-Ones Bit Vectors")
1228 Unknown, ///< Unknown (analysis not performed, don't lower)
1230
1231 /// Range of size-1 expressed as a bit width. For example, if the size is in
1232 /// range [1,256], this number will be 8. This helps generate the most compact
1233 /// instruction sequences.
1234 unsigned SizeM1BitWidth = 0;
1235
1236 // The following fields are only used if the target does not support the use
1237 // of absolute symbols to store constants. Their meanings are the same as the
1238 // corresponding fields in LowerTypeTestsModule::TypeIdLowering in
1239 // LowerTypeTests.cpp.
1240
1245};
1246
1248 enum Kind {
1249 Indir, ///< Just do a regular virtual call
1250 SingleImpl, ///< Single implementation devirtualization
1251 BranchFunnel, ///< When retpoline mitigation is enabled, use a branch funnel
1252 ///< that is defined in the merged module. Otherwise same as
1253 ///< Indir.
1255
1256 std::string SingleImplName;
1257
1258 struct ByArg {
1259 enum Kind {
1260 Indir, ///< Just do a regular virtual call
1261 UniformRetVal, ///< Uniform return value optimization
1262 UniqueRetVal, ///< Unique return value optimization
1263 VirtualConstProp, ///< Virtual constant propagation
1265
1266 /// Additional information for the resolution:
1267 /// - UniformRetVal: the uniform return value.
1268 /// - UniqueRetVal: the return value associated with the unique vtable (0 or
1269 /// 1).
1271
1272 // The following fields are only used if the target does not support the use
1273 // of absolute symbols to store constants.
1274
1277 };
1278
1279 /// Resolutions for calls with all constant integer arguments (excluding the
1280 /// first argument, "this"), where the key is the argument vector.
1281 std::map<std::vector<uint64_t>, ByArg> ResByArg;
1282};
1283
1286
1287 /// Mapping from byte offset to whole-program devirt resolution for that
1288 /// (typeid, byte offset) pair.
1289 std::map<uint64_t, WholeProgramDevirtResolution> WPDRes;
1290};
1291
1292/// 160 bits SHA1
1293using ModuleHash = std::array<uint32_t, 5>;
1294
1295/// Type used for iterating through the global value summary map.
1296using const_gvsummary_iterator = GlobalValueSummaryMapTy::const_iterator;
1297using gvsummary_iterator = GlobalValueSummaryMapTy::iterator;
1298
1299/// String table to hold/own module path strings, as well as a hash
1300/// of the module. The StringMap makes a copy of and owns inserted strings.
1302
1303/// Map of global value GUID to its summary, used to identify values defined in
1304/// a particular module, and provide efficient access to their summary.
1306
1307/// Map of a module name to the GUIDs and summaries we will import from that
1308/// module.
1310 std::map<std::string, GVSummaryMapTy, std::less<>>;
1311
1312/// A set of global value summary pointers.
1313using GVSummaryPtrSet = std::unordered_set<GlobalValueSummary *>;
1314
1315/// Map of a type GUID to type id string and summary (multimap used
1316/// in case of GUID conflicts).
1318 std::multimap<GlobalValue::GUID, std::pair<StringRef, TypeIdSummary>>;
1319
1320/// The following data structures summarize type metadata information.
1321/// For type metadata overview see https://llvm.org/docs/TypeMetadata.html.
1322/// Each type metadata includes both the type identifier and the offset of
1323/// the address point of the type (the address held by objects of that type
1324/// which may not be the beginning of the virtual table). Vtable definitions
1325/// are decorated with type metadata for the types they are compatible with.
1326///
1327/// Holds information about vtable definitions decorated with type metadata:
1328/// the vtable definition value and its address point offset in a type
1329/// identifier metadata it is decorated (compatible) with.
1333
1336};
1337/// List of vtable definitions decorated by a particular type identifier,
1338/// and their corresponding offsets in that type identifier's metadata.
1339/// Note that each type identifier may be compatible with multiple vtables, due
1340/// to inheritance, which is why this is a vector.
1341using TypeIdCompatibleVtableInfo = std::vector<TypeIdOffsetVtableInfo>;
1342
1343/// Class to hold module path string table and global value map,
1344/// and encapsulate methods for operating on them.
1346private:
1347 /// Map from value name to list of summary instances for values of that
1348 /// name (may be duplicates in the COMDAT case, e.g.).
1349 GlobalValueSummaryMapTy GlobalValueMap;
1350
1351 /// Holds strings for combined index, mapping to the corresponding module ID.
1352 ModulePathStringTableTy ModulePathStringTable;
1353
1354 BumpPtrAllocator TypeIdSaverAlloc;
1355 UniqueStringSaver TypeIdSaver;
1356
1357 /// Mapping from type identifier GUIDs to type identifier and its summary
1358 /// information. Produced by thin link.
1359 TypeIdSummaryMapTy TypeIdMap;
1360
1361 /// Mapping from type identifier to information about vtables decorated
1362 /// with that type identifier's metadata. Produced by per module summary
1363 /// analysis and consumed by thin link. For more information, see description
1364 /// above where TypeIdCompatibleVtableInfo is defined.
1365 std::map<StringRef, TypeIdCompatibleVtableInfo, std::less<>>
1366 TypeIdCompatibleVtableMap;
1367
1368 /// Mapping from original ID to GUID. If original ID can map to multiple
1369 /// GUIDs, it will be mapped to 0.
1371
1372 /// Indicates that summary-based GlobalValue GC has run, and values with
1373 /// GVFlags::Live==false are really dead. Otherwise, all values must be
1374 /// considered live.
1375 bool WithGlobalValueDeadStripping = false;
1376
1377 /// Indicates that summary-based attribute propagation has run and
1378 /// GVarFlags::MaybeReadonly / GVarFlags::MaybeWriteonly are really
1379 /// read/write only.
1380 bool WithAttributePropagation = false;
1381
1382 /// Indicates that summary-based DSOLocal propagation has run and the flag in
1383 /// every summary of a GV is synchronized.
1384 bool WithDSOLocalPropagation = false;
1385
1386 /// Indicates that we have whole program visibility.
1387 bool WithWholeProgramVisibility = false;
1388
1389 /// Indicates that summary-based synthetic entry count propagation has run
1390 bool HasSyntheticEntryCounts = false;
1391
1392 /// Indicates that we linked with allocator supporting hot/cold new operators.
1393 bool WithSupportsHotColdNew = false;
1394
1395 /// Indicates that distributed backend should skip compilation of the
1396 /// module. Flag is suppose to be set by distributed ThinLTO indexing
1397 /// when it detected that the module is not needed during the final
1398 /// linking. As result distributed backend should just output a minimal
1399 /// valid object file.
1400 bool SkipModuleByDistributedBackend = false;
1401
1402 /// If true then we're performing analysis of IR module, or parsing along with
1403 /// the IR from assembly. The value of 'false' means we're reading summary
1404 /// from BC or YAML source. Affects the type of value stored in NameOrGV
1405 /// union.
1406 bool HaveGVs;
1407
1408 // True if the index was created for a module compiled with -fsplit-lto-unit.
1409 bool EnableSplitLTOUnit;
1410
1411 // True if the index was created for a module compiled with -funified-lto
1412 bool UnifiedLTO;
1413
1414 // True if some of the modules were compiled with -fsplit-lto-unit and
1415 // some were not. Set when the combined index is created during the thin link.
1416 bool PartiallySplitLTOUnits = false;
1417
1418 /// True if some of the FunctionSummary contains a ParamAccess.
1419 bool HasParamAccess = false;
1420
1421 std::set<std::string, std::less<>> CfiFunctionDefs;
1422 std::set<std::string, std::less<>> CfiFunctionDecls;
1423
1424 // Used in cases where we want to record the name of a global, but
1425 // don't have the string owned elsewhere (e.g. the Strtab on a module).
1426 BumpPtrAllocator Alloc;
1427 StringSaver Saver;
1428
1429 // The total number of basic blocks in the module in the per-module summary or
1430 // the total number of basic blocks in the LTO unit in the combined index.
1431 // FIXME: Putting this in the distributed ThinLTO index files breaks LTO
1432 // backend caching on any BB change to any linked file. It is currently not
1433 // used except in the case of a SamplePGO partial profile, and should be
1434 // reevaluated/redesigned to allow more effective incremental builds in that
1435 // case.
1436 uint64_t BlockCount = 0;
1437
1438 // List of unique stack ids (hashes). We use a 4B index of the id in the
1439 // stack id lists on the alloc and callsite summaries for memory savings,
1440 // since the number of unique ids is in practice much smaller than the
1441 // number of stack id references in the summaries.
1442 std::vector<uint64_t> StackIds;
1443
1444 // Temporary map while building StackIds list. Clear when index is completely
1445 // built via releaseTemporaryMemory.
1446 DenseMap<uint64_t, unsigned> StackIdToIndex;
1447
1448 // YAML I/O support.
1450
1451 GlobalValueSummaryMapTy::value_type *
1452 getOrInsertValuePtr(GlobalValue::GUID GUID) {
1453 return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo(HaveGVs))
1454 .first;
1455 }
1456
1457public:
1458 // See HaveGVs variable comment.
1459 ModuleSummaryIndex(bool HaveGVs, bool EnableSplitLTOUnit = false,
1460 bool UnifiedLTO = false)
1461 : TypeIdSaver(TypeIdSaverAlloc), HaveGVs(HaveGVs),
1462 EnableSplitLTOUnit(EnableSplitLTOUnit), UnifiedLTO(UnifiedLTO),
1463 Saver(Alloc) {}
1464
1465 // Current version for the module summary in bitcode files.
1466 // The BitcodeSummaryVersion should be bumped whenever we introduce changes
1467 // in the way some record are interpreted, like flags for instance.
1468 // Note that incrementing this may require changes in both BitcodeReader.cpp
1469 // and BitcodeWriter.cpp.
1470 static constexpr uint64_t BitcodeSummaryVersion = 12;
1471
1472 // Regular LTO module name for ASM writer
1473 static constexpr const char *getRegularLTOModuleName() {
1474 return "[Regular LTO]";
1475 }
1476
1477 bool haveGVs() const { return HaveGVs; }
1478
1479 uint64_t getFlags() const;
1480 void setFlags(uint64_t Flags);
1481
1482 uint64_t getBlockCount() const { return BlockCount; }
1483 void addBlockCount(uint64_t C) { BlockCount += C; }
1484 void setBlockCount(uint64_t C) { BlockCount = C; }
1485
1486 gvsummary_iterator begin() { return GlobalValueMap.begin(); }
1487 const_gvsummary_iterator begin() const { return GlobalValueMap.begin(); }
1488 gvsummary_iterator end() { return GlobalValueMap.end(); }
1489 const_gvsummary_iterator end() const { return GlobalValueMap.end(); }
1490 size_t size() const { return GlobalValueMap.size(); }
1491
1492 const std::vector<uint64_t> &stackIds() const { return StackIds; }
1493
1494 unsigned addOrGetStackIdIndex(uint64_t StackId) {
1495 auto Inserted = StackIdToIndex.insert({StackId, StackIds.size()});
1496 if (Inserted.second)
1497 StackIds.push_back(StackId);
1498 return Inserted.first->second;
1499 }
1500
1502 assert(StackIds.size() > Index);
1503 return StackIds[Index];
1504 }
1505
1506 // Facility to release memory from data structures only needed during index
1507 // construction (including while building combined index). Currently this only
1508 // releases the temporary map used while constructing a correspondence between
1509 // stack ids and their index in the StackIds vector. Mostly impactful when
1510 // building a large combined index.
1512 assert(StackIdToIndex.size() == StackIds.size());
1513 StackIdToIndex.clear();
1514 StackIds.shrink_to_fit();
1515 }
1516
1517 /// Convenience function for doing a DFS on a ValueInfo. Marks the function in
1518 /// the FunctionHasParent map.
1520 std::map<ValueInfo, bool> &FunctionHasParent) {
1521 if (!V.getSummaryList().size())
1522 return; // skip external functions that don't have summaries
1523
1524 // Mark discovered if we haven't yet
1525 auto S = FunctionHasParent.emplace(V, false);
1526
1527 // Stop if we've already discovered this node
1528 if (!S.second)
1529 return;
1530
1532 dyn_cast<FunctionSummary>(V.getSummaryList().front().get());
1533 assert(F != nullptr && "Expected FunctionSummary node");
1534
1535 for (const auto &C : F->calls()) {
1536 // Insert node if necessary
1537 auto S = FunctionHasParent.emplace(C.first, true);
1538
1539 // Skip nodes that we're sure have parents
1540 if (!S.second && S.first->second)
1541 continue;
1542
1543 if (S.second)
1544 discoverNodes(C.first, FunctionHasParent);
1545 else
1546 S.first->second = true;
1547 }
1548 }
1549
1550 // Calculate the callgraph root
1552 // Functions that have a parent will be marked in FunctionHasParent pair.
1553 // Once we've marked all functions, the functions in the map that are false
1554 // have no parent (so they're the roots)
1555 std::map<ValueInfo, bool> FunctionHasParent;
1556
1557 for (auto &S : *this) {
1558 // Skip external functions
1559 if (!S.second.SummaryList.size() ||
1560 !isa<FunctionSummary>(S.second.SummaryList.front().get()))
1561 continue;
1562 discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent);
1563 }
1564
1566 // create edges to all roots in the Index
1567 for (auto &P : FunctionHasParent) {
1568 if (P.second)
1569 continue; // skip over non-root nodes
1570 Edges.push_back(std::make_pair(P.first, CalleeInfo{}));
1571 }
1572 return FunctionSummary::makeDummyFunctionSummary(std::move(Edges));
1573 }
1574
1576 return WithGlobalValueDeadStripping;
1577 }
1579 WithGlobalValueDeadStripping = true;
1580 }
1581
1582 bool withAttributePropagation() const { return WithAttributePropagation; }
1584 WithAttributePropagation = true;
1585 }
1586
1587 bool withDSOLocalPropagation() const { return WithDSOLocalPropagation; }
1588 void setWithDSOLocalPropagation() { WithDSOLocalPropagation = true; }
1589
1590 bool withWholeProgramVisibility() const { return WithWholeProgramVisibility; }
1591 void setWithWholeProgramVisibility() { WithWholeProgramVisibility = true; }
1592
1593 bool isReadOnly(const GlobalVarSummary *GVS) const {
1594 return WithAttributePropagation && GVS->maybeReadOnly();
1595 }
1596 bool isWriteOnly(const GlobalVarSummary *GVS) const {
1597 return WithAttributePropagation && GVS->maybeWriteOnly();
1598 }
1599
1600 bool withSupportsHotColdNew() const { return WithSupportsHotColdNew; }
1601 void setWithSupportsHotColdNew() { WithSupportsHotColdNew = true; }
1602
1604 return SkipModuleByDistributedBackend;
1605 }
1607 SkipModuleByDistributedBackend = true;
1608 }
1609
1610 bool enableSplitLTOUnit() const { return EnableSplitLTOUnit; }
1611 void setEnableSplitLTOUnit() { EnableSplitLTOUnit = true; }
1612
1613 bool hasUnifiedLTO() const { return UnifiedLTO; }
1614 void setUnifiedLTO() { UnifiedLTO = true; }
1615
1616 bool partiallySplitLTOUnits() const { return PartiallySplitLTOUnits; }
1617 void setPartiallySplitLTOUnits() { PartiallySplitLTOUnits = true; }
1618
1619 bool hasParamAccess() const { return HasParamAccess; }
1620
1621 bool isGlobalValueLive(const GlobalValueSummary *GVS) const {
1622 return !WithGlobalValueDeadStripping || GVS->isLive();
1623 }
1624 bool isGUIDLive(GlobalValue::GUID GUID) const;
1625
1626 /// Return a ValueInfo for the index value_type (convenient when iterating
1627 /// index).
1628 ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const {
1629 return ValueInfo(HaveGVs, &R);
1630 }
1631
1632 /// Return a ValueInfo for GUID if it exists, otherwise return ValueInfo().
1634 auto I = GlobalValueMap.find(GUID);
1635 return ValueInfo(HaveGVs, I == GlobalValueMap.end() ? nullptr : &*I);
1636 }
1637
1638 /// Return a ValueInfo for \p GUID.
1640 return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID));
1641 }
1642
1643 // Save a string in the Index. Use before passing Name to
1644 // getOrInsertValueInfo when the string isn't owned elsewhere (e.g. on the
1645 // module's Strtab).
1647
1648 /// Return a ValueInfo for \p GUID setting value \p Name.
1650 assert(!HaveGVs);
1651 auto VP = getOrInsertValuePtr(GUID);
1652 VP->second.U.Name = Name;
1653 return ValueInfo(HaveGVs, VP);
1654 }
1655
1656 /// Return a ValueInfo for \p GV and mark it as belonging to GV.
1658 assert(HaveGVs);
1659 auto VP = getOrInsertValuePtr(GV->getGUID());
1660 VP->second.U.GV = GV;
1661 return ValueInfo(HaveGVs, VP);
1662 }
1663
1664 /// Return the GUID for \p OriginalId in the OidGuidMap.
1666 const auto I = OidGuidMap.find(OriginalID);
1667 return I == OidGuidMap.end() ? 0 : I->second;
1668 }
1669
1670 std::set<std::string, std::less<>> &cfiFunctionDefs() {
1671 return CfiFunctionDefs;
1672 }
1673 const std::set<std::string, std::less<>> &cfiFunctionDefs() const {
1674 return CfiFunctionDefs;
1675 }
1676
1677 std::set<std::string, std::less<>> &cfiFunctionDecls() {
1678 return CfiFunctionDecls;
1679 }
1680 const std::set<std::string, std::less<>> &cfiFunctionDecls() const {
1681 return CfiFunctionDecls;
1682 }
1683
1684 /// Add a global value summary for a value.
1686 std::unique_ptr<GlobalValueSummary> Summary) {
1687 addGlobalValueSummary(getOrInsertValueInfo(&GV), std::move(Summary));
1688 }
1689
1690 /// Add a global value summary for a value of the given name.
1692 std::unique_ptr<GlobalValueSummary> Summary) {
1694 std::move(Summary));
1695 }
1696
1697 /// Add a global value summary for the given ValueInfo.
1699 std::unique_ptr<GlobalValueSummary> Summary) {
1700 if (const FunctionSummary *FS = dyn_cast<FunctionSummary>(Summary.get()))
1701 HasParamAccess |= !FS->paramAccesses().empty();
1702 addOriginalName(VI.getGUID(), Summary->getOriginalName());
1703 // Here we have a notionally const VI, but the value it points to is owned
1704 // by the non-const *this.
1705 const_cast<GlobalValueSummaryMapTy::value_type *>(VI.getRef())
1706 ->second.SummaryList.push_back(std::move(Summary));
1707 }
1708
1709 /// Add an original name for the value of the given GUID.
1711 GlobalValue::GUID OrigGUID) {
1712 if (OrigGUID == 0 || ValueGUID == OrigGUID)
1713 return;
1714 if (OidGuidMap.count(OrigGUID) && OidGuidMap[OrigGUID] != ValueGUID)
1715 OidGuidMap[OrigGUID] = 0;
1716 else
1717 OidGuidMap[OrigGUID] = ValueGUID;
1718 }
1719
1720 /// Find the summary for ValueInfo \p VI in module \p ModuleId, or nullptr if
1721 /// not found.
1723 auto SummaryList = VI.getSummaryList();
1724 auto Summary =
1725 llvm::find_if(SummaryList,
1726 [&](const std::unique_ptr<GlobalValueSummary> &Summary) {
1727 return Summary->modulePath() == ModuleId;
1728 });
1729 if (Summary == SummaryList.end())
1730 return nullptr;
1731 return Summary->get();
1732 }
1733
1734 /// Find the summary for global \p GUID in module \p ModuleId, or nullptr if
1735 /// not found.
1737 StringRef ModuleId) const {
1738 auto CalleeInfo = getValueInfo(ValueGUID);
1739 if (!CalleeInfo)
1740 return nullptr; // This function does not have a summary
1741 return findSummaryInModule(CalleeInfo, ModuleId);
1742 }
1743
1744 /// Returns the first GlobalValueSummary for \p GV, asserting that there
1745 /// is only one if \p PerModuleIndex.
1747 bool PerModuleIndex = true) const {
1748 assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
1749 return getGlobalValueSummary(GV.getGUID(), PerModuleIndex);
1750 }
1751
1752 /// Returns the first GlobalValueSummary for \p ValueGUID, asserting that
1753 /// there
1754 /// is only one if \p PerModuleIndex.
1756 bool PerModuleIndex = true) const;
1757
1758 /// Table of modules, containing module hash and id.
1760 return ModulePathStringTable;
1761 }
1762
1763 /// Table of modules, containing hash and id.
1764 StringMap<ModuleHash> &modulePaths() { return ModulePathStringTable; }
1765
1766 /// Get the module SHA1 hash recorded for the given module path.
1767 const ModuleHash &getModuleHash(const StringRef ModPath) const {
1768 auto It = ModulePathStringTable.find(ModPath);
1769 assert(It != ModulePathStringTable.end() && "Module not registered");
1770 return It->second;
1771 }
1772
1773 /// Convenience method for creating a promoted global name
1774 /// for the given value name of a local, and its original module's ID.
1775 static std::string getGlobalNameForLocal(StringRef Name, ModuleHash ModHash) {
1776 std::string Suffix = utostr((uint64_t(ModHash[0]) << 32) |
1777 ModHash[1]); // Take the first 64 bits
1778 return getGlobalNameForLocal(Name, Suffix);
1779 }
1780
1781 static std::string getGlobalNameForLocal(StringRef Name, StringRef Suffix) {
1782 SmallString<256> NewName(Name);
1783 NewName += ".llvm.";
1784 NewName += Suffix;
1785 return std::string(NewName);
1786 }
1787
1788 /// Helper to obtain the unpromoted name for a global value (or the original
1789 /// name if not promoted). Split off the rightmost ".llvm.${hash}" suffix,
1790 /// because it is possible in certain clients (not clang at the moment) for
1791 /// two rounds of ThinLTO optimization and therefore promotion to occur.
1793 std::pair<StringRef, StringRef> Pair = Name.rsplit(".llvm.");
1794 return Pair.first;
1795 }
1796
1798
1799 /// Add a new module with the given \p Hash, mapped to the given \p
1800 /// ModID, and return a reference to the module.
1802 return &*ModulePathStringTable.insert({ModPath, Hash}).first;
1803 }
1804
1805 /// Return module entry for module with the given \p ModPath.
1807 auto It = ModulePathStringTable.find(ModPath);
1808 assert(It != ModulePathStringTable.end() && "Module not registered");
1809 return &*It;
1810 }
1811
1812 /// Return module entry for module with the given \p ModPath.
1813 const ModuleInfo *getModule(StringRef ModPath) const {
1814 auto It = ModulePathStringTable.find(ModPath);
1815 assert(It != ModulePathStringTable.end() && "Module not registered");
1816 return &*It;
1817 }
1818
1819 /// Check if the given Module has any functions available for exporting
1820 /// in the index. We consider any module present in the ModulePathStringTable
1821 /// to have exported functions.
1822 bool hasExportedFunctions(const Module &M) const {
1823 return ModulePathStringTable.count(M.getModuleIdentifier());
1824 }
1825
1826 const TypeIdSummaryMapTy &typeIds() const { return TypeIdMap; }
1827
1828 /// Return an existing or new TypeIdSummary entry for \p TypeId.
1829 /// This accessor can mutate the map and therefore should not be used in
1830 /// the ThinLTO backends.
1832 auto TidIter = TypeIdMap.equal_range(GlobalValue::getGUID(TypeId));
1833 for (auto &[GUID, TypeIdPair] : make_range(TidIter))
1834 if (TypeIdPair.first == TypeId)
1835 return TypeIdPair.second;
1836 auto It = TypeIdMap.insert({GlobalValue::getGUID(TypeId),
1837 {TypeIdSaver.save(TypeId), TypeIdSummary()}});
1838 return It->second.second;
1839 }
1840
1841 /// This returns either a pointer to the type id summary (if present in the
1842 /// summary map) or null (if not present). This may be used when importing.
1844 auto TidIter = TypeIdMap.equal_range(GlobalValue::getGUID(TypeId));
1845 for (const auto &[GUID, TypeIdPair] : make_range(TidIter))
1846 if (TypeIdPair.first == TypeId)
1847 return &TypeIdPair.second;
1848 return nullptr;
1849 }
1850
1852 return const_cast<TypeIdSummary *>(
1853 static_cast<const ModuleSummaryIndex *>(this)->getTypeIdSummary(
1854 TypeId));
1855 }
1856
1857 const auto &typeIdCompatibleVtableMap() const {
1858 return TypeIdCompatibleVtableMap;
1859 }
1860
1861 /// Return an existing or new TypeIdCompatibleVtableMap entry for \p TypeId.
1862 /// This accessor can mutate the map and therefore should not be used in
1863 /// the ThinLTO backends.
1866 return TypeIdCompatibleVtableMap[TypeIdSaver.save(TypeId)];
1867 }
1868
1869 /// For the given \p TypeId, this returns the TypeIdCompatibleVtableMap
1870 /// entry if present in the summary map. This may be used when importing.
1871 std::optional<TypeIdCompatibleVtableInfo>
1873 auto I = TypeIdCompatibleVtableMap.find(TypeId);
1874 if (I == TypeIdCompatibleVtableMap.end())
1875 return std::nullopt;
1876 return I->second;
1877 }
1878
1879 /// Collect for the given module the list of functions it defines
1880 /// (GUID -> Summary).
1882 GVSummaryMapTy &GVSummaryMap) const;
1883
1884 /// Collect for each module the list of Summaries it defines (GUID ->
1885 /// Summary).
1886 template <class Map>
1887 void
1888 collectDefinedGVSummariesPerModule(Map &ModuleToDefinedGVSummaries) const {
1889 for (const auto &GlobalList : *this) {
1890 auto GUID = GlobalList.first;
1891 for (const auto &Summary : GlobalList.second.SummaryList) {
1892 ModuleToDefinedGVSummaries[Summary->modulePath()][GUID] = Summary.get();
1893 }
1894 }
1895 }
1896
1897 /// Print to an output stream.
1898 void print(raw_ostream &OS, bool IsForDebug = false) const;
1899
1900 /// Dump to stderr (for debugging).
1901 void dump() const;
1902
1903 /// Export summary to dot file for GraphViz.
1904 void
1906 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) const;
1907
1908 /// Print out strongly connected components for debugging.
1909 void dumpSCCs(raw_ostream &OS);
1910
1911 /// Do the access attribute and DSOLocal propagation in combined index.
1913
1914 /// Checks if we can import global variable from another module.
1915 bool canImportGlobalVar(const GlobalValueSummary *S, bool AnalyzeRefs) const;
1916
1917 /// Same as above but checks whether the global var is importable as a
1918 /// declaration.
1919 bool canImportGlobalVar(const GlobalValueSummary *S, bool AnalyzeRefs,
1920 bool &CanImportDecl) const;
1921};
1922
1923/// GraphTraits definition to build SCC for the index
1924template <> struct GraphTraits<ValueInfo> {
1927
1929 return P.first;
1930 }
1933 decltype(&valueInfoFromEdge)>;
1934
1937
1938 static NodeRef getEntryNode(ValueInfo V) { return V; }
1939
1941 if (!N.getSummaryList().size()) // handle external function
1942 return ChildIteratorType(
1943 FunctionSummary::ExternalNode.CallGraphEdgeList.begin(),
1944 &valueInfoFromEdge);
1946 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
1947 return ChildIteratorType(F->CallGraphEdgeList.begin(), &valueInfoFromEdge);
1948 }
1949
1951 if (!N.getSummaryList().size()) // handle external function
1952 return ChildIteratorType(
1953 FunctionSummary::ExternalNode.CallGraphEdgeList.end(),
1954 &valueInfoFromEdge);
1956 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
1957 return ChildIteratorType(F->CallGraphEdgeList.end(), &valueInfoFromEdge);
1958 }
1959
1961 if (!N.getSummaryList().size()) // handle external function
1962 return FunctionSummary::ExternalNode.CallGraphEdgeList.begin();
1963
1965 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
1966 return F->CallGraphEdgeList.begin();
1967 }
1968
1970 if (!N.getSummaryList().size()) // handle external function
1971 return FunctionSummary::ExternalNode.CallGraphEdgeList.end();
1972
1974 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
1975 return F->CallGraphEdgeList.end();
1976 }
1977
1978 static NodeRef edge_dest(EdgeRef E) { return E.first; }
1979};
1980
1981template <>
1984 std::unique_ptr<GlobalValueSummary> Root =
1985 std::make_unique<FunctionSummary>(I->calculateCallGraphRoot());
1986 GlobalValueSummaryInfo G(I->haveGVs());
1987 G.SummaryList.push_back(std::move(Root));
1988 static auto P =
1989 GlobalValueSummaryMapTy::value_type(GlobalValue::GUID(0), std::move(G));
1990 return ValueInfo(I->haveGVs(), &P);
1991 }
1992};
1993} // end namespace llvm
1994
1995#endif // LLVM_IR_MODULESUMMARYINDEX_H
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
This file defines the StringMap class.
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
DXIL Finalize Linkage
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is Live
This file defines the DenseMap class.
std::string Name
uint32_t Index
static const char * PreservedSymbols[]
Definition: IRSymtab.cpp:49
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
AllocType
#define P(N)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the SmallString class.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
Value * RHS
Alias summary information.
GlobalValue::GUID getAliaseeGUID() const
const GlobalValueSummary & getAliasee() const
ValueInfo getAliaseeVI() const
static bool classof(const GlobalValueSummary *GVS)
Check if this is an alias summary.
AliasSummary(GVFlags Flags)
GlobalValueSummary & getAliasee()
void setAliasee(ValueInfo &AliaseeVI, GlobalValueSummary *Aliasee)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
This class represents a range of values.
Definition: ConstantRange.h:47
This is an important base class in LLVM.
Definition: Constant.h:42
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:156
unsigned size() const
Definition: DenseMap.h:99
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:152
iterator end()
Definition: DenseMap.h:84
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition: DenseMap.h:211
Implements a dense probed hash-table based set.
Definition: DenseSet.h:278
Function summary information to aid decisions and implementation of importing.
static FunctionSummary ExternalNode
A dummy node to reference external functions that aren't in the index.
void addCallsite(CallsiteInfo &Callsite)
static FunctionSummary makeDummyFunctionSummary(SmallVectorImpl< FunctionSummary::EdgeTy > &&Edges)
Create an empty FunctionSummary (with specified call edges).
FunctionSummary(GVFlags Flags, unsigned NumInsts, FFlags FunFlags, SmallVectorImpl< ValueInfo > &&Refs, SmallVectorImpl< EdgeTy > &&CGEdges, std::vector< GlobalValue::GUID > TypeTests, std::vector< VFuncId > TypeTestAssumeVCalls, std::vector< VFuncId > TypeCheckedLoadVCalls, std::vector< ConstVCall > TypeTestAssumeConstVCalls, std::vector< ConstVCall > TypeCheckedLoadConstVCalls, std::vector< ParamAccess > Params, CallsitesTy CallsiteList, AllocsTy AllocList)
ArrayRef< VFuncId > type_test_assume_vcalls() const
Returns the list of virtual calls made by this function using llvm.assume(llvm.type....
ArrayRef< ConstVCall > type_test_assume_const_vcalls() const
Returns the list of virtual calls made by this function using llvm.assume(llvm.type....
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
std::pair< unsigned, unsigned > specialRefCounts() const
SmallVector< EdgeTy, 0 > & mutableCalls()
ArrayRef< AllocInfo > allocs() const
ArrayRef< CallsiteInfo > callsites() const
void addTypeTest(GlobalValue::GUID Guid)
Add a type test to the summary.
ArrayRef< VFuncId > type_checked_load_vcalls() const
Returns the list of virtual calls made by this function using llvm.type.checked.load intrinsics that ...
void setParamAccesses(std::vector< ParamAccess > NewParams)
Sets the list of known uses of pointer parameters.
unsigned instCount() const
Get the instruction count recorded for this function.
const TypeIdInfo * getTypeIdInfo() const
ArrayRef< ConstVCall > type_checked_load_const_vcalls() const
Returns the list of virtual calls made by this function using llvm.type.checked.load intrinsics with ...
ArrayRef< EdgeTy > calls() const
Return the list of <CalleeValueInfo, CalleeInfo> pairs.
ArrayRef< ParamAccess > paramAccesses() const
Returns the list of known uses of pointer parameters.
CallsitesTy & mutableCallsites()
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
FFlags fflags() const
Get function summary flags.
ArrayRef< GlobalValue::GUID > type_tests() const
Returns the list of type identifiers used by this function in llvm.type.test intrinsics other than by...
static bool classof(const GlobalValueSummary *GVS)
Check if this is a function summary.
Function and variable summary information to aid decisions and implementation of importing.
SummaryKind
Sububclass discriminator (for dyn_cast<> et al.)
GVFlags flags() const
Get the flags for this GlobalValue (see struct GVFlags).
StringRef modulePath() const
Get the path to the module containing this function.
GlobalValueSummary * getBaseObject()
If this is an alias summary, returns the summary of the aliased object (a global variable or function...
SummaryKind getSummaryKind() const
Which kind of summary subclass this is.
GlobalValue::GUID getOriginalName() const
Returns the hash of the original name, it is identical to the GUID for externally visible symbols,...
GlobalValue::VisibilityTypes getVisibility() const
ArrayRef< ValueInfo > refs() const
Return the list of values referenced by this global value definition.
void setLinkage(GlobalValue::LinkageTypes Linkage)
Sets the linkage to the value determined by global summary-based optimization.
void setVisibility(GlobalValue::VisibilityTypes Vis)
virtual ~GlobalValueSummary()=default
GlobalValueSummary::ImportKind importType() const
void setModulePath(StringRef ModPath)
Set the path to the module containing this function, for use in the combined index.
void setNotEligibleToImport()
Flag that this global value cannot be imported.
void setCanAutoHide(bool CanAutoHide)
GlobalValueSummary(SummaryKind K, GVFlags Flags, SmallVectorImpl< ValueInfo > &&Refs)
GlobalValue::LinkageTypes linkage() const
Return linkage type recorded for this global value.
bool notEligibleToImport() const
Return true if this global value can't be imported.
void setImportKind(ImportKind IK)
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static GUID getGUID(StringRef GlobalName)
Return a 64-bit global unique ID constructed from global value name (i.e.
Definition: Globals.cpp:75
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
Definition: GlobalValue.h:595
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition: GlobalValue.h:66
@ DefaultVisibility
The GV is visible.
Definition: GlobalValue.h:67
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition: GlobalValue.h:51
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition: GlobalValue.h:53
Global variable summary information to aid decisions and implementation of importing.
void setVCallVisibility(GlobalObject::VCallVisibility Vis)
struct llvm::GlobalVarSummary::GVarFlags VarFlags
GVarFlags varflags() const
ArrayRef< VirtFuncOffset > vTableFuncs() const
GlobalVarSummary(GVFlags Flags, GVarFlags VarFlags, SmallVectorImpl< ValueInfo > &&Refs)
GlobalObject::VCallVisibility getVCallVisibility() const
static bool classof(const GlobalValueSummary *GVS)
Check if this is a global variable summary.
void setVTableFuncs(VTableFuncList Funcs)
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
std::optional< TypeIdCompatibleVtableInfo > getTypeIdCompatibleVtableSummary(StringRef TypeId) const
For the given TypeId, this returns the TypeIdCompatibleVtableMap entry if present in the summary map.
gvsummary_iterator end()
void addGlobalValueSummary(ValueInfo VI, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for the given ValueInfo.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
bool withGlobalValueDeadStripping() const
static void discoverNodes(ValueInfo V, std::map< ValueInfo, bool > &FunctionHasParent)
Convenience function for doing a DFS on a ValueInfo.
StringRef saveString(StringRef String)
const TypeIdSummaryMapTy & typeIds() const
static StringRef getOriginalNameBeforePromote(StringRef Name)
Helper to obtain the unpromoted name for a global value (or the original name if not promoted).
const TypeIdSummary * getTypeIdSummary(StringRef TypeId) const
This returns either a pointer to the type id summary (if present in the summary map) or null (if not ...
bool isGUIDLive(GlobalValue::GUID GUID) const
gvsummary_iterator begin()
const_gvsummary_iterator end() const
bool isReadOnly(const GlobalVarSummary *GVS) const
void setFlags(uint64_t Flags)
const_gvsummary_iterator begin() const
bool isWriteOnly(const GlobalVarSummary *GVS) const
const std::vector< uint64_t > & stackIds() const
GlobalValueSummary * findSummaryInModule(GlobalValue::GUID ValueGUID, StringRef ModuleId) const
Find the summary for global GUID in module ModuleId, or nullptr if not found.
ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const
Return a ValueInfo for the index value_type (convenient when iterating index).
const ModuleHash & getModuleHash(const StringRef ModPath) const
Get the module SHA1 hash recorded for the given module path.
static constexpr const char * getRegularLTOModuleName()
void addGlobalValueSummary(StringRef ValueName, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value of the given name.
ModuleSummaryIndex(bool HaveGVs, bool EnableSplitLTOUnit=false, bool UnifiedLTO=false)
void collectDefinedFunctionsForModule(StringRef ModulePath, GVSummaryMapTy &GVSummaryMap) const
Collect for the given module the list of functions it defines (GUID -> Summary).
const std::set< std::string, std::less<> > & cfiFunctionDecls() const
const auto & typeIdCompatibleVtableMap() const
void dumpSCCs(raw_ostream &OS)
Print out strongly connected components for debugging.
bool isGlobalValueLive(const GlobalValueSummary *GVS) const
const ModuleInfo * getModule(StringRef ModPath) const
Return module entry for module with the given ModPath.
void propagateAttributes(const DenseSet< GlobalValue::GUID > &PreservedSymbols)
Do the access attribute and DSOLocal propagation in combined index.
const std::set< std::string, std::less<> > & cfiFunctionDefs() const
const StringMap< ModuleHash > & modulePaths() const
Table of modules, containing module hash and id.
void dump() const
Dump to stderr (for debugging).
Definition: AsmWriter.cpp:5356
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void collectDefinedGVSummariesPerModule(Map &ModuleToDefinedGVSummaries) const
Collect for each module the list of Summaries it defines (GUID -> Summary).
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
bool hasExportedFunctions(const Module &M) const
Check if the given Module has any functions available for exporting in the index.
std::set< std::string, std::less<> > & cfiFunctionDefs()
static std::string getGlobalNameForLocal(StringRef Name, ModuleHash ModHash)
Convenience method for creating a promoted global name for the given value name of a local,...
static constexpr uint64_t BitcodeSummaryVersion
void exportToDot(raw_ostream &OS, const DenseSet< GlobalValue::GUID > &GUIDPreservedSymbols) const
Export summary to dot file for GraphViz.
uint64_t getStackIdAtIndex(unsigned Index) const
StringMap< ModuleHash > & modulePaths()
Table of modules, containing hash and id.
void print(raw_ostream &OS, bool IsForDebug=false) const
Print to an output stream.
Definition: AsmWriter.cpp:5283
bool skipModuleByDistributedBackend() const
ValueInfo getOrInsertValueInfo(const GlobalValue *GV)
Return a ValueInfo for GV and mark it as belonging to GV.
std::set< std::string, std::less<> > & cfiFunctionDecls()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
ValueInfo getValueInfo(GlobalValue::GUID GUID) const
Return a ValueInfo for GUID if it exists, otherwise return ValueInfo().
unsigned addOrGetStackIdIndex(uint64_t StackId)
GlobalValue::GUID getGUIDFromOriginalID(GlobalValue::GUID OriginalID) const
Return the GUID for OriginalId in the OidGuidMap.
GlobalValueSummary * getGlobalValueSummary(const GlobalValue &GV, bool PerModuleIndex=true) const
Returns the first GlobalValueSummary for GV, asserting that there is only one if PerModuleIndex.
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID, StringRef Name)
Return a ValueInfo for GUID setting value Name.
bool canImportGlobalVar(const GlobalValueSummary *S, bool AnalyzeRefs) const
Checks if we can import global variable from another module.
static std::string getGlobalNameForLocal(StringRef Name, StringRef Suffix)
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
FunctionSummary calculateCallGraphRoot()
TypeIdSummary * getTypeIdSummary(StringRef TypeId)
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
PointerIntPair - This class implements a pair of a pointer and small integer.
void setPointer(PointerTy PtrVal) &
IntType getInt() const
void setInt(IntType IntVal) &
PointerTy getPointer() const
Simple representation of a scaled number.
Definition: ScaledNumber.h:493
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
iterator end()
Definition: StringMap.h:220
iterator find(StringRef Key)
Definition: StringMap.h:233
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition: StringMap.h:276
bool insert(MapEntryTy *KeyValue)
insert - Insert the specified key/value pair into the map.
Definition: StringMap.h:308
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition: StringSaver.h:21
StringRef save(const char *S)
Definition: StringSaver.h:30
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition: StringSaver.h:44
StringRef save(const char *S)
Definition: StringSaver.h:52
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
bool hasName() const
Definition: Value.h:261
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition: CallingConv.h:47
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
GlobalValueSummaryMapTy::iterator gvsummary_iterator
@ Offset
Definition: DWP.cpp:480
bool operator<(int64_t V1, const APSInt &V2)
Definition: APSInt.h:361
const char * getHotnessName(CalleeInfo::HotnessType HT)
bool operator!=(uint64_t V1, const APInt &V2)
Definition: APInt.h:2082
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
@ None
Definition: CodeGenData.h:106
std::vector< std::unique_ptr< GlobalValueSummary > > GlobalValueSummaryList
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
GlobalValueSummaryMapTy::const_iterator const_gvsummary_iterator
Type used for iterating through the global value summary map.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:303
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
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:1873
std::multimap< GlobalValue::GUID, std::pair< StringRef, TypeIdSummary > > TypeIdSummaryMapTy
Map of a type GUID to type id string and summary (multimap used in case of GUID conflicts).
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1766
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
std::map< GlobalValue::GUID, GlobalValueSummaryInfo > GlobalValueSummaryMapTy
Map from global value GUID to corresponding summary structures.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
Summary of memprof metadata on allocations.
AllocInfo(std::vector< MIBInfo > MIBs)
AllocInfo(SmallVector< uint8_t > Versions, std::vector< MIBInfo > MIBs)
std::vector< std::vector< ContextTotalSize > > ContextSizeInfos
SmallVector< uint8_t > Versions
std::vector< MIBInfo > MIBs
Class to accumulate and hold information about a callee.
static constexpr uint64_t MaxRelBlockFreq
bool hasTailCall() const
void updateHotness(const HotnessType OtherHotness)
CalleeInfo(HotnessType Hotness, bool HasTC, uint64_t RelBF)
HotnessType getHotness() const
static constexpr int32_t ScaleShift
void setHasTailCall(const bool HasTC)
void updateRelBlockFreq(uint64_t BlockFreq, uint64_t EntryFreq)
Update RelBlockFreq from BlockFreq and EntryFreq.
static constexpr unsigned RelBlockFreqBits
The value stored in RelBlockFreq has to be interpreted as the digits of a scaled number with a scale ...
Summary of memprof callsite metadata.
SmallVector< unsigned > StackIdIndices
SmallVector< unsigned > Clones
CallsiteInfo(ValueInfo Callee, SmallVector< unsigned > StackIdIndices)
CallsiteInfo(ValueInfo Callee, SmallVector< unsigned > Clones, SmallVector< unsigned > StackIdIndices)
static FunctionSummary::ConstVCall getEmptyKey()
static FunctionSummary::ConstVCall getTombstoneKey()
static unsigned getHashValue(FunctionSummary::ConstVCall I)
static bool isEqual(FunctionSummary::ConstVCall L, FunctionSummary::ConstVCall R)
static FunctionSummary::VFuncId getEmptyKey()
static bool isEqual(FunctionSummary::VFuncId L, FunctionSummary::VFuncId R)
static FunctionSummary::VFuncId getTombstoneKey()
static unsigned getHashValue(FunctionSummary::VFuncId I)
static bool isEqual(ValueInfo L, ValueInfo R)
static bool isSpecialKey(ValueInfo V)
static unsigned getHashValue(ValueInfo I)
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
A specification for a virtual function call with all constant integer arguments.
Flags specific to function summaries.
FFlags & operator&=(const FFlags &RHS)
Describes the use of a value in a call instruction, specifying the call's target, the value's paramet...
Call(uint64_t ParamNo, ValueInfo Callee, const ConstantRange &Offsets)
Describes the uses of a parameter by the function.
ParamAccess(uint64_t ParamNo, const ConstantRange &Use)
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
static constexpr uint32_t RangeWidth
All type identifier related information.
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
An "identifier" for a virtual function.
GlobalValueSummaryList SummaryList
List of global value summary structures for a particular value held in the GlobalValueMap.
union llvm::GlobalValueSummaryInfo::NameOrGV U
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
GVFlags(GlobalValue::LinkageTypes Linkage, GlobalValue::VisibilityTypes Visibility, bool NotEligibleToImport, bool Live, bool IsLocal, bool CanAutoHide, ImportKind ImportType)
Convenience Constructors.
unsigned DSOLocal
Indicates that the linker resolved the symbol to a definition from within the same linkage unit.
unsigned CanAutoHide
In the per-module summary, indicates that the global value is linkonce_odr and global unnamed addr (s...
unsigned ImportType
This field is written by the ThinLTO indexing step to postlink combined summary.
unsigned NotEligibleToImport
Indicate if the global value cannot be imported (e.g.
unsigned Linkage
The linkage type of the associated global value.
unsigned Visibility
Indicates the visibility.
unsigned Live
In per-module summary, indicate that the global value must be considered a live root for index-based ...
GVarFlags(bool ReadOnly, bool WriteOnly, bool Constant, GlobalObject::VCallVisibility Vis)
static NodeRef getEntryNode(ModuleSummaryIndex *I)
static NodeRef valueInfoFromEdge(FunctionSummary::EdgeTy &P)
static ChildIteratorType child_begin(NodeRef N)
static ChildEdgeIteratorType child_edge_begin(NodeRef N)
static NodeRef edge_dest(EdgeRef E)
static NodeRef getEntryNode(ValueInfo V)
static ChildIteratorType child_end(NodeRef N)
static ChildEdgeIteratorType child_edge_end(NodeRef N)
FunctionSummary::EdgeTy & EdgeRef
Summary of a single MIB in a memprof metadata on allocations.
MIBInfo(AllocationType AllocType, SmallVector< unsigned > StackIdIndices)
AllocationType AllocType
SmallVector< unsigned > StackIdIndices
The following data structures summarize type metadata information.
TypeIdOffsetVtableInfo(uint64_t Offset, ValueInfo VI)
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
TypeTestResolution TTRes
Kind
Specifies which kind of type check we should emit for this byte array.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
Struct that holds a reference to a particular GUID in a global value summary.
PointerIntPair< const GlobalValueSummaryMapTy::value_type *, 3, int > RefAndFlags
GlobalValue::VisibilityTypes getELFVisibility() const
Returns the most constraining visibility among summaries.
bool isValidAccessSpecifier() const
const GlobalValueSummaryMapTy::value_type * getRef() const
ArrayRef< std::unique_ptr< GlobalValueSummary > > getSummaryList() const
StringRef name() const
bool isWriteOnly() const
const GlobalValue * getValue() const
bool hasName() const
ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R)
bool isReadOnly() const
bool canAutoHide() const
Checks if all copies are eligible for auto-hiding (have flag set).
unsigned getAccessSpecifier() const
ValueInfo()=default
bool isDSOLocal(bool WithDSOLocalPropagation=false) const
Checks if all summaries are DSO local (have the flag set).
GlobalValue::GUID getGUID() const
bool haveGVs() const
The ValueInfo and offset for a function within a vtable definition initializer array.
VirtFuncOffset(ValueInfo VI, uint64_t Offset)
@ UniformRetVal
Uniform return value optimization.
@ VirtualConstProp
Virtual constant propagation.
@ UniqueRetVal
Unique return value optimization.
@ Indir
Just do a regular virtual call.
uint64_t Info
Additional information for the resolution:
enum llvm::WholeProgramDevirtResolution::ByArg::Kind TheKind
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
@ SingleImpl
Single implementation devirtualization.
@ Indir
Just do a regular virtual call.
@ BranchFunnel
When retpoline mitigation is enabled, use a branch funnel that is defined in the merged module.
const GlobalValue * GV
The GlobalValue corresponding to this summary.
StringRef Name
Summary string representation.