136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- Verifier.h - LLVM IR Verifier ----------------------------*- C++ -*-===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file defines the function verifier interface, that can be used for some 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// sanity checking of input to the system, and for checking that transformations 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// haven't done something bad. 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Note that this does not provide full 'java style' security and verifications, 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// instead it just tries to ensure that code is well formed. 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// To see what specifically is checked, look at the top of Verifier.cpp 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_IR_VERIFIER_H 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_IR_VERIFIER_H 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/PassManager.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm { 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass Function; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass FunctionPass; 30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass ModulePass; 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass Module; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass raw_ostream; 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Check a function for errors, useful for use when debugging a 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// pass. 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// If there are no errors, the function returns false. If an error is found, 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// a message describing the error is written to OS (if non-null) and true is 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// returned. 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool verifyFunction(const Function &F, raw_ostream *OS = nullptr); 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Check a module for errors. 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// If there are no errors, the function returns false. If an error is 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// found, a message describing the error is written to OS (if 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// non-null) and true is returned. 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// \return true if the module is broken. If BrokenDebugInfo is 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// supplied, DebugInfo verification failures won't be considered as 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// error and instead *BrokenDebugInfo will be set to true. Debug 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// info errors can be "recovered" from by stripping the debug info. 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool verifyModule(const Module &M, raw_ostream *OS = nullptr, 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool *BrokenDebugInfo = nullptr); 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarFunctionPass *createVerifierPass(bool FatalErrors = true); 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Check a module for errors, and report separate error states for IR 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// and debug info errors. 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass VerifierAnalysis : public AnalysisInfoMixin<VerifierAnalysis> { 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar friend AnalysisInfoMixin<VerifierAnalysis>; 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static char PassID; 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar struct Result { 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar bool IRBroken, DebugInfoBroken; 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }; 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar static void *ID() { return (void *)&PassID; } 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Result run(Module &M, ModuleAnalysisManager &); 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Result run(Function &F, FunctionAnalysisManager &); 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Check a module for errors, but report debug info errors separately. 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Otherwise behaves as the normal verifyModule. Debug info errors can be 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// "recovered" from by stripping the debug info. 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool verifyModule(bool &BrokenDebugInfo, const Module &M, raw_ostream *OS); 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// \brief Create a verifier pass. 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Check a module or function for validity. This is essentially a pass wrapped 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// around the above verifyFunction and verifyModule routines and 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// functionality. When the pass detects a verification error it is always 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// printed to stderr, and by default they are fatal. You can override that by 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// passing \c false to \p FatalErrors. 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// Note that this creates a pass suitable for the legacy pass manager. It has 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// nothing to do with \c VerifierPass. 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass VerifierPass : public PassInfoMixin<VerifierPass> { 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool FatalErrors; 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines explicit VerifierPass(bool FatalErrors = true) : FatalErrors(FatalErrors) {} 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // End llvm namespace 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif 101