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 | 043949d4465f1c49557e4ac1b9a1646ed6c80312 (patch) | |
tree | feec0c0bf7bbe274fb52be9f42ddba10c2781983 /llvm/lib/Analysis/Analysis.cpp | |
parent | 6a93692a34a501ed8e4c735175780ee98f3cf48f (diff) | |
download | bcm5719-llvm-043949d4465f1c49557e4ac1b9a1646ed6c80312.tar.gz bcm5719-llvm-043949d4465f1c49557e4ac1b9a1646ed6c80312.zip |
[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.
llvm-svn: 199569
Diffstat (limited to 'llvm/lib/Analysis/Analysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/Analysis.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/Analysis.cpp b/llvm/lib/Analysis/Analysis.cpp index ef99e35ffda..c9ce1643c3d 100644 --- a/llvm/lib/Analysis/Analysis.cpp +++ b/llvm/lib/Analysis/Analysis.cpp @@ -11,6 +11,7 @@ #include "llvm-c/Initialization.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/InitializePasses.h" #include "llvm/PassRegistry.h" #include <cstring> @@ -72,21 +73,33 @@ void LLVMInitializeAnalysis(LLVMPassRegistryRef R) { LLVMBool LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action, char **OutMessages) { + raw_ostream *DebugOS = Action != LLVMReturnStatusAction ? &errs() : 0; std::string Messages; + raw_string_ostream MsgsOS(Messages); - LLVMBool Result = verifyModule(*unwrap(M), - static_cast<VerifierFailureAction>(Action), - OutMessages? &Messages : 0); + LLVMBool Result = verifyModule(*unwrap(M), OutMessages ? &MsgsOS : DebugOS); + + // Duplicate the output to stderr. + if (DebugOS && OutMessages) + *DebugOS << MsgsOS.str(); + + if (Action == LLVMAbortProcessAction && Result) + report_fatal_error("Broken module found, compilation aborted!"); if (OutMessages) - *OutMessages = strdup(Messages.c_str()); + *OutMessages = strdup(MsgsOS.str().c_str()); return Result; } LLVMBool LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action) { - return verifyFunction(*unwrap<Function>(Fn), - static_cast<VerifierFailureAction>(Action)); + LLVMBool Result = verifyFunction( + *unwrap<Function>(Fn), Action != LLVMReturnStatusAction ? &errs() : 0); + + if (Action == LLVMAbortProcessAction && Result) + report_fatal_error("Broken function found, compilation aborted!"); + + return Result; } void LLVMViewFunctionCFG(LLVMValueRef Fn) { |