diff options
Diffstat (limited to 'clang/lib/StaticAnalyzer/Frontend/ModelInjector.h')
| -rw-r--r-- | clang/lib/StaticAnalyzer/Frontend/ModelInjector.h | 69 | 
1 files changed, 69 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.h b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.h new file mode 100644 index 0000000000000..d2016c3b112c2 --- /dev/null +++ b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.h @@ -0,0 +1,69 @@ +//===-- ModelInjector.h -----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// This file defines the clang::ento::ModelInjector class which implements the +/// clang::CodeInjector interface. This class is responsible for injecting +/// function definitions that were synthesized from model files. +/// +/// Model files allow definitions of functions to be lazily constituted for functions +/// which lack bodies in the original source code.  This allows the analyzer +/// to more precisely analyze code that calls such functions, analyzing the +/// artificial definitions (which typically approximate the semantics of the +/// called function) when called by client code.  These definitions are +/// reconstituted lazily, on-demand, by the static analyzer engine. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_SA_FRONTEND_MODELINJECTOR_H +#define LLVM_CLANG_SA_FRONTEND_MODELINJECTOR_H + +#include "clang/Analysis/CodeInjector.h" +#include "llvm/ADT/StringMap.h" + +namespace clang { + +class CompilerInstance; +class ASTUnit; +class ASTReader; +class NamedDecl; +class Module; + +namespace ento { +class ModelInjector : public CodeInjector { +public: +  ModelInjector(CompilerInstance &CI); +  Stmt *getBody(const FunctionDecl *D) override; +  Stmt *getBody(const ObjCMethodDecl *D) override; + +private: +  /// Synthesize a body for a declaration +  /// +  /// This method first looks up the appropriate model file based on the +  /// model-path configuration option and the name of the declaration that is +  /// looked up. If no model were synthesized yet for a function with that name +  /// it will create a new compiler instance to parse the model file using the +  /// ASTContext, Preprocessor, SourceManager of the original compiler instance. +  /// The former resources are shared between the two compiler instance, so the +  /// newly created instance have to "leak" these objects, since they are owned +  /// by the original instance. +  /// +  /// The model-path should be either an absolute path or relative to the +  /// working directory of the compiler. +  void onBodySynthesis(const NamedDecl *D); + +  CompilerInstance &CI; + +  // FIXME: double memoization is redundant, with memoization both here and in +  // BodyFarm. +  llvm::StringMap<Stmt *> Bodies; +}; +} +} + +#endif  | 
