//===-- NaCl.h - NaCl Analysis ---------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_ANALYSIS_NACL_H #define LLVM_ANALYSIS_NACL_H #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include namespace llvm { class FunctionPass; class ModulePass; extern cl::opt PNaClABIAllowDebugMetadata; class PNaClABIErrorReporter { public: PNaClABIErrorReporter() : ErrorCount(0), Errors(ErrorString), UseFatalErrors(true) {} // Return the number of verification errors from the last run. int getErrorCount() { return ErrorCount; } // Print the error messages to O void printErrors(llvm::raw_ostream &O) { Errors.flush(); O << ErrorString; } // Increments the error count and returns an ostream to which the error // message can be streamed. raw_ostream &addError() { ErrorCount++; return Errors; } // Reset the error count and error messages. void reset() { ErrorCount = 0; Errors.flush(); ErrorString.clear(); } void setNonFatal() { UseFatalErrors = false; } void checkForFatalErrors() { if (UseFatalErrors && ErrorCount != 0) { printErrors(errs()); report_fatal_error("PNaCl ABI verification failed"); } } private: int ErrorCount; std::string ErrorString; raw_string_ostream Errors; bool UseFatalErrors; }; FunctionPass *createPNaClABIVerifyFunctionsPass( PNaClABIErrorReporter *Reporter); ModulePass *createPNaClABIVerifyModulePass(PNaClABIErrorReporter *Reporter, bool StreamingMode = false); } #endif