summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/Verifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r--llvm/lib/IR/Verifier.cpp27
1 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 33f358440a31..64c59914cf2f 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -1734,8 +1734,28 @@ void Verifier::visitModuleFlags() {
// Scan each flag, and track the flags and requirements.
DenseMap<const MDString*, const MDNode*> SeenIDs;
SmallVector<const MDNode*, 16> Requirements;
- for (const MDNode *MDN : Flags->operands())
+ uint64_t PAuthABIPlatform = -1;
+ uint64_t PAuthABIVersion = -1;
+ for (const MDNode *MDN : Flags->operands()) {
visitModuleFlag(MDN, SeenIDs, Requirements);
+ if (MDN->getNumOperands() != 3)
+ continue;
+ if (const auto *FlagName = dyn_cast_or_null<MDString>(MDN->getOperand(1))) {
+ if (FlagName->getString() == "aarch64-elf-pauthabi-platform") {
+ if (const auto *PAP =
+ mdconst::dyn_extract_or_null<ConstantInt>(MDN->getOperand(2)))
+ PAuthABIPlatform = PAP->getZExtValue();
+ } else if (FlagName->getString() == "aarch64-elf-pauthabi-version") {
+ if (const auto *PAV =
+ mdconst::dyn_extract_or_null<ConstantInt>(MDN->getOperand(2)))
+ PAuthABIVersion = PAV->getZExtValue();
+ }
+ }
+ }
+
+ if ((PAuthABIPlatform == uint64_t(-1)) != (PAuthABIVersion == uint64_t(-1)))
+ CheckFailed("either both or no 'aarch64-elf-pauthabi-platform' and "
+ "'aarch64-elf-pauthabi-version' module flags must be present");
// Validate that the requirements in the module are valid.
for (const MDNode *Requirement : Requirements) {
@@ -4343,6 +4363,11 @@ void Verifier::visitEHPadPredecessors(Instruction &I) {
if (auto *II = dyn_cast<InvokeInst>(TI)) {
Check(II->getUnwindDest() == BB && II->getNormalDest() != BB,
"EH pad must be jumped to via an unwind edge", ToPad, II);
+ auto *CalledFn =
+ dyn_cast<Function>(II->getCalledOperand()->stripPointerCasts());
+ if (CalledFn && CalledFn->isIntrinsic() && II->doesNotThrow() &&
+ !IntrinsicInst::mayLowerToFunctionCall(CalledFn->getIntrinsicID()))
+ continue;
if (auto Bundle = II->getOperandBundle(LLVMContext::OB_funclet))
FromPad = Bundle->Inputs[0];
else