aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Module.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR/Module.cpp')
-rw-r--r--llvm/lib/IR/Module.cpp50
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;
}