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