LLVM 23.0.0git
Module.cpp
Go to the documentation of this file.
1//===- Module.cpp - Implement the Module class ----------------------------===//
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// This file implements the Module class for the IR library.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/Module.h"
17#include "llvm/ADT/StringMap.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/ADT/Twine.h"
20#include "llvm/IR/Attributes.h"
21#include "llvm/IR/Comdat.h"
22#include "llvm/IR/Constants.h"
23#include "llvm/IR/DataLayout.h"
26#include "llvm/IR/Function.h"
28#include "llvm/IR/GlobalAlias.h"
29#include "llvm/IR/GlobalIFunc.h"
30#include "llvm/IR/GlobalValue.h"
32#include "llvm/IR/LLVMContext.h"
33#include "llvm/IR/Metadata.h"
36#include "llvm/IR/Type.h"
37#include "llvm/IR/TypeFinder.h"
38#include "llvm/IR/Value.h"
43#include "llvm/Support/Error.h"
45#include "llvm/Support/Path.h"
49#include <cassert>
50#include <cstdint>
51#include <memory>
52#include <optional>
53#include <utility>
54#include <vector>
55
56using namespace llvm;
57
58//===----------------------------------------------------------------------===//
59// Methods to implement the globals and functions lists.
60//
61
62// Explicit instantiations of SymbolTableListTraits since some of the methods
63// are not in the public header file.
68
69//===----------------------------------------------------------------------===//
70// Primitive Module methods.
71//
72
74 : Context(C), ValSymTab(std::make_unique<ValueSymbolTable>(-1)),
75 ModuleID(std::string(MID)), SourceFileName(std::string(MID)) {
76 Context.addModule(this);
77}
78
80 assert(&Context == &Other.Context && "Module must be in the same Context");
81
82 dropAllReferences();
83
84 ModuleID = std::move(Other.ModuleID);
85 SourceFileName = std::move(Other.SourceFileName);
86
87 GlobalList.clear();
88 GlobalList.splice(GlobalList.begin(), Other.GlobalList);
89
90 FunctionList.clear();
91 FunctionList.splice(FunctionList.begin(), Other.FunctionList);
92
93 AliasList.clear();
94 AliasList.splice(AliasList.begin(), Other.AliasList);
95
96 IFuncList.clear();
97 IFuncList.splice(IFuncList.begin(), Other.IFuncList);
98
99 NamedMDList.clear();
100 NamedMDList.splice(NamedMDList.begin(), Other.NamedMDList);
101 for (NamedMDNode &NMD : NamedMDList)
102 NMD.setParent(this);
103
104 NamedMDSymTab = std::move(Other.NamedMDSymTab);
105 ComdatSymTab = std::move(Other.ComdatSymTab);
106 GlobalScopeAsm = std::move(Other.GlobalScopeAsm);
107 OwnedMemoryBuffer = std::move(Other.OwnedMemoryBuffer);
108 Materializer = std::move(Other.Materializer);
109 TargetTriple = std::move(Other.TargetTriple);
110 DL = std::move(Other.DL);
111 CurrentIntrinsicIds = std::move(Other.CurrentIntrinsicIds);
112 UniquedIntrinsicNames = std::move(Other.UniquedIntrinsicNames);
113 ModuleFlags = std::move(Other.ModuleFlags);
114 Context.addModule(this);
115 return *this;
116}
117
119 Context.removeModule(this);
120 dropAllReferences();
121 GlobalList.clear();
122 FunctionList.clear();
123 AliasList.clear();
124 IFuncList.clear();
125}
126
128 if (auto *DeclareIntrinsicFn =
129 Intrinsic::getDeclarationIfExists(this, Intrinsic::dbg_declare)) {
130 assert((!isMaterialized() || DeclareIntrinsicFn->hasZeroLiveUses()) &&
131 "Debug declare intrinsic should have had uses removed.");
132 DeclareIntrinsicFn->eraseFromParent();
133 }
134 if (auto *ValueIntrinsicFn =
135 Intrinsic::getDeclarationIfExists(this, Intrinsic::dbg_value)) {
136 assert((!isMaterialized() || ValueIntrinsicFn->hasZeroLiveUses()) &&
137 "Debug value intrinsic should have had uses removed.");
138 ValueIntrinsicFn->eraseFromParent();
139 }
140 if (auto *AssignIntrinsicFn =
141 Intrinsic::getDeclarationIfExists(this, Intrinsic::dbg_assign)) {
142 assert((!isMaterialized() || AssignIntrinsicFn->hasZeroLiveUses()) &&
143 "Debug assign intrinsic should have had uses removed.");
144 AssignIntrinsicFn->eraseFromParent();
145 }
146 if (auto *LabelntrinsicFn =
147 Intrinsic::getDeclarationIfExists(this, Intrinsic::dbg_label)) {
148 assert((!isMaterialized() || LabelntrinsicFn->hasZeroLiveUses()) &&
149 "Debug label intrinsic should have had uses removed.");
150 LabelntrinsicFn->eraseFromParent();
151 }
152}
153
154std::unique_ptr<RandomNumberGenerator>
155Module::createRNG(const StringRef Name) const {
156 SmallString<32> Salt(Name);
157
158 // This RNG is guaranteed to produce the same random stream only
159 // when the Module ID and thus the input filename is the same. This
160 // might be problematic if the input filename extension changes
161 // (e.g. from .c to .bc or .ll).
162 //
163 // We could store this salt in NamedMetadata, but this would make
164 // the parameter non-const. This would unfortunately make this
165 // interface unusable by any Machine passes, since they only have a
166 // const reference to their IR Module. Alternatively we can always
167 // store salt metadata from the Module constructor.
168 Salt += sys::path::filename(getModuleIdentifier());
169
170 return std::unique_ptr<RandomNumberGenerator>(
171 new RandomNumberGenerator(Salt));
172}
173
174/// getNamedValue - Return the first global value in the module with
175/// the specified name, of arbitrary type. This method returns null
176/// if a global with the specified name is not found.
178 return cast_or_null<GlobalValue>(getValueSymbolTable().lookup(Name));
179}
180
181unsigned Module::getNumNamedValues() const {
182 return getValueSymbolTable().size();
183}
184
185/// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
186/// This ID is uniqued across modules in the current LLVMContext.
187unsigned Module::getMDKindID(StringRef Name) const {
188 return Context.getMDKindID(Name);
189}
190
191/// getMDKindNames - Populate client supplied SmallVector with the name for
192/// custom metadata IDs registered in this LLVMContext. ID #0 is not used,
193/// so it is filled in as an empty string.
195 return Context.getMDKindNames(Result);
196}
197
199 return Context.getOperandBundleTags(Result);
200}
201
202//===----------------------------------------------------------------------===//
203// Methods for easy access to the functions in the module.
204//
205
206// getOrInsertFunction - Look up the specified function in the module symbol
207// table. If it does not exist, add a prototype for the function and return
208// it. This is nice because it allows most passes to get away with not handling
209// the symbol table directly for this common task.
210//
212 AttributeList AttributeList) {
213 // See if we have a definition for the specified function already.
214 GlobalValue *F = getNamedValue(Name);
215 if (!F) {
216 // Nope, add it
218 DL.getProgramAddressSpace(), Name, this);
219 if (!New->isIntrinsic()) // Intrinsics get attrs set on construction
220 New->setAttributes(AttributeList);
221 return {Ty, New}; // Return the new prototype.
222 }
223
224 // Otherwise, we just found the existing function or a prototype.
225 return {Ty, F};
226}
227
229 return getOrInsertFunction(Name, Ty, AttributeList());
230}
231
232// getFunction - Look up the specified function in the module symbol table.
233// If it does not exist, return null.
234//
236 return dyn_cast_or_null<Function>(getNamedValue(Name));
237}
238
239//===----------------------------------------------------------------------===//
240// Methods for easy access to the global variables in the module.
241//
242
243/// getGlobalVariable - Look up the specified global variable in the module
244/// symbol table. If it does not exist, return null. The type argument
245/// should be the underlying type of the global, i.e., it should not have
246/// the top-level PointerType, which represents the address of the global.
247/// If AllowLocal is set to true, this function will return types that
248/// have an local. By default, these types are not returned.
249///
251 bool AllowLocal) const {
252 if (GlobalVariable *Result =
253 dyn_cast_or_null<GlobalVariable>(getNamedValue(Name)))
254 if (AllowLocal || !Result->hasLocalLinkage())
255 return Result;
256 return nullptr;
257}
258
259/// getOrInsertGlobal - Look up the specified global in the module symbol table.
260/// If it does not exist, add a declaration of the global and return it.
261/// Otherwise, return the existing global.
263 StringRef Name, Type *Ty,
264 function_ref<GlobalVariable *()> CreateGlobalCallback) {
265 // See if we have a definition for the specified global already.
266 GlobalVariable *GV = dyn_cast_or_null<GlobalVariable>(getNamedValue(Name));
267 if (!GV)
268 GV = CreateGlobalCallback();
269 assert(GV && "The CreateGlobalCallback is expected to create a global");
270
271 // Otherwise, we just found the existing function or a prototype.
272 return GV;
273}
274
275// Overload to construct a global variable using its constructor's defaults.
277 return getOrInsertGlobal(Name, Ty, [&] {
278 return new GlobalVariable(*this, Ty, false, GlobalVariable::ExternalLinkage,
279 nullptr, Name);
280 });
281}
282
283//===----------------------------------------------------------------------===//
284// Methods for easy access to the global variables in the module.
285//
286
287// getNamedAlias - Look up the specified global in the module symbol table.
288// If it does not exist, return null.
289//
291 return dyn_cast_or_null<GlobalAlias>(getNamedValue(Name));
292}
293
295 return dyn_cast_or_null<GlobalIFunc>(getNamedValue(Name));
296}
297
298/// getNamedMetadata - Return the first NamedMDNode in the module with the
299/// specified name. This method returns null if a NamedMDNode with the
300/// specified name is not found.
302 return NamedMDSymTab.lookup(Name);
303}
304
305/// getOrInsertNamedMetadata - Return the first named MDNode in the module
306/// with the specified name. This method returns a new NamedMDNode if a
307/// NamedMDNode with the specified name is not found.
309 NamedMDNode *&NMD = NamedMDSymTab[Name];
310 if (!NMD) {
311 NMD = new NamedMDNode(Name);
312 NMD->setParent(this);
313 insertNamedMDNode(NMD);
314 if (Name == "llvm.module.flags")
315 ModuleFlags = NMD;
316 }
317 return NMD;
318}
319
320/// eraseNamedMetadata - Remove the given NamedMDNode from this module and
321/// delete it.
323 NamedMDSymTab.erase(NMD->getName());
324 if (NMD == ModuleFlags)
325 ModuleFlags = nullptr;
326 eraseNamedMDNode(NMD);
327}
328
329bool Module::isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB) {
331 uint64_t Val = Behavior->getLimitedValue();
332 if (Val >= ModFlagBehaviorFirstVal && Val <= ModFlagBehaviorLastVal) {
333 MFB = static_cast<ModFlagBehavior>(Val);
334 return true;
335 }
336 }
337 return false;
338}
339
340/// getModuleFlagsMetadata - Returns the module flags in the provided vector.
341void Module::
342getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const {
343 const NamedMDNode *ModFlags = getModuleFlagsMetadata();
344 if (!ModFlags) return;
345
346 for (const MDNode *Flag : ModFlags->operands()) {
347 // The verifier will catch errors, so no need to check them here.
348 auto *MFBConstant = mdconst::extract<ConstantInt>(Flag->getOperand(0));
349 auto MFB = static_cast<ModFlagBehavior>(MFBConstant->getLimitedValue());
350 MDString *Key = cast<MDString>(Flag->getOperand(1));
351 Metadata *Val = Flag->getOperand(2);
352 Flags.push_back(ModuleFlagEntry(MFB, Key, Val));
353 }
354}
355
356/// Return the corresponding value if Key appears in module flags, otherwise
357/// return null.
359 const NamedMDNode *ModFlags = getModuleFlagsMetadata();
360 if (!ModFlags)
361 return nullptr;
362 for (const MDNode *Flag : ModFlags->operands()) {
363 if (Key == cast<MDString>(Flag->getOperand(1))->getString())
364 return Flag->getOperand(2);
365 }
366 return nullptr;
367}
368
369/// getOrInsertModuleFlagsMetadata - Returns the NamedMDNode in the module that
370/// represents module-level flags. If module-level flags aren't found, it
371/// creates the named metadata that contains them.
373 if (ModuleFlags)
374 return ModuleFlags;
375 return getOrInsertNamedMetadata("llvm.module.flags");
376}
377
378/// addModuleFlag - Add a module-level flag to the module-level flags
379/// metadata. It will create the module-level flags named metadata if it doesn't
380/// already exist.
381void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
382 Metadata *Val) {
383 Type *Int32Ty = Type::getInt32Ty(Context);
384 Metadata *Ops[3] = {
385 ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Behavior)),
386 MDString::get(Context, Key), Val};
387 getOrInsertModuleFlagsMetadata()->addOperand(MDNode::get(Context, Ops));
388}
389void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
390 Constant *Val) {
391 addModuleFlag(Behavior, Key, ConstantAsMetadata::get(Val));
392}
393void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
394 uint32_t Val) {
395 Type *Int32Ty = Type::getInt32Ty(Context);
396 addModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val));
397}
399 assert(Node->getNumOperands() == 3 &&
400 "Invalid number of operands for module flag!");
401 assert(mdconst::hasa<ConstantInt>(Node->getOperand(0)) &&
402 isa<MDString>(Node->getOperand(1)) &&
403 "Invalid operand types for module flag!");
404 getOrInsertModuleFlagsMetadata()->addOperand(Node);
405}
406
407void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
408 Metadata *Val) {
409 NamedMDNode *ModFlags = getOrInsertModuleFlagsMetadata();
410 // Replace the flag if it already exists.
411 for (unsigned i = 0; i < ModFlags->getNumOperands(); ++i) {
412 MDNode *Flag = ModFlags->getOperand(i);
413 if (cast<MDString>(Flag->getOperand(1))->getString() == Key) {
414 Type *Int32Ty = Type::getInt32Ty(Context);
415 Metadata *Ops[3] = {
416 ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Behavior)),
417 MDString::get(Context, Key), Val};
418 ModFlags->setOperand(i, MDNode::get(Context, Ops));
419 return;
420 }
421 }
422 addModuleFlag(Behavior, Key, Val);
423}
424void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
425 Constant *Val) {
426 setModuleFlag(Behavior, Key, ConstantAsMetadata::get(Val));
427}
428void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
429 uint32_t Val) {
430 Type *Int32Ty = Type::getInt32Ty(Context);
431 setModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val));
432}
433
435
437
439 return cast<DICompileUnit>(CUs->getOperand(Idx));
440}
442 return cast<DICompileUnit>(CUs->getOperand(Idx));
443}
444
445void Module::debug_compile_units_iterator::SkipNoDebugCUs() {
446 while (CUs && (Idx < CUs->getNumOperands()) &&
447 ((*this)->getEmissionKind() == DICompileUnit::NoDebug))
448 ++Idx;
449}
450
453}
457}
458
460 return concat<GlobalValue>(functions(), globals(), aliases(), ifuncs());
461}
463Module::global_values() const {
464 return concat<const GlobalValue>(functions(), globals(), aliases(), ifuncs());
465}
466
467//===----------------------------------------------------------------------===//
468// Methods to control the materialization of GlobalValues in the Module.
469//
471 assert(!Materializer &&
472 "Module already has a GVMaterializer. Call materializeAll"
473 " to clear it out before setting another one.");
474 Materializer.reset(GVM);
475}
476
478 if (!Materializer)
479 return Error::success();
480
481 return Materializer->materialize(GV);
482}
483
485 if (!Materializer)
486 return Error::success();
487 std::unique_ptr<GVMaterializer> M = std::move(Materializer);
488 return M->materializeModule();
489}
490
492 llvm::TimeTraceScope timeScope("Materialize metadata");
493 if (!Materializer)
494 return Error::success();
495 return Materializer->materializeMetadata();
496}
497
498//===----------------------------------------------------------------------===//
499// Other module related stuff.
500//
501
502std::vector<StructType *> Module::getIdentifiedStructTypes() const {
503 // If we have a materializer, it is possible that some unread function
504 // uses a type that is currently not visible to a TypeFinder, so ask
505 // the materializer which types it created.
506 if (Materializer)
507 return Materializer->getIdentifiedStructTypes();
508
509 std::vector<StructType *> Ret;
510 TypeFinder SrcStructTypes;
511 SrcStructTypes.run(*this, true);
512 Ret.assign(SrcStructTypes.begin(), SrcStructTypes.end());
513 return Ret;
514}
515
517 const FunctionType *Proto) {
518 auto Encode = [&BaseName](unsigned Suffix) {
519 return (Twine(BaseName) + "." + Twine(Suffix)).str();
520 };
521
522 {
523 // fast path - the prototype is already known
524 auto UinItInserted = UniquedIntrinsicNames.insert({{Id, Proto}, 0});
525 if (!UinItInserted.second)
526 return Encode(UinItInserted.first->second);
527 }
528
529 // Not known yet. A new entry was created with index 0. Check if there already
530 // exists a matching declaration, or select a new entry.
531
532 // Start looking for names with the current known maximum count (or 0).
533 auto NiidItInserted = CurrentIntrinsicIds.insert({BaseName, 0});
534 unsigned Count = NiidItInserted.first->second;
535
536 // This might be slow if a whole population of intrinsics already existed, but
537 // we cache the values for later usage.
538 std::string NewName;
539 while (true) {
540 NewName = Encode(Count);
541 GlobalValue *F = getNamedValue(NewName);
542 if (!F) {
543 // Reserve this entry for the new proto
544 UniquedIntrinsicNames[{Id, Proto}] = Count;
545 break;
546 }
547
548 // A declaration with this name already exists. Remember it.
549 FunctionType *FT = dyn_cast<FunctionType>(F->getValueType());
550 auto UinItInserted = UniquedIntrinsicNames.insert({{Id, FT}, Count});
551 if (FT == Proto) {
552 // It was a declaration for our prototype. This entry was allocated in the
553 // beginning. Update the count to match the existing declaration.
554 UinItInserted.first->second = Count;
555 break;
556 }
557
558 ++Count;
559 }
560
561 NiidItInserted.first->second = Count + 1;
562
563 return NewName;
564}
565
566// dropAllReferences() - This function causes all the subelements to "let go"
567// of all references that they are maintaining. This allows one to 'delete' a
568// whole module at a time, even though there may be circular references... first
569// all references are dropped, and all use counts go to zero. Then everything
570// is deleted for real. Note that no operations are valid on an object that
571// has "dropped all references", except operator delete.
572//
574 for (Function &F : *this)
575 F.dropAllReferences();
576
577 for (GlobalVariable &GV : globals())
579
580 for (GlobalAlias &GA : aliases())
581 GA.dropAllReferences();
582
583 for (GlobalIFunc &GIF : ifuncs())
584 GIF.dropAllReferences();
585}
586
588 auto *Val =
589 cast_or_null<ConstantAsMetadata>(getModuleFlag("NumRegisterParameters"));
590 if (!Val)
591 return 0;
592 return cast<ConstantInt>(Val->getValue())->getZExtValue();
593}
594
595unsigned Module::getDwarfVersion() const {
596 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Dwarf Version"));
597 if (!Val)
598 return 0;
599 return cast<ConstantInt>(Val->getValue())->getZExtValue();
600}
601
602bool Module::isDwarf64() const {
603 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("DWARF64"));
604 return Val && cast<ConstantInt>(Val->getValue())->isOne();
605}
606
607unsigned Module::getCodeViewFlag() const {
608 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("CodeView"));
609 if (!Val)
610 return 0;
611 return cast<ConstantInt>(Val->getValue())->getZExtValue();
612}
613
614unsigned Module::getInstructionCount() const {
615 unsigned NumInstrs = 0;
616 for (const Function &F : FunctionList)
617 NumInstrs += F.getInstructionCount();
618 return NumInstrs;
619}
620
622 auto &Entry = *ComdatSymTab.insert(std::make_pair(Name, Comdat())).first;
623 Entry.second.Name = &Entry;
624 return &Entry.second;
625}
626
628 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIC Level"));
629
630 if (!Val)
631 return PICLevel::NotPIC;
632
633 return static_cast<PICLevel::Level>(
634 cast<ConstantInt>(Val->getValue())->getZExtValue());
635}
636
638 // The merge result of a non-PIC object and a PIC object can only be reliably
639 // used as a non-PIC object, so use the Min merge behavior.
640 addModuleFlag(ModFlagBehavior::Min, "PIC Level", PL);
641}
642
644 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level"));
645
646 if (!Val)
647 return PIELevel::Default;
648
649 return static_cast<PIELevel::Level>(
650 cast<ConstantInt>(Val->getValue())->getZExtValue());
651}
652
654 addModuleFlag(ModFlagBehavior::Max, "PIE Level", PL);
655}
656
657std::optional<CodeModel::Model> Module::getCodeModel() const {
658 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Code Model"));
659
660 if (!Val)
661 return std::nullopt;
662
663 return static_cast<CodeModel::Model>(
664 cast<ConstantInt>(Val->getValue())->getZExtValue());
665}
666
668 // Linking object files with different code models is undefined behavior
669 // because the compiler would have to generate additional code (to span
670 // longer jumps) if a larger code model is used with a smaller one.
671 // Therefore we will treat attempts to mix code models as an error.
672 addModuleFlag(ModFlagBehavior::Error, "Code Model", CL);
673}
674
675std::optional<uint64_t> Module::getLargeDataThreshold() const {
676 auto *Val =
677 cast_or_null<ConstantAsMetadata>(getModuleFlag("Large Data Threshold"));
678
679 if (!Val)
680 return std::nullopt;
681
682 return cast<ConstantInt>(Val->getValue())->getZExtValue();
683}
684
686 // Since the large data threshold goes along with the code model, the merge
687 // behavior is the same.
688 addModuleFlag(ModFlagBehavior::Error, "Large Data Threshold",
689 ConstantInt::get(Type::getInt64Ty(Context), Threshold));
690}
691
693 if (Kind == ProfileSummary::PSK_CSInstr)
694 setModuleFlag(ModFlagBehavior::Error, "CSProfileSummary", M);
695 else
696 setModuleFlag(ModFlagBehavior::Error, "ProfileSummary", M);
697}
698
699Metadata *Module::getProfileSummary(bool IsCS) const {
700 return (IsCS ? getModuleFlag("CSProfileSummary")
701 : getModuleFlag("ProfileSummary"));
702}
703
705 Metadata *MF = getModuleFlag("SemanticInterposition");
706
707 auto *Val = cast_or_null<ConstantAsMetadata>(MF);
708 if (!Val)
709 return false;
710
711 return cast<ConstantInt>(Val->getValue())->getZExtValue();
712}
713
715 addModuleFlag(ModFlagBehavior::Error, "SemanticInterposition", SI);
716}
717
718void Module::setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB) {
719 OwnedMemoryBuffer = std::move(MB);
720}
721
722bool Module::getRtLibUseGOT() const {
723 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("RtLibUseGOT"));
724 return Val && (cast<ConstantInt>(Val->getValue())->getZExtValue() > 0);
725}
726
728 addModuleFlag(ModFlagBehavior::Max, "RtLibUseGOT", 1);
729}
730
733 getModuleFlag("direct-access-external-data"));
734 if (Val)
735 return cast<ConstantInt>(Val->getValue())->getZExtValue() > 0;
736 return getPICLevel() == PICLevel::NotPIC;
737}
738
740 addModuleFlag(ModFlagBehavior::Max, "direct-access-external-data", Value);
741}
742
744 if (auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("uwtable")))
745 return UWTableKind(cast<ConstantInt>(Val->getValue())->getZExtValue());
746 return UWTableKind::None;
747}
748
750 addModuleFlag(ModFlagBehavior::Max, "uwtable", uint32_t(Kind));
751}
752
754 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("frame-pointer"));
755 return static_cast<FramePointerKind>(
756 Val ? cast<ConstantInt>(Val->getValue())->getZExtValue() : 0);
757}
758
760 addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast<int>(Kind));
761}
762
764 Metadata *MD = getModuleFlag("stack-protector-guard");
765 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
766 return MDS->getString();
767 return {};
768}
769
772 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard", ID);
773}
774
776 Metadata *MD = getModuleFlag("stack-protector-guard-reg");
777 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
778 return MDS->getString();
779 return {};
780}
781
784 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-reg", ID);
785}
786
788 Metadata *MD = getModuleFlag("stack-protector-guard-symbol");
789 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
790 return MDS->getString();
791 return {};
792}
793
795 MDString *ID = MDString::get(getContext(), Symbol);
796 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-symbol", ID);
797}
798
800 Metadata *MD = getModuleFlag("stack-protector-guard-offset");
802 return CI->getSExtValue();
803 return INT_MAX;
804}
805
807 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-offset", Offset);
808}
809
810unsigned Module::getOverrideStackAlignment() const {
811 Metadata *MD = getModuleFlag("override-stack-alignment");
813 return CI->getZExtValue();
814 return 0;
815}
816
817unsigned Module::getMaxTLSAlignment() const {
818 Metadata *MD = getModuleFlag("MaxTLSAlign");
820 return CI->getZExtValue();
821 return 0;
822}
823
825 addModuleFlag(ModFlagBehavior::Error, "override-stack-alignment", Align);
826}
827
828static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name) {
830 Entries.push_back(V.getMajor());
831 if (auto Minor = V.getMinor()) {
832 Entries.push_back(*Minor);
833 if (auto Subminor = V.getSubminor())
834 Entries.push_back(*Subminor);
835 // Ignore the 'build' component as it can't be represented in the object
836 // file.
837 }
838 M.addModuleFlag(Module::ModFlagBehavior::Warning, Name,
839 ConstantDataArray::get(M.getContext(), Entries));
840}
841
842void Module::setSDKVersion(const VersionTuple &V) {
843 addSDKVersionMD(V, *this, "SDK Version");
844}
845
848 if (!CM)
849 return {};
850 auto *Arr = dyn_cast_or_null<ConstantDataArray>(CM->getValue());
851 if (!Arr)
852 return {};
853 auto getVersionComponent = [&](unsigned Index) -> std::optional<unsigned> {
854 if (Index >= Arr->getNumElements())
855 return std::nullopt;
856 return (unsigned)Arr->getElementAsInteger(Index);
857 };
858 auto Major = getVersionComponent(0);
859 if (!Major)
860 return {};
862 if (auto Minor = getVersionComponent(1)) {
863 Result = VersionTuple(*Major, *Minor);
864 if (auto Subminor = getVersionComponent(2)) {
865 Result = VersionTuple(*Major, *Minor, *Subminor);
866 }
867 }
868 return Result;
869}
870
872 return getSDKVersionMD(getModuleFlag("SDK Version"));
873}
874
876 const Module &M, SmallVectorImpl<GlobalValue *> &Vec, bool CompilerUsed) {
877 const char *Name = CompilerUsed ? "llvm.compiler.used" : "llvm.used";
878 GlobalVariable *GV = M.getGlobalVariable(Name);
879 if (!GV || !GV->hasInitializer())
880 return GV;
881
883 for (Value *Op : Init->operands()) {
884 GlobalValue *G = cast<GlobalValue>(Op->stripPointerCasts());
885 Vec.push_back(G);
886 }
887 return GV;
888}
889
891 if (auto *SummaryMD = getProfileSummary(/*IsCS*/ false)) {
892 std::unique_ptr<ProfileSummary> ProfileSummary(
893 ProfileSummary::getFromMD(SummaryMD));
894 if (ProfileSummary) {
897 return;
898 uint64_t BlockCount = Index.getBlockCount();
899 uint32_t NumCounts = ProfileSummary->getNumCounts();
900 if (!NumCounts)
901 return;
902 double Ratio = (double)BlockCount / NumCounts;
904 setProfileSummary(ProfileSummary->getMD(getContext()),
906 }
907 }
908}
909
911 if (const auto *MD = getModuleFlag("darwin.target_variant.triple"))
912 return cast<MDString>(MD)->getString();
913 return "";
914}
915
917 addModuleFlag(ModFlagBehavior::Warning, "darwin.target_variant.triple",
919}
920
922 return getSDKVersionMD(getModuleFlag("darwin.target_variant.SDK Version"));
923}
924
926 addSDKVersionMD(Version, *this, "darwin.target_variant.SDK Version");
927}
928
930 StringRef TargetABI;
931 if (auto *TargetABIMD =
932 dyn_cast_or_null<MDString>(getModuleFlag("target-abi")))
933 TargetABI = TargetABIMD->getString();
934 return TargetABI;
935}
936
938 Metadata *MD = getModuleFlag("winx64-eh-unwindv2");
940 return static_cast<WinX64EHUnwindV2Mode>(CI->getZExtValue());
942}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
Lower uses of LDS variables from non kernel functions
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_EXPORT_TEMPLATE
Definition Compiler.h:215
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil globals
dxil translate DXIL Translate Metadata
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define G(x, y, z)
Definition MD5.cpp:55
Machine Check Debug Module
Register Reg
static Constant * getOrInsertGlobal(Module &M, StringRef Name, Type *Ty)
This file contains the declarations for metadata subclasses.
#define T
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
static VersionTuple getSDKVersionMD(Metadata *MD)
Definition Module.cpp:846
static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name)
Definition Module.cpp:828
This file defines the SmallString class.
This file defines the SmallVector class.
Defines the llvm::VersionTuple class, which represents a version in the form major[....
ConstantArray - Constant Array Declarations.
Definition Constants.h:438
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:536
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:720
This is the shared class of boolean and integer constants.
Definition Constants.h:87
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
Definition Function.h:166
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Metadata node.
Definition Metadata.h:1078
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
A single uniqued string.
Definition Metadata.h:721
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:608
Class to hold module path string table and global value map, and encapsulate methods for operating on...
LLVM_ABI DICompileUnit * operator*() const
Definition Module.cpp:438
LLVM_ABI DICompileUnit * operator->() const
Definition Module.cpp:441
void setStackProtectorGuardSymbol(StringRef Symbol)
Definition Module.cpp:794
void setSemanticInterposition(bool)
Set whether semantic interposition is to be respected.
Definition Module.cpp:714
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
Definition Module.cpp:301
@ Warning
Emits a warning if two values disagree.
Definition Module.h:124
llvm::Error materializeAll()
Make sure all GlobalValues in this Module are fully read and clear the Materializer.
Definition Module.cpp:484
WinX64EHUnwindV2Mode getWinX64EHUnwindV2Mode() const
Get how unwind v2 (epilog) information should be generated for x64 Windows.
Definition Module.cpp:937
void setOverrideStackAlignment(unsigned Align)
Definition Module.cpp:824
void setDirectAccessExternalData(bool Value)
Definition Module.cpp:739
unsigned getMaxTLSAlignment() const
Definition Module.cpp:817
StringRef getTargetABIFromMD()
Returns target-abi from MDString, null if target-abi is absent.
Definition Module.cpp:929
void setOwnedMemoryBuffer(std::unique_ptr< MemoryBuffer > MB)
Take ownership of the given memory buffer.
Definition Module.cpp:718
void setMaterializer(GVMaterializer *GVM)
Sets the GVMaterializer to GVM.
Definition Module.cpp:470
llvm::Error materialize(GlobalValue *GV)
Make sure the GlobalValue is fully read.
Definition Module.cpp:477
Function * getFunction(StringRef Name) const
Look up the specified function in the module symbol table.
Definition Module.cpp:235
void setCodeModel(CodeModel::Model CL)
Set the code model (tiny, small, kernel, medium or large)
Definition Module.cpp:667
StringRef getStackProtectorGuardSymbol() const
Get/set a symbol to use as the stack protector guard.
Definition Module.cpp:787
bool getSemanticInterposition() const
Returns whether semantic interposition is to be respected.
Definition Module.cpp:704
void getMDKindNames(SmallVectorImpl< StringRef > &Result) const
Populate client supplied SmallVector with the name for custom metadata IDs registered in this LLVMCon...
Definition Module.cpp:194
Module(StringRef ModuleID, LLVMContext &C)
The Module constructor.
Definition Module.cpp:73
void removeDebugIntrinsicDeclarations()
Used when printing this module in the new debug info format; removes all declarations of debug intrin...
Definition Module.cpp:127
void setRtLibUseGOT()
Set that PLT should be avoid for RTLib calls.
Definition Module.cpp:727
llvm::Error materializeMetadata()
Definition Module.cpp:491
NamedMDNode * getOrInsertModuleFlagsMetadata()
Returns the NamedMDNode in the module that represents module-level flags.
Definition Module.cpp:372
void eraseNamedMetadata(NamedMDNode *NMD)
Remove the given NamedMDNode from this module and delete it.
Definition Module.cpp:322
unsigned getNumNamedValues() const
Return the number of global values in the module.
Definition Module.cpp:181
unsigned getMDKindID(StringRef Name) const
Return a unique non-zero ID for the specified metadata kind.
Definition Module.cpp:187
void setFramePointer(FramePointerKind Kind)
Definition Module.cpp:759
std::optional< uint64_t > getLargeDataThreshold() const
Returns the large data threshold.
Definition Module.cpp:675
StringRef getStackProtectorGuard() const
Get/set what kind of stack protector guard to use.
Definition Module.cpp:763
bool getRtLibUseGOT() const
Returns true if PLT should be avoided for RTLib calls.
Definition Module.cpp:722
void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val)
Like addModuleFlag but replaces the old module flag if it already exists.
Definition Module.cpp:407
UWTableKind getUwtable() const
Get/set whether synthesized functions should get the uwtable attribute.
Definition Module.cpp:743
void dropAllReferences()
This function causes all the subinstructions to "let go" of all references that they are maintaining.
Definition Module.cpp:573
void setStackProtectorGuard(StringRef Kind)
Definition Module.cpp:770
void setProfileSummary(Metadata *M, ProfileSummary::Kind Kind)
Attach profile summary metadata to this module.
Definition Module.cpp:692
void setUwtable(UWTableKind Kind)
Definition Module.cpp:749
unsigned getCodeViewFlag() const
Returns the CodeView Version by checking module flags.
Definition Module.cpp:607
void setPartialSampleProfileRatio(const ModuleSummaryIndex &Index)
Set the partial sample profile ratio in the profile summary module flag, if applicable.
Definition Module.cpp:890
Module & operator=(Module &&Other)
Move assignment.
Definition Module.cpp:79
std::string getUniqueIntrinsicName(StringRef BaseName, Intrinsic::ID Id, const FunctionType *Proto)
Return a unique name for an intrinsic whose mangling is based on an unnamed type.
Definition Module.cpp:516
~Module()
The module destructor. This will dropAllReferences.
Definition Module.cpp:118
FramePointerKind getFramePointer() const
Get/set whether synthesized functions should get the "frame-pointer" attribute.
Definition Module.cpp:753
unsigned getOverrideStackAlignment() const
Get/set the stack alignment overridden from the default.
Definition Module.cpp:810
void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val)
Add a module-level flag to the module-level flags metadata.
Definition Module.cpp:381
void setStackProtectorGuardReg(StringRef Reg)
Definition Module.cpp:782
PICLevel::Level getPICLevel() const
Returns the PIC level (small or large model)
Definition Module.cpp:627
std::unique_ptr< RandomNumberGenerator > createRNG(const StringRef Name) const
Get a RandomNumberGenerator salted for use with this module.
Definition Module.cpp:155
std::vector< StructType * > getIdentifiedStructTypes() const
Definition Module.cpp:502
void setDarwinTargetVariantTriple(StringRef T)
Set the target variant triple which is a string describing a variant of the target host platform.
Definition Module.cpp:916
void setPICLevel(PICLevel::Level PL)
Set the PIC level (small or large model)
Definition Module.cpp:637
unsigned getNumberRegisterParameters() const
Returns the Number of Register ParametersDwarf Version by checking module flags.
Definition Module.cpp:587
GlobalIFunc * getNamedIFunc(StringRef Name) const
Return the global ifunc in the module with the specified name, of arbitrary type.
Definition Module.cpp:294
StringRef getStackProtectorGuardReg() const
Get/set which register to use as the stack protector guard register.
Definition Module.cpp:775
unsigned getDwarfVersion() const
Returns the Dwarf Version by checking module flags.
Definition Module.cpp:595
void setDataLayout(StringRef Desc)
Set the data layout.
Definition Module.cpp:434
GlobalVariable * getGlobalVariable(StringRef Name) const
Look up the specified global variable in the module symbol table.
Definition Module.h:430
void setLargeDataThreshold(uint64_t Threshold)
Set the large data threshold.
Definition Module.cpp:685
bool isDwarf64() const
Returns the DWARF format by checking module flags.
Definition Module.cpp:602
static bool isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB)
Checks if Metadata represents a valid ModFlagBehavior, and stores the converted result in MFB.
Definition Module.cpp:329
void setStackProtectorGuardOffset(int Offset)
Definition Module.cpp:806
iterator_range< global_object_iterator > global_objects()
Definition Module.cpp:451
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type.
Definition Module.cpp:177
unsigned getInstructionCount() const
Returns the number of non-debug IR instructions in the module.
Definition Module.cpp:614
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Definition Module.cpp:308
void getOperandBundleTags(SmallVectorImpl< StringRef > &Result) const
Populate client supplied SmallVector with the bundle tags registered in this LLVMContext.
Definition Module.cpp:198
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Definition Module.cpp:621
FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T, AttributeList AttributeList)
Look up the specified function in the module symbol table.
Definition Module.cpp:211
std::optional< CodeModel::Model > getCodeModel() const
Returns the code model (tiny, small, kernel, medium or large model)
Definition Module.cpp:657
VersionTuple getDarwinTargetVariantSDKVersion() const
Get the target variant version build SDK version metadata.
Definition Module.cpp:921
void setPIELevel(PIELevel::Level PL)
Set the PIE level (small or large model)
Definition Module.cpp:653
GlobalVariable * getOrInsertGlobal(StringRef Name, Type *Ty, function_ref< GlobalVariable *()> CreateGlobalCallback)
Look up the specified global in the module symbol table.
Definition Module.cpp:262
VersionTuple getSDKVersion() const
Get the build SDK version metadata.
Definition Module.cpp:871
GlobalAlias * getNamedAlias(StringRef Name) const
Return the global alias in the module with the specified name, of arbitrary type.
Definition Module.cpp:290
void setDarwinTargetVariantSDKVersion(VersionTuple Version)
Set the target variant version build SDK version metadata.
Definition Module.cpp:925
PIELevel::Level getPIELevel() const
Returns the PIE level (small or large model)
Definition Module.cpp:643
StringRef getDarwinTargetVariantTriple() const
Get the target variant triple which is a string describing a variant of the target host platform.
Definition Module.cpp:910
void setSDKVersion(const VersionTuple &V)
Attach a build SDK version metadata to this module.
Definition Module.cpp:842
iterator_range< global_value_iterator > global_values()
Definition Module.cpp:459
int getStackProtectorGuardOffset() const
Get/set what offset from the stack protector to use.
Definition Module.cpp:799
bool getDirectAccessExternalData() const
Get/set whether referencing global variables can use direct access relocations on ELF targets.
Definition Module.cpp:731
Metadata * getProfileSummary(bool IsCS) const
Returns profile summary metadata.
Definition Module.cpp:699
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition Module.cpp:358
A tuple of MDNodes.
Definition Metadata.h:1757
LLVM_ABI void setOperand(unsigned I, MDNode *New)
LLVM_ABI StringRef getName() const
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
iterator_range< op_iterator > operands()
Definition Metadata.h:1853
void setPartialProfileRatio(double R)
LLVM_ABI Metadata * getMD(LLVMContext &Context, bool AddPartialField=true, bool AddPartialProfileRatioField=true)
Return summary information as metadata.
uint32_t getNumCounts() const
bool isPartialProfile() const
static LLVM_ABI ProfileSummary * getFromMD(Metadata *MD)
Construct profile summary from metdata.
A random number generator.
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.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
TypeFinder - Walk over a module, identifying all of the types that are used by the module.
Definition TypeFinder.h:31
iterator end()
Definition TypeFinder.h:52
void run(const Module &M, bool onlyNamed)
iterator begin()
Definition TypeFinder.h:51
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:297
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:296
void dropAllReferences()
Drop all references to operands.
Definition User.h:350
This class provides a symbol table of name/value pairs.
Represents a version number in the form major[.minor[.subminor[.build]]].
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
LLVM_ABI Function * getDeclarationIfExists(const Module *M, ID id)
Look up the Function declaration of the intrinsic id in the Module M and return it if it exists.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
Definition Metadata.h:708
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
Definition Metadata.h:650
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:667
Context & getContext() const
Definition BasicBlock.h:99
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition Path.cpp:578
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
FramePointerKind
Definition CodeGen.h:118
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:296
auto cast_or_null(const Y &Val)
Definition Casting.h:714
Op::Description Desc
detail::concat_range< ValueT, RangeTs... > concat(RangeTs &&...Ranges)
Returns a concatenated range across two or more ranges.
Definition STLExtras.h:1150
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
UWTableKind
Definition CodeGen.h:154
@ None
No unwind table requested.
Definition CodeGen.h:155
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ Other
Any other memory.
Definition ModRef.h:68
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
WinX64EHUnwindV2Mode
Definition CodeGen.h:167
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:875
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39