1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- llvm/Module.h - C++ class to represent a VM module -------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @file 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Module.h This file contains the declarations for the Module class. 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_IR_MODULE_H 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_IR_MODULE_H 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm-c/Types.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/STLExtras.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringMap.h" 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/StringRef.h" 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/iterator_range.h" 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Attributes.h" 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Comdat.h" 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/DataLayout.h" 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Function.h" 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/GlobalAlias.h" 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/GlobalIFunc.h" 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/GlobalVariable.h" 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/Metadata.h" 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/IR/SymbolTableListTraits.h" 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/CBindingWrapping.h" 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/Support/CodeGen.h" 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cstddef> 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <cstdint> 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <iterator> 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <memory> 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <string> 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <vector> 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace llvm { 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Error; 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass FunctionType; 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass GVMaterializer; 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass LLVMContext; 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass MemoryBuffer; 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass RandomNumberGenerator; 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robottemplate <class PtrType> class SmallPtrSetImpl; 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass StructType; 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A Module instance is used to store all the information related to an 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// LLVM module. Modules are the top level container of all other LLVM 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// Intermediate Representation (IR) objects. Each module directly contains a 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// list of globals variables, a list of functions, a list of libraries (or 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// other modules) this module depends on, a symbol table, and various data 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// about the target's characteristics. 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// A module maintains a GlobalValRefMap object that is used to hold all 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// constant references to global variables in the module. When a global 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// variable is destroyed, it should have no entries in the GlobalValueRefMap. 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @brief The main container class for the LLVM Intermediate Representation. 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass Module { 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Types And Enumerations 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type for the list of global variables. 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using GlobalListType = SymbolTableList<GlobalVariable>; 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type for the list of functions. 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using FunctionListType = SymbolTableList<Function>; 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type for the list of aliases. 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using AliasListType = SymbolTableList<GlobalAlias>; 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type for the list of ifuncs. 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using IFuncListType = SymbolTableList<GlobalIFunc>; 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type for the list of named metadata. 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using NamedMDListType = ilist<NamedMDNode>; 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The type of the comdat "symbol" table. 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using ComdatSymTabType = StringMap<Comdat>; 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global Variable iterator. 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using global_iterator = GlobalListType::iterator; 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global Variable constant iterator. 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_global_iterator = GlobalListType::const_iterator; 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Function iterators. 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using iterator = FunctionListType::iterator; 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Function constant iterator 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_iterator = FunctionListType::const_iterator; 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Function reverse iterator. 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using reverse_iterator = FunctionListType::reverse_iterator; 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Function constant reverse iterator. 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_reverse_iterator = FunctionListType::const_reverse_iterator; 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global Alias iterators. 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using alias_iterator = AliasListType::iterator; 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global Alias constant iterator 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_alias_iterator = AliasListType::const_iterator; 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global IFunc iterators. 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using ifunc_iterator = IFuncListType::iterator; 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Global IFunc constant iterator 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_ifunc_iterator = IFuncListType::const_iterator; 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The named metadata iterators. 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using named_metadata_iterator = NamedMDListType::iterator; 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The named metadata constant iterators. 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_named_metadata_iterator = NamedMDListType::const_iterator; 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This enumeration defines the supported behaviors of module flags. 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot enum ModFlagBehavior { 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Emits an error if two values disagree, otherwise the resulting value is 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// that of the operands. 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Error = 1, 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Emits a warning if two values disagree. The result value will be the 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// operand for the flag from the first module being linked. 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Warning = 2, 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Adds a requirement that another module flag be present and have a 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// specified value after linking is performed. The value must be a metadata 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// pair, where the first element of the pair is the ID of the module flag 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// to be restricted, and the second element of the pair is the value the 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// module flag should be restricted to. This behavior can be used to 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// restrict the allowable results (via triggering of an error) of linking 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// IDs with the **Override** behavior. 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Require = 3, 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Uses the specified value, regardless of the behavior or value of the 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// other module. If both modules specify **Override**, but the values 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// differ, an error will be emitted. 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Override = 4, 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Appends the two values, which are required to be metadata nodes. 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Append = 5, 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Appends the two values, which are required to be metadata 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// nodes. However, duplicate entries in the second list are dropped 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// during the append operation. 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AppendUnique = 6, 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Takes the max of the two values, which are required to be integers. 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Max = 7, 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot // Markers: 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ModFlagBehaviorFirstVal = Error, 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ModFlagBehaviorLastVal = Max 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Checks if Metadata represents a valid ModFlagBehavior, and stores the 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// converted result in MFB. 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static bool isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB); 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot struct ModuleFlagEntry { 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ModFlagBehavior Behavior; 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot MDString *Key; 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Metadata *Val; 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ModuleFlagEntry(ModFlagBehavior B, MDString *K, Metadata *V) 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Behavior(B), Key(K), Val(V) {} 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Member Variables 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotprivate: 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LLVMContext &Context; ///< The LLVMContext from which types and 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ///< constants are allocated. 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalListType GlobalList; ///< The Global Variables in the module 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot FunctionListType FunctionList; ///< The Functions in the module 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AliasListType AliasList; ///< The Aliases in the module 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IFuncListType IFuncList; ///< The IFuncs in the module 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDListType NamedMDList; ///< The named metadata in the module 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string GlobalScopeAsm; ///< Inline Asm at global scope. 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ValueSymbolTable *ValSymTab; ///< Symbol table for values 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ComdatSymTabType ComdatSymTab; ///< Symbol table for COMDATs 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<MemoryBuffer> 178f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot OwnedMemoryBuffer; ///< Memory buffer directly owned by this 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ///< module, for legacy clients only. 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::unique_ptr<GVMaterializer> 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Materializer; ///< Used to materialize GlobalValues 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string ModuleID; ///< Human readable identifier for the module 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string SourceFileName; ///< Original source file name for module, 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ///< recorded in bitcode. 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string TargetTriple; ///< Platform target triple Module compiled on 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ///< Format: (arch)(sub)-(vendor)-(sys0-(abi) 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void *NamedMDSymTab; ///< NamedMDNode names. 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DataLayout DL; ///< DataLayout associated with the module 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend class Constant; 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Constructors 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The Module constructor. Note that there is no default constructor. You 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// must provide a name for the module upon construction. 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit Module(StringRef ModuleID, LLVMContext& C); 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// The module destructor. This will dropAllReferences. 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ~Module(); 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Module Level Accessors 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the module identifier which is, essentially, the name of the module. 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @returns the module identifier as a string 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getModuleIdentifier() const { return ModuleID; } 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the module's original source file name. When compiling from 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// bitcode, this is taken from a bitcode record where it was recorded. 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// For other compiles it is the same as the ModuleID, which would 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// contain the source file name. 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getSourceFileName() const { return SourceFileName; } 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Get a short "name" for the module. 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This is useful for debugging or logging. It is essentially a convenience 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// wrapper around getModuleIdentifier(). 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StringRef getName() const { return ModuleID; } 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the data layout string for the module's target platform. This is 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// equivalent to getDataLayout()->getStringRepresentation(). 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getDataLayoutStr() const { 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return DL.getStringRepresentation(); 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the data layout for the module's target platform. 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const DataLayout &getDataLayout() const; 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the target triple which is a string describing the target host. 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @returns a string containing the target triple. 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getTargetTriple() const { return TargetTriple; } 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the global data context. 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @returns LLVMContext - a container for LLVM's global information 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot LLVMContext &getContext() const { return Context; } 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get any module-scope inline assembly blocks. 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @returns a string containing the module-scope inline assembly blocks. 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; } 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get a RandomNumberGenerator salted for use with this module. The 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// RNG can be seeded via -rng-seed=<uint64> and is salted with the 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ModuleID and the provided pass salt. The returned RNG should not 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// be shared across threads or passes. 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// A unique RNG per pass ensures a reproducible random stream even 249f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// when other randomness consuming passes are added or removed. In 250f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// addition, the random stream will be reproducible across LLVM 251f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// versions when the pass does not change. 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot RandomNumberGenerator *createRNG(const Pass* P) const; 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 254f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 255f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Module Level Mutators 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the module identifier. 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setModuleIdentifier(StringRef ID) { ModuleID = ID; } 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the module's original source file name. 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setSourceFileName(StringRef Name) { SourceFileName = Name; } 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the data layout 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDataLayout(StringRef Desc); 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setDataLayout(const DataLayout &Other); 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the target triple. 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setTargetTriple(StringRef T) { TargetTriple = T; } 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Set the module-scope inline assembly blocks. 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// A trailing newline is added if the input doesn't have one. 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setModuleInlineAsm(StringRef Asm) { 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalScopeAsm = Asm; 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalScopeAsm += '\n'; 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Append to the module-scope inline assembly blocks. 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// A trailing newline is added if the input doesn't have one. 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void appendModuleInlineAsm(StringRef Asm) { 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalScopeAsm += Asm; 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!GlobalScopeAsm.empty() && GlobalScopeAsm.back() != '\n') 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalScopeAsm += '\n'; 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Generic Value Accessors 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the global value in the module with the specified name, of 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// arbitrary type. This method returns null if a global with the specified 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name is not found. 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalValue *getNamedValue(StringRef Name) const; 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return a unique non-zero ID for the specified metadata kind. This ID is 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// uniqued across modules in the current LLVMContext. 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getMDKindID(StringRef Name) const; 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Populate client supplied SmallVector with the name for custom metadata IDs 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// registered in this LLVMContext. 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void getMDKindNames(SmallVectorImpl<StringRef> &Result) const; 303f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Populate client supplied SmallVector with the bundle tags registered in 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// this LLVMContext. The bundle tags are ordered by increasing bundle IDs. 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \see LLVMContext::getOperandBundleTagID 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void getOperandBundleTags(SmallVectorImpl<StringRef> &Result) const; 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the type with the specified name, or null if there is none by that 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name. 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot StructType *getTypeByName(StringRef Name) const; 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::vector<StructType *> getIdentifiedStructTypes() const; 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Function Accessors 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 318f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 319f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Look up the specified function in the module symbol table. Four 320f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// possibilities: 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 1. If it does not exist, add a prototype for the function and return it. 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 2. If it exists, and has a local linkage, the existing function is 323f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// renamed and a new one is inserted. 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 3. Otherwise, if the existing function has the correct prototype, return 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the existing function. 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 4. Finally, the function exists but has the wrong prototype: return the 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// function with a constantexpr cast to the right prototype. 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Constant *getOrInsertFunction(StringRef Name, FunctionType *T, 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AttributeList AttributeList); 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Constant *getOrInsertFunction(StringRef Name, FunctionType *T); 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Look up the specified function in the module symbol table. If it does not 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// exist, add a prototype for the function and return it. This function 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// guarantees to return a constant of pointer to the specified function type 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// or a ConstantExpr BitCast of that type if the named function has a 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// different type. This version of the method takes a list of 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// function arguments, which makes it easier for clients to use. 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot template<typename... ArgsTy> 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Constant *getOrInsertFunction(StringRef Name, 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AttributeList AttributeList, 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Type *RetTy, ArgsTy... Args) 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot { 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallVector<Type*, sizeof...(ArgsTy)> ArgTys{Args...}; 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getOrInsertFunction(Name, 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot FunctionType::get(RetTy, ArgTys, false), 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AttributeList); 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Same as above, but without the attributes. 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot template<typename... ArgsTy> 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Constant *getOrInsertFunction(StringRef Name, Type *RetTy, ArgsTy... Args) { 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getOrInsertFunction(Name, AttributeList{}, RetTy, Args...); 354f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Look up the specified function in the module symbol table. If it does not 357f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// exist, return null. 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Function *getFunction(StringRef Name) const; 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Global Variable Accessors 362f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Look up the specified global variable in the module symbol table. If it 365f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// does not exist, return null. If AllowInternal is set to true, this 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// function will return types that have InternalLinkage. By default, these 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// types are not returned. 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalVariable *getGlobalVariable(StringRef Name) const { 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getGlobalVariable(Name, false); 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalVariable *getGlobalVariable(StringRef Name, bool AllowInternal) const; 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalVariable *getGlobalVariable(StringRef Name, 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool AllowInternal = false) { 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return static_cast<const Module *>(this)->getGlobalVariable(Name, 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AllowInternal); 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the global variable in the module with the specified name, of 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// arbitrary type. This method returns null if a global with the specified 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name is not found. 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const GlobalVariable *getNamedGlobal(StringRef Name) const { 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return getGlobalVariable(Name, true); 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalVariable *getNamedGlobal(StringRef Name) { 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return const_cast<GlobalVariable *>( 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static_cast<const Module *>(this)->getNamedGlobal(Name)); 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Look up the specified global in the module symbol table. 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 1. If it does not exist, add a declaration of the global and return it. 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 2. Else, the global exists but has the wrong type: return the function 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// with a constantexpr cast to the right type. 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 3. Finally, if the existing global is the correct declaration, return 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the existing global. 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Constant *getOrInsertGlobal(StringRef Name, Type *Ty); 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Global Alias Accessors 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the global alias in the module with the specified name, of 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// arbitrary type. This method returns null if a global with the specified 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name is not found. 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalAlias *getNamedAlias(StringRef Name) const; 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Global IFunc Accessors 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the global ifunc in the module with the specified name, of 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// arbitrary type. This method returns null if a global with the specified 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// name is not found. 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalIFunc *getNamedIFunc(StringRef Name) const; 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Named Metadata Accessors 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the first NamedMDNode in the module with the specified name. This 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// method returns null if a NamedMDNode with the specified name is not found. 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDNode *getNamedMetadata(const Twine &Name) const; 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the named MDNode in the module with the specified name. This method 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// returns a new NamedMDNode if a NamedMDNode with the specified name is not 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// found. 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDNode *getOrInsertNamedMetadata(StringRef Name); 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Remove the given NamedMDNode from this module and delete it. 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void eraseNamedMetadata(NamedMDNode *NMD); 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Comdat Accessors 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the Comdat in the module with the specified name. It is created 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// if it didn't already exist. 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Comdat *getOrInsertComdat(StringRef Name); 440f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 441f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 442f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Module Flags Accessors 443f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 444f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 445f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns the module flags in the provided vector. 446f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const; 447f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 448f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return the corresponding value if Key appears in module flags, otherwise 449f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// return null. 450f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Metadata *getModuleFlag(StringRef Key) const; 451f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 452f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns the NamedMDNode in the module that represents module-level flags. 453f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This method returns null if there are no module-level flags. 454f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDNode *getModuleFlagsMetadata() const; 455f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 456f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns the NamedMDNode in the module that represents module-level flags. 457f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If module-level flags aren't found, it creates the named metadata that 458f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// contains them. 459f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDNode *getOrInsertModuleFlagsMetadata(); 460f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 461f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Add a module-level flag to the module-level flags metadata. It will create 462f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the module-level flags named metadata if it doesn't already exist. 463f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val); 464f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, Constant *Val); 465f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addModuleFlag(ModFlagBehavior Behavior, StringRef Key, uint32_t Val); 466f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void addModuleFlag(MDNode *Node); 467f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 468f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 469f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Materialization 470f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 471f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 472f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Sets the GVMaterializer to GVM. This module must not yet have a 473f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Materializer. To reset the materializer for a module that already has one, 474f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// call materializeAll first. Destroying this module will destroy 475f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// its materializer without materializing any more GlobalValues. Without 476f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// destroying the Module, there is no way to detach or destroy a materializer 477f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// without materializing all the GVs it controls, to avoid leaving orphan 478f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// unmaterialized GVs. 479f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setMaterializer(GVMaterializer *GVM); 480f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Retrieves the GVMaterializer, if any, for this Module. 481f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GVMaterializer *getMaterializer() const { return Materializer.get(); } 482f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool isMaterialized() const { return !getMaterializer(); } 483f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 484f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Make sure the GlobalValue is fully read. 485f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Error materialize(GlobalValue *GV); 486f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 487f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Make sure all GlobalValues in this Module are fully read and clear the 488f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Materializer. 489f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Error materializeAll(); 490f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 491f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot llvm::Error materializeMetadata(); 492f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 493f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 494f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Direct access to the globals list, functions list, and symbol table 495f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 496f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 497f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of global variables (constant). 498f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const GlobalListType &getGlobalList() const { return GlobalList; } 499f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of global variables. 500f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot GlobalListType &getGlobalList() { return GlobalList; } 501f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 502f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static GlobalListType Module::*getSublistAccess(GlobalVariable*) { 503f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return &Module::GlobalList; 504f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 505f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 506f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of functions (constant). 507f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const FunctionListType &getFunctionList() const { return FunctionList; } 508f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of functions. 509f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot FunctionListType &getFunctionList() { return FunctionList; } 510f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static FunctionListType Module::*getSublistAccess(Function*) { 511f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return &Module::FunctionList; 512f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 513f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 514f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of aliases (constant). 515f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const AliasListType &getAliasList() const { return AliasList; } 516f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of aliases. 517f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot AliasListType &getAliasList() { return AliasList; } 518f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 519f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static AliasListType Module::*getSublistAccess(GlobalAlias*) { 520f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return &Module::AliasList; 521f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 522f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 523f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of ifuncs (constant). 524f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const IFuncListType &getIFuncList() const { return IFuncList; } 525f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of ifuncs. 526f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot IFuncListType &getIFuncList() { return IFuncList; } 527f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 528f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static IFuncListType Module::*getSublistAccess(GlobalIFunc*) { 529f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return &Module::IFuncList; 530f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 531f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 532f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of named metadata (constant). 533f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const NamedMDListType &getNamedMDList() const { return NamedMDList; } 534f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's list of named metadata. 535f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDListType &getNamedMDList() { return NamedMDList; } 536f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 537f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot static NamedMDListType Module::*getSublistAccess(NamedMDNode*) { 538f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return &Module::NamedMDList; 539f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 540f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 541f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the symbol table of global variable and function identifiers 542f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; } 543f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's symbol table of global variable and function identifiers. 544f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ValueSymbolTable &getValueSymbolTable() { return *ValSymTab; } 545f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 546f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's symbol table for COMDATs (constant). 547f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const ComdatSymTabType &getComdatSymbolTable() const { return ComdatSymTab; } 548f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Get the Module's symbol table for COMDATs. 549f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ComdatSymTabType &getComdatSymbolTable() { return ComdatSymTab; } 550f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 551f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 552f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Global Variable Iteration 553f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 554f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 555f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_iterator global_begin() { return GlobalList.begin(); } 556f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_iterator global_begin() const { return GlobalList.begin(); } 557f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_iterator global_end () { return GlobalList.end(); } 558f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_iterator global_end () const { return GlobalList.end(); } 559f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool global_empty() const { return GlobalList.empty(); } 560f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 561f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<global_iterator> globals() { 562f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(global_begin(), global_end()); 563f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 564f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_global_iterator> globals() const { 565f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(global_begin(), global_end()); 566f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 567f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 568f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 569f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Function Iteration 570f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 571f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 572f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator begin() { return FunctionList.begin(); } 573f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_iterator begin() const { return FunctionList.begin(); } 574f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator end () { return FunctionList.end(); } 575f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_iterator end () const { return FunctionList.end(); } 576f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot reverse_iterator rbegin() { return FunctionList.rbegin(); } 577f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_reverse_iterator rbegin() const{ return FunctionList.rbegin(); } 578f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot reverse_iterator rend() { return FunctionList.rend(); } 579f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_reverse_iterator rend() const { return FunctionList.rend(); } 580f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t size() const { return FunctionList.size(); } 581f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool empty() const { return FunctionList.empty(); } 582f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 583f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<iterator> functions() { 584f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(begin(), end()); 585f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 586f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_iterator> functions() const { 587f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(begin(), end()); 588f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 589f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 590f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 591f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Alias Iteration 592f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 593f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 594f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot alias_iterator alias_begin() { return AliasList.begin(); } 595f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_alias_iterator alias_begin() const { return AliasList.begin(); } 596f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot alias_iterator alias_end () { return AliasList.end(); } 597f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_alias_iterator alias_end () const { return AliasList.end(); } 598f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t alias_size () const { return AliasList.size(); } 599f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool alias_empty() const { return AliasList.empty(); } 600f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 601f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<alias_iterator> aliases() { 602f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(alias_begin(), alias_end()); 603f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 604f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_alias_iterator> aliases() const { 605f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(alias_begin(), alias_end()); 606f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 607f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 608f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 609f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name IFunc Iteration 610f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 611f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 612f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ifunc_iterator ifunc_begin() { return IFuncList.begin(); } 613f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_ifunc_iterator ifunc_begin() const { return IFuncList.begin(); } 614f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ifunc_iterator ifunc_end () { return IFuncList.end(); } 615f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_ifunc_iterator ifunc_end () const { return IFuncList.end(); } 616f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t ifunc_size () const { return IFuncList.size(); } 617f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool ifunc_empty() const { return IFuncList.empty(); } 618f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 619f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<ifunc_iterator> ifuncs() { 620f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(ifunc_begin(), ifunc_end()); 621f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 622f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_ifunc_iterator> ifuncs() const { 623f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(ifunc_begin(), ifunc_end()); 624f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 625f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 626f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 627f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @name Convenience iterators 628f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 629f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 630f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using global_object_iterator = 631f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot concat_iterator<GlobalObject, iterator, global_iterator>; 632f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_global_object_iterator = 633f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot concat_iterator<const GlobalObject, const_iterator, 634f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_iterator>; 635f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 636f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<global_object_iterator> global_objects() { 637f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return concat<GlobalObject>(functions(), globals()); 638f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 639f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_global_object_iterator> global_objects() const { 640f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return concat<const GlobalObject>(functions(), globals()); 641f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 642f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 643f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_object_iterator global_object_begin() { 644f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return global_objects().begin(); 645f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 646f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_object_iterator global_object_end() { return global_objects().end(); } 647f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 648f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_object_iterator global_object_begin() const { 649f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return global_objects().begin(); 650f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 651f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_object_iterator global_object_end() const { 652f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return global_objects().end(); 653f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 654f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 655f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using global_value_iterator = 656f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot concat_iterator<GlobalValue, iterator, global_iterator, alias_iterator, 657f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ifunc_iterator>; 658f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot using const_global_value_iterator = 659f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot concat_iterator<const GlobalValue, const_iterator, const_global_iterator, 660f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_alias_iterator, const_ifunc_iterator>; 661f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 662f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<global_value_iterator> global_values() { 663f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return concat<GlobalValue>(functions(), globals(), aliases(), ifuncs()); 664f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 665f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_global_value_iterator> global_values() const { 666f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return concat<const GlobalValue>(functions(), globals(), aliases(), 667f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ifuncs()); 668f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 669f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 670f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_value_iterator global_value_begin() { return global_values().begin(); } 671f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot global_value_iterator global_value_end() { return global_values().end(); } 672f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 673f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_value_iterator global_value_begin() const { 674f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return global_values().begin(); 675f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 676f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_global_value_iterator global_value_end() const { 677f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return global_values().end(); 678f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 679f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 680f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 681f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @name Named Metadata Iteration 682f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 683f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 684f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot named_metadata_iterator named_metadata_begin() { return NamedMDList.begin(); } 685f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_named_metadata_iterator named_metadata_begin() const { 686f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return NamedMDList.begin(); 687f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 688f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 689f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot named_metadata_iterator named_metadata_end() { return NamedMDList.end(); } 690f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot const_named_metadata_iterator named_metadata_end() const { 691f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return NamedMDList.end(); 692f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 693f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 694f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot size_t named_metadata_size() const { return NamedMDList.size(); } 695f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool named_metadata_empty() const { return NamedMDList.empty(); } 696f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 697f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<named_metadata_iterator> named_metadata() { 698f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(named_metadata_begin(), named_metadata_end()); 699f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 700f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<const_named_metadata_iterator> named_metadata() const { 701f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range(named_metadata_begin(), named_metadata_end()); 702f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 703f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 704f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// An iterator for DICompileUnits that skips those marked NoDebug. 705f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot class debug_compile_units_iterator 706f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : public std::iterator<std::input_iterator_tag, DICompileUnit *> { 707f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot NamedMDNode *CUs; 708f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Idx; 709f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 710f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void SkipNoDebugCUs(); 711f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 712f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot public: 713f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit debug_compile_units_iterator(NamedMDNode *CUs, unsigned Idx) 714f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : CUs(CUs), Idx(Idx) { 715f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SkipNoDebugCUs(); 716f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 717f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 718f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator &operator++() { 719f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ++Idx; 720f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SkipNoDebugCUs(); 721f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return *this; 722f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 723f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 724f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator operator++(int) { 725f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator T(*this); 726f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ++Idx; 727f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return T; 728f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 729f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 730f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool operator==(const debug_compile_units_iterator &I) const { 731f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Idx == I.Idx; 732f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 733f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 734f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool operator!=(const debug_compile_units_iterator &I) const { 735f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Idx != I.Idx; 736f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 737f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 738f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DICompileUnit *operator*() const; 739f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot DICompileUnit *operator->() const; 740f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot }; 741f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 742f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator debug_compile_units_begin() const { 743f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto *CUs = getNamedMetadata("llvm.dbg.cu"); 744f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return debug_compile_units_iterator(CUs, 0); 745f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 746f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 747f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator debug_compile_units_end() const { 748f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto *CUs = getNamedMetadata("llvm.dbg.cu"); 749f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0); 750f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 751f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 752f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Return an iterator for all DICompileUnits listed in this Module's 753f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// llvm.dbg.cu named metadata node and aren't explicitly marked as 754f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// NoDebug. 755f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot iterator_range<debug_compile_units_iterator> debug_compile_units() const { 756f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot auto *CUs = getNamedMetadata("llvm.dbg.cu"); 757f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return make_range( 758f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator(CUs, 0), 759f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot debug_compile_units_iterator(CUs, CUs ? CUs->getNumOperands() : 0)); 760f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 761f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 762f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 763f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Destroy ConstantArrays in LLVMContext if they are not used. 764f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// ConstantArrays constructed during linking can cause quadratic memory 765f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// explosion. Releasing all unused constants can cause a 20% LTO compile-time 766f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// slowdown for a large application. 767f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 768f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// NOTE: Constants are currently owned by LLVMContext. This can then only 769f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// be called where all uses of the LLVMContext are understood. 770f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void dropTriviallyDeadConstantArrays(); 771f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 772f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Utility functions for printing and dumping Module objects 773f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 774f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 775f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Print the module to an output stream with an optional 776f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// AssemblyAnnotationWriter. If \c ShouldPreserveUseListOrder, then include 777f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// uselistorder directives so that use-lists can be recreated when reading 778f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// the assembly. 779f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, 780f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool ShouldPreserveUseListOrder = false, 781f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool IsForDebug = false) const; 782f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 783f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Dump the module to stderr (for debugging). 784f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void dump() const; 785f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 786f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// This function causes all the subinstructions to "let go" of all references 787f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// that they are maintaining. This allows one to 'delete' a whole class at 788f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// a time, even though there may be circular references... first all 789f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// references are dropped, and all use counts go to zero. Then everything 790f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// is delete'd for real. Note that no operations are valid on an object 791f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// that has "dropped all references", except operator delete. 792f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void dropAllReferences(); 793f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 794f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 795f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Utility functions for querying Debug information. 796f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 797f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 798f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns the Number of Register ParametersDwarf Version by checking 799f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// module flags. 800f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getNumberRegisterParameters() const; 801f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 802f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns the Dwarf Version by checking module flags. 803f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getDwarfVersion() const; 804f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 805f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns the CodeView Version by checking module flags. 806f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Returns zero if not present in module. 807f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getCodeViewFlag() const; 808f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 809f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 810f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Utility functions for querying and setting PIC level 811f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 812f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 813f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns the PIC level (small or large model) 814f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PICLevel::Level getPICLevel() const; 815f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 816f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Set the PIC level (small or large model) 817f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setPICLevel(PICLevel::Level PL); 818f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 819f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 820f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 821f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @name Utility functions for querying and setting PIE level 822f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @{ 823f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 824f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns the PIE level (small or large model) 825f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PIELevel::Level getPIELevel() const; 826f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 827f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Set the PIE level (small or large model) 828f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setPIELevel(PIELevel::Level PL); 829f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// @} 830f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 831f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @name Utility functions for querying and setting PGO summary 832f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @{ 833f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 834f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Attach profile summary metadata to this module. 835f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setProfileSummary(Metadata *M); 836f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 837f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Returns profile summary metadata 838f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Metadata *getProfileSummary(); 839f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// @} 840f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 841f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// Take ownership of the given memory buffer. 842f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void setOwnedMemoryBuffer(std::unique_ptr<MemoryBuffer> MB); 843f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 844f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 845f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Given "llvm.used" or "llvm.compiler.used" as a global name, collect 846f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the initializer elements of that global in Set and return the global itself. 847f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotGlobalVariable *collectUsedGlobalVariables(const Module &M, 848f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SmallPtrSetImpl<GlobalValue *> &Set, 849f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool CompilerUsed); 850f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 851f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// An raw_ostream inserter for modules. 852f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline raw_ostream &operator<<(raw_ostream &O, const Module &M) { 853f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot M.print(O, nullptr); 854f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return O; 855f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 856f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 857f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// Create wrappers for C Binding types (see CBindingWrapping.h). 858f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotDEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef) 859f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 860f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/* LLVMModuleProviderRef exists for historical reasons, but now just holds a 861f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot * Module. 862f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot */ 863f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotinline Module *unwrap(LLVMModuleProviderRef MP) { 864f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return reinterpret_cast<Module*>(MP); 865f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 866f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 867f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace llvm 868f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 869f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLVM_IR_MODULE_H 870