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