]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/include/lldb/Symbol/GoASTContext.h
Upgrade Unbound to 1.7.0. More to follow.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / include / lldb / Symbol / GoASTContext.h
1 //===-- GoASTContext.h ------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_GoASTContext_h_
11 #define liblldb_GoASTContext_h_
12
13 // C Includes
14 // C++ Includes
15 #include <map>
16 #include <memory>
17 #include <set>
18 #include <string>
19 #include <vector>
20
21 // Other libraries and framework includes
22 // Project includes
23 #include "lldb/Symbol/CompilerType.h"
24 #include "lldb/Symbol/TypeSystem.h"
25 #include "lldb/Utility/ConstString.h"
26
27 namespace lldb_private {
28
29 class Declaration;
30 class GoType;
31
32 class GoASTContext : public TypeSystem {
33 public:
34   GoASTContext();
35   ~GoASTContext() override;
36
37   //------------------------------------------------------------------
38   // PluginInterface functions
39   //------------------------------------------------------------------
40   ConstString GetPluginName() override;
41
42   uint32_t GetPluginVersion() override;
43
44   static ConstString GetPluginNameStatic();
45
46   static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language,
47                                            Module *module, Target *target);
48
49   static void EnumerateSupportedLanguages(
50       std::set<lldb::LanguageType> &languages_for_types,
51       std::set<lldb::LanguageType> &languages_for_expressions);
52
53   static void Initialize();
54
55   static void Terminate();
56
57   DWARFASTParser *GetDWARFParser() override;
58
59   void SetAddressByteSize(int byte_size) { m_pointer_byte_size = byte_size; }
60
61   //------------------------------------------------------------------
62   // llvm casting support
63   //------------------------------------------------------------------
64   static bool classof(const TypeSystem *ts) {
65     return ts->getKind() == TypeSystem::eKindGo;
66   }
67
68   //----------------------------------------------------------------------
69   // CompilerDecl functions
70   //----------------------------------------------------------------------
71   ConstString DeclGetName(void *opaque_decl) override { return ConstString(); }
72
73   //----------------------------------------------------------------------
74   // CompilerDeclContext functions
75   //----------------------------------------------------------------------
76
77   bool DeclContextIsStructUnionOrClass(void *opaque_decl_ctx) override {
78     return false;
79   }
80
81   ConstString DeclContextGetName(void *opaque_decl_ctx) override {
82     return ConstString();
83   }
84
85   ConstString DeclContextGetScopeQualifiedName(void *opaque_decl_ctx) override {
86     return ConstString();
87   }
88
89   bool
90   DeclContextIsClassMethod(void *opaque_decl_ctx,
91                            lldb::LanguageType *language_ptr,
92                            bool *is_instance_method_ptr,
93                            ConstString *language_object_name_ptr) override {
94     return false;
95   }
96
97   //----------------------------------------------------------------------
98   // Creating Types
99   //----------------------------------------------------------------------
100
101   CompilerType CreateArrayType(const ConstString &name,
102                                const CompilerType &element_type,
103                                uint64_t length);
104
105   CompilerType CreateBaseType(int go_kind,
106                               const ConstString &type_name_const_str,
107                               uint64_t byte_size);
108
109   // For interface, map, chan.
110   CompilerType CreateTypedefType(int kind, const ConstString &name,
111                                  CompilerType impl);
112
113   CompilerType CreateVoidType(const ConstString &name);
114   CompilerType CreateFunctionType(const lldb_private::ConstString &name,
115                                   CompilerType *params, size_t params_count,
116                                   bool is_variadic);
117
118   CompilerType CreateStructType(int kind, const ConstString &name,
119                                 uint32_t byte_size);
120
121   void CompleteStructType(const CompilerType &type);
122
123   void AddFieldToStruct(const CompilerType &struct_type,
124                         const ConstString &name, const CompilerType &field_type,
125                         uint32_t byte_offset);
126
127   //----------------------------------------------------------------------
128   // Tests
129   //----------------------------------------------------------------------
130
131   static bool IsGoString(const CompilerType &type);
132   static bool IsGoSlice(const CompilerType &type);
133   static bool IsGoInterface(const CompilerType &type);
134   static bool IsDirectIface(uint8_t kind);
135   static bool IsPointerKind(uint8_t kind);
136
137   bool IsArrayType(lldb::opaque_compiler_type_t type,
138                    CompilerType *element_type, uint64_t *size,
139                    bool *is_incomplete) override;
140
141   bool IsAggregateType(lldb::opaque_compiler_type_t type) override;
142
143   bool IsCharType(lldb::opaque_compiler_type_t type) override;
144
145   bool IsCompleteType(lldb::opaque_compiler_type_t type) override;
146
147   bool IsDefined(lldb::opaque_compiler_type_t type) override;
148
149   bool IsFloatingPointType(lldb::opaque_compiler_type_t type, uint32_t &count,
150                            bool &is_complex) override;
151
152   bool IsFunctionType(lldb::opaque_compiler_type_t type,
153                       bool *is_variadic_ptr = nullptr) override;
154
155   size_t
156   GetNumberOfFunctionArguments(lldb::opaque_compiler_type_t type) override;
157
158   CompilerType GetFunctionArgumentAtIndex(lldb::opaque_compiler_type_t type,
159                                           const size_t index) override;
160
161   bool IsFunctionPointerType(lldb::opaque_compiler_type_t type) override;
162
163   bool IsBlockPointerType(lldb::opaque_compiler_type_t type,
164                           CompilerType *function_pointer_type_ptr) override;
165
166   bool IsIntegerType(lldb::opaque_compiler_type_t type,
167                      bool &is_signed) override;
168
169   bool IsPossibleDynamicType(lldb::opaque_compiler_type_t type,
170                              CompilerType *target_type, // Can pass nullptr
171                              bool check_cplusplus, bool check_objc) override;
172
173   bool IsPointerType(lldb::opaque_compiler_type_t type,
174                      CompilerType *pointee_type = nullptr) override;
175
176   bool IsScalarType(lldb::opaque_compiler_type_t type) override;
177
178   bool IsVoidType(lldb::opaque_compiler_type_t type) override;
179
180   bool SupportsLanguage(lldb::LanguageType language) override;
181
182   //----------------------------------------------------------------------
183   // Type Completion
184   //----------------------------------------------------------------------
185
186   bool GetCompleteType(lldb::opaque_compiler_type_t type) override;
187
188   //----------------------------------------------------------------------
189   // AST related queries
190   //----------------------------------------------------------------------
191
192   uint32_t GetPointerByteSize() override;
193
194   //----------------------------------------------------------------------
195   // Accessors
196   //----------------------------------------------------------------------
197
198   ConstString GetTypeName(lldb::opaque_compiler_type_t type) override;
199
200   uint32_t GetTypeInfo(
201       lldb::opaque_compiler_type_t type,
202       CompilerType *pointee_or_element_compiler_type = nullptr) override;
203
204   lldb::LanguageType
205   GetMinimumLanguage(lldb::opaque_compiler_type_t type) override;
206
207   lldb::TypeClass GetTypeClass(lldb::opaque_compiler_type_t type) override;
208
209   //----------------------------------------------------------------------
210   // Creating related types
211   //----------------------------------------------------------------------
212
213   CompilerType GetArrayElementType(lldb::opaque_compiler_type_t type,
214                                    uint64_t *stride = nullptr) override;
215
216   CompilerType GetCanonicalType(lldb::opaque_compiler_type_t type) override;
217
218   // Returns -1 if this isn't a function of if the function doesn't have a
219   // prototype
220   // Returns a value >= 0 if there is a prototype.
221   int GetFunctionArgumentCount(lldb::opaque_compiler_type_t type) override;
222
223   CompilerType GetFunctionArgumentTypeAtIndex(lldb::opaque_compiler_type_t type,
224                                               size_t idx) override;
225
226   CompilerType
227   GetFunctionReturnType(lldb::opaque_compiler_type_t type) override;
228
229   size_t GetNumMemberFunctions(lldb::opaque_compiler_type_t type) override;
230
231   TypeMemberFunctionImpl
232   GetMemberFunctionAtIndex(lldb::opaque_compiler_type_t type,
233                            size_t idx) override;
234
235   CompilerType GetPointeeType(lldb::opaque_compiler_type_t type) override;
236
237   CompilerType GetPointerType(lldb::opaque_compiler_type_t type) override;
238
239   //----------------------------------------------------------------------
240   // Exploring the type
241   //----------------------------------------------------------------------
242
243   uint64_t GetBitSize(lldb::opaque_compiler_type_t type,
244                       ExecutionContextScope *exe_scope) override;
245
246   lldb::Encoding GetEncoding(lldb::opaque_compiler_type_t type,
247                              uint64_t &count) override;
248
249   lldb::Format GetFormat(lldb::opaque_compiler_type_t type) override;
250
251   uint32_t GetNumChildren(lldb::opaque_compiler_type_t type,
252                           bool omit_empty_base_classes) override;
253
254   lldb::BasicType
255   GetBasicTypeEnumeration(lldb::opaque_compiler_type_t type) override;
256
257   CompilerType GetBuiltinTypeForEncodingAndBitSize(lldb::Encoding encoding,
258                                                    size_t bit_size) override;
259
260   uint32_t GetNumFields(lldb::opaque_compiler_type_t type) override;
261
262   CompilerType GetFieldAtIndex(lldb::opaque_compiler_type_t type, size_t idx,
263                                std::string &name, uint64_t *bit_offset_ptr,
264                                uint32_t *bitfield_bit_size_ptr,
265                                bool *is_bitfield_ptr) override;
266
267   uint32_t GetNumDirectBaseClasses(lldb::opaque_compiler_type_t type) override {
268     return 0;
269   }
270
271   uint32_t
272   GetNumVirtualBaseClasses(lldb::opaque_compiler_type_t type) override {
273     return 0;
274   }
275
276   CompilerType GetDirectBaseClassAtIndex(lldb::opaque_compiler_type_t type,
277                                          size_t idx,
278                                          uint32_t *bit_offset_ptr) override {
279     return CompilerType();
280   }
281
282   CompilerType GetVirtualBaseClassAtIndex(lldb::opaque_compiler_type_t type,
283                                           size_t idx,
284                                           uint32_t *bit_offset_ptr) override {
285     return CompilerType();
286   }
287
288   CompilerType GetChildCompilerTypeAtIndex(
289       lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx, size_t idx,
290       bool transparent_pointers, bool omit_empty_base_classes,
291       bool ignore_array_bounds, std::string &child_name,
292       uint32_t &child_byte_size, int32_t &child_byte_offset,
293       uint32_t &child_bitfield_bit_size, uint32_t &child_bitfield_bit_offset,
294       bool &child_is_base_class, bool &child_is_deref_of_parent,
295       ValueObject *valobj, uint64_t &language_flags) override;
296
297   // Lookup a child given a name. This function will match base class names
298   // and member member names in "clang_type" only, not descendants.
299   uint32_t GetIndexOfChildWithName(lldb::opaque_compiler_type_t type,
300                                    const char *name,
301                                    bool omit_empty_base_classes) override;
302
303   // Lookup a child member given a name. This function will match member names
304   // only and will descend into "clang_type" children in search for the first
305   // member in this class, or any base class that matches "name".
306   // TODO: Return all matches for a given name by returning a
307   // vector<vector<uint32_t>>
308   // so we catch all names that match a given child name, not just the first.
309   size_t
310   GetIndexOfChildMemberWithName(lldb::opaque_compiler_type_t type,
311                                 const char *name, bool omit_empty_base_classes,
312                                 std::vector<uint32_t> &child_indexes) override;
313
314   size_t GetNumTemplateArguments(lldb::opaque_compiler_type_t type) override {
315     return 0;
316   }
317
318   //----------------------------------------------------------------------
319   // Dumping types
320   //----------------------------------------------------------------------
321   void DumpValue(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
322                  Stream *s, lldb::Format format, const DataExtractor &data,
323                  lldb::offset_t data_offset, size_t data_byte_size,
324                  uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
325                  bool show_types, bool show_summary, bool verbose,
326                  uint32_t depth) override;
327
328   bool DumpTypeValue(lldb::opaque_compiler_type_t type, Stream *s,
329                      lldb::Format format, const DataExtractor &data,
330                      lldb::offset_t data_offset, size_t data_byte_size,
331                      uint32_t bitfield_bit_size, uint32_t bitfield_bit_offset,
332                      ExecutionContextScope *exe_scope) override;
333
334   void DumpTypeDescription(
335       lldb::opaque_compiler_type_t type) override; // Dump to stdout
336
337   void DumpTypeDescription(lldb::opaque_compiler_type_t type,
338                            Stream *s) override;
339
340   //----------------------------------------------------------------------
341   // TODO: These methods appear unused. Should they be removed?
342   //----------------------------------------------------------------------
343
344   bool IsRuntimeGeneratedType(lldb::opaque_compiler_type_t type) override;
345
346   void DumpSummary(lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
347                    Stream *s, const DataExtractor &data,
348                    lldb::offset_t data_offset, size_t data_byte_size) override;
349
350   // Converts "s" to a floating point value and place resulting floating
351   // point bytes in the "dst" buffer.
352   size_t ConvertStringToFloatValue(lldb::opaque_compiler_type_t type,
353                                    const char *s, uint8_t *dst,
354                                    size_t dst_size) override;
355
356   //----------------------------------------------------------------------
357   // TODO: Determine if these methods should move to ClangASTContext.
358   //----------------------------------------------------------------------
359
360   bool IsPointerOrReferenceType(lldb::opaque_compiler_type_t type,
361                                 CompilerType *pointee_type = nullptr) override;
362
363   unsigned GetTypeQualifiers(lldb::opaque_compiler_type_t type) override;
364
365   bool IsCStringType(lldb::opaque_compiler_type_t type,
366                      uint32_t &length) override;
367
368   size_t GetTypeBitAlign(lldb::opaque_compiler_type_t type) override;
369
370   CompilerType GetBasicTypeFromAST(lldb::BasicType basic_type) override;
371
372   bool IsBeingDefined(lldb::opaque_compiler_type_t type) override;
373
374   bool IsConst(lldb::opaque_compiler_type_t type) override;
375
376   uint32_t IsHomogeneousAggregate(lldb::opaque_compiler_type_t type,
377                                   CompilerType *base_type_ptr) override;
378
379   bool IsPolymorphicClass(lldb::opaque_compiler_type_t type) override;
380
381   bool IsTypedefType(lldb::opaque_compiler_type_t type) override;
382
383   // If the current object represents a typedef type, get the underlying type
384   CompilerType GetTypedefedType(lldb::opaque_compiler_type_t type) override;
385
386   bool IsVectorType(lldb::opaque_compiler_type_t type,
387                     CompilerType *element_type, uint64_t *size) override;
388
389   CompilerType
390   GetFullyUnqualifiedType(lldb::opaque_compiler_type_t type) override;
391
392   CompilerType GetNonReferenceType(lldb::opaque_compiler_type_t type) override;
393
394   bool IsReferenceType(lldb::opaque_compiler_type_t type,
395                        CompilerType *pointee_type = nullptr,
396                        bool *is_rvalue = nullptr) override;
397
398 private:
399   typedef std::map<ConstString, std::unique_ptr<GoType>> TypeMap;
400   int m_pointer_byte_size;
401   int m_int_byte_size;
402   std::unique_ptr<TypeMap> m_types;
403   std::unique_ptr<DWARFASTParser> m_dwarf_ast_parser_ap;
404
405   GoASTContext(const GoASTContext &) = delete;
406   const GoASTContext &operator=(const GoASTContext &) = delete;
407 };
408
409 class GoASTContextForExpr : public GoASTContext {
410 public:
411   GoASTContextForExpr(lldb::TargetSP target) : m_target_wp(target) {}
412   UserExpression *
413   GetUserExpression(llvm::StringRef expr, llvm::StringRef prefix,
414                     lldb::LanguageType language,
415                     Expression::ResultType desired_type,
416                     const EvaluateExpressionOptions &options) override;
417
418 private:
419   lldb::TargetWP m_target_wp;
420 };
421 }
422 #endif // liblldb_GoASTContext_h_