[PATCH] D21042: Verifier: Simplify and fix issue where we were not verifying unmaterialized functions.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 6 16:28:11 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL271956: Verifier: Simplify and fix issue where we were not verifying unmaterialized… (authored by pcc).
Changed prior to commit:
http://reviews.llvm.org/D21042?vs=59796&id=59803#toc
Repository:
rL LLVM
http://reviews.llvm.org/D21042
Files:
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/unittests/IR/MetadataTest.cpp
Index: llvm/trunk/lib/IR/Verifier.cpp
===================================================================
--- llvm/trunk/lib/IR/Verifier.cpp
+++ llvm/trunk/lib/IR/Verifier.cpp
@@ -314,17 +314,10 @@
Context = &M.getContext();
Broken = false;
- // Scan through, checking all of the external function's linkage now...
- for (const Function &F : M) {
- visitGlobalValue(F);
-
- // Check to make sure function prototypes are okay.
- if (F.isDeclaration()) {
- visitFunction(F);
- if (F.getIntrinsicID() == Intrinsic::experimental_deoptimize)
- DeoptimizeDeclarations.push_back(&F);
- }
- }
+ // Collect all declarations of the llvm.experimental.deoptimize intrinsic.
+ for (const Function &F : M)
+ if (F.getIntrinsicID() == Intrinsic::experimental_deoptimize)
+ DeoptimizeDeclarations.push_back(&F);
// Now that we've visited every function, verify that we never asked to
// recover a frame index that wasn't escaped.
@@ -1866,6 +1859,8 @@
// visitFunction - Verify that a function is ok.
//
void Verifier::visitFunction(const Function &F) {
+ visitGlobalValue(F);
+
// Check function arguments.
FunctionType *FT = F.getFunctionType();
unsigned NumArgs = F.arg_size();
@@ -4427,7 +4422,6 @@
bool llvm::verifyFunction(const Function &f, raw_ostream *OS) {
Function &F = const_cast<Function &>(f);
- assert(!F.isDeclaration() && "Cannot verify external functions");
// Don't use a raw_null_ostream. Printing IR is expensive.
Verifier V(OS, /*ShouldTreatBrokenDebugInfoAsError=*/true);
@@ -4444,8 +4438,7 @@
bool Broken = false;
for (const Function &F : M)
- if (!F.isDeclaration() && !F.isMaterializable())
- Broken |= !V.verify(F);
+ Broken |= !V.verify(F);
Broken |= !V.verify(M);
if (BrokenDebugInfo)
@@ -4482,7 +4475,12 @@
}
bool doFinalization(Module &M) override {
- bool HasErrors = !V.verify(M);
+ bool HasErrors = false;
+ for (Function &F : M)
+ if (F.isDeclaration())
+ HasErrors |= !V.verify(F);
+
+ HasErrors |= !V.verify(M);
if (FatalErrors) {
if (HasErrors)
report_fatal_error("Broken module found, compilation aborted!");
Index: llvm/trunk/unittests/IR/MetadataTest.cpp
===================================================================
--- llvm/trunk/unittests/IR/MetadataTest.cpp
+++ llvm/trunk/unittests/IR/MetadataTest.cpp
@@ -2253,7 +2253,12 @@
// be verified directly, so check that the module fails to verify).
EXPECT_TRUE(verifyModule(*F->getParent()));
+ // Nor can materializable functions.
+ F->setIsMaterializable(true);
+ EXPECT_TRUE(verifyModule(*F->getParent()));
+
// Functions with a body can.
+ F->setIsMaterializable(false);
(void)new UnreachableInst(Context, BasicBlock::Create(Context, "bb", F));
EXPECT_FALSE(verifyModule(*F->getParent()));
EXPECT_FALSE(verifyFunction(*F));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21042.59803.patch
Type: text/x-patch
Size: 2935 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160606/5cf59984/attachment.bin>
More information about the llvm-commits
mailing list