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"
21#include "llvm/ADT/SetVector.h"
26#include "llvm/ADT/StringMap.h"
27#include "llvm/ADT/StringRef.h"
28#include "llvm/ADT/StringSet.h"
29#include "llvm/ADT/iterator.h"
32#include "llvm/IR/GlobalValue.h"
33#include "llvm/IR/Module.h"
40#include <algorithm>
41#include <array>
42#include <cassert>
43#include <cstddef>
44#include <cstdint>
45#include <deque>
46#include <map>
47#include <memory>
48#include <optional>
49#include <set>
50#include <string>
51#include <utility>
52#include <vector>
53
54namespace llvm {
55
56template <class GraphType> struct GraphTraits;
57
58namespace yaml {
59
60template <typename T> struct MappingTraits;
61
62} // end namespace yaml
63
64/// Class to accumulate and hold information about a callee.
65struct CalleeInfo {
66 enum class HotnessType : uint8_t {
68 Cold = 1,
69 None = 2,
70 Hot = 3,
72 };
73
74 // The size of the bit-field might need to be adjusted if more values are
75 // added to HotnessType enum.
77
78 // True if at least one of the calls to the callee is a tail call.
81
85 explicit CalleeInfo(HotnessType Hotness, bool HasTC)
86 : Hotness(static_cast<uint32_t>(Hotness)), HasTailCall(HasTC) {}
87
88 void updateHotness(const HotnessType OtherHotness) {
89 Hotness = std::max(Hotness, static_cast<uint32_t>(OtherHotness));
90 }
91
92 bool hasTailCall() const { return HasTailCall; }
93
94 void setHasTailCall(const bool HasTC) { HasTailCall = HasTC; }
95
97};
98
100 switch (HT) {
102 return "unknown";
104 return "cold";
106 return "none";
108 return "hot";
110 return "critical";
111 }
112 llvm_unreachable("invalid hotness");
113}
114
115class GlobalValueSummary;
116
117using GlobalValueSummaryList = std::vector<std::unique_ptr<GlobalValueSummary>>;
118
119struct alignas(8) GlobalValueSummaryInfo {
120 union NameOrGV {
121 NameOrGV(bool HaveGVs) {
122 if (HaveGVs)
123 GV = nullptr;
124 else
125 Name = "";
126 }
127
128 /// The GlobalValue corresponding to this summary. This is only used in
129 /// per-module summaries and when the IR is available. E.g. when module
130 /// analysis is being run, or when parsing both the IR and the summary
131 /// from assembly.
133
134 /// Summary string representation. This StringRef points to BC module
135 /// string table and is valid until module data is stored in memory.
136 /// This is guaranteed to happen until runThinLTOBackend function is
137 /// called, so it is safe to use this field during thin link. This field
138 /// is only valid if summary index was loaded from BC file.
140 } U;
141
142 inline GlobalValueSummaryInfo(bool HaveGVs);
143
144 /// Access a read-only list of global value summary structures for a
145 /// particular value held in the GlobalValueMap.
147 return SummaryList;
148 }
149
150 /// Add a summary corresponding to a global value definition in a module with
151 /// the corresponding GUID.
152 inline void addSummary(std::unique_ptr<GlobalValueSummary> Summary);
153
154 /// Verify that the HasLocal flag is consistent with the SummaryList. Should
155 /// only be called prior to index-based internalization and promotion.
156 inline void verifyLocal() const;
157
158 bool hasLocal() const { return HasLocal; }
159
160private:
161 /// List of global value summary structures for a particular value held
162 /// in the GlobalValueMap. Requires a vector in the case of multiple
163 /// COMDAT values of the same name, weak symbols, locals of the same name when
164 /// compiling without sufficient distinguishing path, or (theoretically) hash
165 /// collisions. Each summary is from a different module.
166 GlobalValueSummaryList SummaryList;
167
168 /// True if the SummaryList contains at least one summary with local linkage.
169 /// In most cases there should be only one, unless translation units with
170 /// same-named locals were compiled without distinguishing path. And generally
171 /// there should not be a mix of local and non-local summaries, because the
172 /// GUID for a local is computed with the path prepended and a ';' delimiter.
173 /// In extremely rare cases there could be a GUID hash collision. Having the
174 /// flag saves having to walk through all summaries to prove the existence or
175 /// not of any locals.
176 /// NOTE: this flag is set when the index is built. It does not reflect
177 /// index-based internalization and promotion decisions. Generally most
178 /// index-based analysis occurs before then, but any users should assert that
179 /// the withInternalizeAndPromote() flag is not set on the index.
180 /// TODO: Replace checks in various ThinLTO analyses that loop through all
181 /// summaries to handle the local case with a check of the flag.
182 bool HasLocal : 1;
183};
184
185/// Map from global value GUID to corresponding summary structures. Use a
186/// DenseMap for O(1) lookup and a std::deque for storage. std::deque
187/// guarantees that pointers to elements are not invalidated by push_back,
188/// which is required because ValueInfo stores a raw pointer to elements of
189/// this container.
191public:
194 using value_type = std::pair<key_type, mapped_type>;
195 using iterator = std::deque<value_type>::iterator;
196 using const_iterator = std::deque<value_type>::const_iterator;
197 using size_type = std::deque<value_type>::size_type;
198
199private:
200 /// Vector of pointers into Storage, used for key-sorted iteration.
201 using SortedEntriesVec = SmallVector<const value_type *, 0>;
202
204 std::deque<value_type> Storage;
205
206public:
207 template <typename... Ts>
208 std::pair<iterator, bool> try_emplace(key_type Key, Ts &&...Args) {
209 auto Res = Map.try_emplace(Key, Storage.size());
210 if (Res.second) {
211 Storage.emplace_back(std::piecewise_construct, std::forward_as_tuple(Key),
212 std::forward_as_tuple(std::forward<Ts>(Args)...));
213 return {std::prev(Storage.end()), true};
214 }
215 return {Storage.begin() + Res.first->second, false};
216 }
217
219 auto It = Map.find(Key);
220 return It == Map.end() ? Storage.end() : Storage.begin() + It->second;
221 }
222
224 auto It = Map.find(Key);
225 return It == Map.end() ? Storage.end() : Storage.begin() + It->second;
226 }
227
228 iterator begin() { return Storage.begin(); }
229 const_iterator begin() const { return Storage.begin(); }
230 iterator end() { return Storage.end(); }
231 const_iterator end() const { return Storage.end(); }
232 size_type size() const { return Storage.size(); }
233 bool empty() const { return Storage.empty(); }
234
235 /// An owning range over the entries sorted by key, yielding each entry by
236 /// reference.
238 SortedEntriesVec Entries;
239
240 public:
242
243 explicit SortedEntriesRange(SortedEntriesVec Entries)
244 : Entries(std::move(Entries)) {}
245
246 iterator begin() const { return iterator(Entries.begin()); }
247 iterator end() const { return iterator(Entries.end()); }
248 size_t size() const { return Entries.size(); }
249 bool empty() const { return Entries.empty(); }
250 };
251
252 /// Return an owning range over the entries sorted by key. Storage is in
253 /// insertion order; some serialization paths and tests rely on key-sorted
254 /// iteration.
256 return SortedEntriesRange(getSortedEntries());
257 }
258
259private:
260 SortedEntriesVec getSortedEntries() const {
261 SortedEntriesVec Sorted;
262 Sorted.reserve(Storage.size());
263 for (const auto &E : Storage)
264 Sorted.push_back(&E);
265 llvm::sort(Sorted, [](const auto *A, const auto *B) {
266 return A->first < B->first;
267 });
268 return Sorted;
269 }
270};
271
273
274/// Struct that holds a reference to a particular GUID in a global value
275/// summary.
276struct ValueInfo {
277 enum Flags { HaveGV = 1, ReadOnly = 2, WriteOnly = 4 };
280
281 ValueInfo() = default;
283 RefAndFlags.setPointer(R);
284 RefAndFlags.setInt(HaveGVs);
285 }
286
287 explicit operator bool() const { return getRef(); }
288
289 GlobalValue::GUID getGUID() const { return getRef()->first; }
290 const GlobalValue *getValue() const {
291 assert(haveGVs());
292 return getRef()->second.U.GV;
293 }
294
296 return getRef()->second.getSummaryList();
297 }
298
299 void verifyLocal() const { getRef()->second.verifyLocal(); }
300
301 bool hasLocal() const { return getRef()->second.hasLocal(); }
302
303 // Even if the index is built with GVs available, we may not have one for
304 // summary entries synthesized for profiled indirect call targets.
305 bool hasName() const { return !haveGVs() || getValue(); }
306
307 StringRef name() const {
308 assert(!haveGVs() || getRef()->second.U.GV);
309 return haveGVs() ? getRef()->second.U.GV->getName()
310 : getRef()->second.U.Name;
311 }
312
313 bool haveGVs() const { return RefAndFlags.getInt() & HaveGV; }
314 bool isReadOnly() const {
316 return RefAndFlags.getInt() & ReadOnly;
317 }
318 bool isWriteOnly() const {
320 return RefAndFlags.getInt() & WriteOnly;
321 }
322 unsigned getAccessSpecifier() const {
324 return RefAndFlags.getInt() & (ReadOnly | WriteOnly);
325 }
327 unsigned BadAccessMask = ReadOnly | WriteOnly;
328 return (RefAndFlags.getInt() & BadAccessMask) != BadAccessMask;
329 }
330 void setReadOnly() {
331 // We expect ro/wo attribute to set only once during
332 // ValueInfo lifetime.
334 RefAndFlags.setInt(RefAndFlags.getInt() | ReadOnly);
335 }
338 RefAndFlags.setInt(RefAndFlags.getInt() | WriteOnly);
339 }
340
342 return RefAndFlags.getPointer();
343 }
344
345 /// Returns the most constraining visibility among summaries. The
346 /// visibilities, ordered from least to most constraining, are: default,
347 /// protected and hidden.
349
350 /// Checks if all summaries are DSO local (have the flag set). When DSOLocal
351 /// propagation has been done, set the parameter to enable fast check.
352 LLVM_ABI bool isDSOLocal(bool WithDSOLocalPropagation = false) const;
353
354 /// Checks if all copies are eligible for auto-hiding (have flag set).
355 LLVM_ABI bool canAutoHide() const;
356
358};
359
361 OS << VI.getGUID();
362 if (!VI.name().empty())
363 OS << " (" << VI.name() << ")";
364 return OS;
365}
366
367inline bool operator==(const ValueInfo &A, const ValueInfo &B) {
368 assert(A.getRef() && B.getRef() &&
369 "Need ValueInfo with non-null Ref for comparison");
370 return A.getRef() == B.getRef();
371}
372
373inline bool operator!=(const ValueInfo &A, const ValueInfo &B) {
374 assert(A.getRef() && B.getRef() &&
375 "Need ValueInfo with non-null Ref for comparison");
376 return A.getRef() != B.getRef();
377}
378
379inline bool operator<(const ValueInfo &A, const ValueInfo &B) {
380 assert(A.getRef() && B.getRef() &&
381 "Need ValueInfo with non-null Ref to compare GUIDs");
382 return A.getGUID() < B.getGUID();
383}
384
385template <> struct DenseMapInfo<ValueInfo> {
386 static bool isEqual(ValueInfo L, ValueInfo R) {
387 // We are not supposed to mix ValueInfo(s) with different HaveGVs flag
388 // in a same container.
389 assert(L.haveGVs() == R.haveGVs());
390 return L.getRef() == R.getRef();
391 }
392 static unsigned getHashValue(ValueInfo I) { return hash_value(I.getRef()); }
393};
394
395// For optional hinted size reporting, holds a pair of the full stack id
396// (pre-trimming, from the full context in the profile), and the associated
397// total profiled size.
402
403/// Summary of memprof callsite metadata.
405 // Actual callee function.
407
408 // Used to record whole program analysis cloning decisions.
409 // The ThinLTO backend will need to create as many clones as there are entries
410 // in the vector (it is expected and should be confirmed that all such
411 // summaries in the same FunctionSummary have the same number of entries).
412 // Each index records version info for the corresponding clone of this
413 // function. The value is the callee clone it calls (becomes the appended
414 // suffix id). Index 0 is the original version, and a value of 0 calls the
415 // original callee.
417
418 // Represents stack ids in this context, recorded as indices into the
419 // StackIds vector in the summary index, which in turn holds the full 64-bit
420 // stack ids. This reduces memory as there are in practice far fewer unique
421 // stack ids than stack id references.
423
430};
431
433 OS << "Callee: " << SNI.Callee;
434 OS << " Clones: " << llvm::interleaved(SNI.Clones);
435 OS << " StackIds: " << llvm::interleaved(SNI.StackIdIndices);
436 return OS;
437}
438
439// Allocation type assigned to an allocation reached by a given context.
440// More can be added, now this is cold, notcold and hot.
441// Values should be powers of two so that they can be ORed, in particular to
442// track allocations that have different behavior with different calling
443// contexts.
445 None = 0,
447 Cold = 2,
448 Hot = 4,
449 All = 7 // This should always be set to the OR of all values.
450};
451
452/// Summary of a single MIB in a memprof metadata on allocations.
453struct MIBInfo {
454 // The allocation type for this profiled context.
456
457 // Represents stack ids in this context, recorded as indices into the
458 // StackIds vector in the summary index, which in turn holds the full 64-bit
459 // stack ids. This reduces memory as there are in practice far fewer unique
460 // stack ids than stack id references.
462
465};
466
467inline raw_ostream &operator<<(raw_ostream &OS, const MIBInfo &MIB) {
468 OS << "AllocType " << (unsigned)MIB.AllocType;
469 OS << " StackIds: " << llvm::interleaved(MIB.StackIdIndices);
470 return OS;
471}
472
473/// Summary of memprof metadata on allocations.
474struct AllocInfo {
475 // Used to record whole program analysis cloning decisions.
476 // The ThinLTO backend will need to create as many clones as there are entries
477 // in the vector (it is expected and should be confirmed that all such
478 // summaries in the same FunctionSummary have the same number of entries).
479 // Each index records version info for the corresponding clone of this
480 // function. The value is the allocation type of the corresponding allocation.
481 // Index 0 is the original version. Before cloning, index 0 may have more than
482 // one allocation type.
484
485 // Vector of MIBs in this memprof metadata.
486 std::vector<MIBInfo> MIBs;
487
488 // If requested, keep track of full stack contexts and total profiled sizes
489 // for each MIB. This will be a vector of the same length and order as the
490 // MIBs vector, if non-empty. Note that each MIB in the summary can have
491 // multiple of these as we trim the contexts when possible during matching.
492 // For hinted size reporting we, however, want the original pre-trimmed full
493 // stack context id for better correlation with the profile.
494 std::vector<std::vector<ContextTotalSize>> ContextSizeInfos;
495
496 AllocInfo(std::vector<MIBInfo> MIBs) : MIBs(std::move(MIBs)) {
497 Versions.push_back(0);
498 }
501};
502
504 OS << "Versions: "
506
507 OS << " MIB:\n";
508 for (auto &M : AE.MIBs)
509 OS << "\t\t" << M << "\n";
510 if (!AE.ContextSizeInfos.empty()) {
511 OS << "\tContextSizeInfo per MIB:\n";
512 for (auto Infos : AE.ContextSizeInfos) {
513 OS << "\t\t";
514 ListSeparator InfoLS;
515 for (auto [FullStackId, TotalSize] : Infos)
516 OS << InfoLS << "{ " << FullStackId << ", " << TotalSize << " }";
517 OS << "\n";
518 }
519 }
520 return OS;
521}
522
523/// Function and variable summary information to aid decisions and
524/// implementation of importing.
526public:
527 /// Sububclass discriminator (for dyn_cast<> et al.)
529
530 enum ImportKind : unsigned {
531 // The global value definition corresponding to the summary should be
532 // imported from source module
534
535 // When its definition doesn't exist in the destination module and not
536 // imported (e.g., function is too large to be inlined), the global value
537 // declaration corresponding to the summary should be imported, or the
538 // attributes from summary should be annotated on the function declaration.
540 };
541
542 /// Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
543 struct GVFlags {
544 /// The linkage type of the associated global value.
545 ///
546 /// One use is to flag values that have local linkage types and need to
547 /// have module identifier appended before placing into the combined
548 /// index, to disambiguate from other values with the same name.
549 /// In the future this will be used to update and optimize linkage
550 /// types based on global summary-based analysis.
551 unsigned Linkage : 4;
552
553 /// Indicates the visibility.
554 unsigned Visibility : 2;
555
556 /// Indicate if the global value cannot be imported (e.g. it cannot
557 /// be renamed or references something that can't be renamed).
559
560 /// In per-module summary, indicate that the global value must be considered
561 /// a live root for index-based liveness analysis. Used for special LLVM
562 /// values such as llvm.global_ctors that the linker does not know about.
563 ///
564 /// In combined summary, indicate that the global value is live.
565 unsigned Live : 1;
566
567 /// Indicates that the linker resolved the symbol to a definition from
568 /// within the same linkage unit.
569 unsigned DSOLocal : 1;
570
571 /// In the per-module summary, indicates that the global value is
572 /// linkonce_odr and global unnamed addr (so eligible for auto-hiding
573 /// via hidden visibility). In the combined summary, indicates that the
574 /// prevailing linkonce_odr copy can be auto-hidden via hidden visibility
575 /// when it is upgraded to weak_odr in the backend. This is legal when
576 /// all copies are eligible for auto-hiding (i.e. all copies were
577 /// linkonce_odr global unnamed addr. If any copy is not (e.g. it was
578 /// originally weak_odr, we cannot auto-hide the prevailing copy as it
579 /// means the symbol was externally visible.
580 unsigned CanAutoHide : 1;
581
582 /// This field is written by the ThinLTO indexing step to postlink combined
583 /// summary. The value is interpreted as 'ImportKind' enum defined above.
584 unsigned ImportType : 1;
585
586 /// This symbol was promoted. Thinlink stages need to be aware of this
587 /// transition
588 unsigned Promoted : 1;
589
590 /// This field is written by the ThinLTO prelink stage to decide whether
591 /// a particular static global value should be promoted or not.
593
594 /// Convenience Constructors
605 };
606
607private:
608 /// Kind of summary for use in dyn_cast<> et al.
609 SummaryKind Kind;
610
611 GVFlags Flags;
612
613 /// This is the hash of the name of the symbol in the original file. It is
614 /// identical to the GUID for global symbols, but differs for local since the
615 /// GUID includes the module level id in the hash.
616 GlobalValue::GUID OriginalName = 0;
617
618 /// Path of module IR containing value's definition, used to locate
619 /// module during importing.
620 ///
621 /// This is only used during parsing of the combined index, or when
622 /// parsing the per-module index for creation of the combined summary index,
623 /// not during writing of the per-module index which doesn't contain a
624 /// module path string table.
625 StringRef ModulePath;
626
627 /// List of values referenced by this global value's definition
628 /// (either by the initializer of a global variable, or referenced
629 /// from within a function). This does not include functions called, which
630 /// are listed in the derived FunctionSummary object.
631 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
632 /// smaller memory footprint.
633 SmallVector<ValueInfo, 0> RefEdgeList;
634
635protected:
638 : Kind(K), Flags(Flags), RefEdgeList(std::move(Refs)) {
639 assert((K != AliasKind || Refs.empty()) &&
640 "Expect no references for AliasSummary");
641 }
642
643public:
644 virtual ~GlobalValueSummary() = default;
645
646 /// Returns the hash of the original name, it is identical to the GUID for
647 /// externally visible symbols, but not for local ones.
648 GlobalValue::GUID getOriginalName() const { return OriginalName; }
649
650 /// Initialize the original name hash in this summary.
651 void setOriginalName(GlobalValue::GUID Name) { OriginalName = Name; }
652
653 /// Which kind of summary subclass this is.
654 SummaryKind getSummaryKind() const { return Kind; }
655
656 /// Set the path to the module containing this function, for use in
657 /// the combined index.
658 void setModulePath(StringRef ModPath) { ModulePath = ModPath; }
659
660 /// Get the path to the module containing this function.
661 StringRef modulePath() const { return ModulePath; }
662
663 /// Get the flags for this GlobalValue (see \p struct GVFlags).
664 GVFlags flags() const { return Flags; }
665
666 /// Return linkage type recorded for this global value.
668 return static_cast<GlobalValue::LinkageTypes>(Flags.Linkage);
669 }
670
671 bool wasPromoted() const { return Flags.Promoted; }
672
673 void promote() {
675 "unexpected (re-)promotion of non-local symbol");
676 assert(!Flags.Promoted);
677 Flags.Promoted = true;
679 }
680
681 /// Sets the linkage to the value determined by global summary-based
682 /// optimization. Will be applied in the ThinLTO backends.
685 assert(!GlobalValue::isExternalLinkage(Linkage) && "use `promote` instead");
686 Flags.Linkage = Linkage;
687 }
688
692
693 /// Return true if this global value can't be imported.
694 bool notEligibleToImport() const { return Flags.NotEligibleToImport; }
695
696 bool isLive() const { return Flags.Live; }
697
698 void setLive(bool Live) { Flags.Live = Live; }
699
700 void setDSOLocal(bool Local) { Flags.DSOLocal = Local; }
701
702 bool isDSOLocal() const { return Flags.DSOLocal; }
703
704 void setCanAutoHide(bool CanAutoHide) { Flags.CanAutoHide = CanAutoHide; }
705
706 bool canAutoHide() const { return Flags.CanAutoHide; }
707
708 bool shouldImportAsDecl() const {
709 return Flags.ImportType == GlobalValueSummary::ImportKind::Declaration;
710 }
711
712 void setImportKind(ImportKind IK) { Flags.ImportType = IK; }
713
714 void setNoRenameOnPromotion(bool NoRenameOnPromotion) {
715 Flags.NoRenameOnPromotion = NoRenameOnPromotion;
716 }
717
718 bool noRenameOnPromotion() const { return Flags.NoRenameOnPromotion; }
719
721 return static_cast<ImportKind>(Flags.ImportType);
722 }
723
725 return (GlobalValue::VisibilityTypes)Flags.Visibility;
726 }
728 Flags.Visibility = (unsigned)Vis;
729 }
730
731 /// Flag that this global value cannot be imported.
732 void setNotEligibleToImport() { Flags.NotEligibleToImport = true; }
733
734 /// Return the list of values referenced by this global value definition.
735 ArrayRef<ValueInfo> refs() const { return RefEdgeList; }
736
737 /// If this is an alias summary, returns the summary of the aliased object (a
738 /// global variable or function), otherwise returns itself.
740 const GlobalValueSummary *getBaseObject() const;
741
742 friend class ModuleSummaryIndex;
743};
744
746 : U(HaveGVs), HasLocal(false) {}
747
749 std::unique_ptr<GlobalValueSummary> Summary) {
750 if (GlobalValue::isLocalLinkage(Summary->linkage()))
751 HasLocal = true;
752 return SummaryList.push_back(std::move(Summary));
753}
754
756 assert(HasLocal ==
757 llvm::any_of(SummaryList,
758 [](const std::unique_ptr<GlobalValueSummary> &Summary) {
759 return GlobalValue::isLocalLinkage(Summary->linkage());
760 }));
761}
762
763/// Alias summary information.
765 ValueInfo AliaseeValueInfo;
766
767 /// This is the Aliasee in the same module as alias (could get from VI, trades
768 /// memory for time). Note that this pointer may be null (and the value info
769 /// empty) when we have a distributed index where the alias is being imported
770 /// (as a copy of the aliasee), but the aliasee is not.
771 GlobalValueSummary *AliaseeSummary = nullptr;
772
773public:
776
777 /// Check if this is an alias summary.
778 static bool classof(const GlobalValueSummary *GVS) {
779 return GVS->getSummaryKind() == AliasKind;
780 }
781
782 void setAliasee(ValueInfo &AliaseeVI, GlobalValueSummary *Aliasee) {
783 AliaseeValueInfo = AliaseeVI;
784 AliaseeSummary = Aliasee;
785 }
786
787 bool hasAliasee() const {
788 assert(!!AliaseeSummary == (AliaseeValueInfo &&
789 !AliaseeValueInfo.getSummaryList().empty()) &&
790 "Expect to have both aliasee summary and summary list or neither");
791 return !!AliaseeSummary;
792 }
793
795 assert(AliaseeSummary && "Unexpected missing aliasee summary");
796 return *AliaseeSummary;
797 }
798
800 return const_cast<GlobalValueSummary &>(
801 static_cast<const AliasSummary *>(this)->getAliasee());
802 }
804 assert(AliaseeValueInfo && "Unexpected missing aliasee");
805 return AliaseeValueInfo;
806 }
808 assert(AliaseeValueInfo && "Unexpected missing aliasee");
809 return AliaseeValueInfo.getGUID();
810 }
811};
812
814 if (auto *AS = dyn_cast<AliasSummary>(this))
815 return &AS->getAliasee();
816 return this;
817}
818
820 if (auto *AS = dyn_cast<AliasSummary>(this))
821 return &AS->getAliasee();
822 return this;
823}
824
825/// Function summary information to aid decisions and implementation of
826/// importing.
828public:
829 /// <CalleeValueInfo, CalleeInfo> call edge pair.
830 using EdgeTy = std::pair<ValueInfo, CalleeInfo>;
831
832 /// Types for -force-summary-edges-cold debugging option.
838
839 /// An "identifier" for a virtual function. This contains the type identifier
840 /// represented as a GUID and the offset from the address point to the virtual
841 /// function pointer, where "address point" is as defined in the Itanium ABI:
842 /// https://itanium-cxx-abi.github.io/cxx-abi/abi.html#vtable-general
847
848 /// A specification for a virtual function call with all constant integer
849 /// arguments. This is used to perform virtual constant propagation on the
850 /// summary.
851 struct ConstVCall {
853 std::vector<uint64_t> Args;
854 };
855
856 /// All type identifier related information. Because these fields are
857 /// relatively uncommon we only allocate space for them if necessary.
858 struct TypeIdInfo {
859 /// List of type identifiers used by this function in llvm.type.test
860 /// intrinsics referenced by something other than an llvm.assume intrinsic,
861 /// represented as GUIDs.
862 std::vector<GlobalValue::GUID> TypeTests;
863
864 /// List of virtual calls made by this function using (respectively)
865 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics that do
866 /// not have all constant integer arguments.
868
869 /// List of virtual calls made by this function using (respectively)
870 /// llvm.assume(llvm.type.test) or llvm.type.checked.load intrinsics with
871 /// all constant integer arguments.
872 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
874 };
875
876 /// Flags specific to function summaries.
877 struct FFlags {
878 // Function attribute flags. Used to track if a function accesses memory,
879 // recurses or aliases.
880 unsigned ReadNone : 1;
881 unsigned ReadOnly : 1;
882 unsigned NoRecurse : 1;
883 unsigned ReturnDoesNotAlias : 1;
884
885 // Indicate if the global value cannot be inlined.
886 unsigned NoInline : 1;
887 // Indicate if function should be always inlined.
888 unsigned AlwaysInline : 1;
889 // Indicate if function never raises an exception. Can be modified during
890 // thinlink function attribute propagation
891 unsigned NoUnwind : 1;
892 // Indicate if function contains instructions that mayThrow
893 unsigned MayThrow : 1;
894
895 // If there are calls to unknown targets (e.g. indirect)
896 unsigned HasUnknownCall : 1;
897
898 // Indicate if a function must be an unreachable function.
899 //
900 // This bit is sufficient but not necessary;
901 // if this bit is on, the function must be regarded as unreachable;
902 // if this bit is off, the function might be reachable or unreachable.
903 unsigned MustBeUnreachable : 1;
904
906 this->ReadNone &= RHS.ReadNone;
907 this->ReadOnly &= RHS.ReadOnly;
908 this->NoRecurse &= RHS.NoRecurse;
909 this->ReturnDoesNotAlias &= RHS.ReturnDoesNotAlias;
910 this->NoInline &= RHS.NoInline;
911 this->AlwaysInline &= RHS.AlwaysInline;
912 this->NoUnwind &= RHS.NoUnwind;
913 this->MayThrow &= RHS.MayThrow;
914 this->HasUnknownCall &= RHS.HasUnknownCall;
915 this->MustBeUnreachable &= RHS.MustBeUnreachable;
916 return *this;
917 }
918
919 bool anyFlagSet() {
920 return this->ReadNone | this->ReadOnly | this->NoRecurse |
921 this->ReturnDoesNotAlias | this->NoInline | this->AlwaysInline |
922 this->NoUnwind | this->MayThrow | this->HasUnknownCall |
923 this->MustBeUnreachable;
924 }
925
926 operator std::string() {
927 std::string Output;
928 raw_string_ostream OS(Output);
929 OS << "funcFlags: (";
930 OS << "readNone: " << this->ReadNone;
931 OS << ", readOnly: " << this->ReadOnly;
932 OS << ", noRecurse: " << this->NoRecurse;
933 OS << ", returnDoesNotAlias: " << this->ReturnDoesNotAlias;
934 OS << ", noInline: " << this->NoInline;
935 OS << ", alwaysInline: " << this->AlwaysInline;
936 OS << ", noUnwind: " << this->NoUnwind;
937 OS << ", mayThrow: " << this->MayThrow;
938 OS << ", hasUnknownCall: " << this->HasUnknownCall;
939 OS << ", mustBeUnreachable: " << this->MustBeUnreachable;
940 OS << ")";
941 return Output;
942 }
943 };
944
945 /// Describes the uses of a parameter by the function.
946 struct ParamAccess {
947 static constexpr uint32_t RangeWidth = 64;
948
949 /// Describes the use of a value in a call instruction, specifying the
950 /// call's target, the value's parameter number, and the possible range of
951 /// offsets from the beginning of the value that are passed.
961
963 /// The range contains byte offsets from the parameter pointer which
964 /// accessed by the function. In the per-module summary, it only includes
965 /// accesses made by the function instructions. In the combined summary, it
966 /// also includes accesses by nested function calls.
967 ConstantRange Use{/*BitWidth=*/RangeWidth, /*isFullSet=*/true};
968 /// In the per-module summary, it summarizes the byte offset applied to each
969 /// pointer parameter before passing to each corresponding callee.
970 /// In the combined summary, it's empty and information is propagated by
971 /// inter-procedural analysis and applied to the Use field.
972 std::vector<Call> Calls;
973
974 ParamAccess() = default;
977 };
978
979 /// Create an empty FunctionSummary (with specified call edges).
980 /// Used to represent external nodes and the dummy root node.
981 static FunctionSummary
983 return FunctionSummary(
987 /*NotEligibleToImport=*/true, /*Live=*/true, /*IsLocal=*/false,
988 /*CanAutoHide=*/false, GlobalValueSummary::ImportKind::Definition,
989 /*NoRenameOnPromotion=*/false),
991 std::move(Edges), std::vector<GlobalValue::GUID>(),
992 std::vector<FunctionSummary::VFuncId>(),
993 std::vector<FunctionSummary::VFuncId>(),
994 std::vector<FunctionSummary::ConstVCall>(),
995 std::vector<FunctionSummary::ConstVCall>(),
996 std::vector<FunctionSummary::ParamAccess>(),
997 std::vector<CallsiteInfo>(), std::vector<AllocInfo>());
998 }
999
1000 /// A dummy node to reference external functions that aren't in the index
1002
1003private:
1004 /// Number of instructions (ignoring debug instructions, e.g.) computed
1005 /// during the initial compile step when the summary index is first built.
1006 unsigned InstCount;
1007
1008 /// Function summary specific flags.
1009 FFlags FunFlags;
1010
1011 /// List of <CalleeValueInfo, CalleeInfo> call edge pairs from this function.
1012 /// We use SmallVector<ValueInfo, 0> instead of std::vector<ValueInfo> for its
1013 /// smaller memory footprint.
1014 SmallVector<EdgeTy, 0> CallGraphEdgeList;
1015
1016 std::unique_ptr<TypeIdInfo> TIdInfo;
1017
1018 /// Uses for every parameter to this function.
1019 using ParamAccessesTy = std::vector<ParamAccess>;
1020 std::unique_ptr<ParamAccessesTy> ParamAccesses;
1021
1022 /// Optional list of memprof callsite metadata summaries. The correspondence
1023 /// between the callsite summary and the callsites in the function is implied
1024 /// by the order in the vector (and can be validated by comparing the stack
1025 /// ids in the CallsiteInfo to those in the instruction callsite metadata).
1026 /// As a memory savings optimization, we only create these for the prevailing
1027 /// copy of a symbol when creating the combined index during LTO.
1028 using CallsitesTy = std::vector<CallsiteInfo>;
1029 std::unique_ptr<CallsitesTy> Callsites;
1030
1031 /// Optional list of allocation memprof metadata summaries. The correspondence
1032 /// between the alloc memprof summary and the allocation callsites in the
1033 /// function is implied by the order in the vector (and can be validated by
1034 /// comparing the stack ids in the AllocInfo to those in the instruction
1035 /// memprof metadata).
1036 /// As a memory savings optimization, we only create these for the prevailing
1037 /// copy of a symbol when creating the combined index during LTO.
1038 using AllocsTy = std::vector<AllocInfo>;
1039 std::unique_ptr<AllocsTy> Allocs;
1040
1041public:
1042 FunctionSummary(GVFlags Flags, unsigned NumInsts, FFlags FunFlags,
1044 SmallVectorImpl<EdgeTy> &&CGEdges,
1045 std::vector<GlobalValue::GUID> TypeTests,
1046 std::vector<VFuncId> TypeTestAssumeVCalls,
1047 std::vector<VFuncId> TypeCheckedLoadVCalls,
1048 std::vector<ConstVCall> TypeTestAssumeConstVCalls,
1049 std::vector<ConstVCall> TypeCheckedLoadConstVCalls,
1050 std::vector<ParamAccess> Params, CallsitesTy CallsiteList,
1051 AllocsTy AllocList)
1052 : GlobalValueSummary(FunctionKind, Flags, std::move(Refs)),
1053 InstCount(NumInsts), FunFlags(FunFlags),
1054 CallGraphEdgeList(std::move(CGEdges)) {
1055 if (!TypeTests.empty() || !TypeTestAssumeVCalls.empty() ||
1056 !TypeCheckedLoadVCalls.empty() || !TypeTestAssumeConstVCalls.empty() ||
1057 !TypeCheckedLoadConstVCalls.empty())
1058 TIdInfo = std::make_unique<TypeIdInfo>(
1059 TypeIdInfo{std::move(TypeTests), std::move(TypeTestAssumeVCalls),
1060 std::move(TypeCheckedLoadVCalls),
1061 std::move(TypeTestAssumeConstVCalls),
1062 std::move(TypeCheckedLoadConstVCalls)});
1063 if (!Params.empty())
1064 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(Params));
1065 if (!CallsiteList.empty())
1066 Callsites = std::make_unique<CallsitesTy>(std::move(CallsiteList));
1067 if (!AllocList.empty())
1068 Allocs = std::make_unique<AllocsTy>(std::move(AllocList));
1069 }
1070 // Gets the number of readonly and writeonly refs in RefEdgeList
1071 LLVM_ABI std::pair<unsigned, unsigned> specialRefCounts() const;
1072
1073 /// Check if this is a function summary.
1074 static bool classof(const GlobalValueSummary *GVS) {
1075 return GVS->getSummaryKind() == FunctionKind;
1076 }
1077
1078 /// Get function summary flags.
1079 FFlags fflags() const { return FunFlags; }
1080
1081 void setNoRecurse() { FunFlags.NoRecurse = true; }
1082
1083 void setNoUnwind() { FunFlags.NoUnwind = true; }
1084
1085 /// Get the instruction count recorded for this function.
1086 unsigned instCount() const { return InstCount; }
1087
1088 /// Return the list of <CalleeValueInfo, CalleeInfo> pairs.
1089 ArrayRef<EdgeTy> calls() const { return CallGraphEdgeList; }
1090
1091 SmallVector<EdgeTy, 0> &mutableCalls() { return CallGraphEdgeList; }
1092
1093 void addCall(EdgeTy E) { CallGraphEdgeList.push_back(E); }
1094
1095 /// Returns the list of type identifiers used by this function in
1096 /// llvm.type.test intrinsics other than by an llvm.assume intrinsic,
1097 /// represented as GUIDs.
1099 if (TIdInfo)
1100 return TIdInfo->TypeTests;
1101 return {};
1102 }
1103
1104 /// Returns the list of virtual calls made by this function using
1105 /// llvm.assume(llvm.type.test) intrinsics that do not have all constant
1106 /// integer arguments.
1108 if (TIdInfo)
1109 return TIdInfo->TypeTestAssumeVCalls;
1110 return {};
1111 }
1112
1113 /// Returns the list of virtual calls made by this function using
1114 /// llvm.type.checked.load intrinsics that do not have all constant integer
1115 /// arguments.
1117 if (TIdInfo)
1118 return TIdInfo->TypeCheckedLoadVCalls;
1119 return {};
1120 }
1121
1122 /// Returns the list of virtual calls made by this function using
1123 /// llvm.assume(llvm.type.test) intrinsics with all constant integer
1124 /// arguments.
1126 if (TIdInfo)
1127 return TIdInfo->TypeTestAssumeConstVCalls;
1128 return {};
1129 }
1130
1131 /// Returns the list of virtual calls made by this function using
1132 /// llvm.type.checked.load intrinsics with all constant integer arguments.
1134 if (TIdInfo)
1135 return TIdInfo->TypeCheckedLoadConstVCalls;
1136 return {};
1137 }
1138
1139 /// Returns the list of known uses of pointer parameters.
1141 if (ParamAccesses)
1142 return *ParamAccesses;
1143 return {};
1144 }
1145
1146 /// Sets the list of known uses of pointer parameters.
1147 void setParamAccesses(std::vector<ParamAccess> NewParams) {
1148 if (NewParams.empty())
1149 ParamAccesses.reset();
1150 else if (ParamAccesses)
1151 *ParamAccesses = std::move(NewParams);
1152 else
1153 ParamAccesses = std::make_unique<ParamAccessesTy>(std::move(NewParams));
1154 }
1155
1156 /// Add a type test to the summary. This is used by WholeProgramDevirt if we
1157 /// were unable to devirtualize a checked call.
1159 if (!TIdInfo)
1160 TIdInfo = std::make_unique<TypeIdInfo>();
1161 TIdInfo->TypeTests.push_back(Guid);
1162 }
1163
1164 const TypeIdInfo *getTypeIdInfo() const { return TIdInfo.get(); };
1165
1167 if (Callsites)
1168 return *Callsites;
1169 return {};
1170 }
1171
1172 CallsitesTy &mutableCallsites() {
1173 assert(Callsites);
1174 return *Callsites;
1175 }
1176
1177 void addCallsite(CallsiteInfo &&Callsite) {
1178 if (!Callsites)
1179 Callsites = std::make_unique<CallsitesTy>();
1180 Callsites->push_back(std::move(Callsite));
1181 }
1182
1184 if (Allocs)
1185 return *Allocs;
1186 return {};
1187 }
1188
1190 if (!Allocs)
1191 Allocs = std::make_unique<AllocsTy>();
1192 Allocs->push_back(std::move(Alloc));
1193 }
1194
1195 AllocsTy &mutableAllocs() {
1196 assert(Allocs);
1197 return *Allocs;
1198 }
1199
1200 friend struct GraphTraits<ValueInfo>;
1201};
1202
1203template <> struct DenseMapInfo<FunctionSummary::VFuncId> {
1205 return L.GUID == R.GUID && L.Offset == R.Offset;
1206 }
1207
1208 static unsigned getHashValue(FunctionSummary::VFuncId I) { return I.GUID; }
1209};
1210
1211template <> struct DenseMapInfo<FunctionSummary::ConstVCall> {
1214 return DenseMapInfo<FunctionSummary::VFuncId>::isEqual(L.VFunc, R.VFunc) &&
1215 L.Args == R.Args;
1216 }
1217
1219 return I.VFunc.GUID;
1220 }
1221};
1222
1223/// The ValueInfo and offset for a function within a vtable definition
1224/// initializer array.
1232/// List of functions referenced by a particular vtable definition.
1233using VTableFuncList = std::vector<VirtFuncOffset>;
1234
1235/// Global variable summary information to aid decisions and
1236/// implementation of importing.
1237///
1238/// Global variable summary has two extra flag, telling if it is
1239/// readonly or writeonly. Both readonly and writeonly variables
1240/// can be optimized in the backed: readonly variables can be
1241/// const-folded, while writeonly vars can be completely eliminated
1242/// together with corresponding stores. We let both things happen
1243/// by means of internalizing such variables after ThinLTO import.
1245private:
1246 /// For vtable definitions this holds the list of functions and
1247 /// their corresponding offsets within the initializer array.
1248 std::unique_ptr<VTableFuncList> VTableFuncs;
1249
1250public:
1251 struct GVarFlags {
1252 GVarFlags(bool ReadOnly, bool WriteOnly, bool Constant,
1254 : MaybeReadOnly(ReadOnly), MaybeWriteOnly(WriteOnly),
1256
1257 // If true indicates that this global variable might be accessed
1258 // purely by non-volatile load instructions. This in turn means
1259 // it can be internalized in source and destination modules during
1260 // thin LTO import because it neither modified nor its address
1261 // is taken.
1262 unsigned MaybeReadOnly : 1;
1263 // If true indicates that variable is possibly only written to, so
1264 // its value isn't loaded and its address isn't taken anywhere.
1265 // False, when 'Constant' attribute is set.
1266 unsigned MaybeWriteOnly : 1;
1267 // Indicates that value is a compile-time constant. Global variable
1268 // can be 'Constant' while not being 'ReadOnly' on several occasions:
1269 // - it is volatile, (e.g mapped device address)
1270 // - its address is taken, meaning that unlike 'ReadOnly' vars we can't
1271 // internalize it.
1272 // Constant variables are always imported thus giving compiler an
1273 // opportunity to make some extra optimizations. Readonly constants
1274 // are also internalized.
1275 unsigned Constant : 1;
1276 // Set from metadata on vtable definitions during the module summary
1277 // analysis.
1278 unsigned VCallVisibility : 2;
1280
1285
1286 /// Check if this is a global variable summary.
1287 static bool classof(const GlobalValueSummary *GVS) {
1288 return GVS->getSummaryKind() == GlobalVarKind;
1289 }
1290
1291 GVarFlags varflags() const { return VarFlags; }
1292 void setReadOnly(bool RO) { VarFlags.MaybeReadOnly = RO; }
1293 void setWriteOnly(bool WO) { VarFlags.MaybeWriteOnly = WO; }
1294 bool maybeReadOnly() const { return VarFlags.MaybeReadOnly; }
1295 bool maybeWriteOnly() const { return VarFlags.MaybeWriteOnly; }
1296 bool isConstant() const { return VarFlags.Constant; }
1298 VarFlags.VCallVisibility = Vis;
1299 }
1303
1305 assert(!VTableFuncs);
1306 VTableFuncs = std::make_unique<VTableFuncList>(std::move(Funcs));
1307 }
1308
1310 if (VTableFuncs)
1311 return *VTableFuncs;
1312 return {};
1313 }
1314};
1315
1317 /// Specifies which kind of type check we should emit for this byte array.
1318 /// See http://clang.llvm.org/docs/ControlFlowIntegrityDesign.html for full
1319 /// details on each kind of check; the enumerators are described with
1320 /// reference to that document.
1321 enum Kind {
1322 Unsat, ///< Unsatisfiable type (i.e. no global has this type metadata)
1323 ByteArray, ///< Test a byte array (first example)
1324 Inline, ///< Inlined bit vector ("Short Inline Bit Vectors")
1325 Single, ///< Single element (last example in "Short Inline Bit Vectors")
1326 AllOnes, ///< All-ones bit vector ("Eliminating Bit Vector Checks for
1327 /// All-Ones Bit Vectors")
1328 Unknown, ///< Unknown (analysis not performed, don't lower)
1330
1331 /// Range of size-1 expressed as a bit width. For example, if the size is in
1332 /// range [1,256], this number will be 8. This helps generate the most compact
1333 /// instruction sequences.
1334 unsigned SizeM1BitWidth = 0;
1335
1336 // The following fields are only used if the target does not support the use
1337 // of absolute symbols to store constants. Their meanings are the same as the
1338 // corresponding fields in LowerTypeTestsModule::TypeIdLowering in
1339 // LowerTypeTests.cpp.
1340
1345};
1346
1348 enum Kind {
1349 Indir, ///< Just do a regular virtual call
1350 SingleImpl, ///< Single implementation devirtualization
1351 BranchFunnel, ///< When retpoline mitigation is enabled, use a branch funnel
1352 ///< that is defined in the merged module. Otherwise same as
1353 ///< Indir.
1355
1356 std::string SingleImplName;
1357
1358 struct ByArg {
1359 enum Kind {
1360 Indir, ///< Just do a regular virtual call
1361 UniformRetVal, ///< Uniform return value optimization
1362 UniqueRetVal, ///< Unique return value optimization
1363 VirtualConstProp, ///< Virtual constant propagation
1365
1366 /// Additional information for the resolution:
1367 /// - UniformRetVal: the uniform return value.
1368 /// - UniqueRetVal: the return value associated with the unique vtable (0 or
1369 /// 1).
1371
1372 // The following fields are only used if the target does not support the use
1373 // of absolute symbols to store constants.
1374
1377 };
1378
1379 /// Resolutions for calls with all constant integer arguments (excluding the
1380 /// first argument, "this"), where the key is the argument vector.
1381 std::map<std::vector<uint64_t>, ByArg> ResByArg;
1382};
1383
1386
1387 /// Mapping from byte offset to whole-program devirt resolution for that
1388 /// (typeid, byte offset) pair.
1389 std::map<uint64_t, WholeProgramDevirtResolution> WPDRes;
1390};
1391
1392/// Encapsulate the names of CFI target functions. It interfaces with ThinLTO to
1393/// determine efficiently which of the names need to be exported for a
1394/// particular module.
1396 // `Names` is the authoritative source of data. `ThinLTOToNamesIndex` is there
1397 // just to efficiently retrieve which names in this index need exporting for
1398 // a particular module index. We cannot guarantee the ThinLTO GUIDs are
1399 // collision - free, so we associate a collection to a guid. Functions with
1400 // the same name may have different GUIDs, too. So we index a list of names
1401 // with the same GUID under that GUID key. We don't need the reverse because
1402 // the queries from ThinLTO use GUIDs as key.
1403 // Note that StringSet rehashing doesn't move keys, so we can safely store the
1404 // StringRef value inserted in `Names` in ThinLTOToNamesIndex, and avoid
1405 // copies.
1406 // Design note: we could do away with Names and use ThinLTOToNamesIndex as
1407 // index and data source, but opted against, for a small heap penalty, to
1408 // avoid confusion wrt the role GUIDs play in this case: they are an artifact
1409 // of the need to interface with ThinLTO, not otherwise necessary to CFI.
1410 StringSet<> Names;
1411
1412 using InternalIndexGroup = SetVector<StringRef>;
1414
1415 using NestedIterator = InternalIndexGroup::const_iterator;
1416
1417public:
1418 CfiFunctionIndex() = default;
1421
1422 /// API used for serialization, e.g. YAML.
1423 std::vector<std::pair<StringRef, GlobalValue::GUID>>
1425 std::vector<std::pair<StringRef, GlobalValue::GUID>> Symbols;
1426 for (auto &[GUID, Names] : ThinLTOToNamesIndex)
1427 for (auto Name : Names)
1428 Symbols.emplace_back(Name, GUID);
1429 llvm::sort(Symbols);
1430 return Symbols;
1431 }
1432
1433 /// get the set of GUIDs that should also be exported because they are the
1434 /// GUIDs of the cfi functions encapsulated here.
1436 return map_range(ThinLTOToNamesIndex, [](auto I) { return I.first; });
1437 }
1438
1439 /// get the name(s) associated with a given ThinLTO GUID. This enables
1440 /// efficient identification of the subset of names that should be included in
1441 /// a module summary.
1443 auto I = ThinLTOToNamesIndex.find(GUID);
1444 if (I == ThinLTOToNamesIndex.end())
1445 return make_range(NestedIterator{}, NestedIterator{});
1446 return make_range(I->second.begin(), I->second.end());
1447 }
1448
1449 /// Add the function name and the GUID that ThinLTO uses for it.
1451 auto [Iter, _] = Names.insert(Name);
1452 ThinLTOToNamesIndex[GUID].insert(Iter->first());
1453 }
1454
1455 bool contains(StringRef Name) const {
1456 return Names.find(Name) != Names.end();
1457 }
1458
1459 bool empty() const {
1460 assert(Names.empty() == ThinLTOToNamesIndex.empty());
1461 return Names.empty();
1462 }
1463};
1464
1465/// 160 bits SHA1
1466using ModuleHash = std::array<uint32_t, 5>;
1467
1468/// Type used for iterating through the global value summary map.
1471
1472/// String table to hold/own module path strings, as well as a hash
1473/// of the module. The StringMap makes a copy of and owns inserted strings.
1475
1476/// Map of global value GUID to its summary, used to identify values defined in
1477/// a particular module, and provide efficient access to their summary.
1479
1480/// Map of a module name to the GUIDs and summaries we will import from that
1481/// module.
1483 std::map<std::string, GVSummaryMapTy, std::less<>>;
1484
1485/// A set of global value summary pointers.
1487
1488/// Map of a type GUID to type id string and summary (multimap used
1489/// in case of GUID conflicts).
1491 std::multimap<GlobalValue::GUID, std::pair<StringRef, TypeIdSummary>>;
1492
1493/// The following data structures summarize type metadata information.
1494/// For type metadata overview see https://llvm.org/docs/TypeMetadata.html.
1495/// Each type metadata includes both the type identifier and the offset of
1496/// the address point of the type (the address held by objects of that type
1497/// which may not be the beginning of the virtual table). Vtable definitions
1498/// are decorated with type metadata for the types they are compatible with.
1499///
1500/// Holds information about vtable definitions decorated with type metadata:
1501/// the vtable definition value and its address point offset in a type
1502/// identifier metadata it is decorated (compatible) with.
1510/// List of vtable definitions decorated by a particular type identifier,
1511/// and their corresponding offsets in that type identifier's metadata.
1512/// Note that each type identifier may be compatible with multiple vtables, due
1513/// to inheritance, which is why this is a vector.
1514using TypeIdCompatibleVtableInfo = std::vector<TypeIdOffsetVtableInfo>;
1515
1516/// Class to hold module path string table and global value map,
1517/// and encapsulate methods for operating on them.
1519private:
1520 /// Map from value name to list of summary instances for values of that
1521 /// name (may be duplicates in the COMDAT case, e.g.).
1522 GlobalValueSummaryMapTy GlobalValueMap;
1523
1524 /// Holds strings for combined index, mapping to the corresponding module ID.
1525 ModulePathStringTableTy ModulePathStringTable;
1526
1527 BumpPtrAllocator TypeIdSaverAlloc;
1528 UniqueStringSaver TypeIdSaver;
1529
1530 /// Mapping from type identifier GUIDs to type identifier and its summary
1531 /// information. Produced by thin link.
1532 TypeIdSummaryMapTy TypeIdMap;
1533
1534 /// Mapping from type identifier to information about vtables decorated
1535 /// with that type identifier's metadata. Produced by per module summary
1536 /// analysis and consumed by thin link. For more information, see description
1537 /// above where TypeIdCompatibleVtableInfo is defined.
1538 std::map<StringRef, TypeIdCompatibleVtableInfo, std::less<>>
1539 TypeIdCompatibleVtableMap;
1540
1541 /// Mapping from original ID to GUID. If original ID can map to multiple
1542 /// GUIDs, it will be mapped to 0.
1544
1545 /// Indicates that summary-based GlobalValue GC has run, and values with
1546 /// GVFlags::Live==false are really dead. Otherwise, all values must be
1547 /// considered live.
1548 bool WithGlobalValueDeadStripping = false;
1549
1550 /// Indicates that summary-based attribute propagation has run and
1551 /// GVarFlags::MaybeReadonly / GVarFlags::MaybeWriteonly are really
1552 /// read/write only.
1553 bool WithAttributePropagation = false;
1554
1555 /// Indicates that summary-based DSOLocal propagation has run and the flag in
1556 /// every summary of a GV is synchronized.
1557 bool WithDSOLocalPropagation = false;
1558
1559 /// Indicates that summary-based internalization and promotion has run.
1560 bool WithInternalizeAndPromote = false;
1561
1562 /// Indicates that we have whole program visibility.
1563 bool WithWholeProgramVisibility = false;
1564
1565 /// Indicates that summary-based synthetic entry count propagation has run
1566 bool HasSyntheticEntryCounts = false;
1567
1568 /// Indicates that we linked with allocator supporting hot/cold new operators.
1569 bool WithSupportsHotColdNew = false;
1570
1571 /// Indicates that distributed backend should skip compilation of the
1572 /// module. Flag is suppose to be set by distributed ThinLTO indexing
1573 /// when it detected that the module is not needed during the final
1574 /// linking. As result distributed backend should just output a minimal
1575 /// valid object file.
1576 bool SkipModuleByDistributedBackend = false;
1577
1578 /// If true then we're performing analysis of IR module, or parsing along with
1579 /// the IR from assembly. The value of 'false' means we're reading summary
1580 /// from BC or YAML source. Affects the type of value stored in NameOrGV
1581 /// union.
1582 bool HaveGVs;
1583
1584 // True if the index was created for a module compiled with -fsplit-lto-unit.
1585 bool EnableSplitLTOUnit;
1586
1587 // True if the index was created for a module compiled with -funified-lto
1588 bool UnifiedLTO;
1589
1590 // True if some of the modules were compiled with -fsplit-lto-unit and
1591 // some were not. Set when the combined index is created during the thin link.
1592 bool PartiallySplitLTOUnits = false;
1593
1594 /// True if some of the FunctionSummary contains a ParamAccess.
1595 bool HasParamAccess = false;
1596
1597 CfiFunctionIndex CfiFunctionDefs;
1598 CfiFunctionIndex CfiFunctionDecls;
1599
1600 // Used in cases where we want to record the name of a global, but
1601 // don't have the string owned elsewhere (e.g. the Strtab on a module).
1602 BumpPtrAllocator Alloc;
1603 StringSaver Saver;
1604
1605 // The total number of basic blocks in the module in the per-module summary or
1606 // the total number of basic blocks in the LTO unit in the combined index.
1607 // FIXME: Putting this in the distributed ThinLTO index files breaks LTO
1608 // backend caching on any BB change to any linked file. It is currently not
1609 // used except in the case of a SamplePGO partial profile, and should be
1610 // reevaluated/redesigned to allow more effective incremental builds in that
1611 // case.
1612 uint64_t BlockCount = 0;
1613
1614 // List of unique stack ids (hashes). We use a 4B index of the id in the
1615 // stack id lists on the alloc and callsite summaries for memory savings,
1616 // since the number of unique ids is in practice much smaller than the
1617 // number of stack id references in the summaries.
1618 std::vector<uint64_t> StackIds;
1619
1620 // Temporary map while building StackIds list. Clear when index is completely
1621 // built via releaseTemporaryMemory.
1622 DenseMap<uint64_t, unsigned> StackIdToIndex;
1623
1624 // YAML I/O support.
1626
1628 getOrInsertValuePtr(GlobalValue::GUID GUID) {
1629 return &*GlobalValueMap.try_emplace(GUID, GlobalValueSummaryInfo(HaveGVs))
1630 .first;
1631 }
1632
1633public:
1634 // See HaveGVs variable comment.
1635 ModuleSummaryIndex(bool HaveGVs, bool EnableSplitLTOUnit = false,
1636 bool UnifiedLTO = false)
1637 : TypeIdSaver(TypeIdSaverAlloc), HaveGVs(HaveGVs),
1638 EnableSplitLTOUnit(EnableSplitLTOUnit), UnifiedLTO(UnifiedLTO),
1639 Saver(Alloc) {}
1640
1641 // Current version for the module summary in bitcode files.
1642 // The BitcodeSummaryVersion should be bumped whenever we introduce changes
1643 // in the way some record are interpreted, like flags for instance.
1644 // Note that incrementing this may require changes in both BitcodeReader.cpp
1645 // and BitcodeWriter.cpp.
1646 static constexpr uint64_t BitcodeSummaryVersion = 14;
1647
1648 // Regular LTO module name for ASM writer
1649 static constexpr const char *getRegularLTOModuleName() {
1650 return "[Regular LTO]";
1651 }
1652
1653 bool haveGVs() const { return HaveGVs; }
1654
1655 LLVM_ABI uint64_t getFlags() const;
1656 LLVM_ABI void setFlags(uint64_t Flags);
1657
1658 uint64_t getBlockCount() const { return BlockCount; }
1659 void addBlockCount(uint64_t C) { BlockCount += C; }
1660 void setBlockCount(uint64_t C) { BlockCount = C; }
1661
1662 gvsummary_iterator begin() { return GlobalValueMap.begin(); }
1663 const_gvsummary_iterator begin() const { return GlobalValueMap.begin(); }
1664 gvsummary_iterator end() { return GlobalValueMap.end(); }
1665 const_gvsummary_iterator end() const { return GlobalValueMap.end(); }
1666 size_t size() const { return GlobalValueMap.size(); }
1667
1670 return GlobalValueMap.sortedRange();
1671 }
1672
1673 const std::vector<uint64_t> &stackIds() const { return StackIds; }
1674
1675 unsigned addOrGetStackIdIndex(uint64_t StackId) {
1676 auto Inserted = StackIdToIndex.insert({StackId, StackIds.size()});
1677 if (Inserted.second)
1678 StackIds.push_back(StackId);
1679 return Inserted.first->second;
1680 }
1681
1682 uint64_t getStackIdAtIndex(unsigned Index) const {
1683 assert(StackIds.size() > Index);
1684 return StackIds[Index];
1685 }
1686
1687 // Facility to release memory from data structures only needed during index
1688 // construction (including while building combined index). Currently this only
1689 // releases the temporary map used while constructing a correspondence between
1690 // stack ids and their index in the StackIds vector. Mostly impactful when
1691 // building a large combined index.
1693 assert(StackIdToIndex.size() == StackIds.size());
1694 StackIdToIndex.clear();
1695 StackIds.shrink_to_fit();
1696 }
1697
1698 /// Convenience function for doing a DFS on a ValueInfo. Marks the function in
1699 /// the FunctionHasParent map.
1701 std::map<ValueInfo, bool> &FunctionHasParent) {
1702 if (!V.getSummaryList().size())
1703 return; // skip external functions that don't have summaries
1704
1705 // Mark discovered if we haven't yet
1706 auto S = FunctionHasParent.emplace(V, false);
1707
1708 // Stop if we've already discovered this node
1709 if (!S.second)
1710 return;
1711
1713 dyn_cast<FunctionSummary>(V.getSummaryList().front().get());
1714 assert(F != nullptr && "Expected FunctionSummary node");
1715
1716 for (const auto &C : F->calls()) {
1717 // Insert node if necessary
1718 auto S = FunctionHasParent.emplace(C.first, true);
1719
1720 // Skip nodes that we're sure have parents
1721 if (!S.second && S.first->second)
1722 continue;
1723
1724 if (S.second)
1725 discoverNodes(C.first, FunctionHasParent);
1726 else
1727 S.first->second = true;
1728 }
1729 }
1730
1731 // Calculate the callgraph root
1733 // Functions that have a parent will be marked in FunctionHasParent pair.
1734 // Once we've marked all functions, the functions in the map that are false
1735 // have no parent (so they're the roots)
1736 std::map<ValueInfo, bool> FunctionHasParent;
1737
1738 for (auto &S : *this) {
1739 // Skip external functions
1740 if (!S.second.getSummaryList().size() ||
1741 !isa<FunctionSummary>(S.second.getSummaryList().front().get()))
1742 continue;
1743 discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent);
1744 }
1745
1747 // create edges to all roots in the Index
1748 for (auto &P : FunctionHasParent) {
1749 if (P.second)
1750 continue; // skip over non-root nodes
1751 Edges.push_back(std::make_pair(P.first, CalleeInfo{}));
1752 }
1753 return FunctionSummary::makeDummyFunctionSummary(std::move(Edges));
1754 }
1755
1757 return WithGlobalValueDeadStripping;
1758 }
1760 WithGlobalValueDeadStripping = true;
1761 }
1762
1763 bool withAttributePropagation() const { return WithAttributePropagation; }
1765 WithAttributePropagation = true;
1766 }
1767
1768 bool withDSOLocalPropagation() const { return WithDSOLocalPropagation; }
1769 void setWithDSOLocalPropagation() { WithDSOLocalPropagation = true; }
1770
1771 bool withInternalizeAndPromote() const { return WithInternalizeAndPromote; }
1772 void setWithInternalizeAndPromote() { WithInternalizeAndPromote = true; }
1773
1774 bool withWholeProgramVisibility() const { return WithWholeProgramVisibility; }
1775 void setWithWholeProgramVisibility() { WithWholeProgramVisibility = true; }
1776
1777 bool isReadOnly(const GlobalVarSummary *GVS) const {
1778 return WithAttributePropagation && GVS->maybeReadOnly();
1779 }
1780 bool isWriteOnly(const GlobalVarSummary *GVS) const {
1781 return WithAttributePropagation && GVS->maybeWriteOnly();
1782 }
1783
1784 bool withSupportsHotColdNew() const { return WithSupportsHotColdNew; }
1785 void setWithSupportsHotColdNew() { WithSupportsHotColdNew = true; }
1786
1788 return SkipModuleByDistributedBackend;
1789 }
1791 SkipModuleByDistributedBackend = true;
1792 }
1793
1794 bool enableSplitLTOUnit() const { return EnableSplitLTOUnit; }
1795 void setEnableSplitLTOUnit() { EnableSplitLTOUnit = true; }
1796
1797 bool hasUnifiedLTO() const { return UnifiedLTO; }
1798 void setUnifiedLTO() { UnifiedLTO = true; }
1799
1800 bool partiallySplitLTOUnits() const { return PartiallySplitLTOUnits; }
1801 void setPartiallySplitLTOUnits() { PartiallySplitLTOUnits = true; }
1802
1803 bool hasParamAccess() const { return HasParamAccess; }
1804
1805 bool isGlobalValueLive(const GlobalValueSummary *GVS) const {
1806 return !WithGlobalValueDeadStripping || GVS->isLive();
1807 }
1808 LLVM_ABI bool isGUIDLive(GlobalValue::GUID GUID) const;
1809
1810 /// Return a ValueInfo for the index value_type (convenient when iterating
1811 /// index).
1813 return ValueInfo(HaveGVs, &R);
1814 }
1815
1816 /// Return a ValueInfo for GUID if it exists, otherwise return ValueInfo().
1818 auto I = GlobalValueMap.find(GUID);
1819 return ValueInfo(HaveGVs, I == GlobalValueMap.end() ? nullptr : &*I);
1820 }
1821
1822 /// Return a ValueInfo for \p GUID.
1824 return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID));
1825 }
1826
1827 // Save a string in the Index. Use before passing Name to
1828 // getOrInsertValueInfo when the string isn't owned elsewhere (e.g. on the
1829 // module's Strtab).
1830 StringRef saveString(StringRef String) { return Saver.save(String); }
1831
1832 /// Return a ValueInfo for \p GUID setting value \p Name.
1834 assert(!HaveGVs);
1835 auto VP = getOrInsertValuePtr(GUID);
1836 VP->second.U.Name = Name;
1837 return ValueInfo(HaveGVs, VP);
1838 }
1839
1840 /// Return a ValueInfo for \p GV and mark it as belonging to GV.
1842 assert(HaveGVs);
1843 auto VP = getOrInsertValuePtr(GV->getGUID());
1844 VP->second.U.GV = GV;
1845 return ValueInfo(HaveGVs, VP);
1846 }
1847
1848 /// Return the GUID for \p OriginalId in the OidGuidMap.
1850 const auto I = OidGuidMap.find(OriginalID);
1851 return I == OidGuidMap.end() ? 0 : I->second;
1852 }
1853
1854 CfiFunctionIndex &cfiFunctionDefs() { return CfiFunctionDefs; }
1855 const CfiFunctionIndex &cfiFunctionDefs() const { return CfiFunctionDefs; }
1856
1857 CfiFunctionIndex &cfiFunctionDecls() { return CfiFunctionDecls; }
1858 const CfiFunctionIndex &cfiFunctionDecls() const { return CfiFunctionDecls; }
1859
1860 /// Add a global value summary for a value.
1862 std::unique_ptr<GlobalValueSummary> Summary) {
1863 addGlobalValueSummary(getOrInsertValueInfo(&GV), std::move(Summary));
1864 }
1865
1866 /// Add a global value summary for a value of the given name.
1868 std::unique_ptr<GlobalValueSummary> Summary) {
1872 std::move(Summary));
1873 }
1874
1875 /// Add a global value summary for the given ValueInfo.
1877 std::unique_ptr<GlobalValueSummary> Summary) {
1878 if (const FunctionSummary *FS = dyn_cast<FunctionSummary>(Summary.get()))
1879 HasParamAccess |= !FS->paramAccesses().empty();
1880 addOriginalName(VI.getGUID(), Summary->getOriginalName());
1881 // Here we have a notionally const VI, but the value it points to is owned
1882 // by the non-const *this.
1883 const_cast<GlobalValueSummaryMapTy::value_type *>(VI.getRef())
1884 ->second.addSummary(std::move(Summary));
1885 }
1886
1887 /// Add an original name for the value of the given GUID.
1889 GlobalValue::GUID OrigGUID) {
1890 if (OrigGUID == 0 || ValueGUID == OrigGUID)
1891 return;
1892 auto [It, Inserted] = OidGuidMap.try_emplace(OrigGUID, ValueGUID);
1893 if (!Inserted && It->second != ValueGUID)
1894 It->second = 0;
1895 }
1896
1897 /// Find the summary for ValueInfo \p VI in module \p ModuleId, or nullptr if
1898 /// not found.
1900 auto SummaryList = VI.getSummaryList();
1901 auto Summary =
1902 llvm::find_if(SummaryList,
1903 [&](const std::unique_ptr<GlobalValueSummary> &Summary) {
1904 return Summary->modulePath() == ModuleId;
1905 });
1906 if (Summary == SummaryList.end())
1907 return nullptr;
1908 return Summary->get();
1909 }
1910
1911 /// Find the summary for global \p GUID in module \p ModuleId, or nullptr if
1912 /// not found.
1914 StringRef ModuleId) const {
1915 auto CalleeInfo = getValueInfo(ValueGUID);
1916 if (!CalleeInfo)
1917 return nullptr; // This function does not have a summary
1918 return findSummaryInModule(CalleeInfo, ModuleId);
1919 }
1920
1921 /// Returns the first GlobalValueSummary for \p GV, asserting that there
1922 /// is only one if \p PerModuleIndex.
1924 bool PerModuleIndex = true) const {
1925 assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
1926 return getGlobalValueSummary(GV.getGUID(), PerModuleIndex);
1927 }
1928
1929 /// Returns the first GlobalValueSummary for \p ValueGUID, asserting that
1930 /// there
1931 /// is only one if \p PerModuleIndex.
1934 bool PerModuleIndex = true) const;
1935
1936 /// Table of modules, containing module hash and id.
1938 return ModulePathStringTable;
1939 }
1940
1941 /// Table of modules, containing hash and id.
1942 StringMap<ModuleHash> &modulePaths() { return ModulePathStringTable; }
1943
1944 /// Get the module SHA1 hash recorded for the given module path.
1945 const ModuleHash &getModuleHash(const StringRef ModPath) const {
1946 auto It = ModulePathStringTable.find(ModPath);
1947 assert(It != ModulePathStringTable.end() && "Module not registered");
1948 return It->second;
1949 }
1950
1951 /// Convenience method for creating a promoted global name
1952 /// for the given value name of a local, and its original module's ID.
1953 static std::string getGlobalNameForLocal(StringRef Name, ModuleHash ModHash) {
1954 std::string Suffix = utostr((uint64_t(ModHash[0]) << 32) |
1955 ModHash[1]); // Take the first 64 bits
1956 return getGlobalNameForLocal(Name, Suffix);
1957 }
1958
1959 static std::string getGlobalNameForLocal(StringRef Name, StringRef Suffix) {
1960 SmallString<256> NewName(Name);
1961 NewName += ".llvm.";
1962 NewName += Suffix;
1963 return std::string(NewName);
1964 }
1965
1966 /// Helper to obtain the unpromoted name for a global value (or the original
1967 /// name if not promoted). Split off the rightmost ".llvm.${hash}" suffix,
1968 /// because it is possible in certain clients (not clang at the moment) for
1969 /// two rounds of ThinLTO optimization and therefore promotion to occur.
1971 std::pair<StringRef, StringRef> Pair = Name.rsplit(".llvm.");
1972 return Pair.first;
1973 }
1974
1976
1977 /// Add a new module with the given \p Hash, mapped to the given \p
1978 /// ModID, and return a reference to the module.
1980 return &*ModulePathStringTable.insert({ModPath, Hash}).first;
1981 }
1982
1983 /// Return module entry for module with the given \p ModPath.
1985 auto It = ModulePathStringTable.find(ModPath);
1986 assert(It != ModulePathStringTable.end() && "Module not registered");
1987 return &*It;
1988 }
1989
1990 /// Return module entry for module with the given \p ModPath.
1991 const ModuleInfo *getModule(StringRef ModPath) const {
1992 auto It = ModulePathStringTable.find(ModPath);
1993 assert(It != ModulePathStringTable.end() && "Module not registered");
1994 return &*It;
1995 }
1996
1997 /// Check if the given Module has any functions available for exporting
1998 /// in the index. We consider any module present in the ModulePathStringTable
1999 /// to have exported functions.
2000 bool hasExportedFunctions(const Module &M) const {
2001 return ModulePathStringTable.count(M.getModuleIdentifier());
2002 }
2003
2004 const TypeIdSummaryMapTy &typeIds() const { return TypeIdMap; }
2005
2006 /// Return an existing or new TypeIdSummary entry for \p TypeId.
2007 /// This accessor can mutate the map and therefore should not be used in
2008 /// the ThinLTO backends.
2010 auto TidIter = TypeIdMap.equal_range(
2012 for (auto &[GUID, TypeIdPair] : make_range(TidIter))
2013 if (TypeIdPair.first == TypeId)
2014 return TypeIdPair.second;
2015 auto It =
2016 TypeIdMap.insert({GlobalValue::getGUIDAssumingExternalLinkage(TypeId),
2017 {TypeIdSaver.save(TypeId), TypeIdSummary()}});
2018 return It->second.second;
2019 }
2020
2021 /// This returns either a pointer to the type id summary (if present in the
2022 /// summary map) or null (if not present). This may be used when importing.
2024 auto TidIter = TypeIdMap.equal_range(
2026 for (const auto &[GUID, TypeIdPair] : make_range(TidIter))
2027 if (TypeIdPair.first == TypeId)
2028 return &TypeIdPair.second;
2029 return nullptr;
2030 }
2031
2033 return const_cast<TypeIdSummary *>(
2034 static_cast<const ModuleSummaryIndex *>(this)->getTypeIdSummary(
2035 TypeId));
2036 }
2037
2038 const auto &typeIdCompatibleVtableMap() const {
2039 return TypeIdCompatibleVtableMap;
2040 }
2041
2042 /// Return an existing or new TypeIdCompatibleVtableMap entry for \p TypeId.
2043 /// This accessor can mutate the map and therefore should not be used in
2044 /// the ThinLTO backends.
2047 return TypeIdCompatibleVtableMap[TypeIdSaver.save(TypeId)];
2048 }
2049
2050 /// For the given \p TypeId, this returns the TypeIdCompatibleVtableMap
2051 /// entry if present in the summary map. This may be used when importing.
2052 std::optional<TypeIdCompatibleVtableInfo>
2054 auto I = TypeIdCompatibleVtableMap.find(TypeId);
2055 if (I == TypeIdCompatibleVtableMap.end())
2056 return std::nullopt;
2057 return I->second;
2058 }
2059
2060 /// Collect for the given module the list of functions it defines
2061 /// (GUID -> Summary).
2062 LLVM_ABI void
2064 GVSummaryMapTy &GVSummaryMap) const;
2065
2066 /// Collect for each module the list of Summaries it defines (GUID ->
2067 /// Summary).
2068 template <class Map>
2069 void
2070 collectDefinedGVSummariesPerModule(Map &ModuleToDefinedGVSummaries) const {
2071 for (const auto &GlobalList : *this) {
2072 auto GUID = GlobalList.first;
2073 for (const auto &Summary : GlobalList.second.getSummaryList()) {
2074 ModuleToDefinedGVSummaries[Summary->modulePath()][GUID] = Summary.get();
2075 }
2076 }
2077 }
2078
2079 /// Print to an output stream.
2080 LLVM_ABI void print(raw_ostream &OS, bool IsForDebug = false) const;
2081
2082 /// Dump to stderr (for debugging).
2083 LLVM_ABI void dump() const;
2084
2085 /// Export summary to dot file for GraphViz.
2086 LLVM_ABI void
2088 const DenseSet<GlobalValue::GUID> &GUIDPreservedSymbols) const;
2089
2090 /// Print out strongly connected components for debugging.
2091 LLVM_ABI void dumpSCCs(raw_ostream &OS);
2092
2093 /// Do the access attribute and DSOLocal propagation in combined index.
2094 LLVM_ABI void
2095 propagateAttributes(const DenseSet<GlobalValue::GUID> &PreservedSymbols);
2096
2097 /// Checks if we can import global variable from another module.
2099 bool AnalyzeRefs) const;
2100
2101 /// Same as above but checks whether the global var is importable as a
2102 /// declaration.
2104 bool AnalyzeRefs, bool &CanImportDecl) const;
2105};
2106
2107/// GraphTraits definition to build SCC for the index
2108template <> struct GraphTraits<ValueInfo> {
2111
2113 return P.first;
2114 }
2117 decltype(&valueInfoFromEdge)>;
2118
2121
2122 static NodeRef getEntryNode(ValueInfo V) { return V; }
2123
2125 if (!N.getSummaryList().size()) // handle external function
2126 return ChildIteratorType(
2127 FunctionSummary::ExternalNode.CallGraphEdgeList.begin(),
2130 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2131 return ChildIteratorType(F->CallGraphEdgeList.begin(), &valueInfoFromEdge);
2132 }
2133
2135 if (!N.getSummaryList().size()) // handle external function
2136 return ChildIteratorType(
2137 FunctionSummary::ExternalNode.CallGraphEdgeList.end(),
2140 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2141 return ChildIteratorType(F->CallGraphEdgeList.end(), &valueInfoFromEdge);
2142 }
2143
2145 if (!N.getSummaryList().size()) // handle external function
2146 return FunctionSummary::ExternalNode.CallGraphEdgeList.begin();
2147
2149 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2150 return F->CallGraphEdgeList.begin();
2151 }
2152
2154 if (!N.getSummaryList().size()) // handle external function
2155 return FunctionSummary::ExternalNode.CallGraphEdgeList.end();
2156
2158 cast<FunctionSummary>(N.getSummaryList().front()->getBaseObject());
2159 return F->CallGraphEdgeList.end();
2160 }
2161
2162 static NodeRef edge_dest(EdgeRef E) { return E.first; }
2163};
2164
2165template <>
2168 std::unique_ptr<GlobalValueSummary> Root =
2169 std::make_unique<FunctionSummary>(I->calculateCallGraphRoot());
2170 GlobalValueSummaryInfo G(I->haveGVs());
2171 G.addSummary(std::move(Root));
2172 static auto P =
2174 return ValueInfo(I->haveGVs(), &P);
2175 }
2176};
2177} // end namespace llvm
2178
2179#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:731
#define LLVM_ABI
Definition Compiler.h:215
DXIL Finalize Linkage
This file defines the DenseMap class.
#define _
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 implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
StringSet - A set-like wrapper for the StringMap.
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)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Encapsulate the names of CFI target functions.
std::vector< std::pair< StringRef, GlobalValue::GUID > > getSortedSymbols() const
API used for serialization, e.g. YAML.
auto getExportedThinLTOGUIDs() const
get the set of GUIDs that should also be exported because they are the GUIDs of the cfi functions enc...
CfiFunctionIndex(CfiFunctionIndex &&)=default
auto getNamesForGUID(GlobalValue::GUID GUID) const
get the name(s) associated with a given ThinLTO GUID.
void addSymbolWithThinLTOGUID(StringRef Name, GlobalValue::GUID GUID)
Add the function name and the GUID that ThinLTO uses for it.
bool contains(StringRef Name) const
CfiFunctionIndex(const CfiFunctionIndex &)=delete
This class represents a range of values.
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
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.
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....
void addCallsite(CallsiteInfo &&Callsite)
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 addAlloc(AllocInfo &&Alloc)
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.
An owning range over the entries sorted by key, yielding each entry by reference.
pointee_iterator< SortedEntriesVec::const_iterator > iterator
Map from global value GUID to corresponding summary structures.
iterator find(key_type Key)
std::pair< iterator, bool > try_emplace(key_type Key, Ts &&...Args)
std::pair< key_type, mapped_type > value_type
GlobalValueSummaryInfo mapped_type
const_iterator begin() const
std::deque< value_type >::size_type size_type
SortedEntriesRange sortedRange() const
Return an owning range over the entries sorted by key.
const_iterator find(key_type Key) const
std::deque< value_type >::iterator iterator
std::deque< value_type >::const_iterator const_iterator
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 setNoRenameOnPromotion(bool NoRenameOnPromotion)
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:80
static bool isLocalLinkage(LinkageTypes Linkage)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
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,...
GlobalValueSummaryMapTy::SortedEntriesRange sortedGlobalValueSummariesRange() const
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.
A vector that has set insertion semantics.
Definition SetVector.h:57
typename vector_type::const_iterator const_iterator
Definition SetVector.h:73
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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 reserve(size_type N)
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:128
StringMapEntry< ModuleHash > value_type
Definition StringMap.h:204
bool insert(MapEntryTy *KeyValue)
insert - Insert the specified key/value pair into the map.
Definition StringMap.h:310
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Saves strings in the provided stable storage and returns a StringRef with a stable character pointer.
Definition StringSaver.h:22
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition StringSet.h:25
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:261
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.
@ Offset
Definition DWP.cpp:573
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::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:2142
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.
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:365
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
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1636
GlobalValueSummaryMap GlobalValueSummaryMapTy
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
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
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:390
SmallPtrSet< GlobalValueSummary *, 0 > GVSummaryPtrSet
A set of global value summary pointers.
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:860
#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 unsigned getHashValue(FunctionSummary::ConstVCall I)
static bool isEqual(FunctionSummary::ConstVCall L, FunctionSummary::ConstVCall R)
static bool isEqual(FunctionSummary::VFuncId L, FunctionSummary::VFuncId R)
static unsigned getHashValue(FunctionSummary::VFuncId I)
static bool isEqual(ValueInfo L, ValueInfo R)
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.
unsigned NoRenameOnPromotion
This field is written by the ThinLTO prelink stage to decide whether a particular static global value...
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.
GVFlags(GlobalValue::LinkageTypes Linkage, GlobalValue::VisibilityTypes Visibility, bool NotEligibleToImport, bool Live, bool IsLocal, bool CanAutoHide, ImportKind ImportType, bool NoRenameOnPromotion)
Convenience Constructors.
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
LLVM_ABI bool noRenameOnPromotion() 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.
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterator.h:329
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
Definition YAMLTraits.h:63
const GlobalValue * GV
The GlobalValue corresponding to this summary.
StringRef Name
Summary string representation.