1 //===-- ClangASTType.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_ClangASTType_h_
11 #define liblldb_ClangASTType_h_
12 
13 #include <string>
14 #include "lldb/lldb-private.h"
15 #include "lldb/Core/ClangForward.h"
16 #include "clang/AST/Type.h"
17 
18 namespace lldb_private {
19 
20 //----------------------------------------------------------------------
21 // A class that can carry around a clang ASTContext and a opaque clang
22 // QualType. A clang::QualType can be easily reconstructed from an
23 // opaque clang type and often the ASTContext is needed when doing
24 // various type related tasks, so this class allows both items to travel
25 // in a single very lightweight class that can be used. There are many
26 // static equivalents of the member functions that allow the ASTContext
27 // and the opaque clang QualType to be specified for ease of use and
28 // to avoid code duplication.
29 //----------------------------------------------------------------------
30 class ClangASTType
31 {
32 public:
33     enum {
34         eTypeHasChildren        = (1u <<  0),
35         eTypeHasValue           = (1u <<  1),
36         eTypeIsArray            = (1u <<  2),
37         eTypeIsBlock            = (1u <<  3),
38         eTypeIsBuiltIn          = (1u <<  4),
39         eTypeIsClass            = (1u <<  5),
40         eTypeIsCPlusPlus        = (1u <<  6),
41         eTypeIsEnumeration      = (1u <<  7),
42         eTypeIsFuncPrototype    = (1u <<  8),
43         eTypeIsMember           = (1u <<  9),
44         eTypeIsObjC             = (1u << 10),
45         eTypeIsPointer          = (1u << 11),
46         eTypeIsReference        = (1u << 12),
47         eTypeIsStructUnion      = (1u << 13),
48         eTypeIsTemplate         = (1u << 14),
49         eTypeIsTypedef          = (1u << 15),
50         eTypeIsVector           = (1u << 16),
51         eTypeIsScalar           = (1u << 17),
52         eTypeIsInteger          = (1u << 18),
53         eTypeIsFloat            = (1u << 19),
54         eTypeIsComplex          = (1u << 20),
55         eTypeIsSigned           = (1u << 21)
56     };
57 
58 
59     //----------------------------------------------------------------------
60     // Constructors and Destructors
61     //----------------------------------------------------------------------
ClangASTType(clang::ASTContext * ast_context,lldb::clang_type_t type)62     ClangASTType (clang::ASTContext *ast_context, lldb::clang_type_t type) :
63         m_type (type),
64         m_ast  (ast_context)
65     {
66     }
67 
68     ClangASTType (clang::ASTContext *ast_context, clang::QualType qual_type);
69 
ClangASTType(const ClangASTType & rhs)70     ClangASTType (const ClangASTType &rhs) :
71         m_type (rhs.m_type),
72         m_ast  (rhs.m_ast)
73     {
74     }
75 
ClangASTType()76     ClangASTType () :
77         m_type (0),
78         m_ast  (0)
79     {
80     }
81 
82     ~ClangASTType();
83 
84     //----------------------------------------------------------------------
85     // Operators
86     //----------------------------------------------------------------------
87 
88     const ClangASTType &
89     operator= (const ClangASTType &rhs)
90     {
91         m_type = rhs.m_type;
92         m_ast = rhs.m_ast;
93         return *this;
94     }
95 
96 
97     //----------------------------------------------------------------------
98     // Tests
99     //----------------------------------------------------------------------
100 
101     operator bool () const
102     {
103         return m_type != NULL && m_ast != NULL;
104     }
105 
106     bool
107     operator < (const ClangASTType &rhs) const
108     {
109         if (m_ast == rhs.m_ast)
110             return m_type < rhs.m_type;
111         return m_ast < rhs.m_ast;
112     }
113 
114     bool
IsValid()115     IsValid () const
116     {
117         return m_type != NULL && m_ast != NULL;
118     }
119 
120     bool
121     IsArrayType (ClangASTType *element_type,
122                  uint64_t *size,
123                  bool *is_incomplete) const;
124 
125     bool
126     IsArrayOfScalarType () const;
127 
128     bool
129     IsAggregateType () const;
130 
131     bool
132     IsBeingDefined () const;
133 
134     bool
135     IsCharType () const;
136 
137     bool
138     IsCompleteType () const;
139 
140     bool
141     IsConst() const;
142 
143     bool
144     IsCStringType (uint32_t &length) const;
145 
146     bool
147     IsCXXClassType () const;
148 
149     bool
150     IsDefined() const;
151 
152     bool
153     IsFloatingPointType (uint32_t &count, bool &is_complex) const;
154 
155     bool
156     IsFunctionType (bool *is_variadic_ptr = NULL) const;
157 
158     bool
159     IsVariadicFunctionType () const;
160 
161     bool
162     IsFunctionPointerType () const;
163 
164     bool
165     IsIntegerType (bool &is_signed) const;
166 
167     bool
168     IsObjCClassType () const;
169 
170     bool
171     IsObjCClassTypeAndHasIVars (bool check_superclass) const;
172 
173     bool
174     IsObjCObjectOrInterfaceType () const;
175 
176     bool
177     IsObjCObjectPointerType (ClangASTType *target_type = NULL);
178 
179     bool
180     IsPolymorphicClass () const;
181 
182     bool
183     IsPossibleCPlusPlusDynamicType (ClangASTType *target_type = NULL) const
184     {
185         return IsPossibleDynamicType (target_type, true, false);
186     }
187 
188     bool
189     IsPossibleDynamicType (ClangASTType *target_type, // Can pass NULL
190                            bool check_cplusplus,
191                            bool check_objc) const;
192 
193 
194     bool
195     IsPointerToScalarType () const;
196 
197     bool
198     IsPointerType (ClangASTType *pointee_type = NULL) const;
199 
200     bool
201     IsPointerOrReferenceType (ClangASTType *pointee_type = NULL) const;
202 
203     bool
204     IsReferenceType (ClangASTType *pointee_type = NULL) const;
205 
206     bool
207     IsScalarType () const;
208 
209     bool
210     IsTypedefType () const;
211 
212     bool
213     IsVoidType () const;
214 
215     bool
216     GetCXXClassName (std::string &class_name) const;
217 
218     bool
219     GetObjCClassName (std::string &class_name);
220 
221 
222     //----------------------------------------------------------------------
223     // Type Completion
224     //----------------------------------------------------------------------
225 
226     bool
227     GetCompleteType () const;
228 
229     //----------------------------------------------------------------------
230     // AST related queries
231     //----------------------------------------------------------------------
232 
233     size_t
234     GetPointerByteSize () const;
235 
236     //----------------------------------------------------------------------
237     // Accessors
238     //----------------------------------------------------------------------
239 
240     clang::ASTContext *
GetASTContext()241     GetASTContext() const
242     {
243         return m_ast;
244     }
245 
246     ConstString
247     GetConstQualifiedTypeName () const;
248 
249     ConstString
250     GetConstTypeName () const;
251 
252     std::string
253     GetTypeName () const;
254 
255     uint32_t
256     GetTypeInfo (ClangASTType *pointee_or_element_clang_type = NULL) const;
257 
258     lldb::LanguageType
259     GetMinimumLanguage ();
260 
261     lldb::clang_type_t
GetOpaqueQualType()262     GetOpaqueQualType() const
263     {
264         return m_type;
265     }
266 
267     lldb::TypeClass
268     GetTypeClass () const;
269 
270     void
SetClangType(clang::ASTContext * ast,lldb::clang_type_t type)271     SetClangType (clang::ASTContext *ast, lldb::clang_type_t type)
272     {
273         m_ast = ast;
274         m_type = type;
275     }
276 
277     void
278     SetClangType (clang::ASTContext *ast, clang::QualType qual_type);
279 
280     unsigned
281     GetTypeQualifiers() const;
282 
283     //----------------------------------------------------------------------
284     // Creating related types
285     //----------------------------------------------------------------------
286 
287     ClangASTType
288     AddConstModifier () const;
289 
290     ClangASTType
291     AddRestrictModifier () const;
292 
293     ClangASTType
294     AddVolatileModifier () const;
295 
296     // Using the current type, create a new typedef to that type using "typedef_name"
297     // as the name and "decl_ctx" as the decl context.
298     ClangASTType
299     CreateTypedefType (const char *typedef_name,
300                        clang::DeclContext *decl_ctx) const;
301 
302     ClangASTType
303     GetArrayElementType (uint64_t& stride) const;
304 
305     ClangASTType
306     GetCanonicalType () const;
307 
308     ClangASTType
309     GetFullyUnqualifiedType () const;
310 
311     // Returns -1 if this isn't a function of if the fucntion doesn't have a prototype
312     // Returns a value >= 0 if there is a prototype.
313     int
314     GetFunctionArgumentCount () const;
315 
316     ClangASTType
317     GetFunctionArgumentTypeAtIndex (size_t idx);
318 
319     ClangASTType
320     GetFunctionReturnType () const;
321 
322     ClangASTType
323     GetLValueReferenceType () const;
324 
325     ClangASTType
326     GetNonReferenceType () const;
327 
328     ClangASTType
329     GetPointeeType () const;
330 
331     ClangASTType
332     GetPointerType () const;
333 
334     ClangASTType
335     GetRValueReferenceType () const;
336 
337     // If the current object represents a typedef type, get the underlying type
338     ClangASTType
339     GetTypedefedType () const;
340 
341     ClangASTType
342     RemoveFastQualifiers () const;
343 
344     //----------------------------------------------------------------------
345     // Create related types using the current type's AST
346     //----------------------------------------------------------------------
347     ClangASTType
348     GetBasicTypeFromAST (lldb::BasicType basic_type) const;
349 
350     //----------------------------------------------------------------------
351     // Exploring the type
352     //----------------------------------------------------------------------
353 
354     uint64_t
355     GetByteSize () const;
356 
357     uint64_t
358     GetBitSize () const;
359 
360     lldb::Encoding
361     GetEncoding (uint64_t &count) const;
362 
363     lldb::Format
364     GetFormat () const;
365 
366     size_t
367     GetTypeBitAlign () const;
368 
369     uint32_t
370     GetNumChildren (bool omit_empty_base_classes) const;
371 
372     lldb::BasicType
373     GetBasicTypeEnumeration () const;
374 
375     static lldb::BasicType
376     GetBasicTypeEnumeration (const ConstString &name);
377 
378     uint32_t
379     GetNumDirectBaseClasses () const;
380 
381     uint32_t
382     GetNumVirtualBaseClasses () const;
383 
384     uint32_t
385     GetNumFields () const;
386 
387     ClangASTType
388     GetDirectBaseClassAtIndex (size_t idx,
389                                uint32_t *bit_offset_ptr) const;
390 
391     ClangASTType
392     GetVirtualBaseClassAtIndex (size_t idx,
393                                 uint32_t *bit_offset_ptr) const;
394 
395     ClangASTType
396     GetFieldAtIndex (size_t idx,
397                      std::string& name,
398                      uint64_t *bit_offset_ptr,
399                      uint32_t *bitfield_bit_size_ptr,
400                      bool *is_bitfield_ptr) const;
401 
402     uint32_t
403     GetIndexOfFieldWithName (const char* name,
404                              ClangASTType* field_clang_type = NULL,
405                              uint64_t *bit_offset_ptr = NULL,
406                              uint32_t *bitfield_bit_size_ptr = NULL,
407                              bool *is_bitfield_ptr = NULL) const;
408 
409     uint32_t
410     GetNumPointeeChildren () const;
411 
412     ClangASTType
413     GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
414                               const char *parent_name,
415                               size_t idx,
416                               bool transparent_pointers,
417                               bool omit_empty_base_classes,
418                               bool ignore_array_bounds,
419                               std::string& child_name,
420                               uint32_t &child_byte_size,
421                               int32_t &child_byte_offset,
422                               uint32_t &child_bitfield_bit_size,
423                               uint32_t &child_bitfield_bit_offset,
424                               bool &child_is_base_class,
425                               bool &child_is_deref_of_parent) const;
426 
427     // Lookup a child given a name. This function will match base class names
428     // and member member names in "clang_type" only, not descendants.
429     uint32_t
430     GetIndexOfChildWithName (const char *name,
431                              bool omit_empty_base_classes) const;
432 
433     // Lookup a child member given a name. This function will match member names
434     // only and will descend into "clang_type" children in search for the first
435     // member in this class, or any base class that matches "name".
436     // TODO: Return all matches for a given name by returning a vector<vector<uint32_t>>
437     // so we catch all names that match a given child name, not just the first.
438     size_t
439     GetIndexOfChildMemberWithName (const char *name,
440                                    bool omit_empty_base_classes,
441                                    std::vector<uint32_t>& child_indexes) const;
442 
443     size_t
444     GetNumTemplateArguments () const;
445 
446     ClangASTType
447     GetTemplateArgument (size_t idx,
448                          lldb::TemplateArgumentKind &kind) const;
449 
450 
451     //----------------------------------------------------------------------
452     // Modifying RecordType
453     //----------------------------------------------------------------------
454     clang::FieldDecl *
455     AddFieldToRecordType (const char *name,
456                           const ClangASTType &field_type,
457                           lldb::AccessType access,
458                           uint32_t bitfield_bit_size);
459 
460     void
461     BuildIndirectFields ();
462 
463     clang::VarDecl *
464     AddVariableToRecordType (const char *name,
465                              const ClangASTType &var_type,
466                              lldb::AccessType access);
467 
468     clang::CXXMethodDecl *
469     AddMethodToCXXRecordType (const char *name,
470                               const ClangASTType &method_type,
471                               lldb::AccessType access,
472                               bool is_virtual,
473                               bool is_static,
474                               bool is_inline,
475                               bool is_explicit,
476                               bool is_attr_used,
477                               bool is_artificial);
478 
479     // C++ Base Classes
480     clang::CXXBaseSpecifier *
481     CreateBaseClassSpecifier (lldb::AccessType access,
482                               bool is_virtual,
483                               bool base_of_class);
484 
485     static void
486     DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes,
487                                unsigned num_base_classes);
488 
489     bool
490     SetBaseClassesForClassType (clang::CXXBaseSpecifier const * const *base_classes,
491                                 unsigned num_base_classes);
492 
493 
494     bool
495     SetObjCSuperClass (const ClangASTType &superclass_clang_type);
496 
497     bool
498     AddObjCClassProperty (const char *property_name,
499                           const ClangASTType &property_clang_type,
500                           clang::ObjCIvarDecl *ivar_decl,
501                           const char *property_setter_name,
502                           const char *property_getter_name,
503                           uint32_t property_attributes,
504                           ClangASTMetadata *metadata);
505 
506     clang::ObjCMethodDecl *
507     AddMethodToObjCObjectType (const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
508                                const ClangASTType &method_clang_type,
509                                lldb::AccessType access,
510                                bool is_artificial);
511 
512     clang::DeclContext *
513     GetDeclContextForType () const;
514 
515 
516     bool
517     SetDefaultAccessForRecordFields (int default_accessibility,
518                                      int *assigned_accessibilities,
519                                      size_t num_assigned_accessibilities);
520 
521     bool
522     SetHasExternalStorage (bool has_extern);
523 
524 
525     //------------------------------------------------------------------
526     // clang::TagType
527     //------------------------------------------------------------------
528 
529     bool
530     SetTagTypeKind (int kind) const;
531 
532     //------------------------------------------------------------------
533     // Tag Declarations
534     //------------------------------------------------------------------
535     bool
536     StartTagDeclarationDefinition ();
537 
538     bool
539     CompleteTagDeclarationDefinition ();
540 
541     //----------------------------------------------------------------------
542     // Modifying Enumeration types
543     //----------------------------------------------------------------------
544     bool
545     AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_qual_type,
546                                           const Declaration &decl,
547                                           const char *name,
548                                           int64_t enum_value,
549                                           uint32_t enum_value_bit_size);
550 
551 
552 
553     ClangASTType
554     GetEnumerationIntegerType () const;
555 
556 
557     //------------------------------------------------------------------
558     // Pointers & References
559     //------------------------------------------------------------------
560 
561     // Call this function using the class type when you want to make a
562     // member pointer type to pointee_type.
563     ClangASTType
564     CreateMemberPointerType (const ClangASTType &pointee_type) const;
565 
566 
567     // Converts "s" to a floating point value and place resulting floating
568     // point bytes in the "dst" buffer.
569     size_t
570     ConvertStringToFloatValue (const char *s,
571                                uint8_t *dst,
572                                size_t dst_size) const;
573     //----------------------------------------------------------------------
574     // Dumping types
575     //----------------------------------------------------------------------
576     void
577     DumpValue (ExecutionContext *exe_ctx,
578                Stream *s,
579                lldb::Format format,
580                const DataExtractor &data,
581                lldb::offset_t data_offset,
582                size_t data_byte_size,
583                uint32_t bitfield_bit_size,
584                uint32_t bitfield_bit_offset,
585                bool show_types,
586                bool show_summary,
587                bool verbose,
588                uint32_t depth);
589 
590     bool
591     DumpTypeValue (Stream *s,
592                    lldb::Format format,
593                    const DataExtractor &data,
594                    lldb::offset_t data_offset,
595                    size_t data_byte_size,
596                    uint32_t bitfield_bit_size,
597                    uint32_t bitfield_bit_offset,
598                    ExecutionContextScope *exe_scope);
599 
600     void
601     DumpSummary (ExecutionContext *exe_ctx,
602                  Stream *s,
603                  const DataExtractor &data,
604                  lldb::offset_t data_offset,
605                  size_t data_byte_size);
606 
607     void
608     DumpTypeDescription () const; // Dump to stdout
609 
610     void
611     DumpTypeDescription (Stream *s) const;
612 
613     bool
614     GetValueAsScalar (const DataExtractor &data,
615                       lldb::offset_t data_offset,
616                       size_t data_byte_size,
617                       Scalar &value) const;
618 
619     bool
620     SetValueFromScalar (const Scalar &value,
621                         Stream &strm);
622 
623     bool
624     ReadFromMemory (ExecutionContext *exe_ctx,
625                     lldb::addr_t addr,
626                     AddressType address_type,
627                     DataExtractor &data);
628 
629     bool
630     WriteToMemory (ExecutionContext *exe_ctx,
631                    lldb::addr_t addr,
632                    AddressType address_type,
633                    StreamString &new_value);
634 
635 
636     clang::RecordDecl *
637     GetAsRecordDecl () const;
638 
639     clang::CXXRecordDecl *
640     GetAsCXXRecordDecl () const;
641 
642     clang::ObjCInterfaceDecl *
643     GetAsObjCInterfaceDecl () const;
644 
645     void
Clear()646     Clear()
647     {
648         m_type = NULL;
649         m_ast = NULL;
650     }
651 
652     clang::QualType
GetQualType()653     GetQualType () const
654     {
655         if (m_type)
656             return clang::QualType::getFromOpaquePtr(m_type);
657         return clang::QualType();
658     }
659     clang::QualType
GetCanonicalQualType()660     GetCanonicalQualType () const
661     {
662         if (m_type)
663             return clang::QualType::getFromOpaquePtr(m_type).getCanonicalType();
664         return clang::QualType();
665     }
666 
667 private:
668     lldb::clang_type_t m_type;
669     clang::ASTContext *m_ast;
670 
671 };
672 
673 bool operator == (const ClangASTType &lhs, const ClangASTType &rhs);
674 bool operator != (const ClangASTType &lhs, const ClangASTType &rhs);
675 
676 
677 } // namespace lldb_private
678 
679 #endif // #ifndef liblldb_ClangASTType_h_
680