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