1254721Semaste//===-- ClangASTType.h ------------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#ifndef liblldb_ClangASTType_h_
11254721Semaste#define liblldb_ClangASTType_h_
12254721Semaste
13254721Semaste#include <string>
14254721Semaste#include "lldb/lldb-private.h"
15254721Semaste#include "lldb/Core/ClangForward.h"
16254721Semaste#include "clang/AST/Type.h"
17254721Semaste
18254721Semastenamespace lldb_private {
19254721Semaste
20254721Semaste//----------------------------------------------------------------------
21254721Semaste// A class that can carry around a clang ASTContext and a opaque clang
22254721Semaste// QualType. A clang::QualType can be easily reconstructed from an
23254721Semaste// opaque clang type and often the ASTContext is needed when doing
24254721Semaste// various type related tasks, so this class allows both items to travel
25254721Semaste// in a single very lightweight class that can be used. There are many
26254721Semaste// static equivalents of the member functions that allow the ASTContext
27254721Semaste// and the opaque clang QualType to be specified for ease of use and
28254721Semaste// to avoid code duplication.
29254721Semaste//----------------------------------------------------------------------
30254721Semasteclass ClangASTType
31254721Semaste{
32254721Semastepublic:
33254721Semaste    enum {
34254721Semaste        eTypeHasChildren        = (1u <<  0),
35254721Semaste        eTypeHasValue           = (1u <<  1),
36254721Semaste        eTypeIsArray            = (1u <<  2),
37254721Semaste        eTypeIsBlock            = (1u <<  3),
38254721Semaste        eTypeIsBuiltIn          = (1u <<  4),
39254721Semaste        eTypeIsClass            = (1u <<  5),
40254721Semaste        eTypeIsCPlusPlus        = (1u <<  6),
41254721Semaste        eTypeIsEnumeration      = (1u <<  7),
42254721Semaste        eTypeIsFuncPrototype    = (1u <<  8),
43254721Semaste        eTypeIsMember           = (1u <<  9),
44254721Semaste        eTypeIsObjC             = (1u << 10),
45254721Semaste        eTypeIsPointer          = (1u << 11),
46254721Semaste        eTypeIsReference        = (1u << 12),
47254721Semaste        eTypeIsStructUnion      = (1u << 13),
48254721Semaste        eTypeIsTemplate         = (1u << 14),
49254721Semaste        eTypeIsTypedef          = (1u << 15),
50254721Semaste        eTypeIsVector           = (1u << 16),
51254721Semaste        eTypeIsScalar           = (1u << 17),
52254721Semaste        eTypeIsInteger          = (1u << 18),
53254721Semaste        eTypeIsFloat            = (1u << 19),
54254721Semaste        eTypeIsComplex          = (1u << 20),
55254721Semaste        eTypeIsSigned           = (1u << 21)
56254721Semaste    };
57254721Semaste
58254721Semaste
59254721Semaste    //----------------------------------------------------------------------
60254721Semaste    // Constructors and Destructors
61254721Semaste    //----------------------------------------------------------------------
62254721Semaste    ClangASTType (clang::ASTContext *ast_context, lldb::clang_type_t type) :
63254721Semaste        m_type (type),
64254721Semaste        m_ast  (ast_context)
65254721Semaste    {
66254721Semaste    }
67254721Semaste
68254721Semaste    ClangASTType (clang::ASTContext *ast_context, clang::QualType qual_type);
69254721Semaste
70254721Semaste    ClangASTType (const ClangASTType &rhs) :
71254721Semaste        m_type (rhs.m_type),
72254721Semaste        m_ast  (rhs.m_ast)
73254721Semaste    {
74254721Semaste    }
75254721Semaste
76254721Semaste    ClangASTType () :
77254721Semaste        m_type (0),
78254721Semaste        m_ast  (0)
79254721Semaste    {
80254721Semaste    }
81254721Semaste
82254721Semaste    ~ClangASTType();
83254721Semaste
84254721Semaste    //----------------------------------------------------------------------
85254721Semaste    // Operators
86254721Semaste    //----------------------------------------------------------------------
87254721Semaste
88254721Semaste    const ClangASTType &
89254721Semaste    operator= (const ClangASTType &rhs)
90254721Semaste    {
91254721Semaste        m_type = rhs.m_type;
92254721Semaste        m_ast = rhs.m_ast;
93254721Semaste        return *this;
94254721Semaste    }
95254721Semaste
96254721Semaste
97254721Semaste    //----------------------------------------------------------------------
98254721Semaste    // Tests
99254721Semaste    //----------------------------------------------------------------------
100254721Semaste
101263363Semaste    explicit operator bool () const
102254721Semaste    {
103254721Semaste        return m_type != NULL && m_ast != NULL;
104254721Semaste    }
105254721Semaste
106254721Semaste    bool
107254721Semaste    operator < (const ClangASTType &rhs) const
108254721Semaste    {
109254721Semaste        if (m_ast == rhs.m_ast)
110254721Semaste            return m_type < rhs.m_type;
111254721Semaste        return m_ast < rhs.m_ast;
112254721Semaste    }
113254721Semaste
114254721Semaste    bool
115254721Semaste    IsValid () const
116254721Semaste    {
117254721Semaste        return m_type != NULL && m_ast != NULL;
118254721Semaste    }
119254721Semaste
120254721Semaste    bool
121254721Semaste    IsArrayType (ClangASTType *element_type,
122254721Semaste                 uint64_t *size,
123254721Semaste                 bool *is_incomplete) const;
124254721Semaste
125254721Semaste    bool
126254721Semaste    IsArrayOfScalarType () const;
127254721Semaste
128254721Semaste    bool
129254721Semaste    IsAggregateType () const;
130254721Semaste
131254721Semaste    bool
132254721Semaste    IsBeingDefined () const;
133254721Semaste
134254721Semaste    bool
135254721Semaste    IsCharType () const;
136254721Semaste
137254721Semaste    bool
138254721Semaste    IsCompleteType () const;
139254721Semaste
140254721Semaste    bool
141254721Semaste    IsConst() const;
142254721Semaste
143254721Semaste    bool
144254721Semaste    IsCStringType (uint32_t &length) const;
145254721Semaste
146254721Semaste    bool
147254721Semaste    IsCXXClassType () const;
148254721Semaste
149254721Semaste    bool
150254721Semaste    IsDefined() const;
151254721Semaste
152254721Semaste    bool
153254721Semaste    IsFloatingPointType (uint32_t &count, bool &is_complex) const;
154254721Semaste
155254721Semaste    bool
156254721Semaste    IsFunctionType (bool *is_variadic_ptr = NULL) const;
157254721Semaste
158263363Semaste    size_t
159263363Semaste    GetNumberOfFunctionArguments () const;
160263363Semaste
161263363Semaste    ClangASTType
162263363Semaste    GetFunctionArgumentAtIndex (const size_t index);
163263363Semaste
164254721Semaste    bool
165254721Semaste    IsVariadicFunctionType () const;
166254721Semaste
167254721Semaste    bool
168254721Semaste    IsFunctionPointerType () const;
169254721Semaste
170254721Semaste    bool
171254721Semaste    IsIntegerType (bool &is_signed) const;
172254721Semaste
173254721Semaste    bool
174254721Semaste    IsObjCClassType () const;
175254721Semaste
176254721Semaste    bool
177254721Semaste    IsObjCClassTypeAndHasIVars (bool check_superclass) const;
178254721Semaste
179254721Semaste    bool
180254721Semaste    IsObjCObjectOrInterfaceType () const;
181254721Semaste
182254721Semaste    bool
183254721Semaste    IsObjCObjectPointerType (ClangASTType *target_type = NULL);
184254721Semaste
185254721Semaste    bool
186254721Semaste    IsPolymorphicClass () const;
187254721Semaste
188254721Semaste    bool
189254721Semaste    IsPossibleCPlusPlusDynamicType (ClangASTType *target_type = NULL) const
190254721Semaste    {
191254721Semaste        return IsPossibleDynamicType (target_type, true, false);
192254721Semaste    }
193254721Semaste
194254721Semaste    bool
195254721Semaste    IsPossibleDynamicType (ClangASTType *target_type, // Can pass NULL
196254721Semaste                           bool check_cplusplus,
197254721Semaste                           bool check_objc) const;
198254721Semaste
199254721Semaste
200254721Semaste    bool
201254721Semaste    IsPointerToScalarType () const;
202254721Semaste
203254721Semaste    bool
204263363Semaste    IsRuntimeGeneratedType () const;
205263363Semaste
206263363Semaste    bool
207254721Semaste    IsPointerType (ClangASTType *pointee_type = NULL) const;
208254721Semaste
209254721Semaste    bool
210254721Semaste    IsPointerOrReferenceType (ClangASTType *pointee_type = NULL) const;
211254721Semaste
212254721Semaste    bool
213254721Semaste    IsReferenceType (ClangASTType *pointee_type = NULL) const;
214254721Semaste
215254721Semaste    bool
216254721Semaste    IsScalarType () const;
217254721Semaste
218254721Semaste    bool
219254721Semaste    IsTypedefType () const;
220254721Semaste
221254721Semaste    bool
222254721Semaste    IsVoidType () const;
223254721Semaste
224254721Semaste    bool
225254721Semaste    GetCXXClassName (std::string &class_name) const;
226254721Semaste
227254721Semaste    bool
228254721Semaste    GetObjCClassName (std::string &class_name);
229254721Semaste
230254721Semaste
231254721Semaste    //----------------------------------------------------------------------
232254721Semaste    // Type Completion
233254721Semaste    //----------------------------------------------------------------------
234254721Semaste
235254721Semaste    bool
236254721Semaste    GetCompleteType () const;
237254721Semaste
238254721Semaste    //----------------------------------------------------------------------
239254721Semaste    // AST related queries
240254721Semaste    //----------------------------------------------------------------------
241254721Semaste
242254721Semaste    size_t
243254721Semaste    GetPointerByteSize () const;
244254721Semaste
245254721Semaste    //----------------------------------------------------------------------
246254721Semaste    // Accessors
247254721Semaste    //----------------------------------------------------------------------
248254721Semaste
249254721Semaste    clang::ASTContext *
250254721Semaste    GetASTContext() const
251254721Semaste    {
252254721Semaste        return m_ast;
253254721Semaste    }
254254721Semaste
255254721Semaste    ConstString
256254721Semaste    GetConstQualifiedTypeName () const;
257254721Semaste
258254721Semaste    ConstString
259254721Semaste    GetConstTypeName () const;
260254721Semaste
261263363Semaste    ConstString
262254721Semaste    GetTypeName () const;
263254721Semaste
264254721Semaste    uint32_t
265254721Semaste    GetTypeInfo (ClangASTType *pointee_or_element_clang_type = NULL) const;
266254721Semaste
267254721Semaste    lldb::LanguageType
268254721Semaste    GetMinimumLanguage ();
269254721Semaste
270254721Semaste    lldb::clang_type_t
271254721Semaste    GetOpaqueQualType() const
272254721Semaste    {
273254721Semaste        return m_type;
274254721Semaste    }
275254721Semaste
276254721Semaste    lldb::TypeClass
277254721Semaste    GetTypeClass () const;
278254721Semaste
279254721Semaste    void
280254721Semaste    SetClangType (clang::ASTContext *ast, lldb::clang_type_t type)
281254721Semaste    {
282254721Semaste        m_ast = ast;
283254721Semaste        m_type = type;
284254721Semaste    }
285254721Semaste
286254721Semaste    void
287254721Semaste    SetClangType (clang::ASTContext *ast, clang::QualType qual_type);
288254721Semaste
289254721Semaste    unsigned
290254721Semaste    GetTypeQualifiers() const;
291254721Semaste
292254721Semaste    //----------------------------------------------------------------------
293254721Semaste    // Creating related types
294254721Semaste    //----------------------------------------------------------------------
295254721Semaste
296254721Semaste    ClangASTType
297254721Semaste    AddConstModifier () const;
298254721Semaste
299254721Semaste    ClangASTType
300254721Semaste    AddRestrictModifier () const;
301254721Semaste
302254721Semaste    ClangASTType
303254721Semaste    AddVolatileModifier () const;
304254721Semaste
305254721Semaste    // Using the current type, create a new typedef to that type using "typedef_name"
306254721Semaste    // as the name and "decl_ctx" as the decl context.
307254721Semaste    ClangASTType
308254721Semaste    CreateTypedefType (const char *typedef_name,
309254721Semaste                       clang::DeclContext *decl_ctx) const;
310254721Semaste
311254721Semaste    ClangASTType
312254721Semaste    GetArrayElementType (uint64_t& stride) const;
313254721Semaste
314254721Semaste    ClangASTType
315254721Semaste    GetCanonicalType () const;
316254721Semaste
317254721Semaste    ClangASTType
318254721Semaste    GetFullyUnqualifiedType () const;
319254721Semaste
320254721Semaste    // Returns -1 if this isn't a function of if the fucntion doesn't have a prototype
321254721Semaste    // Returns a value >= 0 if there is a prototype.
322254721Semaste    int
323254721Semaste    GetFunctionArgumentCount () const;
324254721Semaste
325254721Semaste    ClangASTType
326254721Semaste    GetFunctionArgumentTypeAtIndex (size_t idx);
327254721Semaste
328254721Semaste    ClangASTType
329254721Semaste    GetFunctionReturnType () const;
330254721Semaste
331254721Semaste    ClangASTType
332254721Semaste    GetLValueReferenceType () const;
333254721Semaste
334254721Semaste    ClangASTType
335254721Semaste    GetNonReferenceType () const;
336254721Semaste
337254721Semaste    ClangASTType
338254721Semaste    GetPointeeType () const;
339254721Semaste
340254721Semaste    ClangASTType
341254721Semaste    GetPointerType () const;
342254721Semaste
343254721Semaste    ClangASTType
344254721Semaste    GetRValueReferenceType () const;
345254721Semaste
346254721Semaste    // If the current object represents a typedef type, get the underlying type
347254721Semaste    ClangASTType
348254721Semaste    GetTypedefedType () const;
349254721Semaste
350254721Semaste    ClangASTType
351254721Semaste    RemoveFastQualifiers () const;
352254721Semaste
353254721Semaste    //----------------------------------------------------------------------
354254721Semaste    // Create related types using the current type's AST
355254721Semaste    //----------------------------------------------------------------------
356254721Semaste    ClangASTType
357254721Semaste    GetBasicTypeFromAST (lldb::BasicType basic_type) const;
358254721Semaste
359254721Semaste    //----------------------------------------------------------------------
360254721Semaste    // Exploring the type
361254721Semaste    //----------------------------------------------------------------------
362254721Semaste
363254721Semaste    uint64_t
364254721Semaste    GetByteSize () const;
365254721Semaste
366254721Semaste    uint64_t
367254721Semaste    GetBitSize () const;
368254721Semaste
369254721Semaste    lldb::Encoding
370254721Semaste    GetEncoding (uint64_t &count) const;
371254721Semaste
372254721Semaste    lldb::Format
373254721Semaste    GetFormat () const;
374254721Semaste
375254721Semaste    size_t
376254721Semaste    GetTypeBitAlign () const;
377254721Semaste
378254721Semaste    uint32_t
379254721Semaste    GetNumChildren (bool omit_empty_base_classes) const;
380254721Semaste
381254721Semaste    lldb::BasicType
382254721Semaste    GetBasicTypeEnumeration () const;
383254721Semaste
384254721Semaste    static lldb::BasicType
385254721Semaste    GetBasicTypeEnumeration (const ConstString &name);
386254721Semaste
387254721Semaste    uint32_t
388254721Semaste    GetNumDirectBaseClasses () const;
389254721Semaste
390254721Semaste    uint32_t
391254721Semaste    GetNumVirtualBaseClasses () const;
392254721Semaste
393254721Semaste    uint32_t
394254721Semaste    GetNumFields () const;
395254721Semaste
396254721Semaste    ClangASTType
397254721Semaste    GetDirectBaseClassAtIndex (size_t idx,
398254721Semaste                               uint32_t *bit_offset_ptr) const;
399254721Semaste
400254721Semaste    ClangASTType
401254721Semaste    GetVirtualBaseClassAtIndex (size_t idx,
402254721Semaste                                uint32_t *bit_offset_ptr) const;
403254721Semaste
404254721Semaste    ClangASTType
405254721Semaste    GetFieldAtIndex (size_t idx,
406254721Semaste                     std::string& name,
407254721Semaste                     uint64_t *bit_offset_ptr,
408254721Semaste                     uint32_t *bitfield_bit_size_ptr,
409254721Semaste                     bool *is_bitfield_ptr) const;
410254721Semaste
411254721Semaste    uint32_t
412254721Semaste    GetIndexOfFieldWithName (const char* name,
413254721Semaste                             ClangASTType* field_clang_type = NULL,
414254721Semaste                             uint64_t *bit_offset_ptr = NULL,
415254721Semaste                             uint32_t *bitfield_bit_size_ptr = NULL,
416254721Semaste                             bool *is_bitfield_ptr = NULL) const;
417254721Semaste
418254721Semaste    uint32_t
419254721Semaste    GetNumPointeeChildren () const;
420254721Semaste
421254721Semaste    ClangASTType
422254721Semaste    GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
423254721Semaste                              const char *parent_name,
424254721Semaste                              size_t idx,
425254721Semaste                              bool transparent_pointers,
426254721Semaste                              bool omit_empty_base_classes,
427254721Semaste                              bool ignore_array_bounds,
428254721Semaste                              std::string& child_name,
429254721Semaste                              uint32_t &child_byte_size,
430254721Semaste                              int32_t &child_byte_offset,
431254721Semaste                              uint32_t &child_bitfield_bit_size,
432254721Semaste                              uint32_t &child_bitfield_bit_offset,
433254721Semaste                              bool &child_is_base_class,
434254721Semaste                              bool &child_is_deref_of_parent) const;
435254721Semaste
436254721Semaste    // Lookup a child given a name. This function will match base class names
437254721Semaste    // and member member names in "clang_type" only, not descendants.
438254721Semaste    uint32_t
439254721Semaste    GetIndexOfChildWithName (const char *name,
440254721Semaste                             bool omit_empty_base_classes) const;
441254721Semaste
442254721Semaste    // Lookup a child member given a name. This function will match member names
443254721Semaste    // only and will descend into "clang_type" children in search for the first
444254721Semaste    // member in this class, or any base class that matches "name".
445254721Semaste    // TODO: Return all matches for a given name by returning a vector<vector<uint32_t>>
446254721Semaste    // so we catch all names that match a given child name, not just the first.
447254721Semaste    size_t
448254721Semaste    GetIndexOfChildMemberWithName (const char *name,
449254721Semaste                                   bool omit_empty_base_classes,
450254721Semaste                                   std::vector<uint32_t>& child_indexes) const;
451254721Semaste
452254721Semaste    size_t
453254721Semaste    GetNumTemplateArguments () const;
454254721Semaste
455254721Semaste    ClangASTType
456254721Semaste    GetTemplateArgument (size_t idx,
457254721Semaste                         lldb::TemplateArgumentKind &kind) const;
458254721Semaste
459254721Semaste
460254721Semaste    //----------------------------------------------------------------------
461254721Semaste    // Modifying RecordType
462254721Semaste    //----------------------------------------------------------------------
463254721Semaste    clang::FieldDecl *
464254721Semaste    AddFieldToRecordType (const char *name,
465254721Semaste                          const ClangASTType &field_type,
466254721Semaste                          lldb::AccessType access,
467254721Semaste                          uint32_t bitfield_bit_size);
468254721Semaste
469254721Semaste    void
470254721Semaste    BuildIndirectFields ();
471254721Semaste
472254721Semaste    clang::VarDecl *
473254721Semaste    AddVariableToRecordType (const char *name,
474254721Semaste                             const ClangASTType &var_type,
475254721Semaste                             lldb::AccessType access);
476254721Semaste
477254721Semaste    clang::CXXMethodDecl *
478254721Semaste    AddMethodToCXXRecordType (const char *name,
479254721Semaste                              const ClangASTType &method_type,
480254721Semaste                              lldb::AccessType access,
481254721Semaste                              bool is_virtual,
482254721Semaste                              bool is_static,
483254721Semaste                              bool is_inline,
484254721Semaste                              bool is_explicit,
485254721Semaste                              bool is_attr_used,
486254721Semaste                              bool is_artificial);
487254721Semaste
488254721Semaste    // C++ Base Classes
489254721Semaste    clang::CXXBaseSpecifier *
490254721Semaste    CreateBaseClassSpecifier (lldb::AccessType access,
491254721Semaste                              bool is_virtual,
492254721Semaste                              bool base_of_class);
493254721Semaste
494254721Semaste    static void
495254721Semaste    DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes,
496254721Semaste                               unsigned num_base_classes);
497254721Semaste
498254721Semaste    bool
499254721Semaste    SetBaseClassesForClassType (clang::CXXBaseSpecifier const * const *base_classes,
500254721Semaste                                unsigned num_base_classes);
501254721Semaste
502254721Semaste
503254721Semaste    bool
504254721Semaste    SetObjCSuperClass (const ClangASTType &superclass_clang_type);
505254721Semaste
506254721Semaste    bool
507254721Semaste    AddObjCClassProperty (const char *property_name,
508254721Semaste                          const ClangASTType &property_clang_type,
509254721Semaste                          clang::ObjCIvarDecl *ivar_decl,
510254721Semaste                          const char *property_setter_name,
511254721Semaste                          const char *property_getter_name,
512254721Semaste                          uint32_t property_attributes,
513254721Semaste                          ClangASTMetadata *metadata);
514254721Semaste
515254721Semaste    clang::ObjCMethodDecl *
516254721Semaste    AddMethodToObjCObjectType (const char *name,  // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
517254721Semaste                               const ClangASTType &method_clang_type,
518254721Semaste                               lldb::AccessType access,
519254721Semaste                               bool is_artificial);
520254721Semaste
521254721Semaste    clang::DeclContext *
522254721Semaste    GetDeclContextForType () const;
523254721Semaste
524254721Semaste
525254721Semaste    bool
526254721Semaste    SetDefaultAccessForRecordFields (int default_accessibility,
527254721Semaste                                     int *assigned_accessibilities,
528254721Semaste                                     size_t num_assigned_accessibilities);
529254721Semaste
530254721Semaste    bool
531254721Semaste    SetHasExternalStorage (bool has_extern);
532254721Semaste
533254721Semaste
534254721Semaste    //------------------------------------------------------------------
535254721Semaste    // clang::TagType
536254721Semaste    //------------------------------------------------------------------
537254721Semaste
538254721Semaste    bool
539254721Semaste    SetTagTypeKind (int kind) const;
540254721Semaste
541254721Semaste    //------------------------------------------------------------------
542254721Semaste    // Tag Declarations
543254721Semaste    //------------------------------------------------------------------
544254721Semaste    bool
545254721Semaste    StartTagDeclarationDefinition ();
546254721Semaste
547254721Semaste    bool
548254721Semaste    CompleteTagDeclarationDefinition ();
549254721Semaste
550254721Semaste    //----------------------------------------------------------------------
551254721Semaste    // Modifying Enumeration types
552254721Semaste    //----------------------------------------------------------------------
553254721Semaste    bool
554254721Semaste    AddEnumerationValueToEnumerationType (const ClangASTType &enumerator_qual_type,
555254721Semaste                                          const Declaration &decl,
556254721Semaste                                          const char *name,
557254721Semaste                                          int64_t enum_value,
558254721Semaste                                          uint32_t enum_value_bit_size);
559254721Semaste
560254721Semaste
561254721Semaste
562254721Semaste    ClangASTType
563254721Semaste    GetEnumerationIntegerType () const;
564254721Semaste
565254721Semaste
566254721Semaste    //------------------------------------------------------------------
567254721Semaste    // Pointers & References
568254721Semaste    //------------------------------------------------------------------
569254721Semaste
570254721Semaste    // Call this function using the class type when you want to make a
571254721Semaste    // member pointer type to pointee_type.
572254721Semaste    ClangASTType
573254721Semaste    CreateMemberPointerType (const ClangASTType &pointee_type) const;
574254721Semaste
575254721Semaste
576254721Semaste    // Converts "s" to a floating point value and place resulting floating
577254721Semaste    // point bytes in the "dst" buffer.
578254721Semaste    size_t
579254721Semaste    ConvertStringToFloatValue (const char *s,
580254721Semaste                               uint8_t *dst,
581254721Semaste                               size_t dst_size) const;
582254721Semaste    //----------------------------------------------------------------------
583254721Semaste    // Dumping types
584254721Semaste    //----------------------------------------------------------------------
585254721Semaste    void
586254721Semaste    DumpValue (ExecutionContext *exe_ctx,
587254721Semaste               Stream *s,
588254721Semaste               lldb::Format format,
589254721Semaste               const DataExtractor &data,
590254721Semaste               lldb::offset_t data_offset,
591254721Semaste               size_t data_byte_size,
592254721Semaste               uint32_t bitfield_bit_size,
593254721Semaste               uint32_t bitfield_bit_offset,
594254721Semaste               bool show_types,
595254721Semaste               bool show_summary,
596254721Semaste               bool verbose,
597254721Semaste               uint32_t depth);
598254721Semaste
599254721Semaste    bool
600254721Semaste    DumpTypeValue (Stream *s,
601254721Semaste                   lldb::Format format,
602254721Semaste                   const DataExtractor &data,
603254721Semaste                   lldb::offset_t data_offset,
604254721Semaste                   size_t data_byte_size,
605254721Semaste                   uint32_t bitfield_bit_size,
606254721Semaste                   uint32_t bitfield_bit_offset,
607254721Semaste                   ExecutionContextScope *exe_scope);
608254721Semaste
609254721Semaste    void
610254721Semaste    DumpSummary (ExecutionContext *exe_ctx,
611254721Semaste                 Stream *s,
612254721Semaste                 const DataExtractor &data,
613254721Semaste                 lldb::offset_t data_offset,
614254721Semaste                 size_t data_byte_size);
615254721Semaste
616254721Semaste    void
617254721Semaste    DumpTypeDescription () const; // Dump to stdout
618254721Semaste
619254721Semaste    void
620254721Semaste    DumpTypeDescription (Stream *s) const;
621254721Semaste
622254721Semaste    bool
623254721Semaste    GetValueAsScalar (const DataExtractor &data,
624254721Semaste                      lldb::offset_t data_offset,
625254721Semaste                      size_t data_byte_size,
626254721Semaste                      Scalar &value) const;
627254721Semaste
628254721Semaste    bool
629254721Semaste    SetValueFromScalar (const Scalar &value,
630254721Semaste                        Stream &strm);
631254721Semaste
632254721Semaste    bool
633254721Semaste    ReadFromMemory (ExecutionContext *exe_ctx,
634254721Semaste                    lldb::addr_t addr,
635254721Semaste                    AddressType address_type,
636254721Semaste                    DataExtractor &data);
637254721Semaste
638254721Semaste    bool
639254721Semaste    WriteToMemory (ExecutionContext *exe_ctx,
640254721Semaste                   lldb::addr_t addr,
641254721Semaste                   AddressType address_type,
642254721Semaste                   StreamString &new_value);
643254721Semaste
644254721Semaste
645254721Semaste    clang::RecordDecl *
646254721Semaste    GetAsRecordDecl () const;
647254721Semaste
648254721Semaste    clang::CXXRecordDecl *
649254721Semaste    GetAsCXXRecordDecl () const;
650254721Semaste
651254721Semaste    clang::ObjCInterfaceDecl *
652254721Semaste    GetAsObjCInterfaceDecl () const;
653254721Semaste
654254721Semaste    void
655254721Semaste    Clear()
656254721Semaste    {
657254721Semaste        m_type = NULL;
658254721Semaste        m_ast = NULL;
659254721Semaste    }
660254721Semaste
661254721Semaste    clang::QualType
662254721Semaste    GetQualType () const
663254721Semaste    {
664254721Semaste        if (m_type)
665254721Semaste            return clang::QualType::getFromOpaquePtr(m_type);
666254721Semaste        return clang::QualType();
667254721Semaste    }
668254721Semaste    clang::QualType
669254721Semaste    GetCanonicalQualType () const
670254721Semaste    {
671254721Semaste        if (m_type)
672254721Semaste            return clang::QualType::getFromOpaquePtr(m_type).getCanonicalType();
673254721Semaste        return clang::QualType();
674254721Semaste    }
675254721Semaste
676254721Semasteprivate:
677254721Semaste    lldb::clang_type_t m_type;
678254721Semaste    clang::ASTContext *m_ast;
679254721Semaste
680254721Semaste};
681254721Semaste
682254721Semastebool operator == (const ClangASTType &lhs, const ClangASTType &rhs);
683254721Semastebool operator != (const ClangASTType &lhs, const ClangASTType &rhs);
684254721Semaste
685254721Semaste
686254721Semaste} // namespace lldb_private
687254721Semaste
688254721Semaste#endif // #ifndef liblldb_ClangASTType_h_
689