diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 1b02d11ff4e7b..56b71f826c06e 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -1744,6 +1744,22 @@ void Verifier::visitModuleFlags() { continue; } } + + // Validate only one of the flags set with none zero value. + auto isModuleAttributeSet = [&](const StringRef &ModAttr) -> bool { + const auto *Attr = + mdconst::extract_or_null(M.getModuleFlag(ModAttr)); + return Attr && Attr->getZExtValue(); + }; + const std::pair ConflictingFlags[] = { + {"sign-return-address", "sign-return-address-all"}}; + + for (auto FlagPair : ConflictingFlags) { + if (isModuleAttributeSet(FlagPair.first) && + isModuleAttributeSet(FlagPair.second)) + CheckFailed("invalid pair of flags set as " + FlagPair.first + " and " + + FlagPair.second); + } } void diff --git a/llvm/test/Verifier/module-flags-1.ll b/llvm/test/Verifier/module-flags-1.ll index 3dfc2a31462ef..ba6f81fc4172d 100644 --- a/llvm/test/Verifier/module-flags-1.ll +++ b/llvm/test/Verifier/module-flags-1.ll @@ -62,6 +62,10 @@ !14 = !{i32 1, !"flag-1", i32 55} !15 = !{i32 3, !"bar", !{!"flag-1", i32 55}} +!22 = !{i32 8, !"sign-return-address", i32 1} +!23 = !{i32 8, !"sign-return-address-all", i32 1} +; CHECK-NOT: invalid set of flags set as sign-return-address and sign-return-address-all + !llvm.module.flags = !{ !0, !1, !2, !3, !4, !5, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, - !16, !17, !18, !19, !20, !21 } + !16, !17, !18, !19, !20, !21, !22, !23 }