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 |