Add a module flags accessor method which returns the flags in a vector.

llvm-svn: 150623
This commit is contained in:
Bill Wendling 2012-02-15 22:34:20 +00:00
parent 5986c3e90a
commit 0294932a43
2 changed files with 26 additions and 0 deletions

View 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.

View 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.