diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 6135e15fd030f7..d2b2fe40b1adad 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -548,6 +548,8 @@ class LLVM_EXTERNAL_VISIBILITY Module { void addModuleFlag(MDNode *Node); /// Like addModuleFlag but replaces the old module flag if it already exists. void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Metadata *Val); + void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, Constant *Val); + void setModuleFlag(ModFlagBehavior Behavior, StringRef Key, uint32_t Val); /// @} /// @name Materialization diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index a8696ed9e3ce5d..25231f54313b33 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -397,6 +397,15 @@ void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key, } addModuleFlag(Behavior, Key, Val); } +void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key, + Constant *Val) { + setModuleFlag(Behavior, Key, ConstantAsMetadata::get(Val)); +} +void Module::setModuleFlag(ModFlagBehavior Behavior, StringRef Key, + uint32_t Val) { + Type *Int32Ty = Type::getInt32Ty(Context); + setModuleFlag(Behavior, Key, ConstantInt::get(Int32Ty, Val)); +} void Module::setDataLayout(StringRef Desc) { DL.reset(Desc); diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp index da684b85a4dfb5..c18301d5e6d758 100644 --- a/llvm/unittests/IR/ModuleTest.cpp +++ b/llvm/unittests/IR/ModuleTest.cpp @@ -8,6 +8,7 @@ #include "llvm/IR/Module.h" #include "llvm/AsmParser/Parser.h" +#include "llvm/IR/Constants.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/ModuleSummaryIndex.h" #include "llvm/Pass.h" @@ -86,6 +87,21 @@ TEST(ModuleTest, setModuleFlag) { EXPECT_EQ(Val2, M.getModuleFlag(Key)); } +TEST(ModuleTest, setModuleFlagInt) { + LLVMContext Context; + Module M("M", Context); + StringRef Key = "Key"; + uint32_t Val1 = 1; + uint32_t Val2 = 2; + EXPECT_EQ(nullptr, M.getModuleFlag(Key)); + M.setModuleFlag(Module::ModFlagBehavior::Error, Key, Val1); + auto A1 = mdconst::extract_or_null(M.getModuleFlag(Key)); + EXPECT_EQ(Val1, A1->getZExtValue()); + M.setModuleFlag(Module::ModFlagBehavior::Error, Key, Val2); + auto A2 = mdconst::extract_or_null(M.getModuleFlag(Key)); + EXPECT_EQ(Val2, A2->getZExtValue()); +} + const char *IRString = R"IR( !llvm.module.flags = !{!0}