diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2014-01-19 02:22:18 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2014-01-19 02:22:18 +0000 |
commit | e608d695de5c8b8de80041d9b654f42b1d7fb893 (patch) | |
tree | ea2e65dc2a05bde72644b807cef8411cda4977a4 /include/llvm | |
parent | 60e425e99ba7ef05b7a52c7068a67c6baa25da38 (diff) | |
download | llvm-e608d695de5c8b8de80041d9b654f42b1d7fb893.tar.gz llvm-e608d695de5c8b8de80041d9b654f42b1d7fb893.tar.bz2 llvm-e608d695de5c8b8de80041d9b654f42b1d7fb893.tar.xz |
[PM] Make the verifier work independently of any pass manager.
This makes the 'verifyFunction' and 'verifyModule' functions totally
independent operations on the LLVM IR. It also cleans up their API a bit
by lifting the abort behavior into their clients and just using an
optional raw_ostream parameter to control printing.
The implementation of the verifier is now just an InstVisitor with no
multiple inheritance. It also is significantly more const-correct, and
hides the const violations internally. The two layers that force us to
break const correctness are building a DomTree and dispatching through
the InstVisitor.
A new VerifierPass is used to implement the legacy pass manager
interface in terms of the other pieces.
The error messages produced may be slightly different now, and we may
have slightly different short circuiting behavior with different usage
models of the verifier, but generally everything works equivalently and
this unblocks wiring the verifier up to the new pass manager.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199569 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm')
-rw-r--r-- | include/llvm/IR/Verifier.h | 45 | ||||
-rw-r--r-- | include/llvm/InitializePasses.h | 2 |
2 files changed, 17 insertions, 30 deletions
diff --git a/include/llvm/IR/Verifier.h b/include/llvm/IR/Verifier.h index 9f6cb42e11..f5d8945ea0 100644 --- a/include/llvm/IR/Verifier.h +++ b/include/llvm/IR/Verifier.h @@ -28,44 +28,31 @@ namespace llvm { class FunctionPass; class Module; class Function; - -/// \brief An enumeration to specify the action to be taken if errors found. -/// -/// This enumeration is used in the functions below to indicate what should -/// happen if the verifier finds errors. Each of the functions that uses -/// this enumeration as an argument provides a default value for it. The -/// actions are listed below. -enum VerifierFailureAction { - AbortProcessAction, ///< verifyModule will print to stderr and abort() - PrintMessageAction, ///< verifyModule will print to stderr and return true - ReturnStatusAction ///< verifyModule will just return true -}; - -/// \brief Create a verifier pass. -/// -/// Check a module or function for validity. When the pass is used, the -/// action indicated by the \p action argument will be used if errors are -/// found. -FunctionPass * -createVerifierPass(VerifierFailureAction action = AbortProcessAction); +class raw_ostream; /// \brief Check a function for errors, useful for use when debugging a /// pass. /// /// If there are no errors, the function returns false. If an error is found, -/// the action taken depends on the \p action parameter. -bool verifyFunction(const Function &F, - VerifierFailureAction action = AbortProcessAction); +/// a message describing the error is written to OS (if non-null) and false is +/// returned. +bool verifyFunction(const Function &F, raw_ostream *OS = 0); /// \brief Check a module for errors. /// /// If there are no errors, the function returns false. If an error is found, -/// the action taken depends on the \p action parameter. -/// This should only be used for debugging, because it plays games with -/// PassManagers and stuff. -bool verifyModule(const Module &M, - VerifierFailureAction action = AbortProcessAction, - std::string *ErrorInfo = 0); +/// a message describing the error is written to OS (if non-null) and false is +/// returned. +bool verifyModule(const Module &M, raw_ostream *OS = 0); + +/// \brief Create a verifier pass. +/// +/// Check a module or function for validity. This is essentially a pass wrapped +/// around the above verifyFunction and verifyModule routines and +/// functionality. When the pass detects a verification error it is always +/// printed to stderr, and by default they are fatal. You can override that by +/// passing \c false to \p FatalErrors. +FunctionPass *createVerifierPass(bool FatalErrors = true); } // End llvm namespace diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index a88d94945a..e08e0c4baf 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -256,7 +256,7 @@ void initializeTypeBasedAliasAnalysisPass(PassRegistry&); void initializeUnifyFunctionExitNodesPass(PassRegistry&); void initializeUnreachableBlockElimPass(PassRegistry&); void initializeUnreachableMachineBlockElimPass(PassRegistry&); -void initializeVerifierPass(PassRegistry&); +void initializeVerifierPassPass(PassRegistry&); void initializeVirtRegMapPass(PassRegistry&); void initializeVirtRegRewriterPass(PassRegistry&); void initializeInstSimplifierPass(PassRegistry&); |