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