Type.h revision f6132ef983e8a5b98fbe5e184f5128eff8c04730
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Type.h --------------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Type_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Type_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ClangForward.h"
15ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham#include "lldb/Core/ConstString.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
170fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton#include "lldb/Symbol/ClangASTType.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Declaration.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
2337bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonclass SymbolFileType :
24598df88bd6fc33c6fb330bc859bdc277795501f3Greg Clayton    public STD_ENABLE_SHARED_FROM_THIS(SymbolFileType),
2537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    public UserID
2637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    {
2737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    public:
2837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        SymbolFileType (SymbolFile &symbol_file, lldb::user_id_t uid) :
2937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            UserID (uid),
3037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            m_symbol_file (symbol_file)
3137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
3237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
3337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
3437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        ~SymbolFileType ()
3537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
3637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
3737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
3837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        Type *
3937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        operator->()
4037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
4137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            return GetType ();
4237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
4337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
4437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        Type *
4537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        GetType ();
4637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
4737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    protected:
4837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        SymbolFile &m_symbol_file;
4937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        lldb::TypeSP m_type_sp;
5037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    };
51979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
524c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Claytonclass Type :
53598df88bd6fc33c6fb330bc859bdc277795501f3Greg Clayton    public STD_ENABLE_SHARED_FROM_THIS(Type),
544c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton    public UserID
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    typedef enum EncodingDataTypeTag
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
594b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingInvalid,
606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eEncodingIsUID,                 ///< This type is the type whose UID is m_encoding_uid
614b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsConstUID,            ///< This type is the type whose UID is m_encoding_uid with the const qualifier added
624b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsRestrictUID,         ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added
634b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsVolatileUID,         ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added
644b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsTypedefUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
654b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsPointerUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
664b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsLValueReferenceUID,  ///< This type is L value reference to a type whose UID is m_encoding_uid
674b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsRValueReferenceUID,  ///< This type is R value reference to a type whose UID is m_encoding_uid
68ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        eEncodingIsSyntheticUID
694b40711e7950310afb74835820eb669004cd8c44Greg Clayton    } EncodingDataType;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    typedef enum ResolveStateTag
726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    {
736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateUnresolved = 0,
746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateForward    = 1,
756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateLayout     = 2,
766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateFull       = 3
776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    } ResolveState;
786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
79462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    Type (lldb::user_id_t uid,
80462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolFile* symbol_file,
81462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const ConstString &name,
824b40711e7950310afb74835820eb669004cd8c44Greg Clayton          uint32_t byte_size,
83462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolContextScope *context,
84bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton          lldb::user_id_t encoding_uid,
85bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton          EncodingDataType encoding_uid_type,
86462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const Declaration& decl,
874b40711e7950310afb74835820eb669004cd8c44Greg Clayton          lldb::clang_type_t clang_qual_type,
886916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton          ResolveState clang_type_resolve_state);
89462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This makes an invalid type.  Used for functions that return a Type when they
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // get an error.
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type();
93bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
94bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Type (const Type &rhs);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type&
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator= (const Type& rhs);
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s, bool show_context);
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpTypeName(Stream *s);
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10512bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
10612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void
10712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name);
10812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile()
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolFile *
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile() const
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList*
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTypeList();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString&
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    uint32_t
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetByteSize();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumChildren (bool omit_empty_base_classes);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsAggregateType ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValidType ()
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
138ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        return m_encoding_uid_type != eEncodingInvalid;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1410cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    bool
1420cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    IsTypedef ()
1430cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    {
1440cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton        return m_encoding_uid_type == eEncodingIsTypedefUID;
1450cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    }
1460cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
1470cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    lldb::TypeSP
1480cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    GetTypedefType();
1490cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetByteSize(uint32_t byte_size);
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_name;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    ConstString
160dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    GetQualifiedName ();
161dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValue(ExecutionContext *exe_ctx,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Stream *s,
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const DataExtractor &data,
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              uint32_t data_offset,
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_type,
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_summary,
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool verbose,
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              lldb::Format format = lldb::eFormatDefault);
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValueInMemory(ExecutionContext *exe_ctx,
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      Stream *s,
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      lldb::addr_t address,
176b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                      AddressType address_type,
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_types,
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_summary,
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool verbose);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadFromMemory (ExecutionContext *exe_ctx,
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::addr_t address,
184b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType address_type,
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DataExtractor &data);
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToMemory (ExecutionContext *exe_ctx,
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   lldb::addr_t address,
190b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                   AddressType address_type,
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   DataExtractor &data);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsDeclaration() const;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsDeclaration(bool b);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsExternal() const;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsExternal(bool b);
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFormat ();
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Encoding
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetEncoding (uint32_t &count);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope()
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContextScope *
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope() const
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetSymbolContextScope(SymbolContextScope *context)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context = context;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2270bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    const lldb_private::Declaration &
2280bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    GetDeclaration () const;
2290bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham
230b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type, and resolve definitions for any
231b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // class/struct/union/enum types completely.
232462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::clang_type_t
23304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    GetClangFullType ();
234b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton
2356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // Get the clang type, and resolve definitions enough so that the type could
2366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // have layout performed. This allows ptrs and refs to class/struct/union/enum
2376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // types remain forward declarations.
2386916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::clang_type_t
2396916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    GetClangLayoutType ();
2406916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
241b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type and leave class/struct/union/enum types as forward
242b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // declarations if they haven't already been fully defined.
243b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    lldb::clang_type_t
244b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    GetClangForwardType ();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangAST ();
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangASTContext &
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangASTContext ();
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const Type &a, const Type &b);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
255dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // From a fully qualified typename, split the type into the type basename
256dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // and the remaining type scope (namespaces/classes).
257dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    static bool
258dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    GetTypeScopeAndBasename (const char* name_cstr,
259dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                             std::string &scope,
260dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                             std::string &basename);
2616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    void
2626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    SetEncodingType (Type *encoding_type)
2636916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    {
2646916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_encoding_type = encoding_type;
2656916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    }
2666916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2672403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    uint32_t
2682403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    GetEncodingMask ();
2692403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
270b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
271b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangPointerType (Type *type);
272b01000fd063629facd45044f137446fb748ee179Greg Clayton
273b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
274b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangTypedefType (Type *typedef_type, Type *base_type);
275b01000fd063629facd45044f137446fb748ee179Greg Clayton
276b01000fd063629facd45044f137446fb748ee179Greg Clayton    // For C++98 references (&)
277b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
278b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangLValueReferenceType (Type *type);
279b01000fd063629facd45044f137446fb748ee179Greg Clayton
280b01000fd063629facd45044f137446fb748ee179Greg Clayton    // For C++0x references (&&)
281b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
282b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangRValueReferenceType (Type *type);
283f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham
284f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    bool
285f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    IsRealObjCClass();
286931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
287931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    bool
288931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    IsCompleteObjCClass()
289931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
290931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        return m_flags.is_complete_objc_class;
291931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
292931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
293931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    void
294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    SetIsCompleteObjCClass(bool is_complete_objc_class)
295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
296931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        m_flags.is_complete_objc_class = is_complete_objc_class;
297931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
298b01000fd063629facd45044f137446fb748ee179Greg Clayton
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *m_symbol_file;
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *m_context; // The symbol context in which this type is defined
303ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    Type *m_encoding_type;
304ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    uint32_t m_encoding_uid;
305bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    EncodingDataType m_encoding_uid_type;
306ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    uint32_t m_byte_size;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_decl;
308bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    lldb::clang_type_t m_clang_type;
309931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
310931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    struct Flags {
311931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        ResolveState    clang_type_resolve_state : 2;
312931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        bool            is_complete_objc_class   : 1;
313931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    } m_flags;
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3154b40711e7950310afb74835820eb669004cd8c44Greg Clayton    Type *
316ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    GetEncodingType ();
317ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
318bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    bool
319bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ResolveClangType (ResolveState clang_type_resolve_state);
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
322ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
323ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
324ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// Sometimes you can find the name of the type corresponding to an object, but we don't have debug
325ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// information for it.  If that is the case, you can return one of these objects, and then if it
326ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// has a full type, you can use that, but if not at least you can print the name for informational
327ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// purposes.
328ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
329ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
330ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamclass TypeAndOrName
331ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
332ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghampublic:
333ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName ();
334ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (lldb::TypeSP &type_sp);
335ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const char *type_str);
336ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const TypeAndOrName &rhs);
337ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (ConstString &type_const_string);
338ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
339ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName &
340ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    operator= (const TypeAndOrName &rhs);
341ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
342ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString GetName () const;
3430fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3440fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP
3450fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeSP () const
3460fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
347ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return m_type_sp;
3480fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
349ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
350ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
351ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    SetName (ConstString &type_name_const_str);
352ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
353ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
354ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    SetName (const char *type_name_str);
355ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
356ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
357ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    SetTypeSP (lldb::TypeSP type_sp);
358ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
359ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    bool
360ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    IsEmpty ();
361ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
362ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamprivate:
363ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    lldb::TypeSP m_type_sp;
364ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString m_type_name;
365ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham};
366ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
367979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the two classes here are used by the public API as a backend to
368979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the SBType and SBTypeList classes
369979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
370979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeImpl
371979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
372979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
373979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
374979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl() :
3750fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(),
3760fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp()
3770fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
3780fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
379979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
380979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl(const TypeImpl& rhs) :
3810fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(rhs.m_clang_ast_type),
3820fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp(rhs.m_type_sp)
3830fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
3840fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
3850fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3860fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb_private::ClangASTType& type);
3870fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3880fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb::TypeSP& type);
389979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
390979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl&
391979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator = (const TypeImpl& rhs);
392979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
393979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
394979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator == (const TypeImpl& rhs)
395979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
3960fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type == rhs.m_clang_ast_type && m_type_sp.get() == rhs.m_type_sp.get();
397979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
398979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
399979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
400979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator != (const TypeImpl& rhs)
401979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4020fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type != rhs.m_clang_ast_type || m_type_sp.get() != rhs.m_type_sp.get();
403979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
404979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
405979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
406979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    IsValid()
407979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4080fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_type_sp.get() != NULL || m_clang_ast_type.IsValid();
409979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
410979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4110fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    const lldb_private::ClangASTType &
4120fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetClangASTType() const
413979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4140fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type;
415979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
416979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
417979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    clang::ASTContext*
418979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetASTContext();
419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
420979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    lldb::clang_type_t
421979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetOpaqueQualType();
4220fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
423d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    lldb::TypeSP
424d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    GetTypeSP ()
425d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    {
426d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata        return m_type_sp;
427d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    }
428d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata
42996154be69fa240a662419183ed08e1cfc5418164Greg Clayton    bool
43096154be69fa240a662419183ed08e1cfc5418164Greg Clayton    GetDescription (lldb_private::Stream &strm,
43196154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    lldb::DescriptionLevel description_level);
43296154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4337dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
4347dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    SetType (const lldb::TypeSP &type_sp);
43596154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4360fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonprivate:
4370fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    ClangASTType m_clang_ast_type;
4380fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP m_type_sp;
439979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
440979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
441979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeListImpl
442979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
443979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
444979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeListImpl() :
4450fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_content()
4460fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
4470fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
448979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
449979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    void
4500fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    Append (const lldb::TypeImplSP& type)
451979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
452979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        m_content.push_back(type);
453979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
454979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4550fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeImplSP
4560fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeAtIndex(size_t idx)
457979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4580fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        lldb::TypeImplSP type_sp;
4590fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        if (idx < GetSize())
4600fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton            type_sp = m_content[idx];
4610fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return type_sp;
462979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
463979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4640fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    size_t
465979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetSize()
466979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
467979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return m_content.size();
468979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
469979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
470979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataprivate:
4710fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    std::vector<lldb::TypeImplSP> m_content;
472979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
473d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
474d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonclass TypeMemberImpl
475d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton{
476d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonpublic:
477d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl () :
478d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (),
479d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (0),
480f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
481f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
482f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
483f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
484d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
485d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
486d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
487d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
488d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset,
489f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    const ConstString &name,
490f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    uint32_t bitfield_bit_size = 0,
491f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    bool is_bitfield = false) :
492d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
493d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
494f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (name),
495f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (bitfield_bit_size),
496f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (is_bitfield)
497d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
498d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
499d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
500d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
501d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset):
502d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
503d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
504f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
505f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
506f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
507d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
508d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
509d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
510d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const lldb::TypeImplSP &
511d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetTypeImpl ()
512d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
513d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_type_impl_sp;
514d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
515d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
516d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const ConstString &
517d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetName () const
518d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
519d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_name;
520d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
521dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
522d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t
523d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetBitOffset () const
524d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
525d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_bit_offset;
526d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
527d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
528f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t
529f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetBitfieldBitSize () const
530f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
531f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_bitfield_bit_size;
532f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
533f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
534f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
535f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetBitfieldBitSize (uint32_t bitfield_bit_size)
536f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
537f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size = bitfield_bit_size;
538f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
539f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
540f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool
541f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetIsBitfield () const
542f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
543f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_is_bitfield;
544f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
545f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
546f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
547f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetIsBitfield (bool is_bitfield)
548f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
549f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield = is_bitfield;
550f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
551f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
552d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonprotected:
553d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    lldb::TypeImplSP m_type_impl_sp;
554d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t m_bit_offset;
555d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    ConstString m_name;
556f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t m_bitfield_bit_size; // Bit size for bitfield members only
557f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool m_is_bitfield;
558d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton};
559979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
560979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Type_h_
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
565