LLVM 24.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 uint64_t Val) {
395 Type *Int64Ty = Type::getInt64Ty(Context);
396 addModuleFlag(Behavior, Key, ConstantInt::get(Int64Ty, Val));
397}
398void Module::addModuleFlag(ModFlagBehavior Behavior, StringRef Key,
399 uint32_t Val) {
400 Type *Int32Ty = Type::getInt32Ty(Context);
401 addModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val));
402}
404 assert(Node->getNumOperands() == 3 &&
405 "Invalid number of operands for module flag!");
406 assert(mdconst::hasa<ConstantInt>(Node->getOperand(0)) &&
407 isa<MDString>(Node->getOperand(1)) &&
408 "Invalid operand types for module flag!");
409 getOrInsertModuleFlagsMetadata()->addOperand(Node);
410}
411
412void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
413 Metadata *Val) {
414 NamedMDNode *ModFlags = getOrInsertModuleFlagsMetadata();
415 // Replace the flag if it already exists.
416 for (unsigned i = 0; i < ModFlags->getNumOperands(); ++i) {
417 MDNode *Flag = ModFlags->getOperand(i);
418 if (cast<MDString>(Flag->getOperand(1))->getString() == Key) {
419 Type *Int32Ty = Type::getInt32Ty(Context);
420 Metadata *Ops[3] = {
421 ConstantAsMetadata::get(ConstantInt::get(Int32Ty, Behavior)),
422 MDString::get(Context, Key), Val};
423 ModFlags->setOperand(i, MDNode::get(Context, Ops));
424 return;
425 }
426 }
427 addModuleFlag(Behavior, Key, Val);
428}
429void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
430 Constant *Val) {
431 setModuleFlag(Behavior, Key, ConstantAsMetadata::get(Val));
432}
433void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
434 uint64_t Val) {
435 Type *Int64Ty = Type::getInt64Ty(Context);
436 setModuleFlag(Behavior, Key, ConstantInt::get(Int64Ty, Val));
437}
438void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key,
439 uint32_t Val) {
440 Type *Int32Ty = Type::getInt32Ty(Context);
441 setModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val));
442}
443
445
447
449 return cast<DICompileUnit>(CUs->getOperand(Idx));
450}
452 return cast<DICompileUnit>(CUs->getOperand(Idx));
453}
454
455void Module::debug_compile_units_iterator::SkipNoDebugCUs() {
456 while (CUs && (Idx < CUs->getNumOperands()) &&
457 ((*this)->getEmissionKind() == DICompileUnit::NoDebug))
458 ++Idx;
459}
460
463}
467}
468
470 return concat<GlobalValue>(functions(), globals(), aliases(), ifuncs());
471}
473Module::global_values() const {
474 return concat<const GlobalValue>(functions(), globals(), aliases(), ifuncs());
475}
476
477//===----------------------------------------------------------------------===//
478// Methods to control the materialization of GlobalValues in the Module.
479//
481 assert(!Materializer &&
482 "Module already has a GVMaterializer. Call materializeAll"
483 " to clear it out before setting another one.");
484 Materializer.reset(GVM);
485}
486
488 if (!Materializer)
489 return Error::success();
490
491 return Materializer->materialize(GV);
492}
493
495 if (!Materializer)
496 return Error::success();
497 std::unique_ptr<GVMaterializer> M = std::move(Materializer);
498 return M->materializeModule();
499}
500
502 llvm::TimeTraceScope timeScope("Materialize metadata");
503 if (!Materializer)
504 return Error::success();
505 return Materializer->materializeMetadata();
506}
507
508//===----------------------------------------------------------------------===//
509// Other module related stuff.
510//
511
512std::vector<StructType *> Module::getIdentifiedStructTypes() const {
513 // If we have a materializer, it is possible that some unread function
514 // uses a type that is currently not visible to a TypeFinder, so ask
515 // the materializer which types it created.
516 if (Materializer)
517 return Materializer->getIdentifiedStructTypes();
518
519 std::vector<StructType *> Ret;
520 TypeFinder SrcStructTypes;
521 SrcStructTypes.run(*this, true);
522 Ret.assign(SrcStructTypes.begin(), SrcStructTypes.end());
523 return Ret;
524}
525
527 const FunctionType *Proto) {
528 auto Encode = [&BaseName](unsigned Suffix) {
529 return (Twine(BaseName) + "." + Twine(Suffix)).str();
530 };
531
532 {
533 // fast path - the prototype is already known
534 auto UinItInserted = UniquedIntrinsicNames.insert({{Id, Proto}, 0});
535 if (!UinItInserted.second)
536 return Encode(UinItInserted.first->second);
537 }
538
539 // Not known yet. A new entry was created with index 0. Check if there already
540 // exists a matching declaration, or select a new entry.
541
542 // Start looking for names with the current known maximum count (or 0).
543 auto NiidItInserted = CurrentIntrinsicIds.insert({BaseName, 0});
544 unsigned Count = NiidItInserted.first->second;
545
546 // This might be slow if a whole population of intrinsics already existed, but
547 // we cache the values for later usage.
548 std::string NewName;
549 while (true) {
550 NewName = Encode(Count);
551 GlobalValue *F = getNamedValue(NewName);
552 if (!F) {
553 // Reserve this entry for the new proto
554 UniquedIntrinsicNames[{Id, Proto}] = Count;
555 break;
556 }
557
558 // A declaration with this name already exists. Remember it.
559 FunctionType *FT = dyn_cast<FunctionType>(F->getValueType());
560 auto UinItInserted = UniquedIntrinsicNames.insert({{Id, FT}, Count});
561 if (FT == Proto) {
562 // It was a declaration for our prototype. This entry was allocated in the
563 // beginning. Update the count to match the existing declaration.
564 UinItInserted.first->second = Count;
565 break;
566 }
567
568 ++Count;
569 }
570
571 NiidItInserted.first->second = Count + 1;
572
573 return NewName;
574}
575
576// dropAllReferences() - This function causes all the subelements to "let go"
577// of all references that they are maintaining. This allows one to 'delete' a
578// whole module at a time, even though there may be circular references... first
579// all references are dropped, and all use counts go to zero. Then everything
580// is deleted for real. Note that no operations are valid on an object that
581// has "dropped all references", except operator delete.
582//
584 for (Function &F : *this)
585 F.dropAllReferences();
586
587 for (GlobalVariable &GV : globals())
589
590 for (GlobalAlias &GA : aliases())
591 GA.dropAllReferences();
592
593 for (GlobalIFunc &GIF : ifuncs())
594 GIF.dropAllReferences();
595}
596
598 auto *Val =
599 cast_or_null<ConstantAsMetadata>(getModuleFlag("NumRegisterParameters"));
600 if (!Val)
601 return 0;
602 return cast<ConstantInt>(Val->getValue())->getZExtValue();
603}
604
605unsigned Module::getDwarfVersion() const {
606 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Dwarf Version"));
607 if (!Val)
608 return 0;
609 return cast<ConstantInt>(Val->getValue())->getZExtValue();
610}
611
612bool Module::isDwarf64() const {
613 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("DWARF64"));
614 return Val && cast<ConstantInt>(Val->getValue())->isOne();
615}
616
617unsigned Module::getCodeViewFlag() const {
618 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("CodeView"));
619 if (!Val)
620 return 0;
621 return cast<ConstantInt>(Val->getValue())->getZExtValue();
622}
623
624unsigned Module::getInstructionCount() const {
625 unsigned NumInstrs = 0;
626 for (const Function &F : FunctionList)
627 NumInstrs += F.getInstructionCount();
628 return NumInstrs;
629}
630
632 auto &Entry = *ComdatSymTab.insert(std::make_pair(Name, Comdat())).first;
633 Entry.second.Name = &Entry;
634 return &Entry.second;
635}
636
638 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIC Level"));
639
640 if (!Val)
641 return PICLevel::NotPIC;
642
643 return static_cast<PICLevel::Level>(
644 cast<ConstantInt>(Val->getValue())->getZExtValue());
645}
646
648 // The merge result of a non-PIC object and a PIC object can only be reliably
649 // used as a non-PIC object, so use the Min merge behavior.
650 addModuleFlag(ModFlagBehavior::Min, "PIC Level", PL);
651}
652
654 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("PIE Level"));
655
656 if (!Val)
657 return PIELevel::Default;
658
659 return static_cast<PIELevel::Level>(
660 cast<ConstantInt>(Val->getValue())->getZExtValue());
661}
662
664 addModuleFlag(ModFlagBehavior::Max, "PIE Level", PL);
665}
666
667std::optional<CodeModel::Model> Module::getCodeModel() const {
668 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("Code Model"));
669
670 if (!Val)
671 return std::nullopt;
672
673 return static_cast<CodeModel::Model>(
674 cast<ConstantInt>(Val->getValue())->getZExtValue());
675}
676
678 // Linking object files with different code models is undefined behavior
679 // because the compiler would have to generate additional code (to span
680 // longer jumps) if a larger code model is used with a smaller one.
681 // Therefore we will treat attempts to mix code models as an error.
682 addModuleFlag(ModFlagBehavior::Error, "Code Model", CL);
683}
684
686 if (auto *Val =
687 dyn_cast_or_null<MDString>(getModuleFlag("long-double-type"))) {
688 if (std::optional<LongDoubleFormat> Format =
689 parseLongDoubleFormat(Val->getString()))
690 return *Format;
691 }
692
693 return getTargetTriple().getDefaultLongDoubleFormat();
694}
695
697 addModuleFlag(ModFlagBehavior::Error, "long-double-type",
699}
700
702 if (auto *Val = dyn_cast_or_null<MDString>(getModuleFlag("float-abi")))
703 return FloatABI::parseABIType(Val->getString()).value_or(FloatABI::Default);
704 return FloatABI::Default;
705}
706
707std::optional<uint64_t> Module::getLargeDataThreshold() const {
708 auto *Val =
709 cast_or_null<ConstantAsMetadata>(getModuleFlag("Large Data Threshold"));
710
711 if (!Val)
712 return std::nullopt;
713
714 return cast<ConstantInt>(Val->getValue())->getZExtValue();
715}
716
718 // Since the large data threshold goes along with the code model, the merge
719 // behavior is the same.
720 addModuleFlag(ModFlagBehavior::Error, "Large Data Threshold",
721 ConstantInt::get(Type::getInt64Ty(Context), Threshold));
722}
723
725 if (Kind == ProfileSummary::PSK_CSInstr)
726 setModuleFlag(ModFlagBehavior::Error, "CSProfileSummary", M);
727 else
728 setModuleFlag(ModFlagBehavior::Error, "ProfileSummary", M);
729}
730
731Metadata *Module::getProfileSummary(bool IsCS) const {
732 return (IsCS ? getModuleFlag("CSProfileSummary")
733 : getModuleFlag("ProfileSummary"));
734}
735
737 Metadata *MF = getModuleFlag("SemanticInterposition");
738
739 auto *Val = cast_or_null<ConstantAsMetadata>(MF);
740 if (!Val)
741 return false;
742
743 return cast<ConstantInt>(Val->getValue())->getZExtValue();
744}
745
747 addModuleFlag(ModFlagBehavior::Error, "SemanticInterposition", SI);
748}
749
750void Module::setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB) {
751 OwnedMemoryBuffer = std::move(MB);
752}
753
754bool Module::getRtLibUseGOT() const {
755 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("RtLibUseGOT"));
756 return Val && (cast<ConstantInt>(Val->getValue())->getZExtValue() > 0);
757}
758
760 addModuleFlag(ModFlagBehavior::Max, "RtLibUseGOT", 1);
761}
762
765 getModuleFlag("direct-access-external-data"));
766 if (Val)
767 return cast<ConstantInt>(Val->getValue())->getZExtValue() > 0;
768 return getPICLevel() == PICLevel::NotPIC;
769}
770
772 addModuleFlag(ModFlagBehavior::Max, "direct-access-external-data", Value);
773}
774
776 if (auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("uwtable")))
777 return UWTableKind(cast<ConstantInt>(Val->getValue())->getZExtValue());
778 return UWTableKind::None;
779}
780
782 addModuleFlag(ModFlagBehavior::Max, "uwtable", uint32_t(Kind));
783}
784
785FramePointerKind Module::getFramePointer() const {
786 auto *Val = cast_or_null<ConstantAsMetadata>(getModuleFlag("frame-pointer"));
787 return static_cast<FramePointerKind>(
788 Val ? cast<ConstantInt>(Val->getValue())->getZExtValue() : 0);
789}
790
791void Module::setFramePointer(FramePointerKind Kind) {
792 addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast<int>(Kind));
793}
794
797 getModuleFlag("stack-protector-guard-record"));
798 return Val && cast<ConstantInt>(Val->getValue())->isOne();
799}
800
802 addModuleFlag(ModFlagBehavior::Max, "stack-protector-guard-record",
803 Flag ? 1 : 0);
804}
805
807 Metadata *MD = getModuleFlag("stack-protector-guard");
808 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
809 return MDS->getString();
810 return {};
811}
812
814 MDString *ID = MDString::get(getContext(), Kind);
815 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard", ID);
816}
817
819 Metadata *MD = getModuleFlag("stack-protector-guard-reg");
820 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
821 return MDS->getString();
822 return {};
823}
824
827 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-reg", ID);
828}
829
831 Metadata *MD = getModuleFlag("stack-protector-guard-symbol");
832 if (auto *MDS = dyn_cast_or_null<MDString>(MD))
833 return MDS->getString();
834 return {};
835}
836
838 MDString *ID = MDString::get(getContext(), Symbol);
839 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-symbol", ID);
840}
841
843 Metadata *MD = getModuleFlag("stack-protector-guard-offset");
845 return CI->getSExtValue();
846 return INT_MAX;
847}
848
850 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-offset", Offset);
851}
852
853std::optional<unsigned> Module::getStackProtectorGuardValueWidth() const {
854 Metadata *MD = getModuleFlag("stack-protector-guard-value-width");
856 return CI->getZExtValue();
857 return std::nullopt;
858}
859
860void Module::setStackProtectorGuardValueWidth(unsigned Width) {
861 addModuleFlag(ModFlagBehavior::Error, "stack-protector-guard-value-width",
862 Width);
863}
864
865unsigned Module::getOverrideStackAlignment() const {
866 Metadata *MD = getModuleFlag("override-stack-alignment");
868 return CI->getZExtValue();
869 return 0;
870}
871
872unsigned Module::getMaxTLSAlignment() const {
873 Metadata *MD = getModuleFlag("MaxTLSAlign");
875 return CI->getZExtValue();
876 return 0;
877}
878
880 addModuleFlag(ModFlagBehavior::Error, "override-stack-alignment", Align);
881}
882
883static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name) {
885 Entries.push_back(V.getMajor());
886 if (auto Minor = V.getMinor()) {
887 Entries.push_back(*Minor);
888 if (auto Subminor = V.getSubminor())
889 Entries.push_back(*Subminor);
890 // Ignore the 'build' component as it can't be represented in the object
891 // file.
892 }
893 M.addModuleFlag(Module::ModFlagBehavior::Warning, Name,
894 ConstantDataArray::get(M.getContext(), Entries));
895}
896
897void Module::setSDKVersion(const VersionTuple &V) {
898 addSDKVersionMD(V, *this, "SDK Version");
899}
900
903 if (!CM)
904 return {};
905 auto *Arr = dyn_cast_or_null<ConstantDataArray>(CM->getValue());
906 if (!Arr)
907 return {};
908 auto getVersionComponent = [&](unsigned Index) -> std::optional<unsigned> {
909 if (Index >= Arr->getNumElements())
910 return std::nullopt;
911 return (unsigned)Arr->getElementAsInteger(Index);
912 };
913 auto Major = getVersionComponent(0);
914 if (!Major)
915 return {};
917 if (auto Minor = getVersionComponent(1)) {
918 Result = VersionTuple(*Major, *Minor);
919 if (auto Subminor = getVersionComponent(2)) {
920 Result = VersionTuple(*Major, *Minor, *Subminor);
921 }
922 }
923 return Result;
924}
925
927 return getSDKVersionMD(getModuleFlag("SDK Version"));
928}
929
931 const Module &M, SmallVectorImpl<GlobalValue *> &Vec, bool CompilerUsed) {
932 const char *Name = CompilerUsed ? "llvm.compiler.used" : "llvm.used";
933 GlobalVariable *GV = M.getGlobalVariable(Name);
934 if (!GV || !GV->hasInitializer())
935 return GV;
936
938 for (Value *Op : Init->operands()) {
939 GlobalValue *G = cast<GlobalValue>(Op->stripPointerCasts());
940 Vec.push_back(G);
941 }
942 return GV;
943}
944
946 if (auto *SummaryMD = getProfileSummary(/*IsCS*/ false)) {
947 std::unique_ptr<ProfileSummary> ProfileSummary(
948 ProfileSummary::getFromMD(SummaryMD));
949 if (ProfileSummary) {
952 return;
953 uint64_t BlockCount = Index.getBlockCount();
954 uint32_t NumCounts = ProfileSummary->getNumCounts();
955 if (!NumCounts)
956 return;
957 double Ratio = (double)BlockCount / NumCounts;
959 setProfileSummary(ProfileSummary->getMD(getContext()),
961 }
962 }
963}
964
966 if (const auto *MD = getModuleFlag("darwin.target_variant.triple"))
967 return cast<MDString>(MD)->getString();
968 return "";
969}
970
972 addModuleFlag(ModFlagBehavior::Warning, "darwin.target_variant.triple",
974}
975
977 return getSDKVersionMD(getModuleFlag("darwin.target_variant.SDK Version"));
978}
979
981 addSDKVersionMD(Version, *this, "darwin.target_variant.SDK Version");
982}
983
985 StringRef TargetABI;
986 if (auto *TargetABIMD =
987 dyn_cast_or_null<MDString>(getModuleFlag("target-abi")))
988 TargetABI = TargetABIMD->getString();
989 return TargetABI;
990}
991
993 // Check the new unified flag first.
994 if (Metadata *MD = getModuleFlag("winx64-eh-unwind")) {
996 return static_cast<WinX64EHUnwindMode>(CI->getZExtValue());
997 }
998 // Fall back to the legacy V2 flag.
999 if (Metadata *MD = getModuleFlag("winx64-eh-unwindv2")) {
1001 return static_cast<WinX64EHUnwindMode>(CI->getZExtValue());
1002 }
1004}
1005
1007 Metadata *MD = getModuleFlag("cfguard");
1009 return static_cast<ControlFlowGuardMode>(CI->getZExtValue());
1011}
1012
1013bool Module::GlobalAsmProperties::set(StringRef Name, std::string Value) {
1014 if (Name == "target_features")
1015 TargetFeatures = std::move(Value);
1016 else if (Name == "target_cpu")
1017 TargetCPU = std::move(Value);
1018 else
1019 return false;
1020 return true;
1021}
1022
1026 if (!TargetFeatures.empty())
1027 Props.emplace_back("target_features", TargetFeatures);
1028 if (!TargetCPU.empty())
1029 Props.emplace_back("target_cpu", TargetCPU);
1030 return Props;
1031}
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:217
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, GsymDataExtractor &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)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static VersionTuple getSDKVersionMD(Metadata *MD)
Definition Module.cpp:901
static void addSDKVersionMD(const VersionTuple &V, Module &M, StringRef Name)
Definition Module.cpp:883
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:590
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
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:878
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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:168
@ 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:1069
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
A single uniqued string.
Definition Metadata.h:722
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:615
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:448
LLVM_ABI DICompileUnit * operator->() const
Definition Module.cpp:451
void setStackProtectorGuardSymbol(StringRef Symbol)
Definition Module.cpp:837
void setSemanticInterposition(bool)
Set whether semantic interposition is to be respected.
Definition Module.cpp:746
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:494
void setOverrideStackAlignment(unsigned Align)
Definition Module.cpp:879
void setDirectAccessExternalData(bool Value)
Definition Module.cpp:771
unsigned getMaxTLSAlignment() const
Definition Module.cpp:872
StringRef getTargetABIFromMD()
Returns target-abi from MDString, null if target-abi is absent.
Definition Module.cpp:984
WinX64EHUnwindMode getWinX64EHUnwindMode() const
Get how unwind information should be generated for x64 Windows.
Definition Module.cpp:992
void setOwnedMemoryBuffer(std::unique_ptr< MemoryBuffer > MB)
Take ownership of the given memory buffer.
Definition Module.cpp:750
void setMaterializer(GVMaterializer *GVM)
Sets the GVMaterializer to GVM.
Definition Module.cpp:480
llvm::Error materialize(GlobalValue *GV)
Make sure the GlobalValue is fully read.
Definition Module.cpp:487
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:677
LongDoubleFormat getLongDoubleFormat() const
Returns the long double format from the "long-double-type" module flag, or the triple default when th...
Definition Module.cpp:685
StringRef getStackProtectorGuardSymbol() const
Get/set a symbol to use as the stack protector guard.
Definition Module.cpp:830
FloatABI::ABIType getFloatABI() const
Returns the floating-point ABI recorded by the "float-abi" module flag, or FloatABI::Default when the...
Definition Module.cpp:701
bool getSemanticInterposition() const
Returns whether semantic interposition is to be respected.
Definition Module.cpp:736
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
std::optional< unsigned > getStackProtectorGuardValueWidth() const
Get/set the width in memory of the stack protector guard value.
Definition Module.cpp:853
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:759
llvm::Error materializeMetadata()
Definition Module.cpp:501
NamedMDNode * getOrInsertModuleFlagsMetadata()
Returns the NamedMDNode in the module that represents module-level flags.
Definition Module.cpp:372
ControlFlowGuardMode getControlFlowGuardMode() const
Gets the Control Flow Guard mode.
Definition Module.cpp:1006
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
bool hasStackProtectorGuardRecord() const
Definition Module.cpp:795
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:791
std::optional< uint64_t > getLargeDataThreshold() const
Returns the large data threshold.
Definition Module.cpp:707
StringRef getStackProtectorGuard() const
Get/set what kind of stack protector guard to use.
Definition Module.cpp:806
bool getRtLibUseGOT() const
Returns true if PLT should be avoided for RTLib calls.
Definition Module.cpp:754
void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val)
Like addModuleFlag but replaces the old module flag if it already exists.
Definition Module.cpp:412
UWTableKind getUwtable() const
Get/set whether synthesized functions should get the uwtable attribute.
Definition Module.cpp:775
void dropAllReferences()
This function causes all the subinstructions to "let go" of all references that they are maintaining.
Definition Module.cpp:583
void setStackProtectorGuard(StringRef Kind)
Definition Module.cpp:813
void setProfileSummary(Metadata *M, ProfileSummary::Kind Kind)
Attach profile summary metadata to this module.
Definition Module.cpp:724
void setUwtable(UWTableKind Kind)
Definition Module.cpp:781
unsigned getCodeViewFlag() const
Returns the CodeView Version by checking module flags.
Definition Module.cpp:617
void setPartialSampleProfileRatio(const ModuleSummaryIndex &Index)
Set the partial sample profile ratio in the profile summary module flag, if applicable.
Definition Module.cpp:945
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:526
~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:785
unsigned getOverrideStackAlignment() const
Get/set the stack alignment overridden from the default.
Definition Module.cpp:865
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:825
PICLevel::Level getPICLevel() const
Returns the PIC level (small or large model)
Definition Module.cpp:637
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:512
void setDarwinTargetVariantTriple(StringRef T)
Set the target variant triple which is a string describing a variant of the target host platform.
Definition Module.cpp:971
void setPICLevel(PICLevel::Level PL)
Set the PIC level (small or large model)
Definition Module.cpp:647
unsigned getNumberRegisterParameters() const
Returns the Number of Register ParametersDwarf Version by checking module flags.
Definition Module.cpp:597
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:818
unsigned getDwarfVersion() const
Returns the Dwarf Version by checking module flags.
Definition Module.cpp:605
void setDataLayout(StringRef Desc)
Set the data layout.
Definition Module.cpp:444
GlobalVariable * getGlobalVariable(StringRef Name) const
Look up the specified global variable in the module symbol table.
Definition Module.h:506
void setLargeDataThreshold(uint64_t Threshold)
Set the large data threshold.
Definition Module.cpp:717
bool isDwarf64() const
Returns the DWARF format by checking module flags.
Definition Module.cpp:612
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:849
iterator_range< global_object_iterator > global_objects()
Definition Module.cpp:461
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:624
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
void setStackProtectorGuardRecord(bool Flag)
Definition Module.cpp:801
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Definition Module.cpp:631
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:667
VersionTuple getDarwinTargetVariantSDKVersion() const
Get the target variant version build SDK version metadata.
Definition Module.cpp:976
void setStackProtectorGuardValueWidth(unsigned Width)
Definition Module.cpp:860
void setLongDoubleFormat(LongDoubleFormat Format)
Set the long double format.
Definition Module.cpp:696
void setPIELevel(PIELevel::Level PL)
Set the PIE level (small or large model)
Definition Module.cpp:663
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:926
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:980
PIELevel::Level getPIELevel() const
Returns the PIE level (small or large model)
Definition Module.cpp:653
StringRef getDarwinTargetVariantTriple() const
Get the target variant triple which is a string describing a variant of the target host platform.
Definition Module.cpp:965
void setSDKVersion(const VersionTuple &V)
Attach a build SDK version metadata to this module.
Definition Module.cpp:897
iterator_range< global_value_iterator > global_values()
Definition Module.cpp:469
int getStackProtectorGuardOffset() const
Get/set what offset from the stack protector to use.
Definition Module.cpp:842
bool getDirectAccessExternalData() const
Get/set whether referencing global variables can use direct access relocations on ELF targets.
Definition Module.cpp:763
Metadata * getProfileSummary(bool IsCS) const
Returns profile summary metadata.
Definition Module.cpp:731
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:1755
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:1851
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...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
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
LLVM_ABI void run(const Module &M, bool onlyNamed)
iterator begin()
Definition TypeFinder.h:51
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:310
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:309
void dropAllReferences()
Drop all references to operands.
Definition User.h:324
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.
std::optional< ABIType > parseABIType(StringRef S)
Parse the string spelling used by the "float-abi" IR module flag into an ABIType.
Definition CodeGen.h:117
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:709
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
Definition Metadata.h:651
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:668
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
Definition Path.cpp:594
This is an optimization pass for GlobalISel generic memory operations.
std::optional< LongDoubleFormat > parseLongDoubleFormat(StringRef Name)
Parses an IR floating-point type name into a LongDoubleFormat, returning std::nullopt if it does not ...
Definition CodeGen.h:94
@ Offset
Definition DWP.cpp:578
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
StringRef getLongDoubleFormatName(LongDoubleFormat Format)
Returns the IR floating-point type name for a LongDoubleFormat.
Definition CodeGen.h:76
LongDoubleFormat
The floating-point format used for the target's "long double" type.
Definition CodeGen.h:67
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:1151
ControlFlowGuardMode
Definition CodeGen.h:244
WinX64EHUnwindMode
Definition CodeGen.h:234
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
UWTableKind
Definition CodeGen.h:221
@ None
No unwind table requested.
Definition CodeGen.h:222
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
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
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:930
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
LLVM_ABI bool set(StringRef Name, std::string Value)
Set a property using a string name.
Definition Module.cpp:1013
LLVM_ABI SmallVector< std::pair< StringRef, StringRef > > getAsStrings() const
Get a list of set properties as pairs of key and value.
Definition Module.cpp:1024