summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/Verifier.cpp
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-06-06 23:21:27 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-06-06 23:21:27 +0000
commitbb738170a9211bd420badcb9cadb0bfa340f1d81 (patch)
treee9616b90ae6a3b68923fda6ca0dd3468a4e8041f /llvm/lib/IR/Verifier.cpp
parent7e4e69abe21a0eec4640f5e6c9a09e520e817937 (diff)
downloadbcm5719-llvm-bb738170a9211bd420badcb9cadb0bfa340f1d81.tar.gz
bcm5719-llvm-bb738170a9211bd420badcb9cadb0bfa340f1d81.zip
Verifier: Simplify and fix issue where we were not verifying unmaterialized functions.
Arrange to call verify(Function &) on each function, followed by verify(Module &), whether the verifier is being used from the pass or from verifyModule(). As a side effect, this fixes an issue that caused us not to call verify(Function &) on unmaterialized functions from verifyModule(). Differential Revision: http://reviews.llvm.org/D21042 llvm-svn: 271956
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r--llvm/lib/IR/Verifier.cpp28
1 files changed, 13 insertions, 15 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 82dadb47210..2c9b1212b11 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -314,17 +314,10 @@ public:
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 @@ void Verifier::verifySiblingFuncletUnwinds() {
// 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 @@ void Verifier::verifyDeoptimizeCallingConvs() {
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 llvm::verifyModule(const Module &M, raw_ostream *OS,
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 @@ struct VerifierLegacyPass : public FunctionPass {
}
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!");
OpenPOWER on IntegriCloud