LLVM 23.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"
28#include "llvm/IR/GlobalValue.h"
29#include "llvm/IR/Module.h"
36#include <algorithm>
37#include <array>
38#include <cassert>
39#include <cstddef>
40#include <cstdint>
41#include <map>
42#include <memory>
43#include <optional>
44#include <set>
45#include <string>
46#include <unordered_set>
47#include <utility>
48#include <vector>
49
50namespace llvm {
51
52template <class GraphType> struct GraphTraits;
53
54namespace yaml {
55
56template <typename T> struct MappingTraits;
57
58} // end namespace yaml
59
60/// Class to accumulate and hold information about a callee.
61struct CalleeInfo {
62 enum class HotnessType : uint8_t {
64 Cold = 1,
65 None = 2,
66 Hot = 3,
68 };
69
70 // The size of the bit-field might need to be adjusted if more values are
71 // added to HotnessType enum.
73
74 // True if at least one of the calls to the callee is a tail call.
77
81 explicit CalleeInfo(HotnessType Hotness, bool HasTC)
82 : Hotness(static_cast<uint32_t>(Hotness)), HasTailCall(HasTC) {}
83
84 void updateHotness(const HotnessType OtherHotness) {
85 Hotness = std::max(Hotness, static_cast<uint32_t>(OtherHotness));
86 }
87
88 bool hasTailCall() const { return HasTailCall; }
89
90 void setHasTailCall(const bool HasTC) { HasTailCall = HasTC; }
91
93};
94
96 switch (HT) {
98 return "unknown";
100 return "cold";
102 return "none";
104 return "hot";
106 return "critical";
107 }
108 llvm_unreachable("invalid hotness");
109}
110
111class GlobalValueSummary;
112
113using GlobalValueSummaryList = std::vector<std::unique_ptr<GlobalValueSummary>>;
114
115struct alignas(8) GlobalValueSummaryInfo {
116 union NameOrGV {
117 NameOrGV(bool HaveGVs) {
118 if (HaveGVs)
119 GV = nullptr;
120 else
121 Name = "";
122 }
123
124 /// The GlobalValue corresponding to this summary. This is only used in
125 /// per-module summaries and when the IR is available. E.g. when module
126 /// analysis is being run, or when parsing both the IR and the summary
127 /// from assembly.
129
130 /// Summary string representation. This StringRef points to BC module
131 /// string table and is valid until module data is stored in memory.
132 /// This is guaranteed to happen until runThinLTOBackend function is
133 /// called, so it is safe to use this field during thin link. This field
134 /// is only valid if summary index was loaded from BC file.
136 } U;
137
138 inline GlobalValueSummaryInfo(bool HaveGVs);
139
140 /// Access a read-only list of global value summary structures for a
141 /// particular value held in the GlobalValueMap.
143 return SummaryList;
144 }
145
146 /// Add a summary corresponding to a global value definition in a module with
147 /// the corresponding GUID.
148 inline void addSummary(std::unique_ptr<GlobalValueSummary> Summary);
149
150 /// Verify that the HasLocal flag is consistent with the SummaryList. Should
151 /// only be called prior to index-based internalization and promotion.
152 inline void verifyLocal() const;
153
154 bool hasLocal() const { return HasLocal; }
155
156private:
157 /// List of global value summary structures for a particular value held
158 /// in the GlobalValueMap. Requires a vector in the case of multiple
159 /// COMDAT values of the same name, weak symbols, locals of the same name when
160 /// compiling without sufficient distinguishing path, or (theoretically) hash
161 /// collisions. Each summary is from a different module.
162 GlobalValueSummaryList SummaryList;
163
164 /// True if the SummaryList contains at least one summary with local linkage.
165 /// In most cases there should be only one, unless translation units with
166 /// same-named locals were compiled without distinguishing path. And generally
167 /// there should not be a mix of local and non-local summaries, because the
168 /// GUID for a local is computed with the path prepended and a ';' delimiter.
169 /// In extremely rare cases there could be a GUID hash collision. Having the
170 /// flag saves having to walk through all summaries to prove the existence or
171 /// not of any locals.
172 /// NOTE: this flag is set when the index is built. It does not reflect
173 /// index-based internalization and promotion decisions. Generally most
174 /// index-based analysis occurs before then, but any users should assert that
175 /// the withInternalizeAndPromote() flag is not set on the index.
176 /// TODO: Replace checks in various ThinLTO analyses that loop through all
177 /// summaries to handle the local case with a check of the flag.
178 bool HasLocal : 1;
179};
180
181/// Map from global value GUID to corresponding summary structures. Use a
182/// std::map rather than a DenseMap so that pointers to the map's value_type
183/// (which are used by ValueInfo) are not invalidated by insertion. Also it will
184/// likely incur less overhead, as the value type is not very small and the size
185/// of the map is unknown, resulting in inefficiencies due to repeated
186/// insertions and resizing.
188 std::map<GlobalValue::GUID, GlobalValueSummaryInfo>;
189
190/// Struct that holds a reference to a particular GUID in a global value
191/// summary.
192struct ValueInfo {
193 enum Flags { HaveGV = 1, ReadOnly = 2, WriteOnly = 4 };
196
197 ValueInfo() = default;
198 ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R) {
199 RefAndFlags.setPointer(R);
200 RefAndFlags.setInt(HaveGVs);
201 }
202
203 explicit operator bool() const { return getRef(); }
204
205 GlobalValue::GUID getGUID() const { return getRef()->first; }
206 const GlobalValue *getValue() const {
207 assert(haveGVs());
208 return getRef()->second.U.GV;
209 }
210
212 return getRef()->second.getSummaryList();
213 }
214
215 void verifyLocal() const { getRef()->second.verifyLocal(); }
216
217 bool hasLocal() const { return getRef()->second.hasLocal(); }
218
219 // Even if the index is built with GVs available, we may not have one for
220 // summary entries synthesized for profiled indirect call targets.
221 bool hasName() const { return !haveGVs() || getValue(); }
222
223 StringRef name() const {
224 assert(!haveGVs() || getRef()->second.U.GV);
225 return haveGVs() ? getRef()->second.U.GV->getName()
226 : getRef()->second.U.Name;
227 }
228
229 bool haveGVs() const { return RefAndFlags.getInt() & HaveGV; }
230 bool isReadOnly() const {
232 return RefAndFlags.getInt() & ReadOnly;
233 }
234 bool isWriteOnly() const {
236 return RefAndFlags.getInt() & WriteOnly;
237 }
238 unsigned getAccessSpecifier() const {
240 return RefAndFlags.getInt() & (ReadOnly | WriteOnly);
241 }
243 unsigned BadAccessMask = ReadOnly | WriteOnly;
244 return (RefAndFlags.getInt() & BadAccessMask) != BadAccessMask;
245 }
246 void setReadOnly() {
247 // We expect ro/wo attribute to set only once during
248 // ValueInfo lifetime.
250 RefAndFlags.setInt(RefAndFlags.getInt() | ReadOnly);
251 }
254 RefAndFlags.setInt(RefAndFlags.getInt() | WriteOnly);
255 }
256
257 const GlobalValueSummaryMapTy::value_type *getRef() const {
258 return RefAndFlags.getPointer();
259 }
260
261 /// Returns the most constraining visibility among summaries. The
262 /// visibilities, ordered from least to most constraining, are: default,
263 /// protected and hidden.
265
266 /// Checks if all summaries are DSO local (have the flag set). When DSOLocal
267 /// propagation has been done, set the parameter to enable fast check.
268 LLVM_ABI bool isDSOLocal(bool WithDSOLocalPropagation = false) const;
269
270 /// Checks if all copies are eligible for auto-hiding (have flag set).
271 LLVM_ABI bool canAutoHide() const;
272};
273
275 OS << VI.getGUID();
276 if (!VI.name().empty())
277 OS << " (" << VI.name() << ")";
278 return OS;
279}
280
281inline bool operator==(const ValueInfo &A, const ValueInfo &B) {
282 assert(A.getRef() && B.getRef() &&
283 "Need ValueInfo with non-null Ref for comparison");
284 return A.getRef() == B.getRef();
285}
286
287inline bool operator!=(const ValueInfo &A, const ValueInfo &B) {
288 assert(A.getRef() && B.getRef() &&
289 "Need ValueInfo with non-null Ref for comparison");
290 return A.getRef() != B.getRef();
291}
292
293inline bool operator<(const ValueInfo &A, const ValueInfo &B) {
294 assert(A.getRef() && B.getRef() &&
295 "Need ValueInfo with non-null Ref to compare GUIDs");
296 return A.getGUID() < B.getGUID();
297}
298
299template <> struct DenseMapInfo<ValueInfo> {
300 static inline ValueInfo getEmptyKey() {
301 return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8);
302 }
303
304 static inline ValueInfo getTombstoneKey() {
305 return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-16);
306 }
307
308 static inline bool isSpecialKey(ValueInfo V) {
309 return V == getTombstoneKey() || V == getEmptyKey();
310 }
311
312 static bool isEqual(ValueInfo L, ValueInfo R) {
313 // We are not supposed to mix ValueInfo(s) with different HaveGVs flag
314 // in a same container.
315 assert(isSpecialKey(L) || isSpecialKey(R) || (L.haveGVs() == R.haveGVs()));
316 return L.getRef() == R.getRef();
317 }
318 static unsigned getHashValue(ValueInfo I) { return hash_value(I.getRef()); }
319};
320
321// For optional hinted size reporting, holds a pair of the full stack id
322// (pre-trimming, from the full context in the profile), and the associated
323// total profiled size.
328
329/// Summary of memprof callsite metadata.
331 // Actual callee function.
333
334 // Used to record whole program analysis cloning decisions.
335 // The ThinLTO backend will need to create as many clones as there are entries
336 // in the vector (it is expected and should be confirmed that all such
337 // summaries in the same FunctionSummary have the same number of entries).
338 // Each index records version info for the corresponding clone of this
339 // function. The value is the callee clone it calls (becomes the appended
340 // suffix id). Index 0 is the original version, and a value of 0 calls the
341 // original callee.
343
344 // Represents stack ids in this context, recorded as indices into the
345 // StackIds vector in the summary index, which in turn holds the full 64-bit
346 // stack ids. This reduces memory as there are in practice far fewer unique
347 // stack ids than stack id references.
349
356};
357
359 OS << "Callee: " << SNI.Callee;
360 OS << " Clones: " << llvm::interleaved(SNI.Clones);
361 OS << " StackIds: " << llvm::interleaved(SNI.StackIdIndices);
362 return OS;
363}
364
365// Allocation type assigned to an allocation reached by a given context.
366// More can be added, now this is cold, notcold and hot.
367// Values should be powers of two so that they can be ORed, in particular to
368// track allocations that have different behavior with different calling
369// contexts.
371 None = 0,
373 Cold = 2,
374 Hot = 4,
375 All = 7 // This should always be set to the OR of all values.
376};
377
378/// Summary of a single MIB in a memprof metadata on allocations.
379struct MIBInfo {
380 // The allocation type for this profiled context.
382
383 // Represents stack ids in this context, recorded as indices into the
384 // StackIds vector in the summary index, which in turn holds the full 64-bit
385 // stack ids. This reduces memory as there are in practice far fewer unique
386 // stack ids than stack id references.
388
391};
392
393inline raw_ostream &operator<<(raw_ostream &OS, const MIBInfo &MIB) {
394 OS << "AllocType " << (unsigned)MIB.AllocType;
395 OS << " StackIds: " << llvm::interleaved(MIB.StackIdIndices);
396 return OS;
397}
398
399/// Summary of memprof metadata on allocations.
400struct AllocInfo {
401 // Used to record whole program analysis cloning decisions.
402 // The ThinLTO backend will need to create as many clones as there are entries
403 // in the vector (it is expected and should be confirmed that all such
404 // summaries in the same FunctionSummary have the same number of entries).
405 // Each index records version info for the corresponding clone of this
406 // function. The value is the allocation type of the corresponding allocation.
407 // Index 0 is the original version. Before cloning, index 0 may have more than
408 // one allocation type.
410
411 // Vector of MIBs in this memprof metadata.
412 std::vector<MIBInfo> MIBs;
413
414 // If requested, keep track of full stack contexts and total profiled sizes
415 // for each MIB. This will be a vector of the same length and order as the
416 // MIBs vector, if non-empty. Note that each MIB in the summary can have
417 // multiple of these as we trim the contexts when possible during matching.
418 // For hinted size reporting we, however, want the original pre-trimmed full
419 // stack context id for better correlation with the profile.
420 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
421
422 AllocInfo(std::vector<MIBInfo> MIBs) : MIBs(std::move(MIBs)) {
423 Versions.push_back(0);
424 }
427};
428
430 OS << "Versions: "
432
433 OS << " MIB:\n";
434 for (auto &M : AE.MIBs)
435 OS << "\t\t" << M << "\n";
436 if (!AE.ContextSizeInfos.empty()) {
437 OS << "\tContextSizeInfo per MIB:\n";
438 for (auto Infos : AE.ContextSizeInfos) {
439 OS << "\t\t";
440 ListSeparator InfoLS;
441 for (auto [FullStackId, TotalSize] : Infos)
442 OS << InfoLS << "{ " << FullStackId << ", " << TotalSize << " }";
443 OS << "\n";
444 }
445 }
446 return OS;
447}
448
449/// Function and variable summary information to aid decisions and
450/// implementation of importing.
452public:
453 /// Sububclass discriminator (for dyn_cast<> et al.)
455
456 enum ImportKind : unsigned {
457 // The global value definition corresponding to the summary should be
458 // imported from source module
460
461 // When its definition doesn't exist in the destination module and not
462 // imported (e.g., function is too large to be inlined), the global value
463 // declaration corresponding to the summary should be imported, or the
464 // attributes from summary should be annotated on the function declaration.
466 };
467
468 /// Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
469 struct GVFlags {
470 /// The linkage type of the associated global value.
471 ///
472 /// One use is to flag values that have local linkage types and need to
473 /// have module identifier appended before placing into the combined
474 /// index, to disambiguate from other values with the same name.
475 /// In the future this will be used to update and optimize linkage
476 /// types based on global summary-based analysis.
477 unsigned Linkage : 4;
478
479 /// Indicates the visibility.
480 unsigned Visibility : 2;
481
482 /// Indicate if the global value cannot be imported (e.g. it cannot
483 /// be renamed or references something that can't be renamed).
485
486 /// In per-module summary, indicate that the global value must be considered
487 /// a live root for index-based liveness analysis. Used for special LLVM
488 /// values such as llvm.global_ctors that the linker does not know about.
489 ///
490 /// In combined summary, indicate that the global value is live.
491 unsigned Live : 1;
492
493 /// Indicates that the linker resolved the symbol to a definition from
494 /// within the same linkage unit.
495 unsigned DSOLocal : 1;
496
497 /// In the per-module summary, indicates that the global value is
498 /// linkonce_odr and global unnamed addr (so eligible for auto-hiding
499 /// via hidden visibility). In the combined summary, indicates that the
500 /// prevailing linkonce_odr copy can be auto-hidden via hidden visibility
501 /// when it is upgraded to weak_odr in the backend. This is legal when
502 /// all copies are eligible for auto-hiding (i.e. all copies were
503 /// linkonce_odr global unnamed addr. If any copy is not (e.g. it was
504 /// originally weak_odr, we cannot auto-hide the prevailing copy as it
505 /// means the symbol was externally visible.
506 unsigned CanAutoHide : 1;
507
508 /// This field is written by the ThinLTO indexing step to postlink combined
509 /// summary. The value is interpreted as 'ImportKind' enum defined above.
510 unsigned ImportType : 1;
511
512 /// This symbol was promoted. Thinlink stages need to be aware of this
513 /// transition
514 unsigned Promoted : 1;
515
516 /// Convenience Constructors
525 };
526
527private:
528 /// Kind of summary for use in dyn_cast<> et al.
529 SummaryKind Kind;
530
531 GVFlags Flags;
532
533 /// This is the hash of the name of the symbol in the original file. It is
534 /// identical to the GUID for global symbols, but differs for local since the
535 /// GUID includes the module level id in the hash.
536 GlobalValue::GUID OriginalName = 0;
537
538 /// Path of module IR containing value's definition, used to locate
539 /// module during importing.
540 ///
541 /// This is only used during parsing of the combined index, or when
542 /// parsing the per-module index for creation of the combined summary index,
543 /// not during writing of the per-module index which doesn't contain a
544 /// module path string table.
545 StringRef ModulePath;
546
547 /// List of values referenced by this global value's definition
548 /// (either by the initializer of a global variable, or referenced
549 /// from within a function). This does not include functions called, which
550 /// are listed in the derived FunctionSummary object.
551 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
552 /// smaller memory footprint.
553 SmallVector<ValueInfo, 0> RefEdgeList;
554
555protected:
558 : Kind(K), Flags(Flags), RefEdgeList(std::move(Refs)) {
559 assert((K != AliasKind || Refs.empty()) &&
560 "Expect no references for AliasSummary");
561 }
562
563public:
564 virtual ~GlobalValueSummary() = default;
565
566 /// Returns the hash of the original name, it is identical to the GUID for
567 /// externally visible symbols, but not for local ones.
568 GlobalValue::GUID getOriginalName() const { return OriginalName; }
569
570 /// Initialize the original name hash in this summary.
571 void setOriginalName(GlobalValue::GUID Name) { OriginalName = Name; }
572
573 /// Which kind of summary subclass this is.
574 SummaryKind getSummaryKind() const { return Kind; }
575
576 /// Set the path to the module containing this function, for use in
577 /// the combined index.
578 void setModulePath(StringRef ModPath) { ModulePath = ModPath; }
579
580 /// Get the path to the module containing this function.
581 StringRef modulePath() const { return ModulePath; }
582
583 /// Get the flags for this GlobalValue (see \p struct GVFlags).
584 GVFlags flags() const { return Flags; }
585
586 /// Return linkage type recorded for this global value.
588 return static_cast<GlobalValue::LinkageTypes>(Flags.Linkage);
589 }
590
591 bool wasPromoted() const { return Flags.Promoted; }
592
593 void promote() {
595 "unexpected (re-)promotion of non-local symbol");
596 assert(!Flags.Promoted);
597 Flags.Promoted = true;
599 }
600
601 /// Sets the linkage to the value determined by global summary-based
602 /// optimization. Will be applied in the ThinLTO backends.
605 assert(!GlobalValue::isExternalLinkage(Linkage) && "use `promote` instead");
606 Flags.Linkage = Linkage;
607 }
608
612
613 /// Return true if this global value can't be imported.
614 bool notEligibleToImport() const { return Flags.NotEligibleToImport; }
615
616 bool isLive() const { return Flags.Live; }
617
618 void setLive(bool Live) { Flags.Live = Live; }
619
620 void setDSOLocal(bool Local) { Flags.DSOLocal = Local; }
621
622 bool isDSOLocal() const { return Flags.DSOLocal; }
623
624 void setCanAutoHide(bool CanAutoHide) { Flags.CanAutoHide = CanAutoHide; }
625
626 bool canAutoHide() const { return Flags.CanAutoHide; }
627
628 bool shouldImportAsDecl() const {
629 return Flags.ImportType == GlobalValueSummary::ImportKind::Declaration;
630 }
631
632 void setImportKind(ImportKind IK) { Flags.ImportType = IK; }
633
635 return static_cast<ImportKind>(Flags.ImportType);
636 }
637
639 return (GlobalValue::VisibilityTypes)Flags.Visibility;
640 }
642 Flags.Visibility = (unsigned)Vis;
643 }
644
645 /// Flag that this global value cannot be imported.
646 void setNotEligibleToImport() { Flags.NotEligibleToImport = true; }
647
648 /// Return the list of values referenced by this global value definition.
649 ArrayRef<ValueInfo> refs() const { return RefEdgeList; }
650
651 /// If this is an alias summary, returns the summary of the aliased object (a
652 /// global variable or function), otherwise returns itself.
654 const GlobalValueSummary *getBaseObject() const;
655
656 friend class ModuleSummaryIndex;
657};
658
660 : U(HaveGVs), HasLocal(false) {}
661
663 std::unique_ptr<GlobalValueSummary> Summary) {
664 if (GlobalValue::isLocalLinkage(Summary->linkage()))
665 HasLocal = true;
666 return SummaryList.push_back(std::move(Summary));
667}
668
670 assert(HasLocal ==
671 llvm::any_of(SummaryList,
672 [](const std::unique_ptr<GlobalValueSummary> &Summary) {
673 return GlobalValue::isLocalLinkage(Summary->linkage());
674 }));
675}
676
677/// Alias summary information.
679 ValueInfo AliaseeValueInfo;
680
681 /// This is the Aliasee in the same module as alias (could get from VI, trades
682 /// memory for time). Note that this pointer may be null (and the value info
683 /// empty) when we have a distributed index where the alias is being imported
684 /// (as a copy of the aliasee), but the aliasee is not.
685 GlobalValueSummary *AliaseeSummary = nullptr;
686
687public:
690
691 /// Check if this is an alias summary.
692 static bool classof(const GlobalValueSummary *GVS) {
693 return GVS->getSummaryKind() == AliasKind;
694 }
695
696 void setAliasee(ValueInfo &AliaseeVI, GlobalValueSummary *Aliasee) {
697 AliaseeValueInfo = AliaseeVI;
698 AliaseeSummary = Aliasee;
699 }
700
701 bool hasAliasee() const {
702 assert(!!AliaseeSummary == (AliaseeValueInfo &&
703 !AliaseeValueInfo.getSummaryList().empty()) &&
704 "Expect to have both aliasee summary and summary list or neither");
705 return !!AliaseeSummary;
706 }
707
709 assert(AliaseeSummary && "Unexpected missing aliasee summary");
710 return *AliaseeSummary;
711 }
712
714 return const_cast<GlobalValueSummary &>(
715 static_cast<const AliasSummary *>(this)->getAliasee());
716 }
718 assert(AliaseeValueInfo && "Unexpected missing aliasee");
719 return AliaseeValueInfo;
720 }
722 assert(AliaseeValueInfo && "Unexpected missing aliasee");
723 return AliaseeValueInfo.getGUID();
724 }
725};
726
728 if (auto *AS = dyn_cast<AliasSummary>(this))
729 return &AS->getAliasee();
730 return this;
731}
732
734 if (auto *AS = dyn_cast<AliasSummary>(this))
735 return &AS->getAliasee();
736 return this;
737}
738
739/// Function summary information to aid decisions and implementation of
740/// importing.
742public:
743 /// <CalleeValueInfo, CalleeInfo> call edge pair.
744 using EdgeTy = std::pair<ValueInfo, CalleeInfo>;
745
746 /// Types for -force-summary-edges-cold debugging option.
752
753 /// An "identifier" for a virtual function. This contains the type identifier
754 /// represented as a GUID and the offset from the address point to the virtual
755 /// function pointer, where "address point" is as defined in the Itanium ABI:
756 /// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-general
761
762 /// A specification for a virtual function call with all constant integer
763 /// arguments. This is used to perform virtual constant propagation on the
764 /// summary.
765 struct ConstVCall {
767 std::vector<uint64_t> Args;
768 };
769
770 /// All type identifier related information. Because these fields are
771 /// relatively uncommon we only allocate space for them if necessary.
772 struct TypeIdInfo {
773 /// List of type identifiers used by this function in llvm.type.test
774 /// intrinsics referenced by something other than an llvm.assume intrinsic,
775 /// represented as GUIDs.
776 std::vector<GlobalValue::GUID> TypeTests;
777
778 /// List of virtual calls made by this function using (respectively)
779 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics that do
780 /// not have all constant integer arguments.
782
783 /// List of virtual calls made by this function using (respectively)
784 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics with
785 /// all constant integer arguments.
786 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
788 };
789
790 /// Flags specific to function summaries.
791 struct FFlags {
792 // Function attribute flags. Used to track if a function accesses memory,
793 // recurses or aliases.
794 unsigned ReadNone : 1;
795 unsigned ReadOnly : 1;
796 unsigned NoRecurse : 1;
797 unsigned ReturnDoesNotAlias : 1;
798
799 // Indicate if the global value cannot be inlined.
800 unsigned NoInline : 1;
801 // Indicate if function should be always inlined.
802 unsigned AlwaysInline : 1;
803 // Indicate if function never raises an exception. Can be modified during
804 // thinlink function attribute propagation
805 unsigned NoUnwind : 1;
806 // Indicate if function contains instructions that mayThrow
807 unsigned MayThrow : 1;
808
809 // If there are calls to unknown targets (e.g. indirect)
810 unsigned HasUnknownCall : 1;
811
812 // Indicate if a function must be an unreachable function.
813 //
814 // This bit is sufficient but not necessary;
815 // if this bit is on, the function must be regarded as unreachable;
816 // if this bit is off, the function might be reachable or unreachable.
817 unsigned MustBeUnreachable : 1;
818
820 this->ReadNone &= RHS.ReadNone;
821 this->ReadOnly &= RHS.ReadOnly;
822 this->NoRecurse &= RHS.NoRecurse;
823 this->ReturnDoesNotAlias &= RHS.ReturnDoesNotAlias;
824 this->NoInline &= RHS.NoInline;
825 this->AlwaysInline &= RHS.AlwaysInline;
826 this->NoUnwind &= RHS.NoUnwind;
827 this->MayThrow &= RHS.MayThrow;
828 this->HasUnknownCall &= RHS.HasUnknownCall;
829 this->MustBeUnreachable &= RHS.MustBeUnreachable;
830 return *this;
831 }
832
833 bool anyFlagSet() {
834 return this->ReadNone | this->ReadOnly | this->NoRecurse |
835 this->ReturnDoesNotAlias | this->NoInline | this->AlwaysInline |
836 this->NoUnwind | this->MayThrow | this->HasUnknownCall |
837 this->MustBeUnreachable;
838 }
839
840 operator std::string() {
841 std::string Output;
842 raw_string_ostream OS(Output);
843 OS << "funcFlags: (";
844 OS << "readNone: " << this->ReadNone;
845 OS << ", readOnly: " << this->ReadOnly;
846 OS << ", noRecurse: " << this->NoRecurse;
847 OS << ", returnDoesNotAlias: " << this->ReturnDoesNotAlias;
848 OS << ", noInline: " << this->NoInline;
849 OS << ", alwaysInline: " << this->AlwaysInline;
850 OS << ", noUnwind: " << this->NoUnwind;
851 OS << ", mayThrow: " << this->MayThrow;
852 OS << ", hasUnknownCall: " << this->HasUnknownCall;
853 OS << ", mustBeUnreachable: " << this->MustBeUnreachable;
854 OS << ")";
855 return Output;
856 }
857 };
858
859 /// Describes the uses of a parameter by the function.
860 struct ParamAccess {
861 static constexpr uint32_t RangeWidth = 64;
862
863 /// Describes the use of a value in a call instruction, specifying the
864 /// call's target, the value's parameter number, and the possible range of
865 /// offsets from the beginning of the value that are passed.
875
877 /// The range contains byte offsets from the parameter pointer which
878 /// accessed by the function. In the per-module summary, it only includes
879 /// accesses made by the function instructions. In the combined summary, it
880 /// also includes accesses by nested function calls.
881 ConstantRange Use{/*BitWidth=*/RangeWidth, /*isFullSet=*/true};
882 /// In the per-module summary, it summarizes the byte offset applied to each
883 /// pointer parameter before passing to each corresponding callee.
884 /// In the combined summary, it's empty and information is propagated by
885 /// inter-procedural analysis and applied to the Use field.
886 std::vector<Call> Calls;
887
888 ParamAccess() = default;
891 };
892
893 /// Create an empty FunctionSummary (with specified call edges).
894 /// Used to represent external nodes and the dummy root node.
895 static FunctionSummary
897 return FunctionSummary(
901 /*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
902 /*CanAutoHide=*/false, GlobalValueSummary::ImportKind::Definition),
904 std::move(Edges), std::vector<GlobalValue::GUID>(),
905 std::vector<FunctionSummary::VFuncId>(),
906 std::vector<FunctionSummary::VFuncId>(),
907 std::vector<FunctionSummary::ConstVCall>(),
908 std::vector<FunctionSummary::ConstVCall>(),
909 std::vector<FunctionSummary::ParamAccess>(),
910 std::vector<CallsiteInfo>(), std::vector<AllocInfo>());
911 }
912
913 /// A dummy node to reference external functions that aren't in the index
915
916private:
917 /// Number of instructions (ignoring debug instructions, e.g.) computed
918 /// during the initial compile step when the summary index is first built.
919 unsigned InstCount;
920
921 /// Function summary specific flags.
922 FFlags FunFlags;
923
924 /// List of <CalleeValueInfo, CalleeInfo> call edge pairs from this function.
925 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
926 /// smaller memory footprint.
927 SmallVector<EdgeTy, 0> CallGraphEdgeList;
928
929 std::unique_ptr<TypeIdInfo> TIdInfo;
930
931 /// Uses for every parameter to this function.
932 using ParamAccessesTy = std::vector<ParamAccess>;
933 std::unique_ptr<ParamAccessesTy> ParamAccesses;
934
935 /// Optional list of memprof callsite metadata summaries. The correspondence
936 /// between the callsite summary and the callsites in the function is implied
937 /// by the order in the vector (and can be validated by comparing the stack
938 /// ids in the CallsiteInfo to those in the instruction callsite metadata).
939 /// As a memory savings optimization, we only create these for the prevailing
940 /// copy of a symbol when creating the combined index during LTO.
941 using CallsitesTy = std::vector<CallsiteInfo>;
942 std::unique_ptr<CallsitesTy> Callsites;
943
944 /// Optional list of allocation memprof metadata summaries. The correspondence
945 /// between the alloc memprof summary and the allocation callsites in the
946 /// function is implied by the order in the vector (and can be validated by
947 /// comparing the stack ids in the AllocInfo to those in the instruction
948 /// memprof metadata).
949 /// As a memory savings optimization, we only create these for the prevailing
950 /// copy of a symbol when creating the combined index during LTO.
951 using AllocsTy = std::vector<AllocInfo>;
952 std::unique_ptr<AllocsTy> Allocs;
953
954public:
955 FunctionSummary(GVFlags Flags, unsigned NumInsts, FFlags FunFlags,
957 SmallVectorImpl<EdgeTy> &&CGEdges,
958 std::vector<GlobalValue::GUID> TypeTests,
959 std::vector<VFuncId> TypeTestAssumeVCalls,
960 std::vector<VFuncId> TypeCheckedLoadVCalls,
961 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
962 std::vector<ConstVCall> TypeCheckedLoadConstVCalls,
963 std::vector<ParamAccess> Params, CallsitesTy CallsiteList,
964 AllocsTy AllocList)
965 : GlobalValueSummary(FunctionKind, Flags, std::move(Refs)),
966 InstCount(NumInsts), FunFlags(FunFlags),
967 CallGraphEdgeList(std::move(CGEdges)) {
968 if (!TypeTests.empty() || !TypeTestAssumeVCalls.empty() ||
969 !TypeCheckedLoadVCalls.empty() || !TypeTestAssumeConstVCalls.empty() ||
970 !TypeCheckedLoadConstVCalls.empty())
971 TIdInfo = std::make_unique<TypeIdInfo>(
972 TypeIdInfo{std::move(TypeTests), std::move(TypeTestAssumeVCalls),
973 std::move(TypeCheckedLoadVCalls),
974 std::move(TypeTestAssumeConstVCalls),
975 std::move(TypeCheckedLoadConstVCalls)});
976 if (!Params.empty())
977 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(Params));
978 if (!CallsiteList.empty())
979 Callsites = std::make_unique<CallsitesTy>(std::move(CallsiteList));
980 if (!AllocList.empty())
981 Allocs = std::make_unique<AllocsTy>(std::move(AllocList));
982 }
983 // Gets the number of readonly and writeonly refs in RefEdgeList
984 LLVM_ABI std::pair<unsigned, unsigned> specialRefCounts() const;
985
986 /// Check if this is a function summary.
987 static bool classof(const GlobalValueSummary *GVS) {
988 return GVS->getSummaryKind() == FunctionKind;
989 }
990
991 /// Get function summary flags.
992 FFlags fflags() const { return FunFlags; }
993
994 void setNoRecurse() { FunFlags.NoRecurse = true; }
995
996 void setNoUnwind() { FunFlags.NoUnwind = true; }
997
998 /// Get the instruction count recorded for this function.
999 unsigned instCount() const { return InstCount; }
1000
1001 /// Return the list of <CalleeValueInfo, CalleeInfo> pairs.
1002 ArrayRef<EdgeTy> calls() const { return CallGraphEdgeList; }
1003
1004 SmallVector<EdgeTy, 0> &mutableCalls() { return CallGraphEdgeList; }
1005
1006 void addCall(EdgeTy E) { CallGraphEdgeList.push_back(E); }
1007
1008 /// Returns the list of type identifiers used by this function in
1009 /// llvm.type.test intrinsics other than by an llvm.assume intrinsic,
1010 /// represented as GUIDs.
1012 if (TIdInfo)
1013 return TIdInfo->TypeTests;
1014 return {};
1015 }
1016
1017 /// Returns the list of virtual calls made by this function using
1018 /// llvm.assume(llvm.type.test) intrinsics that do not have all constant
1019 /// integer arguments.
1021 if (TIdInfo)
1022 return TIdInfo->TypeTestAssumeVCalls;
1023 return {};
1024 }
1025
1026 /// Returns the list of virtual calls made by this function using
1027 /// llvm.type.checked.load intrinsics that do not have all constant integer
1028 /// arguments.
1030 if (TIdInfo)
1031 return TIdInfo->TypeCheckedLoadVCalls;
1032 return {};
1033 }
1034
1035 /// Returns the list of virtual calls made by this function using
1036 /// llvm.assume(llvm.type.test) intrinsics with all constant integer
1037 /// arguments.
1039 if (TIdInfo)
1040 return TIdInfo->TypeTestAssumeConstVCalls;
1041 return {};
1042 }
1043
1044 /// Returns the list of virtual calls made by this function using
1045 /// llvm.type.checked.load intrinsics with all constant integer arguments.
1047 if (TIdInfo)
1048 return TIdInfo->TypeCheckedLoadConstVCalls;
1049 return {};
1050 }
1051
1052 /// Returns the list of known uses of pointer parameters.
1054 if (ParamAccesses)
1055 return *ParamAccesses;
1056 return {};
1057 }
1058
1059 /// Sets the list of known uses of pointer parameters.
1060 void setParamAccesses(std::vector<ParamAccess> NewParams) {
1061 if (NewParams.empty())
1062 ParamAccesses.reset();
1063 else if (ParamAccesses)
1064 *ParamAccesses = std::move(NewParams);
1065 else
1066 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(NewParams));
1067 }
1068
1069 /// Add a type test to the summary. This is used by WholeProgramDevirt if we
1070 /// were unable to devirtualize a checked call.
1072 if (!TIdInfo)
1073 TIdInfo = std::make_unique<TypeIdInfo>();
1074 TIdInfo->TypeTests.push_back(Guid);
1075 }
1076
1077 const TypeIdInfo *getTypeIdInfo() const { return TIdInfo.get(); };
1078
1080 if (Callsites)
1081 return *Callsites;
1082 return {};
1083 }
1084
1085 CallsitesTy &mutableCallsites() {
1086 assert(Callsites);
1087 return *Callsites;
1088 }
1089
1090 void addCallsite(CallsiteInfo &Callsite) {
1091 if (!Callsites)
1092 Callsites = std::make_unique<CallsitesTy>();
1093 Callsites->push_back(Callsite);
1094 }
1095
1097 if (Allocs)
1098 return *Allocs;
1099 return {};
1100 }
1101
1102 AllocsTy &mutableAllocs() {
1103 assert(Allocs);
1104 return *Allocs;
1105 }
1106
1107 friend struct GraphTraits<ValueInfo>;
1108};
1109
1110template <> struct DenseMapInfo<FunctionSummary::VFuncId> {
1111 static FunctionSummary::VFuncId getEmptyKey() { return {0, uint64_t(-1)}; }
1112
1114 return {0, uint64_t(-2)};
1115 }
1116
1118 return L.GUID == R.GUID && L.Offset == R.Offset;
1119 }
1120
1121 static unsigned getHashValue(FunctionSummary::VFuncId I) { return I.GUID; }
1122};
1123
1124template <> struct DenseMapInfo<FunctionSummary::ConstVCall> {
1126 return {{0, uint64_t(-1)}, {}};
1127 }
1128
1130 return {{0, uint64_t(-2)}, {}};
1131 }
1132
1135 return DenseMapInfo<FunctionSummary::VFuncId>::isEqual(L.VFunc, R.VFunc) &&
1136 L.Args == R.Args;
1137 }
1138
1140 return I.VFunc.GUID;
1141 }
1142};
1143
1144/// The ValueInfo and offset for a function within a vtable definition
1145/// initializer array.
1153/// List of functions referenced by a particular vtable definition.
1154using VTableFuncList = std::vector<VirtFuncOffset>;
1155
1156/// Global variable summary information to aid decisions and
1157/// implementation of importing.
1158///
1159/// Global variable summary has two extra flag, telling if it is
1160/// readonly or writeonly. Both readonly and writeonly variables
1161/// can be optimized in the backed: readonly variables can be
1162/// const-folded, while writeonly vars can be completely eliminated
1163/// together with corresponding stores. We let both things happen
1164/// by means of internalizing such variables after ThinLTO import.
1166private:
1167 /// For vtable definitions this holds the list of functions and
1168 /// their corresponding offsets within the initializer array.
1169 std::unique_ptr<VTableFuncList> VTableFuncs;
1170
1171public:
1172 struct GVarFlags {
1173 GVarFlags(bool ReadOnly, bool WriteOnly, bool Constant,
1175 : MaybeReadOnly(ReadOnly), MaybeWriteOnly(WriteOnly),
1177
1178 // If true indicates that this global variable might be accessed
1179 // purely by non-volatile load instructions. This in turn means
1180 // it can be internalized in source and destination modules during
1181 // thin LTO import because it neither modified nor its address
1182 // is taken.
1183 unsigned MaybeReadOnly : 1;
1184 // If true indicates that variable is possibly only written to, so
1185 // its value isn't loaded and its address isn't taken anywhere.
1186 // False, when 'Constant' attribute is set.
1187 unsigned MaybeWriteOnly : 1;
1188 // Indicates that value is a compile-time constant. Global variable
1189 // can be 'Constant' while not being 'ReadOnly' on several occasions:
1190 // - it is volatile, (e.g mapped device address)
1191 // - its address is taken, meaning that unlike 'ReadOnly' vars we can't
1192 // internalize it.
1193 // Constant variables are always imported thus giving compiler an
1194 // opportunity to make some extra optimizations. Readonly constants
1195 // are also internalized.
1196 unsigned Constant : 1;
1197 // Set from metadata on vtable definitions during the module summary
1198 // analysis.
1199 unsigned VCallVisibility : 2;
1201
1206
1207 /// Check if this is a global variable summary.
1208 static bool classof(const GlobalValueSummary *GVS) {
1209 return GVS->getSummaryKind() == GlobalVarKind;
1210 }
1211
1212 GVarFlags varflags() const { return VarFlags; }
1213 void setReadOnly(bool RO) { VarFlags.MaybeReadOnly = RO; }
1214 void setWriteOnly(bool WO) { VarFlags.MaybeWriteOnly = WO; }
1215 bool maybeReadOnly() const { return VarFlags.MaybeReadOnly; }
1216 bool maybeWriteOnly() const { return VarFlags.MaybeWriteOnly; }
1217 bool isConstant() const { return VarFlags.Constant; }
1219 VarFlags.VCallVisibility = Vis;
1220 }
1224
1226 assert(!VTableFuncs);
1227 VTableFuncs = std::make_unique<VTableFuncList>(std::move(Funcs));
1228 }
1229
1231 if (VTableFuncs)
1232 return *VTableFuncs;
1233 return {};
1234 }
1235};
1236
1238 /// Specifies which kind of type check we should emit for this byte array.
1239 /// See http://clang.llvm.org/docs/ControlFlowIntegrityDesign.html for full
1240 /// details on each kind of check; the enumerators are described with
1241 /// reference to that document.
1242 enum Kind {
1243 Unsat, ///< Unsatisfiable type (i.e. no global has this type metadata)
1244 ByteArray, ///< Test a byte array (first example)
1245 Inline, ///< Inlined bit vector ("Short Inline Bit Vectors")
1246 Single, ///< Single element (last example in "Short Inline Bit Vectors")
1247 AllOnes, ///< All-ones bit vector ("Eliminating Bit Vector Checks for
1248 /// All-Ones Bit Vectors")
1249 Unknown, ///< Unknown (analysis not performed, don't lower)
1251
1252 /// Range of size-1 expressed as a bit width. For example, if the size is in
1253 /// range [1,256], this number will be 8. This helps generate the most compact
1254 /// instruction sequences.
1255 unsigned SizeM1BitWidth = 0;
1256
1257 // The following fields are only used if the target does not support the use
1258 // of absolute symbols to store constants. Their meanings are the same as the
1259 // corresponding fields in LowerTypeTestsModule::TypeIdLowering in
1260 // LowerTypeTests.cpp.
1261
1266};
1267
1269 enum Kind {
1270 Indir, ///< Just do a regular virtual call
1271 SingleImpl, ///< Single implementation devirtualization
1272 BranchFunnel, ///< When retpoline mitigation is enabled, use a branch funnel
1273 ///< that is defined in the merged module. Otherwise same as
1274 ///< Indir.
1276
1277 std::string SingleImplName;
1278
1279 struct ByArg {
1280 enum Kind {
1281 Indir, ///< Just do a regular virtual call
1282 UniformRetVal, ///< Uniform return value optimization
1283 UniqueRetVal, ///< Unique return value optimization
1284 VirtualConstProp, ///< Virtual constant propagation
1286
1287 /// Additional information for the resolution:
1288 /// - UniformRetVal: the uniform return value.
1289 /// - UniqueRetVal: the return value associated with the unique vtable (0 or
1290 /// 1).
1292
1293 // The following fields are only used if the target does not support the use
1294 // of absolute symbols to store constants.
1295
1298 };
1299
1300 /// Resolutions for calls with all constant integer arguments (excluding the
1301 /// first argument, "this"), where the key is the argument vector.
1302 std::map<std::vector<uint64_t>, ByArg> ResByArg;
1303};
1304
1307
1308 /// Mapping from byte offset to whole-program devirt resolution for that
1309 /// (typeid, byte offset) pair.
1310 std::map<uint64_t, WholeProgramDevirtResolution> WPDRes;
1311};
1312
1315 using IndexIterator =
1317 std::set<std::string, std::less<>>>::const_iterator;
1318 using NestedIterator = std::set<std::string, std::less<>>::const_iterator;
1319
1320public:
1321 // Iterates keys of the DenseMap.
1322 class GUIDIterator : public iterator_adaptor_base<GUIDIterator, IndexIterator,
1323 std::forward_iterator_tag,
1324 GlobalValue::GUID> {
1326
1327 public:
1328 GUIDIterator() = default;
1329 explicit GUIDIterator(IndexIterator I) : base(I) {}
1330
1331 GlobalValue::GUID operator*() const { return this->wrapped()->first; }
1332 };
1333
1334 CfiFunctionIndex() = default;
1335 template <typename It> CfiFunctionIndex(It B, It E) {
1336 for (; B != E; ++B)
1337 emplace(*B);
1338 }
1339
1340 std::vector<StringRef> symbols() const {
1341 std::vector<StringRef> Symbols;
1342 for (auto &[GUID, Syms] : Index) {
1343 (void)GUID;
1344 llvm::append_range(Symbols, Syms);
1345 }
1346 return Symbols;
1347 }
1348
1349 GUIDIterator guid_begin() const { return GUIDIterator(Index.begin()); }
1350 GUIDIterator guid_end() const { return GUIDIterator(Index.end()); }
1354
1356 auto I = Index.find(GUID);
1357 if (I == Index.end())
1358 return make_range(NestedIterator{}, NestedIterator{});
1359 return make_range(I->second.begin(), I->second.end());
1360 }
1361
1362 template <typename... Args> void emplace(Args &&...A) {
1363 StringRef S(std::forward<Args>(A)...);
1366 Index[GUID].emplace(S);
1367 }
1368
1369 size_t count(StringRef S) const {
1372 auto I = Index.find(GUID);
1373 if (I == Index.end())
1374 return 0;
1375 return I->second.count(S);
1376 }
1377
1378 bool empty() const { return Index.empty(); }
1379};
1380
1381/// 160 bits SHA1
1382using ModuleHash = std::array<uint32_t, 5>;
1383
1384/// Type used for iterating through the global value summary map.
1385using const_gvsummary_iterator = GlobalValueSummaryMapTy::const_iterator;
1386using gvsummary_iterator = GlobalValueSummaryMapTy::iterator;
1387
1388/// String table to hold/own module path strings, as well as a hash
1389/// of the module. The StringMap makes a copy of and owns inserted strings.
1391
1392/// Map of global value GUID to its summary, used to identify values defined in
1393/// a particular module, and provide efficient access to their summary.
1395
1396/// Map of a module name to the GUIDs and summaries we will import from that
1397/// module.
1399 std::map<std::string, GVSummaryMapTy, std::less<>>;
1400
1401/// A set of global value summary pointers.
1402using GVSummaryPtrSet = std::unordered_set<GlobalValueSummary *>;
1403
1404/// Map of a type GUID to type id string and summary (multimap used
1405/// in case of GUID conflicts).
1407 std::multimap<GlobalValue::GUID, std::pair<StringRef, TypeIdSummary>>;
1408
1409/// The following data structures summarize type metadata information.
1410/// For type metadata overview see https://llvm.org/docs/TypeMetadata.html.
1411/// Each type metadata includes both the type identifier and the offset of
1412/// the address point of the type (the address held by objects of that type
1413/// which may not be the beginning of the virtual table). Vtable definitions
1414/// are decorated with type metadata for the types they are compatible with.
1415///
1416/// Holds information about vtable definitions decorated with type metadata:
1417/// the vtable definition value and its address point offset in a type
1418/// identifier metadata it is decorated (compatible) with.
1426/// List of vtable definitions decorated by a particular type identifier,
1427/// and their corresponding offsets in that type identifier's metadata.
1428/// Note that each type identifier may be compatible with multiple vtables, due
1429/// to inheritance, which is why this is a vector.
1430using TypeIdCompatibleVtableInfo = std::vector<TypeIdOffsetVtableInfo>;
1431
1432/// Class to hold module path string table and global value map,
1433/// and encapsulate methods for operating on them.
1435private:
1436 /// Map from value name to list of summary instances for values of that
1437 /// name (may be duplicates in the COMDAT case, e.g.).
1438 GlobalValueSummaryMapTy GlobalValueMap;
1439
1440 /// Holds strings for combined index, mapping to the corresponding module ID.
1441 ModulePathStringTableTy ModulePathStringTable;
1442
1443 BumpPtrAllocator TypeIdSaverAlloc;
1444 UniqueStringSaver TypeIdSaver;
1445
1446 /// Mapping from type identifier GUIDs to type identifier and its summary
1447 /// information. Produced by thin link.
1448 TypeIdSummaryMapTy TypeIdMap;
1449
1450 /// Mapping from type identifier to information about vtables decorated
1451 /// with that type identifier's metadata. Produced by per module summary
1452 /// analysis and consumed by thin link. For more information, see description
1453 /// above where TypeIdCompatibleVtableInfo is defined.
1454 std::map<StringRef, TypeIdCompatibleVtableInfo, std::less<>>
1455 TypeIdCompatibleVtableMap;
1456
1457 /// Mapping from original ID to GUID. If original ID can map to multiple
1458 /// GUIDs, it will be mapped to 0.
1460
1461 /// Indicates that summary-based GlobalValue GC has run, and values with
1462 /// GVFlags::Live==false are really dead. Otherwise, all values must be
1463 /// considered live.
1464 bool WithGlobalValueDeadStripping = false;
1465
1466 /// Indicates that summary-based attribute propagation has run and
1467 /// GVarFlags::MaybeReadonly / GVarFlags::MaybeWriteonly are really
1468 /// read/write only.
1469 bool WithAttributePropagation = false;
1470
1471 /// Indicates that summary-based DSOLocal propagation has run and the flag in
1472 /// every summary of a GV is synchronized.
1473 bool WithDSOLocalPropagation = false;
1474
1475 /// Indicates that summary-based internalization and promotion has run.
1476 bool WithInternalizeAndPromote = false;
1477
1478 /// Indicates that we have whole program visibility.
1479 bool WithWholeProgramVisibility = false;
1480
1481 /// Indicates that summary-based synthetic entry count propagation has run
1482 bool HasSyntheticEntryCounts = false;
1483
1484 /// Indicates that we linked with allocator supporting hot/cold new operators.
1485 bool WithSupportsHotColdNew = false;
1486
1487 /// Indicates that distributed backend should skip compilation of the
1488 /// module. Flag is suppose to be set by distributed ThinLTO indexing
1489 /// when it detected that the module is not needed during the final
1490 /// linking. As result distributed backend should just output a minimal
1491 /// valid object file.
1492 bool SkipModuleByDistributedBackend = false;
1493
1494 /// If true then we're performing analysis of IR module, or parsing along with
1495 /// the IR from assembly. The value of 'false' means we're reading summary
1496 /// from BC or YAML source. Affects the type of value stored in NameOrGV
1497 /// union.
1498 bool HaveGVs;
1499
1500 // True if the index was created for a module compiled with -fsplit-lto-unit.
1501 bool EnableSplitLTOUnit;
1502
1503 // True if the index was created for a module compiled with -funified-lto
1504 bool UnifiedLTO;
1505
1506 // True if some of the modules were compiled with -fsplit-lto-unit and
1507 // some were not. Set when the combined index is created during the thin link.
1508 bool PartiallySplitLTOUnits = false;
1509
1510 /// True if some of the FunctionSummary contains a ParamAccess.
1511 bool HasParamAccess = false;
1512
1513 CfiFunctionIndex CfiFunctionDefs;
1514 CfiFunctionIndex CfiFunctionDecls;
1515
1516 // Used in cases where we want to record the name of a global, but
1517 // don't have the string owned elsewhere (e.g. the Strtab on a module).
1518 BumpPtrAllocator Alloc;
1519 StringSaver Saver;
1520
1521 // The total number of basic blocks in the module in the per-module summary or
1522 // the total number of basic blocks in the LTO unit in the combined index.
1523 // FIXME: Putting this in the distributed ThinLTO index files breaks LTO
1524 // backend caching on any BB change to any linked file. It is currently not
1525 // used except in the case of a SamplePGO partial profile, and should be
1526 // reevaluated/redesigned to allow more effective incremental builds in that
1527 // case.
1528 uint64_t BlockCount = 0;
1529
1530 // List of unique stack ids (hashes). We use a 4B index of the id in the
1531 // stack id lists on the alloc and callsite summaries for memory savings,
1532 // since the number of unique ids is in practice much smaller than the
1533 // number of stack id references in the summaries.
1534 std::vector<uint64_t> StackIds;
1535
1536 // Temporary map while building StackIds list. Clear when index is completely
1537 // built via releaseTemporaryMemory.
1538 DenseMap<uint64_t, unsigned> StackIdToIndex;
1539
1540 // YAML I/O support.
1542
1543 GlobalValueSummaryMapTy::value_type *
1544 getOrInsertValuePtr(GlobalValue::GUID GUID) {
1545 return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo(HaveGVs))
1546 .first;
1547 }
1548
1549public:
1550 // See HaveGVs variable comment.
1551 ModuleSummaryIndex(bool HaveGVs, bool EnableSplitLTOUnit = false,
1552 bool UnifiedLTO = false)
1553 : TypeIdSaver(TypeIdSaverAlloc), HaveGVs(HaveGVs),
1554 EnableSplitLTOUnit(EnableSplitLTOUnit), UnifiedLTO(UnifiedLTO),
1555 Saver(Alloc) {}
1556
1557 // Current version for the module summary in bitcode files.
1558 // The BitcodeSummaryVersion should be bumped whenever we introduce changes
1559 // in the way some record are interpreted, like flags for instance.
1560 // Note that incrementing this may require changes in both BitcodeReader.cpp
1561 // and BitcodeWriter.cpp.
1562 static constexpr uint64_t BitcodeSummaryVersion = 12;
1563
1564 // Regular LTO module name for ASM writer
1565 static constexpr const char *getRegularLTOModuleName() {
1566 return "[Regular LTO]";
1567 }
1568
1569 bool haveGVs() const { return HaveGVs; }
1570
1571 LLVM_ABI uint64_t getFlags() const;
1572 LLVM_ABI void setFlags(uint64_t Flags);
1573
1574 uint64_t getBlockCount() const { return BlockCount; }
1575 void addBlockCount(uint64_t C) { BlockCount += C; }
1576 void setBlockCount(uint64_t C) { BlockCount = C; }
1577
1578 gvsummary_iterator begin() { return GlobalValueMap.begin(); }
1579 const_gvsummary_iterator begin() const { return GlobalValueMap.begin(); }
1580 gvsummary_iterator end() { return GlobalValueMap.end(); }
1581 const_gvsummary_iterator end() const { return GlobalValueMap.end(); }
1582 size_t size() const { return GlobalValueMap.size(); }
1583
1584 const std::vector<uint64_t> &stackIds() const { return StackIds; }
1585
1586 unsigned addOrGetStackIdIndex(uint64_t StackId) {
1587 auto Inserted = StackIdToIndex.insert({StackId, StackIds.size()});
1588 if (Inserted.second)
1589 StackIds.push_back(StackId);
1590 return Inserted.first->second;
1591 }
1592
1593 uint64_t getStackIdAtIndex(unsigned Index) const {
1594 assert(StackIds.size() > Index);
1595 return StackIds[Index];
1596 }
1597
1598 // Facility to release memory from data structures only needed during index
1599 // construction (including while building combined index). Currently this only
1600 // releases the temporary map used while constructing a correspondence between
1601 // stack ids and their index in the StackIds vector. Mostly impactful when
1602 // building a large combined index.
1604 assert(StackIdToIndex.size() == StackIds.size());
1605 StackIdToIndex.clear();
1606 StackIds.shrink_to_fit();
1607 }
1608
1609 /// Convenience function for doing a DFS on a ValueInfo. Marks the function in
1610 /// the FunctionHasParent map.
1612 std::map<ValueInfo, bool> &FunctionHasParent) {
1613 if (!V.getSummaryList().size())
1614 return; // skip external functions that don't have summaries
1615
1616 // Mark discovered if we haven't yet
1617 auto S = FunctionHasParent.emplace(V, false);
1618
1619 // Stop if we've already discovered this node
1620 if (!S.second)
1621 return;
1622
1624 dyn_cast<FunctionSummary>(V.getSummaryList().front().get());
1625 assert(F != nullptr && "Expected FunctionSummary node");
1626
1627 for (const auto &C : F->calls()) {
1628 // Insert node if necessary
1629 auto S = FunctionHasParent.emplace(C.first, true);
1630
1631 // Skip nodes that we're sure have parents
1632 if (!S.second && S.first->second)
1633 continue;
1634
1635 if (S.second)
1636 discoverNodes(C.first, FunctionHasParent);
1637 else
1638 S.first->second = true;
1639 }
1640 }
1641
1642 // Calculate the callgraph root
1644 // Functions that have a parent will be marked in FunctionHasParent pair.
1645 // Once we've marked all functions, the functions in the map that are false
1646 // have no parent (so they're the roots)
1647 std::map<ValueInfo, bool> FunctionHasParent;
1648
1649 for (auto &S : *this) {
1650 // Skip external functions
1651 if (!S.second.getSummaryList().size() ||
1652 !isa<FunctionSummary>(S.second.getSummaryList().front().get()))
1653 continue;
1654 discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent);
1655 }
1656
1658 // create edges to all roots in the Index
1659 for (auto &P : FunctionHasParent) {
1660 if (P.second)
1661 continue; // skip over non-root nodes
1662 Edges.push_back(std::make_pair(P.first, CalleeInfo{}));
1663 }
1664 return FunctionSummary::makeDummyFunctionSummary(std::move(Edges));
1665 }
1666
1668 return WithGlobalValueDeadStripping;
1669 }
1671 WithGlobalValueDeadStripping = true;
1672 }
1673
1674 bool withAttributePropagation() const { return WithAttributePropagation; }
1676 WithAttributePropagation = true;
1677 }
1678
1679 bool withDSOLocalPropagation() const { return WithDSOLocalPropagation; }
1680 void setWithDSOLocalPropagation() { WithDSOLocalPropagation = true; }
1681
1682 bool withInternalizeAndPromote() const { return WithInternalizeAndPromote; }
1683 void setWithInternalizeAndPromote() { WithInternalizeAndPromote = true; }
1684
1685 bool withWholeProgramVisibility() const { return WithWholeProgramVisibility; }
1686 void setWithWholeProgramVisibility() { WithWholeProgramVisibility = true; }
1687
1688 bool isReadOnly(const GlobalVarSummary *GVS) const {
1689 return WithAttributePropagation && GVS->maybeReadOnly();
1690 }
1691 bool isWriteOnly(const GlobalVarSummary *GVS) const {
1692 return WithAttributePropagation && GVS->maybeWriteOnly();
1693 }
1694
1695 bool withSupportsHotColdNew() const { return WithSupportsHotColdNew; }
1696 void setWithSupportsHotColdNew() { WithSupportsHotColdNew = true; }
1697
1699 return SkipModuleByDistributedBackend;
1700 }
1702 SkipModuleByDistributedBackend = true;
1703 }
1704
1705 bool enableSplitLTOUnit() const { return EnableSplitLTOUnit; }
1706 void setEnableSplitLTOUnit() { EnableSplitLTOUnit = true; }
1707
1708 bool hasUnifiedLTO() const { return UnifiedLTO; }
1709 void setUnifiedLTO() { UnifiedLTO = true; }
1710
1711 bool partiallySplitLTOUnits() const { return PartiallySplitLTOUnits; }
1712 void setPartiallySplitLTOUnits() { PartiallySplitLTOUnits = true; }
1713
1714 bool hasParamAccess() const { return HasParamAccess; }
1715
1716 bool isGlobalValueLive(const GlobalValueSummary *GVS) const {
1717 return !WithGlobalValueDeadStripping || GVS->isLive();
1718 }
1719 LLVM_ABI bool isGUIDLive(GlobalValue::GUID GUID) const;
1720
1721 /// Return a ValueInfo for the index value_type (convenient when iterating
1722 /// index).
1723 ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const {
1724 return ValueInfo(HaveGVs, &R);
1725 }
1726
1727 /// Return a ValueInfo for GUID if it exists, otherwise return ValueInfo().
1729 auto I = GlobalValueMap.find(GUID);
1730 return ValueInfo(HaveGVs, I == GlobalValueMap.end() ? nullptr : &*I);
1731 }
1732
1733 /// Return a ValueInfo for \p GUID.
1735 return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID));
1736 }
1737
1738 // Save a string in the Index. Use before passing Name to
1739 // getOrInsertValueInfo when the string isn't owned elsewhere (e.g. on the
1740 // module's Strtab).
1741 StringRef saveString(StringRef String) { return Saver.save(String); }
1742
1743 /// Return a ValueInfo for \p GUID setting value \p Name.
1745 assert(!HaveGVs);
1746 auto VP = getOrInsertValuePtr(GUID);
1747 VP->second.U.Name = Name;
1748 return ValueInfo(HaveGVs, VP);
1749 }
1750
1751 /// Return a ValueInfo for \p GV and mark it as belonging to GV.
1753 assert(HaveGVs);
1754 auto VP = getOrInsertValuePtr(GV->getGUID());
1755 VP->second.U.GV = GV;
1756 return ValueInfo(HaveGVs, VP);
1757 }
1758
1759 /// Return the GUID for \p OriginalId in the OidGuidMap.
1761 const auto I = OidGuidMap.find(OriginalID);
1762 return I == OidGuidMap.end() ? 0 : I->second;
1763 }
1764
1765 CfiFunctionIndex &cfiFunctionDefs() { return CfiFunctionDefs; }
1766 const CfiFunctionIndex &cfiFunctionDefs() const { return CfiFunctionDefs; }
1767
1768 CfiFunctionIndex &cfiFunctionDecls() { return CfiFunctionDecls; }
1769 const CfiFunctionIndex &cfiFunctionDecls() const { return CfiFunctionDecls; }
1770
1771 /// Add a global value summary for a value.
1773 std::unique_ptr<GlobalValueSummary> Summary) {
1774 addGlobalValueSummary(getOrInsertValueInfo(&GV), std::move(Summary));
1775 }
1776
1777 /// Add a global value summary for a value of the given name.
1779 std::unique_ptr<GlobalValueSummary> Summary) {
1783 std::move(Summary));
1784 }
1785
1786 /// Add a global value summary for the given ValueInfo.
1788 std::unique_ptr<GlobalValueSummary> Summary) {
1789 if (const FunctionSummary *FS = dyn_cast<FunctionSummary>(Summary.get()))
1790 HasParamAccess |= !FS->paramAccesses().empty();
1791 addOriginalName(VI.getGUID(), Summary->getOriginalName());
1792 // Here we have a notionally const VI, but the value it points to is owned
1793 // by the non-const *this.
1794 const_cast<GlobalValueSummaryMapTy::value_type *>(VI.getRef())
1795 ->second.addSummary(std::move(Summary));
1796 }
1797
1798 /// Add an original name for the value of the given GUID.
1800 GlobalValue::GUID OrigGUID) {
1801 if (OrigGUID == 0 || ValueGUID == OrigGUID)
1802 return;
1803 auto [It, Inserted] = OidGuidMap.try_emplace(OrigGUID, ValueGUID);
1804 if (!Inserted && It->second != ValueGUID)
1805 It->second = 0;
1806 }
1807
1808 /// Find the summary for ValueInfo \p VI in module \p ModuleId, or nullptr if
1809 /// not found.
1811 auto SummaryList = VI.getSummaryList();
1812 auto Summary =
1813 llvm::find_if(SummaryList,
1814 [&](const std::unique_ptr<GlobalValueSummary> &Summary) {
1815 return Summary->modulePath() == ModuleId;
1816 });
1817 if (Summary == SummaryList.end())
1818 return nullptr;
1819 return Summary->get();
1820 }
1821
1822 /// Find the summary for global \p GUID in module \p ModuleId, or nullptr if
1823 /// not found.
1825 StringRef ModuleId) const {
1826 auto CalleeInfo = getValueInfo(ValueGUID);
1827 if (!CalleeInfo)
1828 return nullptr; // This function does not have a summary
1829 return findSummaryInModule(CalleeInfo, ModuleId);
1830 }
1831
1832 /// Returns the first GlobalValueSummary for \p GV, asserting that there
1833 /// is only one if \p PerModuleIndex.
1835 bool PerModuleIndex = true) const {
1836 assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
1837 return getGlobalValueSummary(GV.getGUID(), PerModuleIndex);
1838 }
1839
1840 /// Returns the first GlobalValueSummary for \p ValueGUID, asserting that
1841 /// there
1842 /// is only one if \p PerModuleIndex.
1845 bool PerModuleIndex = true) const;
1846
1847 /// Table of modules, containing module hash and id.
1849 return ModulePathStringTable;
1850 }
1851
1852 /// Table of modules, containing hash and id.
1853 StringMap<ModuleHash> &modulePaths() { return ModulePathStringTable; }
1854
1855 /// Get the module SHA1 hash recorded for the given module path.
1856 const ModuleHash &getModuleHash(const StringRef ModPath) const {
1857 auto It = ModulePathStringTable.find(ModPath);
1858 assert(It != ModulePathStringTable.end() && "Module not registered");
1859 return It->second;
1860 }
1861
1862 /// Convenience method for creating a promoted global name
1863 /// for the given value name of a local, and its original module's ID.
1864 static std::string getGlobalNameForLocal(StringRef Name, ModuleHash ModHash) {
1865 std::string Suffix = utostr((uint64_t(ModHash[0]) << 32) |
1866 ModHash[1]); // Take the first 64 bits
1867 return getGlobalNameForLocal(Name, Suffix);
1868 }
1869
1870 static std::string getGlobalNameForLocal(StringRef Name, StringRef Suffix) {
1871 SmallString<256> NewName(Name);
1872 NewName += ".llvm.";
1873 NewName += Suffix;
1874 return std::string(NewName);
1875 }
1876
1877 /// Helper to obtain the unpromoted name for a global value (or the original
1878 /// name if not promoted). Split off the rightmost ".llvm.${hash}" suffix,
1879 /// because it is possible in certain clients (not clang at the moment) for
1880 /// two rounds of ThinLTO optimization and therefore promotion to occur.
1882 std::pair<StringRef, StringRef> Pair = Name.rsplit(".llvm.");
1883 return Pair.first;
1884 }
1885
1887
1888 /// Add a new module with the given \p Hash, mapped to the given \p
1889 /// ModID, and return a reference to the module.
1891 return &*ModulePathStringTable.insert({ModPath, Hash}).first;
1892 }
1893
1894 /// Return module entry for module with the given \p ModPath.
1896 auto It = ModulePathStringTable.find(ModPath);
1897 assert(It != ModulePathStringTable.end() && "Module not registered");
1898 return &*It;
1899 }
1900
1901 /// Return module entry for module with the given \p ModPath.
1902 const ModuleInfo *getModule(StringRef ModPath) const {
1903 auto It = ModulePathStringTable.find(ModPath);
1904 assert(It != ModulePathStringTable.end() && "Module not registered");
1905 return &*It;
1906 }
1907
1908 /// Check if the given Module has any functions available for exporting
1909 /// in the index. We consider any module present in the ModulePathStringTable
1910 /// to have exported functions.
1911 bool hasExportedFunctions(const Module &M) const {
1912 return ModulePathStringTable.count(M.getModuleIdentifier());
1913 }
1914
1915 const TypeIdSummaryMapTy &typeIds() const { return TypeIdMap; }
1916
1917 /// Return an existing or new TypeIdSummary entry for \p TypeId.
1918 /// This accessor can mutate the map and therefore should not be used in
1919 /// the ThinLTO backends.
1921 auto TidIter = TypeIdMap.equal_range(
1923 for (auto &[GUID, TypeIdPair] : make_range(TidIter))
1924 if (TypeIdPair.first == TypeId)
1925 return TypeIdPair.second;
1926 auto It =
1927 TypeIdMap.insert({GlobalValue::getGUIDAssumingExternalLinkage(TypeId),
1928 {TypeIdSaver.save(TypeId), TypeIdSummary()}});
1929 return It->second.second;
1930 }
1931
1932 /// This returns either a pointer to the type id summary (if present in the
1933 /// summary map) or null (if not present). This may be used when importing.
1935 auto TidIter = TypeIdMap.equal_range(
1937 for (const auto &[GUID, TypeIdPair] : make_range(TidIter))
1938 if (TypeIdPair.first == TypeId)
1939 return &TypeIdPair.second;
1940 return nullptr;
1941 }
1942
1944 return const_cast<TypeIdSummary *>(
1945 static_cast<const ModuleSummaryIndex *>(this)->getTypeIdSummary(
1946 TypeId));
1947 }
1948
1949 const auto &typeIdCompatibleVtableMap() const {
1950 return TypeIdCompatibleVtableMap;
1951 }
1952
1953 /// Return an existing or new TypeIdCompatibleVtableMap entry for \p TypeId.
1954 /// This accessor can mutate the map and therefore should not be used in
1955 /// the ThinLTO backends.
1958 return TypeIdCompatibleVtableMap[TypeIdSaver.save(TypeId)];
1959 }
1960
1961 /// For the given \p TypeId, this returns the TypeIdCompatibleVtableMap
1962 /// entry if present in the summary map. This may be used when importing.
1963 std::optional<TypeIdCompatibleVtableInfo>
1965 auto I = TypeIdCompatibleVtableMap.find(TypeId);
1966 if (I == TypeIdCompatibleVtableMap.end())
1967 return std::nullopt;
1968 return I->second;
1969 }
1970
1971 /// Collect for the given module the list of functions it defines
1972 /// (GUID -> Summary).
1973 LLVM_ABI void
1975 GVSummaryMapTy &GVSummaryMap) const;
1976
1977 /// Collect for each module the list of Summaries it defines (GUID ->
1978 /// Summary).
1979 template <class Map>
1980 void
1981 collectDefinedGVSummariesPerModule(Map &ModuleToDefinedGVSummaries) const {
1982 for (const auto &GlobalList : *this) {
1983 auto GUID = GlobalList.first;
1984 for (const auto &Summary : GlobalList.second.getSummaryList()) {
1985 ModuleToDefinedGVSummaries[Summary->modulePath()][GUID] = Summary.get();
1986 }
1987 }
1988 }
1989
1990 /// Print to an output stream.
1991 LLVM_ABI void print(raw_ostream &OS, bool IsForDebug = false) const;
1992
1993 /// Dump to stderr (for debugging).
1994 LLVM_ABI void dump() const;
1995
1996 /// Export summary to dot file for GraphViz.
1997 LLVM_ABI void
1999 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) const;
2000
2001 /// Print out strongly connected components for debugging.
2002 LLVM_ABI void dumpSCCs(raw_ostream &OS);
2003
2004 /// Do the access attribute and DSOLocal propagation in combined index.
2005 LLVM_ABI void
2006 propagateAttributes(const DenseSet<GlobalValue::GUID> &PreservedSymbols);
2007
2008 /// Checks if we can import global variable from another module.
2010 bool AnalyzeRefs) const;
2011
2012 /// Same as above but checks whether the global var is importable as a
2013 /// declaration.
2015 bool AnalyzeRefs, bool &CanImportDecl) const;
2016};
2017
2018/// GraphTraits definition to build SCC for the index
2019template <> struct GraphTraits<ValueInfo> {
2022
2024 return P.first;
2025 }
2028 decltype(&valueInfoFromEdge)>;
2029
2032
2033 static NodeRef getEntryNode(ValueInfo V) { return V; }
2034
2036 if (!N.getSummaryList().size()) // handle external function
2037 return ChildIteratorType(
2038 FunctionSummary::ExternalNode.CallGraphEdgeList.begin(),
2041 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2042 return ChildIteratorType(F->CallGraphEdgeList.begin(), &valueInfoFromEdge);
2043 }
2044
2046 if (!N.getSummaryList().size()) // handle external function
2047 return ChildIteratorType(
2048 FunctionSummary::ExternalNode.CallGraphEdgeList.end(),
2051 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2052 return ChildIteratorType(F->CallGraphEdgeList.end(), &valueInfoFromEdge);
2053 }
2054
2056 if (!N.getSummaryList().size()) // handle external function
2057 return FunctionSummary::ExternalNode.CallGraphEdgeList.begin();
2058
2060 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2061 return F->CallGraphEdgeList.begin();
2062 }
2063
2065 if (!N.getSummaryList().size()) // handle external function
2066 return FunctionSummary::ExternalNode.CallGraphEdgeList.end();
2067
2069 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2070 return F->CallGraphEdgeList.end();
2071 }
2072
2073 static NodeRef edge_dest(EdgeRef E) { return E.first; }
2074};
2075
2076template <>
2079 std::unique_ptr<GlobalValueSummary> Root =
2080 std::make_unique<FunctionSummary>(I->calculateCallGraphRoot());
2081 GlobalValueSummaryInfo G(I->haveGVs());
2082 G.addSummary(std::move(Root));
2083 static auto P =
2084 GlobalValueSummaryMapTy::value_type(GlobalValue::GUID(0), std::move(G));
2085 return ValueInfo(I->haveGVs(), &P);
2086 }
2087};
2088} // end namespace llvm
2089
2090#endif // LLVM_IR_MODULESUMMARYINDEX_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_PREFERRED_TYPE(T)
\macro LLVM_PREFERRED_TYPE Adjust type of bit-field in debug info.
Definition Compiler.h:729
#define LLVM_ABI
Definition Compiler.h:213
DXIL Finalize Linkage
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define P(N)
if(PassOpts->AAPipeline)
This file contains some templates that are useful if you are working with the STL at all.
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
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:40
GUIDIterator guid_end() const
size_t count(StringRef S) const
std::vector< StringRef > symbols() const
iterator_range< GUIDIterator > guids() const
iterator_range< NestedIterator > forGuid(GlobalValue::GUID GUID) const
GUIDIterator guid_begin() const
This class represents a range of values.
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
Function summary information to aid decisions and implementation of importing.
static LLVM_ABI 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.
LLVM_ABI 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 LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
Definition Globals.cpp:78
static bool isLocalLinkage(LinkageTypes Linkage)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
static bool isExternalLinkage(LinkageTypes Linkage)
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition GlobalValue.h:67
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
Global variable summary information to aid decisions and implementation of importing.
void setVCallVisibility(GlobalObject::VCallVisibility Vis)
struct llvm::GlobalVarSummary::GVarFlags VarFlags
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)
A helper class to return the specified delimiter string after the first invocation of operator String...
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.
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.
static constexpr uint64_t BitcodeSummaryVersion
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 ...
LLVM_ABI bool isGUIDLive(GlobalValue::GUID GUID) const
const_gvsummary_iterator end() const
bool isReadOnly(const GlobalVarSummary *GVS) const
LLVM_ABI void setFlags(uint64_t Flags)
const_gvsummary_iterator begin() const
CfiFunctionIndex & cfiFunctionDecls()
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()
const CfiFunctionIndex & cfiFunctionDefs() const
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)
LLVM_ABI void collectDefinedFunctionsForModule(StringRef ModulePath, GVSummaryMapTy &GVSummaryMap) const
Collect for the given module the list of functions it defines (GUID -> Summary).
const auto & typeIdCompatibleVtableMap() const
LLVM_ABI 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.
LLVM_ABI void propagateAttributes(const DenseSet< GlobalValue::GUID > &PreservedSymbols)
Do the access attribute and DSOLocal propagation in combined index.
const StringMap< ModuleHash > & modulePaths() const
Table of modules, containing module hash and id.
LLVM_ABI void dump() const
Dump to stderr (for debugging).
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.
static std::string getGlobalNameForLocal(StringRef Name, ModuleHash ModHash)
Convenience method for creating a promoted global name for the given value name of a local,...
LLVM_ABI 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.
LLVM_ABI void print(raw_ostream &OS, bool IsForDebug=false) const
Print to an output stream.
bool skipModuleByDistributedBackend() const
CfiFunctionIndex & cfiFunctionDefs()
ValueInfo getOrInsertValueInfo(const GlobalValue *GV)
Return a ValueInfo for GV and mark it as belonging to GV.
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().
LLVM_ABI uint64_t getFlags() const
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.
LLVM_ABI 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()
const CfiFunctionIndex & cfiFunctionDecls() const
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:67
PointerIntPair - This class implements a pair of a pointer and small integer.
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...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
StringMapEntry< ModuleHash > value_type
Definition StringMap.h:217
bool insert(MapEntryTy *KeyValue)
insert - Insert the specified key/value pair into the map.
Definition StringMap.h:321
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition StringSaver.h:22
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition StringSaver.h:45
bool hasName() const
Definition Value.h:262
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
A raw_ostream that writes to an std::string.
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#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 Types.h:26
@ Offset
Definition DWP.cpp:532
bool operator<(int64_t V1, const APSInt &V2)
Definition APSInt.h:360
StringMapEntry< Value * > ValueName
Definition Value.h:56
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
hash_code hash_value(const FixedPointSemantics &Val)
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
std::vector< std::unique_ptr< GlobalValueSummary > > GlobalValueSummaryList
InterleavedRange< Range > interleaved(const Range &R, StringRef Separator=", ", StringRef Prefix="", StringRef Suffix="")
Output range R as a sequence of interleaved elements.
const char * getHotnessName(CalleeInfo::HotnessType HT)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
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).
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
bool operator!=(uint64_t V1, const APInt &V2)
Definition APInt.h:2128
DenseMap< GlobalValue::GUID, GlobalValueSummary * > GVSummaryMapTy
Map of global value GUID to its summary, used to identify values defined in a particular module,...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2208
std::string utostr(uint64_t X, bool isNeg=false)
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
auto map_range(ContainerTy &&C, FuncTy F)
Return a range that applies F to the elements of C.
Definition STLExtras.h:366
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1746
constexpr detail::StaticCastFunc< To > StaticCastTo
Function objects corresponding to the Cast types defined above.
Definition Casting.h:882
GlobalValueSummaryMapTy::iterator gvsummary_iterator
std::map< GlobalValue::GUID, GlobalValueSummaryInfo > GlobalValueSummaryMapTy
Map from global value GUID to corresponding summary structures.
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
StringMap< ModuleHash > ModulePathStringTableTy
String table to hold/own module path strings, as well as a hash of the module.
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
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:1772
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
GlobalValueSummaryMapTy::const_iterator const_gvsummary_iterator
Type used for iterating through the global value summary map.
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#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.
bool hasTailCall() const
CalleeInfo(HotnessType Hotness, bool HasTC)
void updateHotness(const HotnessType OtherHotness)
HotnessType getHotness() const
void setHasTailCall(const bool HasTC)
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...
A specification for a virtual function call with all constant integer arguments.
Flags specific to function summaries.
FFlags & operator&=(const FFlags &RHS)
Call(uint64_t ParamNo, ValueInfo Callee, const ConstantRange &Offsets)
ParamAccess(uint64_t ParamNo, const ConstantRange &Use)
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
ConstantRange Use
The range contains byte offsets from the parameter pointer which accessed by the function.
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.
void addSummary(std::unique_ptr< GlobalValueSummary > Summary)
Add a summary corresponding to a global value definition in a module with the corresponding GUID.
void verifyLocal() const
Verify that the HasLocal flag is consistent with the SummaryList.
ArrayRef< std::unique_ptr< GlobalValueSummary > > getSummaryList() const
Access a read-only list of global value summary structures for a particular value held in the GlobalV...
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 Promoted
This symbol was promoted.
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)
SmallVector< FunctionSummary::EdgeTy, 0 >::iterator ChildEdgeIteratorType
mapped_iterator< SmallVector< FunctionSummary::EdgeTy, 0 >::iterator, decltype(&valueInfoFromEdge)> ChildIteratorType
static NodeRef getEntryNode(ValueInfo V)
static ChildIteratorType child_end(NodeRef N)
static ChildEdgeIteratorType child_edge_end(NodeRef N)
FunctionSummary::EdgeTy & EdgeRef
typename ModuleSummaryIndex *::UnknownGraphTypeError NodeRef
Definition GraphTraits.h:95
Summary of a single MIB in a memprof metadata on allocations.
MIBInfo(AllocationType AllocType, SmallVector< unsigned > StackIdIndices)
AllocationType AllocType
SmallVector< unsigned > StackIdIndices
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
LLVM_ABI 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
void verifyLocal() const
ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R)
bool isReadOnly() const
LLVM_ABI bool canAutoHide() const
Checks if all copies are eligible for auto-hiding (have flag set).
unsigned getAccessSpecifier() const
ValueInfo()=default
LLVM_ABI bool isDSOLocal(bool WithDSOLocalPropagation=false) const
Checks if all summaries are DSO local (have the flag set).
GlobalValue::GUID getGUID() const
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::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.
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
Definition YAMLTraits.h:62
const GlobalValue * GV
The GlobalValue corresponding to this summary.
StringRef Name
Summary string representation.