xref: /llvm-project/llvm/include/llvm/IR/Module.h (revision a04b0d587a8d260063fe1d50f6fecdc585d75ff4)
1 //===- llvm/Module.h - C++ class to represent a VM module -------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// @file
10 /// Module.h This file contains the declarations for the Module class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_IR_MODULE_H
15 #define LLVM_IR_MODULE_H
16 
17 #include "llvm-c/Types.h"
18 #include "llvm/ADT/STLExtras.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/ADT/iterator_range.h"
22 #include "llvm/IR/Attributes.h"
23 #include "llvm/IR/Comdat.h"
24 #include "llvm/IR/DataLayout.h"
25 #include "llvm/IR/Function.h"
26 #include "llvm/IR/GlobalAlias.h"
27 #include "llvm/IR/GlobalIFunc.h"
28 #include "llvm/IR/GlobalVariable.h"
29 #include "llvm/IR/Metadata.h"
30 #include "llvm/IR/ProfileSummary.h"
31 #include "llvm/IR/SymbolTableListTraits.h"
32 #include "llvm/Support/CBindingWrapping.h"
33 #include "llvm/Support/CodeGen.h"
34 #include <cstddef>
35 #include <cstdint>
36 #include <iterator>
37 #include <memory>
38 #include <optional>
39 #include <string>
40 #include <vector>
41 
42 namespace llvm {
43 
44 class Error;
45 class FunctionType;
46 class GVMaterializer;
47 class LLVMContext;
48 class MemoryBuffer;
49 class ModuleSummaryIndex;
50 class RandomNumberGenerator;
51 class StructType;
52 class VersionTuple;
53 
54 /// A Module instance is used to store all the information related to an
55 /// LLVM module. Modules are the top level container of all other LLVM
56 /// Intermediate Representation (IR) objects. Each module directly contains a
57 /// list of globals variables, a list of functions, a list of libraries (or
58 /// other modules) this module depends on, a symbol table, and various data
59 /// about the target's characteristics.
60 ///
61 /// A module maintains a GlobalList object that is used to hold all
62 /// constant references to global variables in the module.  When a global
63 /// variable is destroyed, it should have no entries in the GlobalList.
64 /// The main container class for the LLVM Intermediate Representation.
65 class LLVM_ABI Module {
66   /// @name Types And Enumerations
67   /// @{
68 public:
69   /// The type for the list of global variables.
70   using GlobalListType = SymbolTableList<GlobalVariable>;
71   /// The type for the list of functions.
72   using FunctionListType = SymbolTableList<Function>;
73   /// The type for the list of aliases.
74   using AliasListType = SymbolTableList<GlobalAlias>;
75   /// The type for the list of ifuncs.
76   using IFuncListType = SymbolTableList<GlobalIFunc>;
77   /// The type for the list of named metadata.
78   using NamedMDListType = ilist<NamedMDNode>;
79   /// The type of the comdat "symbol" table.
80   using ComdatSymTabType = StringMap<Comdat>;
81   /// The type for mapping names to named metadata.
82   using NamedMDSymTabType = StringMap<NamedMDNode *>;
83 
84   /// The Global Variable iterator.
85   using global_iterator = GlobalListType::iterator;
86   /// The Global Variable constant iterator.
87   using const_global_iterator = GlobalListType::const_iterator;
88 
89   /// The Function iterators.
90   using iterator = FunctionListType::iterator;
91   /// The Function constant iterator
92   using const_iterator = FunctionListType::const_iterator;
93 
94   /// The Function reverse iterator.
95   using reverse_iterator = FunctionListType::reverse_iterator;
96   /// The Function constant reverse iterator.
97   using const_reverse_iterator = FunctionListType::const_reverse_iterator;
98 
99   /// The Global Alias iterators.
100   using alias_iterator = AliasListType::iterator;
101   /// The Global Alias constant iterator
102   using const_alias_iterator = AliasListType::const_iterator;
103 
104   /// The Global IFunc iterators.
105   using ifunc_iterator = IFuncListType::iterator;
106   /// The Global IFunc constant iterator
107   using const_ifunc_iterator = IFuncListType::const_iterator;
108 
109   /// The named metadata iterators.
110   using named_metadata_iterator = NamedMDListType::iterator;
111   /// The named metadata constant iterators.
112   using const_named_metadata_iterator = NamedMDListType::const_iterator;
113 
114   /// This enumeration defines the supported behaviors of module flags.
115   enum ModFlagBehavior {
116     /// Emits an error if two values disagree, otherwise the resulting value is
117     /// that of the operands.
118     Error = 1,
119 
120     /// Emits a warning if two values disagree. The result value will be the
121     /// operand for the flag from the first module being linked.
122     Warning = 2,
123 
124     /// Adds a requirement that another module flag be present and have a
125     /// specified value after linking is performed. The value must be a metadata
126     /// pair, where the first element of the pair is the ID of the module flag
127     /// to be restricted, and the second element of the pair is the value the
128     /// module flag should be restricted to. This behavior can be used to
129     /// restrict the allowable results (via triggering of an error) of linking
130     /// IDs with the **Override** behavior.
131     Require = 3,
132 
133     /// Uses the specified value, regardless of the behavior or value of the
134     /// other module. If both modules specify **Override**, but the values
135     /// differ, an error will be emitted.
136     Override = 4,
137 
138     /// Appends the two values, which are required to be metadata nodes.
139     Append = 5,
140 
141     /// Appends the two values, which are required to be metadata
142     /// nodes. However, duplicate entries in the second list are dropped
143     /// during the append operation.
144     AppendUnique = 6,
145 
146     /// Takes the max of the two values, which are required to be integers.
147     Max = 7,
148 
149     /// Takes the min of the two values, which are required to be integers.
150     Min = 8,
151 
152     // Markers:
153     ModFlagBehaviorFirstVal = Error,
154     ModFlagBehaviorLastVal = Min
155   };
156 
157   /// Checks if Metadata represents a valid ModFlagBehavior, and stores the
158   /// converted result in MFB.
159   static bool isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB);
160 
161   struct ModuleFlagEntry {
162     ModFlagBehavior Behavior;
163     MDString *Key;
164     Metadata *Val;
165 
166     ModuleFlagEntry(ModFlagBehavior B, MDString *K, Metadata *V)
167         : Behavior(B), Key(K), Val(V) {}
168   };
169 
170 /// @}
171 /// @name Member Variables
172 /// @{
173 private:
174   LLVMContext &Context;           ///< The LLVMContext from which types and
175                                   ///< constants are allocated.
176   GlobalListType GlobalList;      ///< The Global Variables in the module
177   FunctionListType FunctionList;  ///< The Functions in the module
178   AliasListType AliasList;        ///< The Aliases in the module
179   IFuncListType IFuncList;        ///< The IFuncs in the module
180   NamedMDListType NamedMDList;    ///< The named metadata in the module
181   std::string GlobalScopeAsm;     ///< Inline Asm at global scope.
182   std::unique_ptr<ValueSymbolTable> ValSymTab; ///< Symbol table for values
183   ComdatSymTabType ComdatSymTab;  ///< Symbol table for COMDATs
184   std::unique_ptr<MemoryBuffer>
185   OwnedMemoryBuffer;              ///< Memory buffer directly owned by this
186                                   ///< module, for legacy clients only.
187   std::unique_ptr<GVMaterializer>
188   Materializer;                   ///< Used to materialize GlobalValues
189   std::string ModuleID;           ///< Human readable identifier for the module
190   std::string SourceFileName;     ///< Original source file name for module,
191                                   ///< recorded in bitcode.
192   std::string TargetTriple;       ///< Platform target triple Module compiled on
193                                   ///< Format: (arch)(sub)-(vendor)-(sys0-(abi)
194   NamedMDSymTabType NamedMDSymTab;  ///< NamedMDNode names.
195   DataLayout DL;                  ///< DataLayout associated with the module
196   StringMap<unsigned>
197       CurrentIntrinsicIds; ///< Keep track of the current unique id count for
198                            ///< the specified intrinsic basename.
199   DenseMap<std::pair<Intrinsic::ID, const FunctionType *>, unsigned>
200       UniquedIntrinsicNames; ///< Keep track of uniqued names of intrinsics
201                              ///< based on unnamed types. The combination of
202                              ///< ID and FunctionType maps to the extension that
203                              ///< is used to make the intrinsic name unique.
204 
205   /// llvm.module.flags metadata
206   NamedMDNode *ModuleFlags = nullptr;
207 
208   friend class Constant;
209 
210 /// @}
211 /// @name Constructors
212 /// @{
213 public:
214   /// Is this Module using intrinsics to record the position of debugging
215   /// information, or non-intrinsic records? See IsNewDbgInfoFormat in
216   /// \ref BasicBlock.
217   bool IsNewDbgInfoFormat;
218 
219   /// Used when printing this module in the new debug info format; removes all
220   /// declarations of debug intrinsics that are replaced by non-intrinsic
221   /// records in the new format.
222   void removeDebugIntrinsicDeclarations();
223 
224   /// \see BasicBlock::convertToNewDbgValues.
225   void convertToNewDbgValues() {
226     for (auto &F : *this) {
227       F.convertToNewDbgValues();
228     }
229     IsNewDbgInfoFormat = true;
230   }
231 
232   /// \see BasicBlock::convertFromNewDbgValues.
233   void convertFromNewDbgValues() {
234     for (auto &F : *this) {
235       F.convertFromNewDbgValues();
236     }
237     IsNewDbgInfoFormat = false;
238   }
239 
240   void setIsNewDbgInfoFormat(bool UseNewFormat) {
241     if (UseNewFormat && !IsNewDbgInfoFormat)
242       convertToNewDbgValues();
243     else if (!UseNewFormat && IsNewDbgInfoFormat)
244       convertFromNewDbgValues();
245   }
246   void setNewDbgInfoFormatFlag(bool NewFlag) {
247     for (auto &F : *this) {
248       F.setNewDbgInfoFormatFlag(NewFlag);
249     }
250     IsNewDbgInfoFormat = NewFlag;
251   }
252 
253   /// The Module constructor. Note that there is no default constructor. You
254   /// must provide a name for the module upon construction.
255   explicit Module(StringRef ModuleID, LLVMContext& C);
256   /// The module destructor. This will dropAllReferences.
257   ~Module();
258 
259   /// Move assignment.
260   Module &operator=(Module &&Other);
261 
262   /// @}
263   /// @name Module Level Accessors
264   /// @{
265 
266   /// Get the module identifier which is, essentially, the name of the module.
267   /// @returns the module identifier as a string
268   const std::string &getModuleIdentifier() const { return ModuleID; }
269 
270   /// Returns the number of non-debug IR instructions in the module.
271   /// This is equivalent to the sum of the IR instruction counts of each
272   /// function contained in the module.
273   unsigned getInstructionCount() const;
274 
275   /// Get the module's original source file name. When compiling from
276   /// bitcode, this is taken from a bitcode record where it was recorded.
277   /// For other compiles it is the same as the ModuleID, which would
278   /// contain the source file name.
279   const std::string &getSourceFileName() const { return SourceFileName; }
280 
281   /// Get a short "name" for the module.
282   ///
283   /// This is useful for debugging or logging. It is essentially a convenience
284   /// wrapper around getModuleIdentifier().
285   StringRef getName() const { return ModuleID; }
286 
287   /// Get the data layout string for the module's target platform. This is
288   /// equivalent to getDataLayout()->getStringRepresentation().
289   const std::string &getDataLayoutStr() const {
290     return DL.getStringRepresentation();
291   }
292 
293   /// Get the data layout for the module's target platform.
294   const DataLayout &getDataLayout() const { return DL; }
295 
296   /// Get the target triple which is a string describing the target host.
297   /// @returns a string containing the target triple.
298   const std::string &getTargetTriple() const { return TargetTriple; }
299 
300   /// Get the global data context.
301   /// @returns LLVMContext - a container for LLVM's global information
302   LLVMContext &getContext() const { return Context; }
303 
304   /// Get any module-scope inline assembly blocks.
305   /// @returns a string containing the module-scope inline assembly blocks.
306   const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; }
307 
308   /// Get a RandomNumberGenerator salted for use with this module. The
309   /// RNG can be seeded via -rng-seed=<uint64> and is salted with the
310   /// ModuleID and the provided pass salt. The returned RNG should not
311   /// be shared across threads or passes.
312   ///
313   /// A unique RNG per pass ensures a reproducible random stream even
314   /// when other randomness consuming passes are added or removed. In
315   /// addition, the random stream will be reproducible across LLVM
316   /// versions when the pass does not change.
317   std::unique_ptr<RandomNumberGenerator> createRNG(const StringRef Name) const;
318 
319   /// Return true if size-info optimization remark is enabled, false
320   /// otherwise.
321   bool shouldEmitInstrCountChangedRemark() {
322     return getContext().getDiagHandlerPtr()->isAnalysisRemarkEnabled(
323         "size-info");
324   }
325 
326   /// @}
327   /// @name Module Level Mutators
328   /// @{
329 
330   /// Set the module identifier.
331   void setModuleIdentifier(StringRef ID) { ModuleID = std::string(ID); }
332 
333   /// Set the module's original source file name.
334   void setSourceFileName(StringRef Name) { SourceFileName = std::string(Name); }
335 
336   /// Set the data layout
337   void setDataLayout(StringRef Desc);
338   void setDataLayout(const DataLayout &Other);
339 
340   /// Set the target triple.
341   void setTargetTriple(StringRef T) { TargetTriple = std::string(T); }
342 
343   /// Set the module-scope inline assembly blocks.
344   /// A trailing newline is added if the input doesn't have one.
345   void setModuleInlineAsm(StringRef Asm) {
346     GlobalScopeAsm = std::string(Asm);
347     if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n')
348       GlobalScopeAsm += '\n';
349   }
350 
351   /// Append to the module-scope inline assembly blocks.
352   /// A trailing newline is added if the input doesn't have one.
353   void appendModuleInlineAsm(StringRef Asm) {
354     GlobalScopeAsm += Asm;
355     if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n')
356       GlobalScopeAsm += '\n';
357   }
358 
359 /// @}
360 /// @name Generic Value Accessors
361 /// @{
362 
363   /// Return the global value in the module with the specified name, of
364   /// arbitrary type. This method returns null if a global with the specified
365   /// name is not found.
366   GlobalValue *getNamedValue(StringRef Name) const;
367 
368   /// Return the number of global values in the module.
369   unsigned getNumNamedValues() const;
370 
371   /// Return a unique non-zero ID for the specified metadata kind. This ID is
372   /// uniqued across modules in the current LLVMContext.
373   unsigned getMDKindID(StringRef Name) const;
374 
375   /// Populate client supplied SmallVector with the name for custom metadata IDs
376   /// registered in this LLVMContext.
377   void getMDKindNames(SmallVectorImpl<StringRef> &Result) const;
378 
379   /// Populate client supplied SmallVector with the bundle tags registered in
380   /// this LLVMContext.  The bundle tags are ordered by increasing bundle IDs.
381   /// \see LLVMContext::getOperandBundleTagID
382   void getOperandBundleTags(SmallVectorImpl<StringRef> &Result) const;
383 
384   std::vector<StructType *> getIdentifiedStructTypes() const;
385 
386   /// Return a unique name for an intrinsic whose mangling is based on an
387   /// unnamed type. The Proto represents the function prototype.
388   std::string getUniqueIntrinsicName(StringRef BaseName, Intrinsic::ID Id,
389                                      const FunctionType *Proto);
390 
391 /// @}
392 /// @name Function Accessors
393 /// @{
394 
395   /// Look up the specified function in the module symbol table. If it does not
396   /// exist, add a prototype for the function and return it. Otherwise, return
397   /// the existing function.
398   ///
399   /// In all cases, the returned value is a FunctionCallee wrapper around the
400   /// 'FunctionType *T' passed in, as well as the 'Value*' of the Function. The
401   /// function type of the function may differ from the function type stored in
402   /// FunctionCallee if it was previously created with a different type.
403   ///
404   /// Note: For library calls getOrInsertLibFunc() should be used instead.
405   FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T,
406                                      AttributeList AttributeList);
407 
408   FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T);
409 
410   /// Same as above, but takes a list of function arguments, which makes it
411   /// easier for clients to use.
412   template <typename... ArgsTy>
413   FunctionCallee getOrInsertFunction(StringRef Name,
414                                      AttributeList AttributeList, Type *RetTy,
415                                      ArgsTy... Args) {
416     SmallVector<Type*, sizeof...(ArgsTy)> ArgTys{Args...};
417     return getOrInsertFunction(Name,
418                                FunctionType::get(RetTy, ArgTys, false),
419                                AttributeList);
420   }
421 
422   /// Same as above, but without the attributes.
423   template <typename... ArgsTy>
424   FunctionCallee getOrInsertFunction(StringRef Name, Type *RetTy,
425                                      ArgsTy... Args) {
426     return getOrInsertFunction(Name, AttributeList{}, RetTy, Args...);
427   }
428 
429   // Avoid an incorrect ordering that'd otherwise compile incorrectly.
430   template <typename... ArgsTy>
431   FunctionCallee
432   getOrInsertFunction(StringRef Name, AttributeList AttributeList,
433                       FunctionType *Invalid, ArgsTy... Args) = delete;
434 
435   /// Look up the specified function in the module symbol table. If it does not
436   /// exist, return null.
437   Function *getFunction(StringRef Name) const;
438 
439 /// @}
440 /// @name Global Variable Accessors
441 /// @{
442 
443   /// Look up the specified global variable in the module symbol table. If it
444   /// does not exist, return null. If AllowInternal is set to true, this
445   /// function will return types that have InternalLinkage. By default, these
446   /// types are not returned.
447   GlobalVariable *getGlobalVariable(StringRef Name) const {
448     return getGlobalVariable(Name, false);
449   }
450 
451   GlobalVariable *getGlobalVariable(StringRef Name, bool AllowInternal) const;
452 
453   GlobalVariable *getGlobalVariable(StringRef Name,
454                                     bool AllowInternal = false) {
455     return static_cast<const Module *>(this)->getGlobalVariable(Name,
456                                                                 AllowInternal);
457   }
458 
459   /// Return the global variable in the module with the specified name, of
460   /// arbitrary type. This method returns null if a global with the specified
461   /// name is not found.
462   const GlobalVariable *getNamedGlobal(StringRef Name) const {
463     return getGlobalVariable(Name, true);
464   }
465   GlobalVariable *getNamedGlobal(StringRef Name) {
466     return const_cast<GlobalVariable *>(
467                        static_cast<const Module *>(this)->getNamedGlobal(Name));
468   }
469 
470   /// Look up the specified global in the module symbol table.
471   /// If it does not exist, invoke a callback to create a declaration of the
472   /// global and return it. The global is constantexpr casted to the expected
473   /// type if necessary.
474   Constant *
475   getOrInsertGlobal(StringRef Name, Type *Ty,
476                     function_ref<GlobalVariable *()> CreateGlobalCallback);
477 
478   /// Look up the specified global in the module symbol table. If required, this
479   /// overload constructs the global variable using its constructor's defaults.
480   Constant *getOrInsertGlobal(StringRef Name, Type *Ty);
481 
482 /// @}
483 /// @name Global Alias Accessors
484 /// @{
485 
486   /// Return the global alias in the module with the specified name, of
487   /// arbitrary type. This method returns null if a global with the specified
488   /// name is not found.
489   GlobalAlias *getNamedAlias(StringRef Name) const;
490 
491 /// @}
492 /// @name Global IFunc Accessors
493 /// @{
494 
495   /// Return the global ifunc in the module with the specified name, of
496   /// arbitrary type. This method returns null if a global with the specified
497   /// name is not found.
498   GlobalIFunc *getNamedIFunc(StringRef Name) const;
499 
500 /// @}
501 /// @name Named Metadata Accessors
502 /// @{
503 
504   /// Return the first NamedMDNode in the module with the specified name. This
505   /// method returns null if a NamedMDNode with the specified name is not found.
506   NamedMDNode *getNamedMetadata(StringRef Name) const;
507 
508   /// Return the named MDNode in the module with the specified name. This method
509   /// returns a new NamedMDNode if a NamedMDNode with the specified name is not
510   /// found.
511   NamedMDNode *getOrInsertNamedMetadata(StringRef Name);
512 
513   /// Remove the given NamedMDNode from this module and delete it.
514   void eraseNamedMetadata(NamedMDNode *NMD);
515 
516 /// @}
517 /// @name Comdat Accessors
518 /// @{
519 
520   /// Return the Comdat in the module with the specified name. It is created
521   /// if it didn't already exist.
522   Comdat *getOrInsertComdat(StringRef Name);
523 
524 /// @}
525 /// @name Module Flags Accessors
526 /// @{
527 
528   /// Returns the module flags in the provided vector.
529   void getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const;
530 
531   /// Return the corresponding value if Key appears in module flags, otherwise
532   /// return null.
533   Metadata *getModuleFlag(StringRef Key) const;
534 
535   /// Returns the NamedMDNode in the module that represents module-level flags.
536   /// This method returns null if there are no module-level flags.
537   NamedMDNode *getModuleFlagsMetadata() const { return ModuleFlags; }
538 
539   /// Returns the NamedMDNode in the module that represents module-level flags.
540   /// If module-level flags aren't found, it creates the named metadata that
541   /// contains them.
542   NamedMDNode *getOrInsertModuleFlagsMetadata();
543 
544   /// Add a module-level flag to the module-level flags metadata. It will create
545   /// the module-level flags named metadata if it doesn't already exist.
546   void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val);
547   void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Constant *Val);
548   void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, uint32_t Val);
549   void addModuleFlag(MDNode *Node);
550   /// Like addModuleFlag but replaces the old module flag if it already exists.
551   void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val);
552   void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Constant *Val);
553   void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, uint32_t Val);
554 
555   /// @}
556   /// @name Materialization
557   /// @{
558 
559   /// Sets the GVMaterializer to GVM. This module must not yet have a
560   /// Materializer. To reset the materializer for a module that already has one,
561   /// call materializeAll first. Destroying this module will destroy
562   /// its materializer without materializing any more GlobalValues. Without
563   /// destroying the Module, there is no way to detach or destroy a materializer
564   /// without materializing all the GVs it controls, to avoid leaving orphan
565   /// unmaterialized GVs.
566   void setMaterializer(GVMaterializer *GVM);
567   /// Retrieves the GVMaterializer, if any, for this Module.
568   GVMaterializer *getMaterializer() const { return Materializer.get(); }
569   bool isMaterialized() const { return !getMaterializer(); }
570 
571   /// Make sure the GlobalValue is fully read.
572   llvm::Error materialize(GlobalValue *GV);
573 
574   /// Make sure all GlobalValues in this Module are fully read and clear the
575   /// Materializer.
576   llvm::Error materializeAll();
577 
578   llvm::Error materializeMetadata();
579 
580   /// Detach global variable \p GV from the list but don't delete it.
581   void removeGlobalVariable(GlobalVariable *GV) { GlobalList.remove(GV); }
582   /// Remove global variable \p GV from the list and delete it.
583   void eraseGlobalVariable(GlobalVariable *GV) { GlobalList.erase(GV); }
584   /// Insert global variable \p GV at the end of the global variable list and
585   /// take ownership.
586   void insertGlobalVariable(GlobalVariable *GV) {
587     insertGlobalVariable(GlobalList.end(), GV);
588   }
589   /// Insert global variable \p GV into the global variable list before \p
590   /// Where and take ownership.
591   void insertGlobalVariable(GlobalListType::iterator Where, GlobalVariable *GV) {
592     GlobalList.insert(Where, GV);
593   }
594   // Use global_size() to get the total number of global variables.
595   // Use globals() to get the range of all global variables.
596 
597 private:
598 /// @}
599 /// @name Direct access to the globals list, functions list, and symbol table
600 /// @{
601 
602   /// Get the Module's list of global variables (constant).
603   const GlobalListType   &getGlobalList() const       { return GlobalList; }
604   /// Get the Module's list of global variables.
605   GlobalListType         &getGlobalList()             { return GlobalList; }
606 
607   static GlobalListType Module::*getSublistAccess(GlobalVariable*) {
608     return &Module::GlobalList;
609   }
610   friend class llvm::SymbolTableListTraits<llvm::GlobalVariable>;
611 
612 public:
613   /// Get the Module's list of functions (constant).
614   const FunctionListType &getFunctionList() const     { return FunctionList; }
615   /// Get the Module's list of functions.
616   FunctionListType       &getFunctionList()           { return FunctionList; }
617   static FunctionListType Module::*getSublistAccess(Function*) {
618     return &Module::FunctionList;
619   }
620 
621   /// Detach \p Alias from the list but don't delete it.
622   void removeAlias(GlobalAlias *Alias) { AliasList.remove(Alias); }
623   /// Remove \p Alias from the list and delete it.
624   void eraseAlias(GlobalAlias *Alias) { AliasList.erase(Alias); }
625   /// Insert \p Alias at the end of the alias list and take ownership.
626   void insertAlias(GlobalAlias *Alias) { AliasList.insert(AliasList.end(), Alias); }
627   // Use alias_size() to get the size of AliasList.
628   // Use aliases() to get a range of all Alias objects in AliasList.
629 
630   /// Detach \p IFunc from the list but don't delete it.
631   void removeIFunc(GlobalIFunc *IFunc) { IFuncList.remove(IFunc); }
632   /// Remove \p IFunc from the list and delete it.
633   void eraseIFunc(GlobalIFunc *IFunc) { IFuncList.erase(IFunc); }
634   /// Insert \p IFunc at the end of the alias list and take ownership.
635   void insertIFunc(GlobalIFunc *IFunc) { IFuncList.push_back(IFunc); }
636   // Use ifunc_size() to get the number of functions in IFuncList.
637   // Use ifuncs() to get the range of all IFuncs.
638 
639   /// Detach \p MDNode from the list but don't delete it.
640   void removeNamedMDNode(NamedMDNode *MDNode) { NamedMDList.remove(MDNode); }
641   /// Remove \p MDNode from the list and delete it.
642   void eraseNamedMDNode(NamedMDNode *MDNode) { NamedMDList.erase(MDNode); }
643   /// Insert \p MDNode at the end of the alias list and take ownership.
644   void insertNamedMDNode(NamedMDNode *MDNode) {
645     NamedMDList.push_back(MDNode);
646   }
647   // Use named_metadata_size() to get the size of the named meatadata list.
648   // Use named_metadata() to get the range of all named metadata.
649 
650 private: // Please use functions like insertAlias(), removeAlias() etc.
651   /// Get the Module's list of aliases (constant).
652   const AliasListType    &getAliasList() const        { return AliasList; }
653   /// Get the Module's list of aliases.
654   AliasListType          &getAliasList()              { return AliasList; }
655 
656   static AliasListType Module::*getSublistAccess(GlobalAlias*) {
657     return &Module::AliasList;
658   }
659   friend class llvm::SymbolTableListTraits<llvm::GlobalAlias>;
660 
661   /// Get the Module's list of ifuncs (constant).
662   const IFuncListType    &getIFuncList() const        { return IFuncList; }
663   /// Get the Module's list of ifuncs.
664   IFuncListType          &getIFuncList()              { return IFuncList; }
665 
666   static IFuncListType Module::*getSublistAccess(GlobalIFunc*) {
667     return &Module::IFuncList;
668   }
669   friend class llvm::SymbolTableListTraits<llvm::GlobalIFunc>;
670 
671   /// Get the Module's list of named metadata (constant).
672   const NamedMDListType  &getNamedMDList() const      { return NamedMDList; }
673   /// Get the Module's list of named metadata.
674   NamedMDListType        &getNamedMDList()            { return NamedMDList; }
675 
676   static NamedMDListType Module::*getSublistAccess(NamedMDNode*) {
677     return &Module::NamedMDList;
678   }
679 
680 public:
681   /// Get the symbol table of global variable and function identifiers
682   const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; }
683   /// Get the Module's symbol table of global variable and function identifiers.
684   ValueSymbolTable       &getValueSymbolTable()       { return *ValSymTab; }
685 
686   /// Get the Module's symbol table for COMDATs (constant).
687   const ComdatSymTabType &getComdatSymbolTable() const { return ComdatSymTab; }
688   /// Get the Module's symbol table for COMDATs.
689   ComdatSymTabType &getComdatSymbolTable() { return ComdatSymTab; }
690 
691 /// @}
692 /// @name Global Variable Iteration
693 /// @{
694 
695   global_iterator       global_begin()       { return GlobalList.begin(); }
696   const_global_iterator global_begin() const { return GlobalList.begin(); }
697   global_iterator       global_end  ()       { return GlobalList.end(); }
698   const_global_iterator global_end  () const { return GlobalList.end(); }
699   size_t                global_size () const { return GlobalList.size(); }
700   bool                  global_empty() const { return GlobalList.empty(); }
701 
702   iterator_range<global_iterator> globals() {
703     return make_range(global_begin(), global_end());
704   }
705   iterator_range<const_global_iterator> globals() const {
706     return make_range(global_begin(), global_end());
707   }
708 
709 /// @}
710 /// @name Function Iteration
711 /// @{
712 
713   iterator                begin()       { return FunctionList.begin(); }
714   const_iterator          begin() const { return FunctionList.begin(); }
715   iterator                end  ()       { return FunctionList.end();   }
716   const_iterator          end  () const { return FunctionList.end();   }
717   reverse_iterator        rbegin()      { return FunctionList.rbegin(); }
718   const_reverse_iterator  rbegin() const{ return FunctionList.rbegin(); }
719   reverse_iterator        rend()        { return FunctionList.rend(); }
720   const_reverse_iterator  rend() const  { return FunctionList.rend(); }
721   size_t                  size() const  { return FunctionList.size(); }
722   bool                    empty() const { return FunctionList.empty(); }
723 
724   iterator_range<iterator> functions() {
725     return make_range(begin(), end());
726   }
727   iterator_range<const_iterator> functions() const {
728     return make_range(begin(), end());
729   }
730 
731 /// @}
732 /// @name Alias Iteration
733 /// @{
734 
735   alias_iterator       alias_begin()            { return AliasList.begin(); }
736   const_alias_iterator alias_begin() const      { return AliasList.begin(); }
737   alias_iterator       alias_end  ()            { return AliasList.end();   }
738   const_alias_iterator alias_end  () const      { return AliasList.end();   }
739   size_t               alias_size () const      { return AliasList.size();  }
740   bool                 alias_empty() const      { return AliasList.empty(); }
741 
742   iterator_range<alias_iterator> aliases() {
743     return make_range(alias_begin(), alias_end());
744   }
745   iterator_range<const_alias_iterator> aliases() const {
746     return make_range(alias_begin(), alias_end());
747   }
748 
749 /// @}
750 /// @name IFunc Iteration
751 /// @{
752 
753   ifunc_iterator       ifunc_begin()            { return IFuncList.begin(); }
754   const_ifunc_iterator ifunc_begin() const      { return IFuncList.begin(); }
755   ifunc_iterator       ifunc_end  ()            { return IFuncList.end();   }
756   const_ifunc_iterator ifunc_end  () const      { return IFuncList.end();   }
757   size_t               ifunc_size () const      { return IFuncList.size();  }
758   bool                 ifunc_empty() const      { return IFuncList.empty(); }
759 
760   iterator_range<ifunc_iterator> ifuncs() {
761     return make_range(ifunc_begin(), ifunc_end());
762   }
763   iterator_range<const_ifunc_iterator> ifuncs() const {
764     return make_range(ifunc_begin(), ifunc_end());
765   }
766 
767   /// @}
768   /// @name Convenience iterators
769   /// @{
770 
771   using global_object_iterator =
772       concat_iterator<GlobalObject, iterator, global_iterator>;
773   using const_global_object_iterator =
774       concat_iterator<const GlobalObject, const_iterator,
775                       const_global_iterator>;
776 
777   iterator_range<global_object_iterator> global_objects();
778   iterator_range<const_global_object_iterator> global_objects() const;
779 
780   using global_value_iterator =
781       concat_iterator<GlobalValue, iterator, global_iterator, alias_iterator,
782                       ifunc_iterator>;
783   using const_global_value_iterator =
784       concat_iterator<const GlobalValue, const_iterator, const_global_iterator,
785                       const_alias_iterator, const_ifunc_iterator>;
786 
787   iterator_range<global_value_iterator> global_values();
788   iterator_range<const_global_value_iterator> global_values() const;
789 
790   /// @}
791   /// @name Named Metadata Iteration
792   /// @{
793 
794   named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); }
795   const_named_metadata_iterator named_metadata_begin() const {
796     return NamedMDList.begin();
797   }
798 
799   named_metadata_iterator named_metadata_end() { return NamedMDList.end(); }
800   const_named_metadata_iterator named_metadata_end() const {
801     return NamedMDList.end();
802   }
803 
804   size_t named_metadata_size() const { return NamedMDList.size();  }
805   bool named_metadata_empty() const { return NamedMDList.empty(); }
806 
807   iterator_range<named_metadata_iterator> named_metadata() {
808     return make_range(named_metadata_begin(), named_metadata_end());
809   }
810   iterator_range<const_named_metadata_iterator> named_metadata() const {
811     return make_range(named_metadata_begin(), named_metadata_end());
812   }
813 
814   /// An iterator for DICompileUnits that skips those marked NoDebug.
815   class debug_compile_units_iterator {
816     NamedMDNode *CUs;
817     unsigned Idx;
818 
819     void SkipNoDebugCUs();
820 
821   public:
822     using iterator_category = std::input_iterator_tag;
823     using value_type = DICompileUnit *;
824     using difference_type = std::ptrdiff_t;
825     using pointer = value_type *;
826     using reference = value_type &;
827 
828     explicit debug_compile_units_iterator(NamedMDNode *CUs, unsigned Idx)
829         : CUs(CUs), Idx(Idx) {
830       SkipNoDebugCUs();
831     }
832 
833     debug_compile_units_iterator &operator++() {
834       ++Idx;
835       SkipNoDebugCUs();
836       return *this;
837     }
838 
839     debug_compile_units_iterator operator++(int) {
840       debug_compile_units_iterator T(*this);
841       ++Idx;
842       return T;
843     }
844 
845     bool operator==(const debug_compile_units_iterator &I) const {
846       return Idx == I.Idx;
847     }
848 
849     bool operator!=(const debug_compile_units_iterator &I) const {
850       return Idx != I.Idx;
851     }
852 
853     DICompileUnit *operator*() const;
854     DICompileUnit *operator->() const;
855   };
856 
857   debug_compile_units_iterator debug_compile_units_begin() const {
858     auto *CUs = getNamedMetadata("llvm.dbg.cu");
859     return debug_compile_units_iterator(CUs, 0);
860   }
861 
862   debug_compile_units_iterator debug_compile_units_end() const {
863     auto *CUs = getNamedMetadata("llvm.dbg.cu");
864     return debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0);
865   }
866 
867   /// Return an iterator for all DICompileUnits listed in this Module's
868   /// llvm.dbg.cu named metadata node and aren't explicitly marked as
869   /// NoDebug.
870   iterator_range<debug_compile_units_iterator> debug_compile_units() const {
871     auto *CUs = getNamedMetadata("llvm.dbg.cu");
872     return make_range(
873         debug_compile_units_iterator(CUs, 0),
874         debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0));
875   }
876 /// @}
877 
878   /// Destroy ConstantArrays in LLVMContext if they are not used.
879   /// ConstantArrays constructed during linking can cause quadratic memory
880   /// explosion. Releasing all unused constants can cause a 20% LTO compile-time
881   /// slowdown for a large application.
882   ///
883   /// NOTE: Constants are currently owned by LLVMContext. This can then only
884   /// be called where all uses of the LLVMContext are understood.
885   void dropTriviallyDeadConstantArrays();
886 
887 /// @name Utility functions for printing and dumping Module objects
888 /// @{
889 
890   /// Print the module to an output stream with an optional
891   /// AssemblyAnnotationWriter.  If \c ShouldPreserveUseListOrder, then include
892   /// uselistorder directives so that use-lists can be recreated when reading
893   /// the assembly.
894   void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW,
895              bool ShouldPreserveUseListOrder = false,
896              bool IsForDebug = false) const;
897 
898   /// Dump the module to stderr (for debugging).
899   void dump() const;
900 
901   /// This function causes all the subinstructions to "let go" of all references
902   /// that they are maintaining.  This allows one to 'delete' a whole class at
903   /// a time, even though there may be circular references... first all
904   /// references are dropped, and all use counts go to zero.  Then everything
905   /// is delete'd for real.  Note that no operations are valid on an object
906   /// that has "dropped all references", except operator delete.
907   void dropAllReferences();
908 
909 /// @}
910 /// @name Utility functions for querying Debug information.
911 /// @{
912 
913   /// Returns the Number of Register ParametersDwarf Version by checking
914   /// module flags.
915   unsigned getNumberRegisterParameters() const;
916 
917   /// Returns the Dwarf Version by checking module flags.
918   unsigned getDwarfVersion() const;
919 
920   /// Returns the DWARF format by checking module flags.
921   bool isDwarf64() const;
922 
923   /// Returns the CodeView Version by checking module flags.
924   /// Returns zero if not present in module.
925   unsigned getCodeViewFlag() const;
926 
927 /// @}
928 /// @name Utility functions for querying and setting PIC level
929 /// @{
930 
931   /// Returns the PIC level (small or large model)
932   PICLevel::Level getPICLevel() const;
933 
934   /// Set the PIC level (small or large model)
935   void setPICLevel(PICLevel::Level PL);
936 /// @}
937 
938 /// @}
939 /// @name Utility functions for querying and setting PIE level
940 /// @{
941 
942   /// Returns the PIE level (small or large model)
943   PIELevel::Level getPIELevel() const;
944 
945   /// Set the PIE level (small or large model)
946   void setPIELevel(PIELevel::Level PL);
947 /// @}
948 
949   /// @}
950   /// @name Utility function for querying and setting code model
951   /// @{
952 
953   /// Returns the code model (tiny, small, kernel, medium or large model)
954   std::optional<CodeModel::Model> getCodeModel() const;
955 
956   /// Set the code model (tiny, small, kernel, medium or large)
957   void setCodeModel(CodeModel::Model CL);
958   /// @}
959 
960   /// @}
961   /// @name Utility function for querying and setting the large data threshold
962   /// @{
963 
964   /// Returns the code model (tiny, small, kernel, medium or large model)
965   std::optional<uint64_t> getLargeDataThreshold() const;
966 
967   /// Set the code model (tiny, small, kernel, medium or large)
968   void setLargeDataThreshold(uint64_t Threshold);
969   /// @}
970 
971   /// @name Utility functions for querying and setting PGO summary
972   /// @{
973 
974   /// Attach profile summary metadata to this module.
975   void setProfileSummary(Metadata *M, ProfileSummary::Kind Kind);
976 
977   /// Returns profile summary metadata. When IsCS is true, use the context
978   /// sensitive profile summary.
979   Metadata *getProfileSummary(bool IsCS) const;
980   /// @}
981 
982   /// Returns whether semantic interposition is to be respected.
983   bool getSemanticInterposition() const;
984 
985   /// Set whether semantic interposition is to be respected.
986   void setSemanticInterposition(bool);
987 
988   /// Returns true if PLT should be avoided for RTLib calls.
989   bool getRtLibUseGOT() const;
990 
991   /// Set that PLT should be avoid for RTLib calls.
992   void setRtLibUseGOT();
993 
994   /// Get/set whether referencing global variables can use direct access
995   /// relocations on ELF targets.
996   bool getDirectAccessExternalData() const;
997   void setDirectAccessExternalData(bool Value);
998 
999   /// Get/set whether synthesized functions should get the uwtable attribute.
1000   UWTableKind getUwtable() const;
1001   void setUwtable(UWTableKind Kind);
1002 
1003   /// Get/set whether synthesized functions should get the "frame-pointer"
1004   /// attribute.
1005   FramePointerKind getFramePointer() const;
1006   void setFramePointer(FramePointerKind Kind);
1007 
1008   /// Get/set what kind of stack protector guard to use.
1009   StringRef getStackProtectorGuard() const;
1010   void setStackProtectorGuard(StringRef Kind);
1011 
1012   /// Get/set which register to use as the stack protector guard register. The
1013   /// empty string is equivalent to "global". Other values may be "tls" or
1014   /// "sysreg".
1015   StringRef getStackProtectorGuardReg() const;
1016   void setStackProtectorGuardReg(StringRef Reg);
1017 
1018   /// Get/set a symbol to use as the stack protector guard.
1019   StringRef getStackProtectorGuardSymbol() const;
1020   void setStackProtectorGuardSymbol(StringRef Symbol);
1021 
1022   /// Get/set what offset from the stack protector to use.
1023   int getStackProtectorGuardOffset() const;
1024   void setStackProtectorGuardOffset(int Offset);
1025 
1026   /// Get/set the stack alignment overridden from the default.
1027   unsigned getOverrideStackAlignment() const;
1028   void setOverrideStackAlignment(unsigned Align);
1029 
1030   unsigned getMaxTLSAlignment() const;
1031 
1032   /// @name Utility functions for querying and setting the build SDK version
1033   /// @{
1034 
1035   /// Attach a build SDK version metadata to this module.
1036   void setSDKVersion(const VersionTuple &V);
1037 
1038   /// Get the build SDK version metadata.
1039   ///
1040   /// An empty version is returned if no such metadata is attached.
1041   VersionTuple getSDKVersion() const;
1042   /// @}
1043 
1044   /// Take ownership of the given memory buffer.
1045   void setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB);
1046 
1047   /// Set the partial sample profile ratio in the profile summary module flag,
1048   /// if applicable.
1049   void setPartialSampleProfileRatio(const ModuleSummaryIndex &Index);
1050 
1051   /// Get the target variant triple which is a string describing a variant of
1052   /// the target host platform. For example, Mac Catalyst can be a variant
1053   /// target triple for a macOS target.
1054   /// @returns a string containing the target variant triple.
1055   StringRef getDarwinTargetVariantTriple() const;
1056 
1057   /// Set the target variant triple which is a string describing a variant of
1058   /// the target host platform.
1059   void setDarwinTargetVariantTriple(StringRef T);
1060 
1061   /// Get the target variant version build SDK version metadata.
1062   ///
1063   /// An empty version is returned if no such metadata is attached.
1064   VersionTuple getDarwinTargetVariantSDKVersion() const;
1065 
1066   /// Set the target variant version build SDK version metadata.
1067   void setDarwinTargetVariantSDKVersion(VersionTuple Version);
1068 };
1069 
1070 /// Given "llvm.used" or "llvm.compiler.used" as a global name, collect the
1071 /// initializer elements of that global in a SmallVector and return the global
1072 /// itself.
1073 GlobalVariable *collectUsedGlobalVariables(const Module &M,
1074                                            SmallVectorImpl<GlobalValue *> &Vec,
1075                                            bool CompilerUsed);
1076 
1077 /// An raw_ostream inserter for modules.
1078 inline raw_ostream &operator<<(raw_ostream &O, const Module &M) {
1079   M.print(O, nullptr);
1080   return O;
1081 }
1082 
1083 // Create wrappers for C Binding types (see CBindingWrapping.h).
1084 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef)
1085 
1086 /* LLVMModuleProviderRef exists for historical reasons, but now just holds a
1087  * Module.
1088  */
1089 inline Module *unwrap(LLVMModuleProviderRef MP) {
1090   return reinterpret_cast<Module*>(MP);
1091 }
1092 
1093 } // end namespace llvm
1094 
1095 #endif // LLVM_IR_MODULE_H
1096