#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
#include "llvm/GlobalAlias.h"
-#include "llvm/Support/DataTypes.h"
+#include "llvm/Metadata.h"
+#include "llvm/System/DataTypes.h"
#include <vector>
namespace llvm {
class GlobalValueRefMap; // Used by ConstantVals.cpp
class FunctionType;
+class LLVMContext;
template<> struct ilist_traits<Function>
: public SymbolTableListTraits<Function, Module> {
- // createSentinel is used to create a node that marks the end of the list.
- static Function *createSentinel();
- static void destroySentinel(Function *F) { delete F; }
- static iplist<Function> &getList(Module *M);
- static inline ValueSymbolTable *getSymTab(Module *M);
- static int getListOffset();
+
+ // createSentinel is used to get hold of the node that marks the end of the
+ // list... (same trick used here as in ilist_traits<Instruction>)
+ Function *createSentinel() const {
+ return static_cast<Function*>(&Sentinel);
+ }
+ static void destroySentinel(Function*) {}
+
+ Function *provideInitialHead() const { return createSentinel(); }
+ Function *ensureHead(Function*) const { return createSentinel(); }
+ static void noteHead(Function*, Function*) {}
+
+private:
+ mutable ilist_node<Function> Sentinel;
};
template<> struct ilist_traits<GlobalVariable>
: public SymbolTableListTraits<GlobalVariable, Module> {
// createSentinel is used to create a node that marks the end of the list.
static GlobalVariable *createSentinel();
static void destroySentinel(GlobalVariable *GV) { delete GV; }
- static iplist<GlobalVariable> &getList(Module *M);
- static inline ValueSymbolTable *getSymTab(Module *M);
- static int getListOffset();
};
template<> struct ilist_traits<GlobalAlias>
: public SymbolTableListTraits<GlobalAlias, Module> {
// createSentinel is used to create a node that marks the end of the list.
static GlobalAlias *createSentinel();
static void destroySentinel(GlobalAlias *GA) { delete GA; }
- static iplist<GlobalAlias> &getList(Module *M);
- static inline ValueSymbolTable *getSymTab(Module *M);
- static int getListOffset();
+};
+template<> struct ilist_traits<NamedMDNode>
+ : public SymbolTableListTraits<NamedMDNode, Module> {
+ // createSentinel is used to get hold of a node that marks the end of
+ // the list...
+ NamedMDNode *createSentinel() const {
+ return static_cast<NamedMDNode*>(&Sentinel);
+ }
+ static void destroySentinel(NamedMDNode*) {}
+
+ NamedMDNode *provideInitialHead() const { return createSentinel(); }
+ NamedMDNode *ensureHead(NamedMDNode*) const { return createSentinel(); }
+ static void noteHead(NamedMDNode*, NamedMDNode*) {}
+private:
+ mutable ilist_node<NamedMDNode> Sentinel;
};
/// A Module instance is used to store all the information related to an
typedef iplist<Function> FunctionListType;
/// The type for the list of aliases.
typedef iplist<GlobalAlias> AliasListType;
+ /// The type for the list of named metadata.
+ typedef iplist<NamedMDNode> NamedMDListType;
/// The type for the list of dependent libraries.
typedef std::vector<std::string> LibraryListType;
/// The Global Variable iterator.
- typedef GlobalListType::iterator global_iterator;
+ typedef GlobalListType::iterator global_iterator;
/// The Global Variable constant iterator.
- typedef GlobalListType::const_iterator const_global_iterator;
+ typedef GlobalListType::const_iterator const_global_iterator;
/// The Function iterators.
- typedef FunctionListType::iterator iterator;
+ typedef FunctionListType::iterator iterator;
/// The Function constant iterator
- typedef FunctionListType::const_iterator const_iterator;
+ typedef FunctionListType::const_iterator const_iterator;
/// The Global Alias iterators.
- typedef AliasListType::iterator alias_iterator;
+ typedef AliasListType::iterator alias_iterator;
/// The Global Alias constant iterator
- typedef AliasListType::const_iterator const_alias_iterator;
+ typedef AliasListType::const_iterator const_alias_iterator;
+ /// The named metadata iterators.
+ typedef NamedMDListType::iterator named_metadata_iterator;
+ /// The named metadata constant interators.
+ typedef NamedMDListType::const_iterator const_named_metadata_iterator;
/// The Library list iterator.
typedef LibraryListType::const_iterator lib_iterator;
/// @name Member Variables
/// @{
private:
+ LLVMContext& Context; ///< The LLVMContext from which types and
+ ///< constants are allocated.
GlobalListType GlobalList; ///< The Global Variables in the module
FunctionListType FunctionList; ///< The Functions in the module
AliasListType AliasList; ///< The Aliases in the module
LibraryListType LibraryList; ///< The Libraries needed by the module
+ NamedMDListType NamedMDList; ///< The named metadata in the module
std::string GlobalScopeAsm; ///< Inline Asm at global scope.
ValueSymbolTable *ValSymTab; ///< Symbol table for values
TypeSymbolTable *TypeSymTab; ///< Symbol table for types
public:
/// The Module constructor. Note that there is no default constructor. You
/// must provide a name for the module upon construction.
- explicit Module(const std::string &ModuleID);
+ explicit Module(const StringRef &ModuleID, LLVMContext& C);
/// The module destructor. This will dropAllReferences.
~Module();
/// Get the data layout string for the module's target platform. This encodes
/// the type sizes and alignments expected by this module.
/// @returns the data layout as a string
- const std::string& getDataLayout() const { return DataLayout; }
+ const std::string &getDataLayout() const { return DataLayout; }
/// Get the target triple which is a string describing the target host.
/// @returns a string containing the target triple.
/// @returns PointerSize - an enumeration for the size of the target's pointer
PointerSize getPointerSize() const;
+ /// Get the global data context.
+ /// @returns LLVMContext - a container for LLVM's global information
+ LLVMContext& getContext() const { return Context; }
+
/// Get any module-scope inline assembly blocks.
/// @returns a string containing the module-scope inline assembly blocks.
const std::string &getModuleInlineAsm() const { return GlobalScopeAsm; }
public:
/// Set the module identifier.
- void setModuleIdentifier(const std::string &ID) { ModuleID = ID; }
+ void setModuleIdentifier(const StringRef &ID) { ModuleID = ID; }
/// Set the data layout
- void setDataLayout(const std::string& DL) { DataLayout = DL; }
+ void setDataLayout(const StringRef &DL) { DataLayout = DL; }
/// Set the target triple.
- void setTargetTriple(const std::string &T) { TargetTriple = T; }
+ void setTargetTriple(const StringRef &T) { TargetTriple = T; }
/// Set the module-scope inline assembly blocks.
- void setModuleInlineAsm(const std::string &Asm) { GlobalScopeAsm = Asm; }
+ void setModuleInlineAsm(const StringRef &Asm) { GlobalScopeAsm = Asm; }
/// Append to the module-scope inline assembly blocks, automatically
/// appending a newline to the end.
- void appendModuleInlineAsm(const std::string &Asm) {
+ void appendModuleInlineAsm(const StringRef &Asm) {
GlobalScopeAsm += Asm;
GlobalScopeAsm += '\n';
}
/// getNamedValue - Return the first global value in the module with
/// the specified name, of arbitrary type. This method returns null
/// if a global with the specified name is not found.
- GlobalValue *getNamedValue(const std::string &Name) const;
- GlobalValue *getNamedValue(const char *Name) const;
+ GlobalValue *getNamedValue(const StringRef &Name) const;
/// @}
/// @name Function Accessors
/// the existing function.
/// 4. Finally, the function exists but has the wrong prototype: return the
/// function with a constantexpr cast to the right prototype.
- Constant *getOrInsertFunction(const std::string &Name, const FunctionType *T,
+ Constant *getOrInsertFunction(const StringRef &Name, const FunctionType *T,
AttrListPtr AttributeList);
- Constant *getOrInsertFunction(const std::string &Name, const FunctionType *T);
+ Constant *getOrInsertFunction(const StringRef &Name, const FunctionType *T);
/// getOrInsertFunction - Look up the specified function in the module symbol
/// table. If it does not exist, add a prototype for the function and return
/// named function has a different type. This version of the method takes a
/// null terminated list of function arguments, which makes it easier for
/// clients to use.
- Constant *getOrInsertFunction(const std::string &Name,
+ Constant *getOrInsertFunction(const StringRef &Name,
AttrListPtr AttributeList,
const Type *RetTy, ...) END_WITH_NULL;
- Constant *getOrInsertFunction(const std::string &Name, const Type *RetTy, ...)
+ Constant *getOrInsertFunction(const StringRef &Name, const Type *RetTy, ...)
END_WITH_NULL;
- Constant *getOrInsertTargetIntrinsic(const std::string &Name,
+ Constant *getOrInsertTargetIntrinsic(const StringRef &Name,
const FunctionType *Ty,
AttrListPtr AttributeList);
/// getFunction - Look up the specified function in the module symbol table.
/// If it does not exist, return null.
- Function *getFunction(const std::string &Name) const;
- Function *getFunction(const char *Name) const;
+ Function *getFunction(const StringRef &Name) const;
/// @}
/// @name Global Variable Accessors
/// symbol table. If it does not exist, return null. If AllowInternal is set
/// to true, this function will return types that have InternalLinkage. By
/// default, these types are not returned.
- GlobalVariable *getGlobalVariable(const std::string &Name,
+ GlobalVariable *getGlobalVariable(const StringRef &Name,
bool AllowInternal = false) const;
/// getNamedGlobal - Return the first global variable in the module with the
/// specified name, of arbitrary type. This method returns null if a global
/// with the specified name is not found.
- GlobalVariable *getNamedGlobal(const std::string &Name) const {
+ GlobalVariable *getNamedGlobal(const StringRef &Name) const {
return getGlobalVariable(Name, true);
}
/// with a constantexpr cast to the right type.
/// 3. Finally, if the existing global is the correct delclaration, return
/// the existing global.
- Constant *getOrInsertGlobal(const std::string &Name, const Type *Ty);
+ Constant *getOrInsertGlobal(const StringRef &Name, const Type *Ty);
/// @}
/// @name Global Alias Accessors
/// getNamedAlias - Return the first global alias in the module with the
/// specified name, of arbitrary type. This method returns null if a global
/// with the specified name is not found.
- GlobalAlias *getNamedAlias(const std::string &Name) const;
+ GlobalAlias *getNamedAlias(const StringRef &Name) const;
+
+/// @}
+/// @name Named Metadata Accessors
+/// @{
+public:
+ /// getNamedMetadata - Return the first NamedMDNode in the module with the
+ /// specified name. This method returns null if a NamedMDNode with the
+ /// specified name is not found.
+ NamedMDNode *getNamedMetadata(const StringRef &Name) const;
+
+ /// getOrInsertNamedMetadata - Return the first named MDNode in the module
+ /// with the specified name. This method returns a new NamedMDNode if a
+ /// NamedMDNode with the specified name is not found.
+ NamedMDNode *getOrInsertNamedMetadata(const StringRef &Name);
/// @}
/// @name Type Accessors
/// addTypeName - Insert an entry in the symbol table mapping Str to Type. If
/// there is already an entry for this name, true is returned and the symbol
/// table is not modified.
- bool addTypeName(const std::string &Name, const Type *Ty);
+ bool addTypeName(const StringRef &Name, const Type *Ty);
/// getTypeName - If there is at least one entry in the symbol table for the
/// specified type, return it.
/// getTypeByName - Return the type with the specified name in this module, or
/// null if there is none by that name.
- const Type *getTypeByName(const std::string &Name) const;
+ const Type *getTypeByName(const StringRef &Name) const;
/// @}
/// @name Direct access to the globals list, functions list, and symbol table
const GlobalListType &getGlobalList() const { return GlobalList; }
/// Get the Module's list of global variables.
GlobalListType &getGlobalList() { return GlobalList; }
+ static iplist<GlobalVariable> Module::*getSublistAccess(GlobalVariable*) {
+ return &Module::GlobalList;
+ }
/// Get the Module's list of functions (constant).
const FunctionListType &getFunctionList() const { return FunctionList; }
/// Get the Module's list of functions.
FunctionListType &getFunctionList() { return FunctionList; }
+ static iplist<Function> Module::*getSublistAccess(Function*) {
+ return &Module::FunctionList;
+ }
/// Get the Module's list of aliases (constant).
const AliasListType &getAliasList() const { return AliasList; }
/// Get the Module's list of aliases.
AliasListType &getAliasList() { return AliasList; }
+ static iplist<GlobalAlias> Module::*getSublistAccess(GlobalAlias*) {
+ return &Module::AliasList;
+ }
+ /// Get the Module's list of named metadata (constant).
+ const NamedMDListType &getNamedMDList() const { return NamedMDList; }
+ /// Get the Module's list of named metadata.
+ NamedMDListType &getNamedMDList() { return NamedMDList; }
+ static iplist<NamedMDNode> Module::*getSublistAccess(NamedMDNode *) {
+ return &Module::NamedMDList;
+ }
/// Get the symbol table of global variable and function identifiers
const ValueSymbolTable &getValueSymbolTable() const { return *ValSymTab; }
/// Get the Module's symbol table of global variable and function identifiers.
/// @brief Returns the number of items in the list of libraries.
inline size_t lib_size() const { return LibraryList.size(); }
/// @brief Add a library to the list of dependent libraries
- void addLibrary(const std::string& Lib);
+ void addLibrary(const StringRef &Lib);
/// @brief Remove a library from the list of dependent libraries
- void removeLibrary(const std::string& Lib);
+ void removeLibrary(const StringRef &Lib);
/// @brief Get all the libraries
inline const LibraryListType& getLibraries() const { return LibraryList; }
alias_iterator alias_end () { return AliasList.end(); }
/// Get a constant iterator to the last alias.
const_alias_iterator alias_end () const { return AliasList.end(); }
- /// Determine how many functions are in the Module's list of aliases.
+ /// Determine how many aliases are in the Module's list of aliases.
size_t alias_size () const { return AliasList.size(); }
/// Determine if the list of aliases is empty.
bool alias_empty() const { return AliasList.empty(); }
+
+/// @}
+/// @name Named Metadata Iteration
+/// @{
+public:
+ /// Get an iterator to the first named metadata.
+ named_metadata_iterator named_metadata_begin()
+ { return NamedMDList.begin(); }
+ /// Get a constant iterator to the first named metadata.
+ const_named_metadata_iterator named_metadata_begin() const
+ { return NamedMDList.begin(); }
+ /// Get an iterator to the last named metadata.
+ named_metadata_iterator named_metadata_end ()
+ { return NamedMDList.end(); }
+ /// Get a constant iterator to the last named metadata.
+ const_named_metadata_iterator named_metadata_end () const
+ { return NamedMDList.end(); }
+ /// Determine how many NamedMDNodes are in the Module's list of named metadata.
+ size_t named_metadata_size () const
+ { return NamedMDList.size(); }
+ /// Determine if the list of named metadata is empty.
+ bool named_metadata_empty() const
+ { return NamedMDList.empty(); }
+
+
/// @}
/// @name Utility functions for printing and dumping Module objects
/// @{
public:
/// Print the module to an output stream with AssemblyAnnotationWriter.
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW) const;
- void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;
/// Dump the module to stderr (for debugging).
void dump() const;
/// that has "dropped all references", except operator delete.
void dropAllReferences();
/// @}
-
- static unsigned getFunctionListOffset() {
- Module *Obj = 0;
- return unsigned(reinterpret_cast<uintptr_t>(&Obj->FunctionList));
- }
- static unsigned getGlobalVariableListOffset() {
- Module *Obj = 0;
- return unsigned(reinterpret_cast<uintptr_t>(&Obj->GlobalList));
- }
- static unsigned getAliasListOffset() {
- Module *Obj = 0;
- return unsigned(reinterpret_cast<uintptr_t>(&Obj->AliasList));
- }
};
-/// An iostream inserter for modules.
-inline std::ostream &operator<<(std::ostream &O, const Module &M) {
- M.print(O, 0);
- return O;
-}
+/// An raw_ostream inserter for modules.
inline raw_ostream &operator<<(raw_ostream &O, const Module &M) {
M.print(O, 0);
return O;
}
-
-
-inline ValueSymbolTable *
-ilist_traits<Function>::getSymTab(Module *M) {
- return M ? &M->getValueSymbolTable() : 0;
-}
-
-inline ValueSymbolTable *
-ilist_traits<GlobalVariable>::getSymTab(Module *M) {
- return M ? &M->getValueSymbolTable() : 0;
-}
-
-inline ValueSymbolTable *
-ilist_traits<GlobalAlias>::getSymTab(Module *M) {
- return M ? &M->getValueSymbolTable() : 0;
-}
-
-inline int
-ilist_traits<Function>::getListOffset() {
- return Module::getFunctionListOffset();
-}
-
-inline int
-ilist_traits<GlobalVariable>::getListOffset() {
- return Module::getGlobalVariableListOffset();
-}
-
-inline int
-ilist_traits<GlobalAlias>::getListOffset() {
- return Module::getAliasListOffset();
-}
} // End llvm namespace