[llvm] [llvm][ARM][AArch64] Add conflicting module flag check to the verifier. (PR #83635)

via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 1 15:48:12 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Dani (DanielKristofKiss)

<details>
<summary>Changes</summary>

Some flags shall not be set at the same time.

---
Full diff: https://github.com/llvm/llvm-project/pull/83635.diff


2 Files Affected:

- (modified) llvm/lib/IR/Verifier.cpp (+16) 
- (modified) llvm/test/Verifier/module-flags-1.ll (+5-1) 


``````````diff
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 1b02d11ff4e7b3..56b71f826c06eb 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<ConstantInt>(M.getModuleFlag(ModAttr));
+    return Attr && Attr->getZExtValue();
+  };
+  const std::pair<StringRef, StringRef> 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 3dfc2a31462ef5..ba6f81fc4172de 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 }

``````````

</details>


https://github.com/llvm/llvm-project/pull/83635


More information about the llvm-commits mailing list