1 | //===-- ASTStructExtractor.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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTSTRUCTEXTRACTOR_H |
10 | #define |
11 | |
12 | #include "ClangExpressionVariable.h" |
13 | #include "ClangFunctionCaller.h" |
14 | |
15 | #include "clang/Sema/SemaConsumer.h" |
16 | |
17 | namespace lldb_private { |
18 | |
19 | /// \class ASTStructExtractor ASTStructExtractor.h |
20 | /// "lldb/Expression/ASTStructExtractor.h" Extracts and describes the argument |
21 | /// structure for a wrapped function. |
22 | /// |
23 | /// This pass integrates with ClangFunctionCaller, which calls functions with |
24 | /// custom sets of arguments. To avoid having to implement the full calling |
25 | /// convention for the target's architecture, ClangFunctionCaller writes a |
26 | /// simple wrapper function that takes a pointer to an argument structure that |
27 | /// contains room for the address of the function to be called, the values of |
28 | /// all its arguments, and room for the function's return value. |
29 | /// |
30 | /// The definition of this struct is itself in the body of the wrapper |
31 | /// function, so Clang does the structure layout itself. ASTStructExtractor |
32 | /// reads through the AST for the wrapper function and finds the struct. |
33 | class : public clang::SemaConsumer { |
34 | public: |
35 | /// Constructor |
36 | /// |
37 | /// \param[in] passthrough |
38 | /// Since the ASTs must typically go through to the Clang code generator |
39 | /// in order to produce LLVM IR, this SemaConsumer must allow them to |
40 | /// pass to the next step in the chain after processing. Passthrough is |
41 | /// the next ASTConsumer, or NULL if none is required. |
42 | /// |
43 | /// \param[in] struct_name |
44 | /// The name of the structure to extract from the wrapper function. |
45 | /// |
46 | /// \param[in] function |
47 | /// The caller object whose members should be populated with information |
48 | /// about the argument struct. ClangFunctionCaller friends |
49 | /// ASTStructExtractor |
50 | /// for this purpose. |
51 | (clang::ASTConsumer *passthrough, const char *struct_name, |
52 | ClangFunctionCaller &function); |
53 | |
54 | /// Destructor |
55 | () override; |
56 | |
57 | /// Link this consumer with a particular AST context |
58 | /// |
59 | /// \param[in] Context |
60 | /// This AST context will be used for types and identifiers, and also |
61 | /// forwarded to the passthrough consumer, if one exists. |
62 | void (clang::ASTContext &Context) override; |
63 | |
64 | /// Examine a list of Decls to find the function $__lldb_expr and transform |
65 | /// its code |
66 | /// |
67 | /// \param[in] D |
68 | /// The list of Decls to search. These may contain LinkageSpecDecls, |
69 | /// which need to be searched recursively. That job falls to |
70 | /// TransformTopLevelDecl. |
71 | bool HandleTopLevelDecl(clang::DeclGroupRef D) override; |
72 | |
73 | /// Passthrough stub |
74 | void HandleTranslationUnit(clang::ASTContext &Ctx) override; |
75 | |
76 | /// Passthrough stub |
77 | void HandleTagDeclDefinition(clang::TagDecl *D) override; |
78 | |
79 | /// Passthrough stub |
80 | void (clang::VarDecl *D) override; |
81 | |
82 | /// Passthrough stub |
83 | void HandleVTable(clang::CXXRecordDecl *RD) override; |
84 | |
85 | /// Passthrough stub |
86 | void () override; |
87 | |
88 | /// Set the Sema object to use when performing transforms, and pass it on |
89 | /// |
90 | /// \param[in] S |
91 | /// The Sema to use. Because Sema isn't externally visible, this class |
92 | /// casts it to an Action for actual use. |
93 | void (clang::Sema &S) override; |
94 | |
95 | /// Reset the Sema to NULL now that transformations are done |
96 | void () override; |
97 | |
98 | private: |
99 | /// Hunt the given FunctionDecl for the argument struct and place |
100 | /// information about it into m_function |
101 | /// |
102 | /// \param[in] F |
103 | /// The FunctionDecl to hunt. |
104 | void (clang::FunctionDecl *F); |
105 | |
106 | /// Hunt the given Decl for FunctionDecls named the same as the wrapper |
107 | /// function name, recursing as necessary through LinkageSpecDecls, and |
108 | /// calling ExtractFromFunctionDecl on anything that was found |
109 | /// |
110 | /// \param[in] D |
111 | /// The Decl to hunt. |
112 | void (clang::Decl *D); |
113 | |
114 | clang::ASTContext |
115 | *; ///< The AST context to use for identifiers and types. |
116 | clang::ASTConsumer *; ///< The ASTConsumer down the chain, for |
117 | ///passthrough. NULL if it's a |
118 | ///SemaConsumer. |
119 | clang::SemaConsumer *; ///< The SemaConsumer down the chain, |
120 | ///for passthrough. NULL if it's an |
121 | ///ASTConsumer. |
122 | clang::Sema *; ///< The Sema to use. |
123 | |
124 | ClangFunctionCaller &; ///< The function to populate with |
125 | ///information about the argument structure. |
126 | std::string ; ///< The name of the structure to extract. |
127 | }; |
128 | |
129 | } // namespace lldb_private |
130 | |
131 | #endif // LLDB_SOURCE_PLUGINS_EXPRESSIONPARSER_CLANG_ASTSTRUCTEXTRACTOR_H |
132 | |