OSDN Git Service

Add a module flags accessor method which returns the flags in a vector.
authorBill Wendling <isanbard@gmail.com>
Wed, 15 Feb 2012 22:34:20 +0000 (22:34 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 15 Feb 2012 22:34:20 +0000 (22:34 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150623 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Module.h
lib/VMCore/Module.cpp

index 0467988..e068f93 100644 (file)
@@ -179,6 +179,14 @@ public:
   ///                   values.
   enum ModAttrBehavior { Error = 1, Warning  = 2, Require = 3, Override = 4 };
 
+  struct ModuleFlagEntry {
+    unsigned Behavior;
+    MDString *Key;
+    Value *Val;
+    ModuleFlagEntry(unsigned B, MDString *K, Value *V)
+      : Behavior(B), Key(K), Val(V) {}
+  };
+
 /// @}
 /// @name Member Variables
 /// @{
@@ -401,6 +409,9 @@ public:
 /// @name Module Flags Accessors
 /// @{
 
+  /// getModuleFlagsMetadata - Returns the module flags in the provided vector.
+  void getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const;
+
   /// getModuleFlagsMetadata - Returns the NamedMDNode in the module that
   /// represents module-level flags. This method returns null if there are no
   /// module-level flags.
index 0946818..9de5db5 100644 (file)
@@ -328,6 +328,21 @@ void Module::eraseNamedMetadata(NamedMDNode *NMD) {
   NamedMDList.erase(NMD);
 }
 
+/// getModuleFlagsMetadata - Returns the module flags in the provided vector.
+void Module::
+getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const {
+  const NamedMDNode *ModFlags = getModuleFlagsMetadata();
+  if (!ModFlags) return;
+
+  for (unsigned i = 0, e = ModFlags->getNumOperands(); i != e; ++i) {
+    MDNode *Flag = ModFlags->getOperand(i);
+    ConstantInt *Behavior = cast<ConstantInt>(Flag->getOperand(0));
+    MDString *Key = cast<MDString>(Flag->getOperand(1));
+    Value *Val = Flag->getOperand(2);
+    Flags.push_back(ModuleFlagEntry(Behavior->getZExtValue(), Key, Val));
+  }
+}
+
 /// getModuleFlagsMetadata - Returns the NamedMDNode in the module that
 /// represents module-level flags. This method returns null if there are no
 /// module-level flags.