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