brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · f67229a Raw
127 lines · c
1//===-- IRDynamicChecks.h ---------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_IRDYNAMICCHECKS_H10#define LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_IRDYNAMICCHECKS_H11 12#include "lldb/Expression/DynamicCheckerFunctions.h"13#include "lldb/lldb-types.h"14#include "llvm/Pass.h"15 16namespace llvm {17class BasicBlock;18class Module;19}20 21namespace lldb_private {22 23class ExecutionContext;24class Stream;25 26class ClangDynamicCheckerFunctions27    : public lldb_private::DynamicCheckerFunctions {28public:29  /// Constructor30  ClangDynamicCheckerFunctions();31 32  /// Destructor33  ~ClangDynamicCheckerFunctions() override;34 35  static bool classof(const DynamicCheckerFunctions *checker_funcs) {36    return checker_funcs->GetKind() == DCF_Clang;37  }38 39  /// Install the utility functions into a process.  This binds the instance40  /// of DynamicCheckerFunctions to that process.41  ///42  /// \param[in] diagnostic_manager43  ///     A diagnostic manager to report errors to.44  ///45  /// \param[in] exe_ctx46  ///     The execution context to install the functions into.47  ///48  /// \return49  ///     Either llvm::ErrorSuccess or Error with llvm::ErrorInfo50  ///51  llvm::Error Install(DiagnosticManager &diagnostic_manager,52                      ExecutionContext &exe_ctx) override;53 54  bool DoCheckersExplainStop(lldb::addr_t addr, Stream &message) override;55 56  std::shared_ptr<UtilityFunction> m_objc_object_check;57};58 59/// \class IRDynamicChecks IRDynamicChecks.h60/// "lldb/Expression/IRDynamicChecks.h" Adds dynamic checks to a user-entered61/// expression to reduce its likelihood of crashing62///63/// When an IR function is executed in the target process, it may cause64/// crashes or hangs by dereferencing NULL pointers, trying to call65/// Objective-C methods on objects that do not respond to them, and so forth.66///67/// IRDynamicChecks adds calls to the functions in DynamicCheckerFunctions to68/// appropriate locations in an expression's IR.69class IRDynamicChecks : public llvm::ModulePass {70public:71  /// Constructor72  ///73  /// \param[in] checker_functions74  ///     The checker functions for the target process.75  ///76  /// \param[in] func_name77  ///     The name of the function to prepare for execution in the target.78  IRDynamicChecks(ClangDynamicCheckerFunctions &checker_functions,79                  const char *func_name = "$__lldb_expr");80 81  /// Destructor82  ~IRDynamicChecks() override;83 84  /// Run this IR transformer on a single module85  ///86  /// \param[in] M87  ///     The module to run on.  This module is searched for the function88  ///     $__lldb_expr, and that function is passed to the passes one by89  ///     one.90  ///91  /// \return92  ///     True on success; false otherwise93  bool runOnModule(llvm::Module &M) override;94 95  /// Interface stub96  void assignPassManager(97      llvm::PMStack &PMS,98      llvm::PassManagerType T = llvm::PMT_ModulePassManager) override;99 100  /// Returns PMT_ModulePassManager101  llvm::PassManagerType getPotentialPassManagerType() const override;102 103private:104  /// A basic block-level pass to find all pointer dereferences and105  /// validate them before use.106 107  /// The top-level pass implementation108  ///109  /// \param[in] M110  ///     The module currently being processed.111  ///112  /// \param[in] BB113  ///     The basic block currently being processed.114  ///115  /// \return116  ///     True on success; false otherwise117  bool FindDataLoads(llvm::Module &M, llvm::BasicBlock &BB);118 119  std::string m_func_name; ///< The name of the function to add checks to120  ClangDynamicCheckerFunctions121      &m_checker_functions; ///< The checker functions for the process122};123 124} // namespace lldb_private125 126#endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_IRDYNAMICCHECKS_H127