aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-07-29 17:16:17 +0000
committerDevang Patel <dpatel@apple.com>2009-07-29 17:16:17 +0000
commit28bc9d88260a3e153ead4311c9129e3d3ad07736 (patch)
tree9766b258ed5ad960f24c6ad1ac54b93f6cff9fb1 /include
parent4baffeb6be3a224f7adadbee17512ded22610fd0 (diff)
downloadexternal_llvm-28bc9d88260a3e153ead4311c9129e3d3ad07736.zip
external_llvm-28bc9d88260a3e153ead4311c9129e3d3ad07736.tar.gz
external_llvm-28bc9d88260a3e153ead4311c9129e3d3ad07736.tar.bz2
Keep track of named mdnodes in a Module using an ilist.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77476 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/llvm/Metadata.h9
-rw-r--r--include/llvm/Module.h76
-rw-r--r--include/llvm/ValueSymbolTable.h2
3 files changed, 80 insertions, 7 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index f341475..54af723 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -18,8 +18,10 @@
#include "llvm/Value.h"
#include "llvm/Type.h"
+#include "llvm/OperandTraits.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/ilist_node.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/ValueHandle.h"
@@ -173,7 +175,11 @@ public:
//===----------------------------------------------------------------------===//
/// NamedMDNode - a tuple of other metadata.
/// NamedMDNode is always named. All NamedMDNode element has a type of metadata.
-class NamedMDNode : public MetadataBase {
+template<typename ValueSubClass, typename ItemParentClass>
+ class SymbolTableListTraits;
+
+class NamedMDNode : public MetadataBase, public ilist_node<NamedMDNode> {
+ friend class SymbolTableListTraits<NamedMDNode, Module>;
NamedMDNode(const NamedMDNode &); // DO NOT IMPLEMENT
friend class LLVMContextImpl;
@@ -201,6 +207,7 @@ public:
/// getParent - Get the module that holds this named metadata collection.
inline Module *getParent() { return Parent; }
inline const Module *getParent() const { return Parent; }
+ void setParent(Module *M) { Parent = M; }
Value *getElement(unsigned i) const {
return Node[i];
diff --git a/include/llvm/Module.h b/include/llvm/Module.h
index 913f874..0f8722dc 100644
--- a/include/llvm/Module.h
+++ b/include/llvm/Module.h
@@ -18,6 +18,7 @@
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
#include "llvm/GlobalAlias.h"
+#include "llvm/Metadata.h"
#include "llvm/Support/DataTypes.h"
#include <vector>
@@ -56,6 +57,21 @@ template<> struct ilist_traits<GlobalAlias>
static GlobalAlias *createSentinel();
static void destroySentinel(GlobalAlias *GA) { delete GA; }
};
+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
/// LLVM module. Modules are the top level container of all other LLVM
@@ -78,25 +94,31 @@ public:
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;
@@ -116,6 +138,7 @@ private:
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
@@ -277,6 +300,15 @@ public:
GlobalAlias *getNamedAlias(const StringRef &Name) const;
/// @}
+/// @name Named Metadata Accessors
+/// @{
+public:
+ /// getNamedMetadata - Return the first named MDNode in the module with the
+ /// specified name. This method returns null if a MDNode with the specified
+ /// name is not found.
+ NamedMDNode *getNamedMetadata(const StringRef &Name) const;
+
+/// @}
/// @name Type Accessors
/// @{
public:
@@ -318,6 +350,13 @@ public:
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.
@@ -393,6 +432,31 @@ public:
/// 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
/// @{
diff --git a/include/llvm/ValueSymbolTable.h b/include/llvm/ValueSymbolTable.h
index c9dc82b..4f8ebe8 100644
--- a/include/llvm/ValueSymbolTable.h
+++ b/include/llvm/ValueSymbolTable.h
@@ -23,6 +23,7 @@ namespace llvm {
class SymbolTableListTraits;
class BasicBlock;
class Function;
+ class NamedMDNode;
class Module;
class StringRef;
@@ -38,6 +39,7 @@ class ValueSymbolTable {
friend class SymbolTableListTraits<Function, Module>;
friend class SymbolTableListTraits<GlobalVariable, Module>;
friend class SymbolTableListTraits<GlobalAlias, Module>;
+ friend class SymbolTableListTraits<NamedMDNode, Module>;
/// @name Types
/// @{
public: