xref: /openbsd-src/gnu/llvm/clang/include/clang/Analysis/BodyFarm.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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