Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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_EXTERNAL_VISIBILITY 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 | /// Check if the given module flag metadata represents a valid module flag, |
||
162 | /// and store the flag behavior, the key string and the value metadata. |
||
163 | static bool isValidModuleFlag(const MDNode &ModFlag, ModFlagBehavior &MFB, |
||
164 | MDString *&Key, Metadata *&Val); |
||
165 | |||
166 | struct ModuleFlagEntry { |
||
167 | ModFlagBehavior Behavior; |
||
168 | MDString *Key; |
||
169 | Metadata *Val; |
||
170 | |||
171 | ModuleFlagEntry(ModFlagBehavior B, MDString *K, Metadata *V) |
||
172 | : Behavior(B), Key(K), Val(V) {} |
||
173 | }; |
||
174 | |||
175 | /// @} |
||
176 | /// @name Member Variables |
||
177 | /// @{ |
||
178 | private: |
||
179 | LLVMContext &Context; ///< The LLVMContext from which types and |
||
180 | ///< constants are allocated. |
||
181 | GlobalListType GlobalList; ///< The Global Variables in the module |
||
182 | FunctionListType FunctionList; ///< The Functions in the module |
||
183 | AliasListType AliasList; ///< The Aliases in the module |
||
184 | IFuncListType IFuncList; ///< The IFuncs in the module |
||
185 | NamedMDListType NamedMDList; ///< The named metadata in the module |
||
186 | std::string GlobalScopeAsm; ///< Inline Asm at global scope. |
||
187 | std::unique_ptr<ValueSymbolTable> ValSymTab; ///< Symbol table for values |
||
188 | ComdatSymTabType ComdatSymTab; ///< Symbol table for COMDATs |
||
189 | std::unique_ptr<MemoryBuffer> |
||
190 | OwnedMemoryBuffer; ///< Memory buffer directly owned by this |
||
191 | ///< module, for legacy clients only. |
||
192 | std::unique_ptr<GVMaterializer> |
||
193 | Materializer; ///< Used to materialize GlobalValues |
||
194 | std::string ModuleID; ///< Human readable identifier for the module |
||
195 | std::string SourceFileName; ///< Original source file name for module, |
||
196 | ///< recorded in bitcode. |
||
197 | std::string TargetTriple; ///< Platform target triple Module compiled on |
||
198 | ///< Format: (arch)(sub)-(vendor)-(sys0-(abi) |
||
199 | NamedMDSymTabType NamedMDSymTab; ///< NamedMDNode names. |
||
200 | DataLayout DL; ///< DataLayout associated with the module |
||
201 | StringMap<unsigned> |
||
202 | CurrentIntrinsicIds; ///< Keep track of the current unique id count for |
||
203 | ///< the specified intrinsic basename. |
||
204 | DenseMap<std::pair<Intrinsic::ID, const FunctionType *>, unsigned> |
||
205 | UniquedIntrinsicNames; ///< Keep track of uniqued names of intrinsics |
||
206 | ///< based on unnamed types. The combination of |
||
207 | ///< ID and FunctionType maps to the extension that |
||
208 | ///< is used to make the intrinsic name unique. |
||
209 | |||
210 | friend class Constant; |
||
211 | |||
212 | /// @} |
||
213 | /// @name Constructors |
||
214 | /// @{ |
||
215 | public: |
||
216 | /// The Module constructor. Note that there is no default constructor. You |
||
217 | /// must provide a name for the module upon construction. |
||
218 | explicit Module(StringRef ModuleID, LLVMContext& C); |
||
219 | /// The module destructor. This will dropAllReferences. |
||
220 | ~Module(); |
||
221 | |||
222 | /// @} |
||
223 | /// @name Module Level Accessors |
||
224 | /// @{ |
||
225 | |||
226 | /// Get the module identifier which is, essentially, the name of the module. |
||
227 | /// @returns the module identifier as a string |
||
228 | const std::string &getModuleIdentifier() const { return ModuleID; } |
||
229 | |||
230 | /// Returns the number of non-debug IR instructions in the module. |
||
231 | /// This is equivalent to the sum of the IR instruction counts of each |
||
232 | /// function contained in the module. |
||
233 | unsigned getInstructionCount() const; |
||
234 | |||
235 | /// Get the module's original source file name. When compiling from |
||
236 | /// bitcode, this is taken from a bitcode record where it was recorded. |
||
237 | /// For other compiles it is the same as the ModuleID, which would |
||
238 | /// contain the source file name. |
||
239 | const std::string &getSourceFileName() const { return SourceFileName; } |
||
240 | |||
241 | /// Get a short "name" for the module. |
||
242 | /// |
||
243 | /// This is useful for debugging or logging. It is essentially a convenience |
||
244 | /// wrapper around getModuleIdentifier(). |
||
245 | StringRef getName() const { return ModuleID; } |
||
246 | |||
247 | /// Get the data layout string for the module's target platform. This is |
||
248 | /// equivalent to getDataLayout()->getStringRepresentation(). |
||
249 | const std::string &getDataLayoutStr() const { |
||
250 | return DL.getStringRepresentation(); |
||
251 | } |
||
252 | |||
253 | /// Get the data layout for the module's target platform. |
||
254 | const DataLayout &getDataLayout() const; |
||
255 | |||
256 | /// Get the target triple which is a string describing the target host. |
||
257 | /// @returns a string containing the target triple. |
||
258 | const std::string &getTargetTriple() const { return TargetTriple; } |
||
259 | |||
260 | /// Get the global data context. |
||
261 | /// @returns LLVMContext - a container for LLVM's global information |
||
262 | LLVMContext &getContext() const { return Context; } |
||
263 | |||
264 | /// Get any module-scope inline assembly blocks. |
||
265 | /// @returns a string containing the module-scope inline assembly blocks. |
||
266 | const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; } |
||
267 | |||
268 | /// Get a RandomNumberGenerator salted for use with this module. The |
||
269 | /// RNG can be seeded via -rng-seed=<uint64> and is salted with the |
||
270 | /// ModuleID and the provided pass salt. The returned RNG should not |
||
271 | /// be shared across threads or passes. |
||
272 | /// |
||
273 | /// A unique RNG per pass ensures a reproducible random stream even |
||
274 | /// when other randomness consuming passes are added or removed. In |
||
275 | /// addition, the random stream will be reproducible across LLVM |
||
276 | /// versions when the pass does not change. |
||
277 | std::unique_ptr<RandomNumberGenerator> createRNG(const StringRef Name) const; |
||
278 | |||
279 | /// Return true if size-info optimization remark is enabled, false |
||
280 | /// otherwise. |
||
281 | bool shouldEmitInstrCountChangedRemark() { |
||
282 | return getContext().getDiagHandlerPtr()->isAnalysisRemarkEnabled( |
||
283 | "size-info"); |
||
284 | } |
||
285 | |||
286 | /// @} |
||
287 | /// @name Module Level Mutators |
||
288 | /// @{ |
||
289 | |||
290 | /// Set the module identifier. |
||
291 | void setModuleIdentifier(StringRef ID) { ModuleID = std::string(ID); } |
||
292 | |||
293 | /// Set the module's original source file name. |
||
294 | void setSourceFileName(StringRef Name) { SourceFileName = std::string(Name); } |
||
295 | |||
296 | /// Set the data layout |
||
297 | void setDataLayout(StringRef Desc); |
||
298 | void setDataLayout(const DataLayout &Other); |
||
299 | |||
300 | /// Set the target triple. |
||
301 | void setTargetTriple(StringRef T) { TargetTriple = std::string(T); } |
||
302 | |||
303 | /// Set the module-scope inline assembly blocks. |
||
304 | /// A trailing newline is added if the input doesn't have one. |
||
305 | void setModuleInlineAsm(StringRef Asm) { |
||
306 | GlobalScopeAsm = std::string(Asm); |
||
307 | if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') |
||
308 | GlobalScopeAsm += '\n'; |
||
309 | } |
||
310 | |||
311 | /// Append to the module-scope inline assembly blocks. |
||
312 | /// A trailing newline is added if the input doesn't have one. |
||
313 | void appendModuleInlineAsm(StringRef Asm) { |
||
314 | GlobalScopeAsm += Asm; |
||
315 | if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') |
||
316 | GlobalScopeAsm += '\n'; |
||
317 | } |
||
318 | |||
319 | /// @} |
||
320 | /// @name Generic Value Accessors |
||
321 | /// @{ |
||
322 | |||
323 | /// Return the global value in the module with the specified name, of |
||
324 | /// arbitrary type. This method returns null if a global with the specified |
||
325 | /// name is not found. |
||
326 | GlobalValue *getNamedValue(StringRef Name) const; |
||
327 | |||
328 | /// Return the number of global values in the module. |
||
329 | unsigned getNumNamedValues() const; |
||
330 | |||
331 | /// Return a unique non-zero ID for the specified metadata kind. This ID is |
||
332 | /// uniqued across modules in the current LLVMContext. |
||
333 | unsigned getMDKindID(StringRef Name) const; |
||
334 | |||
335 | /// Populate client supplied SmallVector with the name for custom metadata IDs |
||
336 | /// registered in this LLVMContext. |
||
337 | void getMDKindNames(SmallVectorImpl<StringRef> &Result) const; |
||
338 | |||
339 | /// Populate client supplied SmallVector with the bundle tags registered in |
||
340 | /// this LLVMContext. The bundle tags are ordered by increasing bundle IDs. |
||
341 | /// \see LLVMContext::getOperandBundleTagID |
||
342 | void getOperandBundleTags(SmallVectorImpl<StringRef> &Result) const; |
||
343 | |||
344 | std::vector<StructType *> getIdentifiedStructTypes() const; |
||
345 | |||
346 | /// Return a unique name for an intrinsic whose mangling is based on an |
||
347 | /// unnamed type. The Proto represents the function prototype. |
||
348 | std::string getUniqueIntrinsicName(StringRef BaseName, Intrinsic::ID Id, |
||
349 | const FunctionType *Proto); |
||
350 | |||
351 | /// @} |
||
352 | /// @name Function Accessors |
||
353 | /// @{ |
||
354 | |||
355 | /// Look up the specified function in the module symbol table. Four |
||
356 | /// possibilities: |
||
357 | /// 1. If it does not exist, add a prototype for the function and return it. |
||
358 | /// 2. Otherwise, if the existing function has the correct prototype, return |
||
359 | /// the existing function. |
||
360 | /// 3. Finally, the function exists but has the wrong prototype: return the |
||
361 | /// function with a constantexpr cast to the right prototype. |
||
362 | /// |
||
363 | /// In all cases, the returned value is a FunctionCallee wrapper around the |
||
364 | /// 'FunctionType *T' passed in, as well as a 'Value*' either of the Function or |
||
365 | /// the bitcast to the function. |
||
366 | /// |
||
367 | /// Note: For library calls getOrInsertLibFunc() should be used instead. |
||
368 | FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T, |
||
369 | AttributeList AttributeList); |
||
370 | |||
371 | FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T); |
||
372 | |||
373 | /// Look up the specified function in the module symbol table. If it does not |
||
374 | /// exist, add a prototype for the function and return it. This function |
||
375 | /// guarantees to return a constant of pointer to the specified function type |
||
376 | /// or a ConstantExpr BitCast of that type if the named function has a |
||
377 | /// different type. This version of the method takes a list of |
||
378 | /// function arguments, which makes it easier for clients to use. |
||
379 | template <typename... ArgsTy> |
||
380 | FunctionCallee getOrInsertFunction(StringRef Name, |
||
381 | AttributeList AttributeList, Type *RetTy, |
||
382 | ArgsTy... Args) { |
||
383 | SmallVector<Type*, sizeof...(ArgsTy)> ArgTys{Args...}; |
||
384 | return getOrInsertFunction(Name, |
||
385 | FunctionType::get(RetTy, ArgTys, false), |
||
386 | AttributeList); |
||
387 | } |
||
388 | |||
389 | /// Same as above, but without the attributes. |
||
390 | template <typename... ArgsTy> |
||
391 | FunctionCallee getOrInsertFunction(StringRef Name, Type *RetTy, |
||
392 | ArgsTy... Args) { |
||
393 | return getOrInsertFunction(Name, AttributeList{}, RetTy, Args...); |
||
394 | } |
||
395 | |||
396 | // Avoid an incorrect ordering that'd otherwise compile incorrectly. |
||
397 | template <typename... ArgsTy> |
||
398 | FunctionCallee |
||
399 | getOrInsertFunction(StringRef Name, AttributeList AttributeList, |
||
400 | FunctionType *Invalid, ArgsTy... Args) = delete; |
||
401 | |||
402 | /// Look up the specified function in the module symbol table. If it does not |
||
403 | /// exist, return null. |
||
404 | Function *getFunction(StringRef Name) const; |
||
405 | |||
406 | /// @} |
||
407 | /// @name Global Variable Accessors |
||
408 | /// @{ |
||
409 | |||
410 | /// Look up the specified global variable in the module symbol table. If it |
||
411 | /// does not exist, return null. If AllowInternal is set to true, this |
||
412 | /// function will return types that have InternalLinkage. By default, these |
||
413 | /// types are not returned. |
||
414 | GlobalVariable *getGlobalVariable(StringRef Name) const { |
||
415 | return getGlobalVariable(Name, false); |
||
416 | } |
||
417 | |||
418 | GlobalVariable *getGlobalVariable(StringRef Name, bool AllowInternal) const; |
||
419 | |||
420 | GlobalVariable *getGlobalVariable(StringRef Name, |
||
421 | bool AllowInternal = false) { |
||
422 | return static_cast<const Module *>(this)->getGlobalVariable(Name, |
||
423 | AllowInternal); |
||
424 | } |
||
425 | |||
426 | /// Return the global variable in the module with the specified name, of |
||
427 | /// arbitrary type. This method returns null if a global with the specified |
||
428 | /// name is not found. |
||
429 | const GlobalVariable *getNamedGlobal(StringRef Name) const { |
||
430 | return getGlobalVariable(Name, true); |
||
431 | } |
||
432 | GlobalVariable *getNamedGlobal(StringRef Name) { |
||
433 | return const_cast<GlobalVariable *>( |
||
434 | static_cast<const Module *>(this)->getNamedGlobal(Name)); |
||
435 | } |
||
436 | |||
437 | /// Look up the specified global in the module symbol table. |
||
438 | /// If it does not exist, invoke a callback to create a declaration of the |
||
439 | /// global and return it. The global is constantexpr casted to the expected |
||
440 | /// type if necessary. |
||
441 | Constant * |
||
442 | getOrInsertGlobal(StringRef Name, Type *Ty, |
||
443 | function_ref<GlobalVariable *()> CreateGlobalCallback); |
||
444 | |||
445 | /// Look up the specified global in the module symbol table. If required, this |
||
446 | /// overload constructs the global variable using its constructor's defaults. |
||
447 | Constant *getOrInsertGlobal(StringRef Name, Type *Ty); |
||
448 | |||
449 | /// @} |
||
450 | /// @name Global Alias Accessors |
||
451 | /// @{ |
||
452 | |||
453 | /// Return the global alias in the module with the specified name, of |
||
454 | /// arbitrary type. This method returns null if a global with the specified |
||
455 | /// name is not found. |
||
456 | GlobalAlias *getNamedAlias(StringRef Name) const; |
||
457 | |||
458 | /// @} |
||
459 | /// @name Global IFunc Accessors |
||
460 | /// @{ |
||
461 | |||
462 | /// Return the global ifunc in the module with the specified name, of |
||
463 | /// arbitrary type. This method returns null if a global with the specified |
||
464 | /// name is not found. |
||
465 | GlobalIFunc *getNamedIFunc(StringRef Name) const; |
||
466 | |||
467 | /// @} |
||
468 | /// @name Named Metadata Accessors |
||
469 | /// @{ |
||
470 | |||
471 | /// Return the first NamedMDNode in the module with the specified name. This |
||
472 | /// method returns null if a NamedMDNode with the specified name is not found. |
||
473 | NamedMDNode *getNamedMetadata(const Twine &Name) const; |
||
474 | |||
475 | /// Return the named MDNode in the module with the specified name. This method |
||
476 | /// returns a new NamedMDNode if a NamedMDNode with the specified name is not |
||
477 | /// found. |
||
478 | NamedMDNode *getOrInsertNamedMetadata(StringRef Name); |
||
479 | |||
480 | /// Remove the given NamedMDNode from this module and delete it. |
||
481 | void eraseNamedMetadata(NamedMDNode *NMD); |
||
482 | |||
483 | /// @} |
||
484 | /// @name Comdat Accessors |
||
485 | /// @{ |
||
486 | |||
487 | /// Return the Comdat in the module with the specified name. It is created |
||
488 | /// if it didn't already exist. |
||
489 | Comdat *getOrInsertComdat(StringRef Name); |
||
490 | |||
491 | /// @} |
||
492 | /// @name Module Flags Accessors |
||
493 | /// @{ |
||
494 | |||
495 | /// Returns the module flags in the provided vector. |
||
496 | void getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const; |
||
497 | |||
498 | /// Return the corresponding value if Key appears in module flags, otherwise |
||
499 | /// return null. |
||
500 | Metadata *getModuleFlag(StringRef Key) const; |
||
501 | |||
502 | /// Returns the NamedMDNode in the module that represents module-level flags. |
||
503 | /// This method returns null if there are no module-level flags. |
||
504 | NamedMDNode *getModuleFlagsMetadata() const; |
||
505 | |||
506 | /// Returns the NamedMDNode in the module that represents module-level flags. |
||
507 | /// If module-level flags aren't found, it creates the named metadata that |
||
508 | /// contains them. |
||
509 | NamedMDNode *getOrInsertModuleFlagsMetadata(); |
||
510 | |||
511 | /// Add a module-level flag to the module-level flags metadata. It will create |
||
512 | /// the module-level flags named metadata if it doesn't already exist. |
||
513 | void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val); |
||
514 | void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Constant *Val); |
||
515 | void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, uint32_t Val); |
||
516 | void addModuleFlag(MDNode *Node); |
||
517 | /// Like addModuleFlag but replaces the old module flag if it already exists. |
||
518 | void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val); |
||
519 | |||
520 | /// @} |
||
521 | /// @name Materialization |
||
522 | /// @{ |
||
523 | |||
524 | /// Sets the GVMaterializer to GVM. This module must not yet have a |
||
525 | /// Materializer. To reset the materializer for a module that already has one, |
||
526 | /// call materializeAll first. Destroying this module will destroy |
||
527 | /// its materializer without materializing any more GlobalValues. Without |
||
528 | /// destroying the Module, there is no way to detach or destroy a materializer |
||
529 | /// without materializing all the GVs it controls, to avoid leaving orphan |
||
530 | /// unmaterialized GVs. |
||
531 | void setMaterializer(GVMaterializer *GVM); |
||
532 | /// Retrieves the GVMaterializer, if any, for this Module. |
||
533 | GVMaterializer *getMaterializer() const { return Materializer.get(); } |
||
534 | bool isMaterialized() const { return !getMaterializer(); } |
||
535 | |||
536 | /// Make sure the GlobalValue is fully read. |
||
537 | llvm::Error materialize(GlobalValue *GV); |
||
538 | |||
539 | /// Make sure all GlobalValues in this Module are fully read and clear the |
||
540 | /// Materializer. |
||
541 | llvm::Error materializeAll(); |
||
542 | |||
543 | llvm::Error materializeMetadata(); |
||
544 | |||
545 | /// @} |
||
546 | /// @name Direct access to the globals list, functions list, and symbol table |
||
547 | /// @{ |
||
548 | |||
549 | /// Get the Module's list of global variables (constant). |
||
550 | const GlobalListType &getGlobalList() const { return GlobalList; } |
||
551 | /// Get the Module's list of global variables. |
||
552 | GlobalListType &getGlobalList() { return GlobalList; } |
||
553 | |||
554 | static GlobalListType Module::*getSublistAccess(GlobalVariable*) { |
||
555 | return &Module::GlobalList; |
||
556 | } |
||
557 | |||
558 | /// Get the Module's list of functions (constant). |
||
559 | const FunctionListType &getFunctionList() const { return FunctionList; } |
||
560 | /// Get the Module's list of functions. |
||
561 | FunctionListType &getFunctionList() { return FunctionList; } |
||
562 | static FunctionListType Module::*getSublistAccess(Function*) { |
||
563 | return &Module::FunctionList; |
||
564 | } |
||
565 | |||
566 | /// Get the Module's list of aliases (constant). |
||
567 | const AliasListType &getAliasList() const { return AliasList; } |
||
568 | /// Get the Module's list of aliases. |
||
569 | AliasListType &getAliasList() { return AliasList; } |
||
570 | |||
571 | static AliasListType Module::*getSublistAccess(GlobalAlias*) { |
||
572 | return &Module::AliasList; |
||
573 | } |
||
574 | |||
575 | /// Get the Module's list of ifuncs (constant). |
||
576 | const IFuncListType &getIFuncList() const { return IFuncList; } |
||
577 | /// Get the Module's list of ifuncs. |
||
578 | IFuncListType &getIFuncList() { return IFuncList; } |
||
579 | |||
580 | static IFuncListType Module::*getSublistAccess(GlobalIFunc*) { |
||
581 | return &Module::IFuncList; |
||
582 | } |
||
583 | |||
584 | /// Get the Module's list of named metadata (constant). |
||
585 | const NamedMDListType &getNamedMDList() const { return NamedMDList; } |
||
586 | /// Get the Module's list of named metadata. |
||
587 | NamedMDListType &getNamedMDList() { return NamedMDList; } |
||
588 | |||
589 | static NamedMDListType Module::*getSublistAccess(NamedMDNode*) { |
||
590 | return &Module::NamedMDList; |
||
591 | } |
||
592 | |||
593 | /// Get the symbol table of global variable and function identifiers |
||
594 | const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; } |
||
595 | /// Get the Module's symbol table of global variable and function identifiers. |
||
596 | ValueSymbolTable &getValueSymbolTable() { return *ValSymTab; } |
||
597 | |||
598 | /// Get the Module's symbol table for COMDATs (constant). |
||
599 | const ComdatSymTabType &getComdatSymbolTable() const { return ComdatSymTab; } |
||
600 | /// Get the Module's symbol table for COMDATs. |
||
601 | ComdatSymTabType &getComdatSymbolTable() { return ComdatSymTab; } |
||
602 | |||
603 | /// @} |
||
604 | /// @name Global Variable Iteration |
||
605 | /// @{ |
||
606 | |||
607 | global_iterator global_begin() { return GlobalList.begin(); } |
||
608 | const_global_iterator global_begin() const { return GlobalList.begin(); } |
||
609 | global_iterator global_end () { return GlobalList.end(); } |
||
610 | const_global_iterator global_end () const { return GlobalList.end(); } |
||
611 | size_t global_size () const { return GlobalList.size(); } |
||
612 | bool global_empty() const { return GlobalList.empty(); } |
||
613 | |||
614 | iterator_range<global_iterator> globals() { |
||
615 | return make_range(global_begin(), global_end()); |
||
616 | } |
||
617 | iterator_range<const_global_iterator> globals() const { |
||
618 | return make_range(global_begin(), global_end()); |
||
619 | } |
||
620 | |||
621 | /// @} |
||
622 | /// @name Function Iteration |
||
623 | /// @{ |
||
624 | |||
625 | iterator begin() { return FunctionList.begin(); } |
||
626 | const_iterator begin() const { return FunctionList.begin(); } |
||
627 | iterator end () { return FunctionList.end(); } |
||
628 | const_iterator end () const { return FunctionList.end(); } |
||
629 | reverse_iterator rbegin() { return FunctionList.rbegin(); } |
||
630 | const_reverse_iterator rbegin() const{ return FunctionList.rbegin(); } |
||
631 | reverse_iterator rend() { return FunctionList.rend(); } |
||
632 | const_reverse_iterator rend() const { return FunctionList.rend(); } |
||
633 | size_t size() const { return FunctionList.size(); } |
||
634 | bool empty() const { return FunctionList.empty(); } |
||
635 | |||
636 | iterator_range<iterator> functions() { |
||
637 | return make_range(begin(), end()); |
||
638 | } |
||
639 | iterator_range<const_iterator> functions() const { |
||
640 | return make_range(begin(), end()); |
||
641 | } |
||
642 | |||
643 | /// @} |
||
644 | /// @name Alias Iteration |
||
645 | /// @{ |
||
646 | |||
647 | alias_iterator alias_begin() { return AliasList.begin(); } |
||
648 | const_alias_iterator alias_begin() const { return AliasList.begin(); } |
||
649 | alias_iterator alias_end () { return AliasList.end(); } |
||
650 | const_alias_iterator alias_end () const { return AliasList.end(); } |
||
651 | size_t alias_size () const { return AliasList.size(); } |
||
652 | bool alias_empty() const { return AliasList.empty(); } |
||
653 | |||
654 | iterator_range<alias_iterator> aliases() { |
||
655 | return make_range(alias_begin(), alias_end()); |
||
656 | } |
||
657 | iterator_range<const_alias_iterator> aliases() const { |
||
658 | return make_range(alias_begin(), alias_end()); |
||
659 | } |
||
660 | |||
661 | /// @} |
||
662 | /// @name IFunc Iteration |
||
663 | /// @{ |
||
664 | |||
665 | ifunc_iterator ifunc_begin() { return IFuncList.begin(); } |
||
666 | const_ifunc_iterator ifunc_begin() const { return IFuncList.begin(); } |
||
667 | ifunc_iterator ifunc_end () { return IFuncList.end(); } |
||
668 | const_ifunc_iterator ifunc_end () const { return IFuncList.end(); } |
||
669 | size_t ifunc_size () const { return IFuncList.size(); } |
||
670 | bool ifunc_empty() const { return IFuncList.empty(); } |
||
671 | |||
672 | iterator_range<ifunc_iterator> ifuncs() { |
||
673 | return make_range(ifunc_begin(), ifunc_end()); |
||
674 | } |
||
675 | iterator_range<const_ifunc_iterator> ifuncs() const { |
||
676 | return make_range(ifunc_begin(), ifunc_end()); |
||
677 | } |
||
678 | |||
679 | /// @} |
||
680 | /// @name Convenience iterators |
||
681 | /// @{ |
||
682 | |||
683 | using global_object_iterator = |
||
684 | concat_iterator<GlobalObject, iterator, global_iterator>; |
||
685 | using const_global_object_iterator = |
||
686 | concat_iterator<const GlobalObject, const_iterator, |
||
687 | const_global_iterator>; |
||
688 | |||
689 | iterator_range<global_object_iterator> global_objects(); |
||
690 | iterator_range<const_global_object_iterator> global_objects() const; |
||
691 | |||
692 | using global_value_iterator = |
||
693 | concat_iterator<GlobalValue, iterator, global_iterator, alias_iterator, |
||
694 | ifunc_iterator>; |
||
695 | using const_global_value_iterator = |
||
696 | concat_iterator<const GlobalValue, const_iterator, const_global_iterator, |
||
697 | const_alias_iterator, const_ifunc_iterator>; |
||
698 | |||
699 | iterator_range<global_value_iterator> global_values(); |
||
700 | iterator_range<const_global_value_iterator> global_values() const; |
||
701 | |||
702 | /// @} |
||
703 | /// @name Named Metadata Iteration |
||
704 | /// @{ |
||
705 | |||
706 | named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); } |
||
707 | const_named_metadata_iterator named_metadata_begin() const { |
||
708 | return NamedMDList.begin(); |
||
709 | } |
||
710 | |||
711 | named_metadata_iterator named_metadata_end() { return NamedMDList.end(); } |
||
712 | const_named_metadata_iterator named_metadata_end() const { |
||
713 | return NamedMDList.end(); |
||
714 | } |
||
715 | |||
716 | size_t named_metadata_size() const { return NamedMDList.size(); } |
||
717 | bool named_metadata_empty() const { return NamedMDList.empty(); } |
||
718 | |||
719 | iterator_range<named_metadata_iterator> named_metadata() { |
||
720 | return make_range(named_metadata_begin(), named_metadata_end()); |
||
721 | } |
||
722 | iterator_range<const_named_metadata_iterator> named_metadata() const { |
||
723 | return make_range(named_metadata_begin(), named_metadata_end()); |
||
724 | } |
||
725 | |||
726 | /// An iterator for DICompileUnits that skips those marked NoDebug. |
||
727 | class debug_compile_units_iterator { |
||
728 | NamedMDNode *CUs; |
||
729 | unsigned Idx; |
||
730 | |||
731 | void SkipNoDebugCUs(); |
||
732 | |||
733 | public: |
||
734 | using iterator_category = std::input_iterator_tag; |
||
735 | using value_type = DICompileUnit *; |
||
736 | using difference_type = std::ptrdiff_t; |
||
737 | using pointer = value_type *; |
||
738 | using reference = value_type &; |
||
739 | |||
740 | explicit debug_compile_units_iterator(NamedMDNode *CUs, unsigned Idx) |
||
741 | : CUs(CUs), Idx(Idx) { |
||
742 | SkipNoDebugCUs(); |
||
743 | } |
||
744 | |||
745 | debug_compile_units_iterator &operator++() { |
||
746 | ++Idx; |
||
747 | SkipNoDebugCUs(); |
||
748 | return *this; |
||
749 | } |
||
750 | |||
751 | debug_compile_units_iterator operator++(int) { |
||
752 | debug_compile_units_iterator T(*this); |
||
753 | ++Idx; |
||
754 | return T; |
||
755 | } |
||
756 | |||
757 | bool operator==(const debug_compile_units_iterator &I) const { |
||
758 | return Idx == I.Idx; |
||
759 | } |
||
760 | |||
761 | bool operator!=(const debug_compile_units_iterator &I) const { |
||
762 | return Idx != I.Idx; |
||
763 | } |
||
764 | |||
765 | DICompileUnit *operator*() const; |
||
766 | DICompileUnit *operator->() const; |
||
767 | }; |
||
768 | |||
769 | debug_compile_units_iterator debug_compile_units_begin() const { |
||
770 | auto *CUs = getNamedMetadata("llvm.dbg.cu"); |
||
771 | return debug_compile_units_iterator(CUs, 0); |
||
772 | } |
||
773 | |||
774 | debug_compile_units_iterator debug_compile_units_end() const { |
||
775 | auto *CUs = getNamedMetadata("llvm.dbg.cu"); |
||
776 | return debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0); |
||
777 | } |
||
778 | |||
779 | /// Return an iterator for all DICompileUnits listed in this Module's |
||
780 | /// llvm.dbg.cu named metadata node and aren't explicitly marked as |
||
781 | /// NoDebug. |
||
782 | iterator_range<debug_compile_units_iterator> debug_compile_units() const { |
||
783 | auto *CUs = getNamedMetadata("llvm.dbg.cu"); |
||
784 | return make_range( |
||
785 | debug_compile_units_iterator(CUs, 0), |
||
786 | debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0)); |
||
787 | } |
||
788 | /// @} |
||
789 | |||
790 | /// Destroy ConstantArrays in LLVMContext if they are not used. |
||
791 | /// ConstantArrays constructed during linking can cause quadratic memory |
||
792 | /// explosion. Releasing all unused constants can cause a 20% LTO compile-time |
||
793 | /// slowdown for a large application. |
||
794 | /// |
||
795 | /// NOTE: Constants are currently owned by LLVMContext. This can then only |
||
796 | /// be called where all uses of the LLVMContext are understood. |
||
797 | void dropTriviallyDeadConstantArrays(); |
||
798 | |||
799 | /// @name Utility functions for printing and dumping Module objects |
||
800 | /// @{ |
||
801 | |||
802 | /// Print the module to an output stream with an optional |
||
803 | /// AssemblyAnnotationWriter. If \c ShouldPreserveUseListOrder, then include |
||
804 | /// uselistorder directives so that use-lists can be recreated when reading |
||
805 | /// the assembly. |
||
806 | void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, |
||
807 | bool ShouldPreserveUseListOrder = false, |
||
808 | bool IsForDebug = false) const; |
||
809 | |||
810 | /// Dump the module to stderr (for debugging). |
||
811 | void dump() const; |
||
812 | |||
813 | /// This function causes all the subinstructions to "let go" of all references |
||
814 | /// that they are maintaining. This allows one to 'delete' a whole class at |
||
815 | /// a time, even though there may be circular references... first all |
||
816 | /// references are dropped, and all use counts go to zero. Then everything |
||
817 | /// is delete'd for real. Note that no operations are valid on an object |
||
818 | /// that has "dropped all references", except operator delete. |
||
819 | void dropAllReferences(); |
||
820 | |||
821 | /// @} |
||
822 | /// @name Utility functions for querying Debug information. |
||
823 | /// @{ |
||
824 | |||
825 | /// Returns the Number of Register ParametersDwarf Version by checking |
||
826 | /// module flags. |
||
827 | unsigned getNumberRegisterParameters() const; |
||
828 | |||
829 | /// Returns the Dwarf Version by checking module flags. |
||
830 | unsigned getDwarfVersion() const; |
||
831 | |||
832 | /// Returns the DWARF format by checking module flags. |
||
833 | bool isDwarf64() const; |
||
834 | |||
835 | /// Returns the CodeView Version by checking module flags. |
||
836 | /// Returns zero if not present in module. |
||
837 | unsigned getCodeViewFlag() const; |
||
838 | |||
839 | /// @} |
||
840 | /// @name Utility functions for querying and setting PIC level |
||
841 | /// @{ |
||
842 | |||
843 | /// Returns the PIC level (small or large model) |
||
844 | PICLevel::Level getPICLevel() const; |
||
845 | |||
846 | /// Set the PIC level (small or large model) |
||
847 | void setPICLevel(PICLevel::Level PL); |
||
848 | /// @} |
||
849 | |||
850 | /// @} |
||
851 | /// @name Utility functions for querying and setting PIE level |
||
852 | /// @{ |
||
853 | |||
854 | /// Returns the PIE level (small or large model) |
||
855 | PIELevel::Level getPIELevel() const; |
||
856 | |||
857 | /// Set the PIE level (small or large model) |
||
858 | void setPIELevel(PIELevel::Level PL); |
||
859 | /// @} |
||
860 | |||
861 | /// @} |
||
862 | /// @name Utility function for querying and setting code model |
||
863 | /// @{ |
||
864 | |||
865 | /// Returns the code model (tiny, small, kernel, medium or large model) |
||
866 | std::optional<CodeModel::Model> getCodeModel() const; |
||
867 | |||
868 | /// Set the code model (tiny, small, kernel, medium or large) |
||
869 | void setCodeModel(CodeModel::Model CL); |
||
870 | /// @} |
||
871 | |||
872 | /// @name Utility functions for querying and setting PGO summary |
||
873 | /// @{ |
||
874 | |||
875 | /// Attach profile summary metadata to this module. |
||
876 | void setProfileSummary(Metadata *M, ProfileSummary::Kind Kind); |
||
877 | |||
878 | /// Returns profile summary metadata. When IsCS is true, use the context |
||
879 | /// sensitive profile summary. |
||
880 | Metadata *getProfileSummary(bool IsCS) const; |
||
881 | /// @} |
||
882 | |||
883 | /// Returns whether semantic interposition is to be respected. |
||
884 | bool getSemanticInterposition() const; |
||
885 | |||
886 | /// Set whether semantic interposition is to be respected. |
||
887 | void setSemanticInterposition(bool); |
||
888 | |||
889 | /// Returns true if PLT should be avoided for RTLib calls. |
||
890 | bool getRtLibUseGOT() const; |
||
891 | |||
892 | /// Set that PLT should be avoid for RTLib calls. |
||
893 | void setRtLibUseGOT(); |
||
894 | |||
895 | /// Get/set whether synthesized functions should get the uwtable attribute. |
||
896 | UWTableKind getUwtable() const; |
||
897 | void setUwtable(UWTableKind Kind); |
||
898 | |||
899 | /// Get/set whether synthesized functions should get the "frame-pointer" |
||
900 | /// attribute. |
||
901 | FramePointerKind getFramePointer() const; |
||
902 | void setFramePointer(FramePointerKind Kind); |
||
903 | |||
904 | /// Get/set what kind of stack protector guard to use. |
||
905 | StringRef getStackProtectorGuard() const; |
||
906 | void setStackProtectorGuard(StringRef Kind); |
||
907 | |||
908 | /// Get/set which register to use as the stack protector guard register. The |
||
909 | /// empty string is equivalent to "global". Other values may be "tls" or |
||
910 | /// "sysreg". |
||
911 | StringRef getStackProtectorGuardReg() const; |
||
912 | void setStackProtectorGuardReg(StringRef Reg); |
||
913 | |||
914 | /// Get/set a symbol to use as the stack protector guard. |
||
915 | StringRef getStackProtectorGuardSymbol() const; |
||
916 | void setStackProtectorGuardSymbol(StringRef Symbol); |
||
917 | |||
918 | /// Get/set what offset from the stack protector to use. |
||
919 | int getStackProtectorGuardOffset() const; |
||
920 | void setStackProtectorGuardOffset(int Offset); |
||
921 | |||
922 | /// Get/set the stack alignment overridden from the default. |
||
923 | unsigned getOverrideStackAlignment() const; |
||
924 | void setOverrideStackAlignment(unsigned Align); |
||
925 | |||
926 | /// @name Utility functions for querying and setting the build SDK version |
||
927 | /// @{ |
||
928 | |||
929 | /// Attach a build SDK version metadata to this module. |
||
930 | void setSDKVersion(const VersionTuple &V); |
||
931 | |||
932 | /// Get the build SDK version metadata. |
||
933 | /// |
||
934 | /// An empty version is returned if no such metadata is attached. |
||
935 | VersionTuple getSDKVersion() const; |
||
936 | /// @} |
||
937 | |||
938 | /// Take ownership of the given memory buffer. |
||
939 | void setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB); |
||
940 | |||
941 | /// Set the partial sample profile ratio in the profile summary module flag, |
||
942 | /// if applicable. |
||
943 | void setPartialSampleProfileRatio(const ModuleSummaryIndex &Index); |
||
944 | |||
945 | /// Get the target variant triple which is a string describing a variant of |
||
946 | /// the target host platform. For example, Mac Catalyst can be a variant |
||
947 | /// target triple for a macOS target. |
||
948 | /// @returns a string containing the target variant triple. |
||
949 | StringRef getDarwinTargetVariantTriple() const; |
||
950 | |||
951 | /// Set the target variant triple which is a string describing a variant of |
||
952 | /// the target host platform. |
||
953 | void setDarwinTargetVariantTriple(StringRef T); |
||
954 | |||
955 | /// Get the target variant version build SDK version metadata. |
||
956 | /// |
||
957 | /// An empty version is returned if no such metadata is attached. |
||
958 | VersionTuple getDarwinTargetVariantSDKVersion() const; |
||
959 | |||
960 | /// Set the target variant version build SDK version metadata. |
||
961 | void setDarwinTargetVariantSDKVersion(VersionTuple Version); |
||
962 | }; |
||
963 | |||
964 | /// Given "llvm.used" or "llvm.compiler.used" as a global name, collect the |
||
965 | /// initializer elements of that global in a SmallVector and return the global |
||
966 | /// itself. |
||
967 | GlobalVariable *collectUsedGlobalVariables(const Module &M, |
||
968 | SmallVectorImpl<GlobalValue *> &Vec, |
||
969 | bool CompilerUsed); |
||
970 | |||
971 | /// An raw_ostream inserter for modules. |
||
972 | inline raw_ostream &operator<<(raw_ostream &O, const Module &M) { |
||
973 | M.print(O, nullptr); |
||
974 | return O; |
||
975 | } |
||
976 | |||
977 | // Create wrappers for C Binding types (see CBindingWrapping.h). |
||
978 | DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef) |
||
979 | |||
980 | /* LLVMModuleProviderRef exists for historical reasons, but now just holds a |
||
981 | * Module. |
||
982 | */ |
||
983 | inline Module *unwrap(LLVMModuleProviderRef MP) { |
||
984 | return reinterpret_cast<Module*>(MP); |
||
985 | } |
||
986 | |||
987 | } // end namespace llvm |
||
988 | |||
989 | #endif // LLVM_IR_MODULE_H |