diff options
Diffstat (limited to 'llvm/lib/IR/Module.cpp')
-rw-r--r-- | llvm/lib/IR/Module.cpp | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index c966c53..80b5408 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -259,10 +259,8 @@ GlobalIFunc *Module::getNamedIFunc(StringRef Name) const { /// 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 *Module::getNamedMetadata(const Twine &Name) const { - SmallString<256> NameData; - StringRef NameRef = Name.toStringRef(NameData); - return NamedMDSymTab.lookup(NameRef); +NamedMDNode *Module::getNamedMetadata(StringRef Name) const { + return NamedMDSymTab.lookup(Name); } /// getOrInsertNamedMetadata - Return the first named MDNode in the module @@ -296,20 +294,6 @@ bool Module::isValidModFlagBehavior(Metadata *MD, ModFlagBehavior &MFB) { return false; } -bool Module::isValidModuleFlag(const MDNode &ModFlag, ModFlagBehavior &MFB, - MDString *&Key, Metadata *&Val) { - if (ModFlag.getNumOperands() < 3) - return false; - if (!isValidModFlagBehavior(ModFlag.getOperand(0), MFB)) - return false; - MDString *K = dyn_cast_or_null<MDString>(ModFlag.getOperand(1)); - if (!K) - return false; - Key = K; - Val = ModFlag.getOperand(2); - return true; -} - /// getModuleFlagsMetadata - Returns the module flags in the provided vector. void Module:: getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const { @@ -317,25 +301,24 @@ getModuleFlagsMetadata(SmallVectorImpl<ModuleFlagEntry> &Flags) const { if (!ModFlags) return; for (const MDNode *Flag : ModFlags->operands()) { - ModFlagBehavior MFB; - MDString *Key = nullptr; - Metadata *Val = nullptr; - if (isValidModuleFlag(*Flag, MFB, Key, Val)) { - // Check the operands of the MDNode before accessing the operands. - // The verifier will actually catch these failures. - Flags.push_back(ModuleFlagEntry(MFB, Key, Val)); - } + // The verifier will catch errors, so no need to check them here. + auto *MFBConstant = mdconst::extract<ConstantInt>(Flag->getOperand(0)); + auto MFB = static_cast<ModFlagBehavior>(MFBConstant->getLimitedValue()); + MDString *Key = cast<MDString>(Flag->getOperand(1)); + Metadata *Val = Flag->getOperand(2); + Flags.push_back(ModuleFlagEntry(MFB, Key, Val)); } } /// Return the corresponding value if Key appears in module flags, otherwise /// return null. Metadata *Module::getModuleFlag(StringRef Key) const { - SmallVector<Module::ModuleFlagEntry, 8> ModuleFlags; - getModuleFlagsMetadata(ModuleFlags); - for (const ModuleFlagEntry &MFE : ModuleFlags) { - if (Key == MFE.Key->getString()) - return MFE.Val; + const NamedMDNode *ModFlags = getModuleFlagsMetadata(); + if (!ModFlags) + return nullptr; + for (const MDNode *Flag : ModFlags->operands()) { + if (Key == cast<MDString>(Flag->getOperand(1))->getString()) + return Flag->getOperand(2); } return nullptr; } @@ -388,10 +371,7 @@ void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key, NamedMDNode *ModFlags = getOrInsertModuleFlagsMetadata(); // Replace the flag if it already exists. for (MDNode *Flag : ModFlags->operands()) { - ModFlagBehavior MFB; - MDString *K = nullptr; - Metadata *V = nullptr; - if (isValidModuleFlag(*Flag, MFB, K, V) && K->getString() == Key) { + if (cast<MDString>(Flag->getOperand(1))->getString() == Key) { Flag->replaceOperandWith(2, Val); return; } |