1e5dd7070Spatrick //== BodyFarm.h - Factory for conjuring up fake bodies -------------*- C++ -*-// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // BodyFarm is a factory for creating faux implementations for functions/methods 10e5dd7070Spatrick // for analysis purposes. 11e5dd7070Spatrick // 12e5dd7070Spatrick //===----------------------------------------------------------------------===// 13e5dd7070Spatrick 14*12c85518Srobert #ifndef LLVM_CLANG_ANALYSIS_BODYFARM_H 15*12c85518Srobert #define LLVM_CLANG_ANALYSIS_BODYFARM_H 16e5dd7070Spatrick 17e5dd7070Spatrick #include "clang/AST/DeclBase.h" 18e5dd7070Spatrick #include "clang/Basic/LLVM.h" 19e5dd7070Spatrick #include "llvm/ADT/DenseMap.h" 20*12c85518Srobert #include <optional> 21e5dd7070Spatrick 22e5dd7070Spatrick namespace clang { 23e5dd7070Spatrick 24e5dd7070Spatrick class ASTContext; 25e5dd7070Spatrick class FunctionDecl; 26e5dd7070Spatrick class ObjCMethodDecl; 27e5dd7070Spatrick class Stmt; 28e5dd7070Spatrick class CodeInjector; 29e5dd7070Spatrick 30e5dd7070Spatrick class BodyFarm { 31e5dd7070Spatrick public: BodyFarm(ASTContext & C,CodeInjector * injector)32e5dd7070Spatrick BodyFarm(ASTContext &C, CodeInjector *injector) : C(C), Injector(injector) {} 33e5dd7070Spatrick 34e5dd7070Spatrick /// Factory method for creating bodies for ordinary functions. 35e5dd7070Spatrick Stmt *getBody(const FunctionDecl *D); 36e5dd7070Spatrick 37e5dd7070Spatrick /// Factory method for creating bodies for Objective-C properties. 38e5dd7070Spatrick Stmt *getBody(const ObjCMethodDecl *D); 39e5dd7070Spatrick 40e5dd7070Spatrick /// Remove copy constructor to avoid accidental copying. 41e5dd7070Spatrick BodyFarm(const BodyFarm &other) = delete; 42e5dd7070Spatrick 43e5dd7070Spatrick private: 44*12c85518Srobert typedef llvm::DenseMap<const Decl *, std::optional<Stmt *>> BodyMap; 45e5dd7070Spatrick 46e5dd7070Spatrick ASTContext &C; 47e5dd7070Spatrick BodyMap Bodies; 48e5dd7070Spatrick CodeInjector *Injector; 49e5dd7070Spatrick }; 50e5dd7070Spatrick } // namespace clang 51e5dd7070Spatrick 52e5dd7070Spatrick #endif 53