Type.h revision a8b56238ce138e70433a0ce0b4218c9257beae38
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 :
24102b2c2681c9a830afe25bfea35557421905e42cGreg 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 :
53102b2c2681c9a830afe25bfea35557421905e42cGreg 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,
82fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton          uint64_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
126fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_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    const ConstString &
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_name;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    ConstString
157dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    GetQualifiedName ();
158dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValue(ExecutionContext *exe_ctx,
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Stream *s,
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const DataExtractor &data,
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              uint32_t data_offset,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_type,
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_summary,
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool verbose,
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              lldb::Format format = lldb::eFormatDefault);
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValueInMemory(ExecutionContext *exe_ctx,
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      Stream *s,
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      lldb::addr_t address,
173b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                      AddressType address_type,
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_types,
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_summary,
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool verbose);
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadFromMemory (ExecutionContext *exe_ctx,
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::addr_t address,
181b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType address_type,
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DataExtractor &data);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToMemory (ExecutionContext *exe_ctx,
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   lldb::addr_t address,
187b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                   AddressType address_type,
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   DataExtractor &data);
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsDeclaration() const;
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsDeclaration(bool b);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsExternal() const;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsExternal(bool b);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFormat ();
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Encoding
206fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    GetEncoding (uint64_t &count);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope()
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContextScope *
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope() const
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetSymbolContextScope(SymbolContextScope *context)
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context = context;
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2240bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    const lldb_private::Declaration &
2250bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    GetDeclaration () const;
2260bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham
227b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type, and resolve definitions for any
228b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // class/struct/union/enum types completely.
229462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::clang_type_t
23004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    GetClangFullType ();
231b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton
2326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // Get the clang type, and resolve definitions enough so that the type could
2336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // have layout performed. This allows ptrs and refs to class/struct/union/enum
2346916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // types remain forward declarations.
2356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::clang_type_t
2366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    GetClangLayoutType ();
2376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
238b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type and leave class/struct/union/enum types as forward
239b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // declarations if they haven't already been fully defined.
240b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    lldb::clang_type_t
241b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    GetClangForwardType ();
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangAST ();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangASTContext &
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangASTContext ();
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const Type &a, const Type &b);
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
252dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // From a fully qualified typename, split the type into the type basename
253dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // and the remaining type scope (namespaces/classes).
254dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    static bool
255b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    GetTypeScopeAndBasename (const char* &name_cstr,
256dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                             std::string &scope,
257b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                             std::string &basename,
258b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                             lldb::TypeClass &type_class);
2596916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    void
2606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    SetEncodingType (Type *encoding_type)
2616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    {
2626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_encoding_type = encoding_type;
2636916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    }
2646916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2652403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    uint32_t
2662403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    GetEncodingMask ();
2672403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
268b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
269b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangPointerType (Type *type);
270b01000fd063629facd45044f137446fb748ee179Greg Clayton
271b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
272b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangTypedefType (Type *typedef_type, Type *base_type);
273b01000fd063629facd45044f137446fb748ee179Greg Clayton
274b01000fd063629facd45044f137446fb748ee179Greg Clayton    // For C++98 references (&)
275b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
276b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangLValueReferenceType (Type *type);
277b01000fd063629facd45044f137446fb748ee179Greg Clayton
278b01000fd063629facd45044f137446fb748ee179Greg Clayton    // For C++0x references (&&)
279b01000fd063629facd45044f137446fb748ee179Greg Clayton    void *
280b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangRValueReferenceType (Type *type);
281f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham
282f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    bool
283f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    IsRealObjCClass();
284931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
285931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    bool
286931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    IsCompleteObjCClass()
287931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
288931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        return m_flags.is_complete_objc_class;
289931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
290931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
291931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    void
292931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    SetIsCompleteObjCClass(bool is_complete_objc_class)
293931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        m_flags.is_complete_objc_class = is_complete_objc_class;
295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
296b01000fd063629facd45044f137446fb748ee179Greg Clayton
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *m_symbol_file;
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *m_context; // The symbol context in which this type is defined
301ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    Type *m_encoding_type;
3021b888f8af37eb363d5026ee1bd3eea409be8eae3Greg Clayton    lldb::user_id_t m_encoding_uid;
303bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    EncodingDataType m_encoding_uid_type;
304fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t m_byte_size;
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_decl;
306bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    lldb::clang_type_t m_clang_type;
307931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
308931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    struct Flags {
309931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        ResolveState    clang_type_resolve_state : 2;
310931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        bool            is_complete_objc_class   : 1;
311931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    } m_flags;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3134b40711e7950310afb74835820eb669004cd8c44Greg Clayton    Type *
314ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    GetEncodingType ();
315ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
316bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    bool
317bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ResolveClangType (ResolveState clang_type_resolve_state);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
320ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
321ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
322ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// Sometimes you can find the name of the type corresponding to an object, but we don't have debug
323ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// information for it.  If that is the case, you can return one of these objects, and then if it
324ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// has a full type, you can use that, but if not at least you can print the name for informational
325ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// purposes.
326ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
327ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
328ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamclass TypeAndOrName
329ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
330ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghampublic:
331ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName ();
332ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (lldb::TypeSP &type_sp);
333ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const char *type_str);
334ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const TypeAndOrName &rhs);
335ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (ConstString &type_const_string);
336ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
337ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName &
338ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    operator= (const TypeAndOrName &rhs);
339ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3401a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3411a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator==(const TypeAndOrName &other) const;
3421a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3431a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3441a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator!=(const TypeAndOrName &other) const;
3451a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
346ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString GetName () const;
3470fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3480fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP
3490fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeSP () const
3500fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
351ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return m_type_sp;
3520fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
353ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
354ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
355ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    SetName (const ConstString &type_name);
356ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
357ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
358ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    SetName (const char *type_name_cstr);
359ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
360ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
361ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    SetTypeSP (lldb::TypeSP type_sp);
362ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
363ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    bool
364ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    IsEmpty ();
365ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3661a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3671a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    HasName ();
3681a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3691a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3701a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    HasTypeSP ();
3711a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3721a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    void
3731a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    Clear ();
3741a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3751a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator
3761a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool ()
3771a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
3781a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return !IsEmpty();
3791a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
3801a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
381ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamprivate:
382ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    lldb::TypeSP m_type_sp;
383ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString m_type_name;
384ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham};
385ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
386979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the two classes here are used by the public API as a backend to
387979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the SBType and SBTypeList classes
388979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
389979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeImpl
390979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
391979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
392979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
393979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl() :
3940fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(),
3950fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp()
3960fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
3970fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
398979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
399979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl(const TypeImpl& rhs) :
4000fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(rhs.m_clang_ast_type),
4010fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp(rhs.m_type_sp)
4020fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
4030fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
4040fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
4050fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb_private::ClangASTType& type);
4060fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
4070fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb::TypeSP& type);
408979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
409979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl&
410979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator = (const TypeImpl& rhs);
411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
412979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
413979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator == (const TypeImpl& rhs)
414979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4150fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type == rhs.m_clang_ast_type && m_type_sp.get() == rhs.m_type_sp.get();
416979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
417979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
418979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator != (const TypeImpl& rhs)
420979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4210fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type != rhs.m_clang_ast_type || m_type_sp.get() != rhs.m_type_sp.get();
422979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
423979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
424979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
425979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    IsValid()
426979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4270fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_type_sp.get() != NULL || m_clang_ast_type.IsValid();
428979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
429979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4300fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    const lldb_private::ClangASTType &
4310fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetClangASTType() const
432979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4330fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type;
434979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
435979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
436979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    clang::ASTContext*
437979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetASTContext();
438979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
439979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    lldb::clang_type_t
440979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetOpaqueQualType();
4410fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
442d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    lldb::TypeSP
443d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    GetTypeSP ()
444d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    {
445d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata        return m_type_sp;
446d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    }
4478c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata
4488c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    ConstString
4498c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    GetName ();
450d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata
45196154be69fa240a662419183ed08e1cfc5418164Greg Clayton    bool
45296154be69fa240a662419183ed08e1cfc5418164Greg Clayton    GetDescription (lldb_private::Stream &strm,
45396154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    lldb::DescriptionLevel description_level);
45496154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4557dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
4567dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    SetType (const lldb::TypeSP &type_sp);
45796154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4580fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonprivate:
4590fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    ClangASTType m_clang_ast_type;
4600fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP m_type_sp;
461979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
462979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
463979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeListImpl
464979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
465979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
466979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeListImpl() :
4670fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_content()
4680fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
4690fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
470979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
471979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    void
4720fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    Append (const lldb::TypeImplSP& type)
473979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
474979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        m_content.push_back(type);
475979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
476979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
477a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    class AppendVisitor
478a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
479a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    public:
480a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        AppendVisitor(TypeListImpl &type_list) :
481a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            m_type_list(type_list)
482a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
483a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
484a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
485a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        void
486a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        operator() (const lldb::TypeImplSP& type)
487a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
488a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            m_type_list.Append(type);
489a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
490a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
491a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    private:
492a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        TypeListImpl &m_type_list;
493a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    };
494a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
495a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    void
496a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    Append (const lldb_private::TypeList &type_list);
497a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
4980fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeImplSP
4990fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeAtIndex(size_t idx)
500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
5010fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        lldb::TypeImplSP type_sp;
5020fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        if (idx < GetSize())
5030fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton            type_sp = m_content[idx];
5040fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return type_sp;
505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
5070fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    size_t
508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetSize()
509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return m_content.size();
511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataprivate:
5140fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    std::vector<lldb::TypeImplSP> m_content;
515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
516d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
517d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonclass TypeMemberImpl
518d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton{
519d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonpublic:
520d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl () :
521d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (),
522d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (0),
523f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
524f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
525f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
526f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
527d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
528d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
529d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
530d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
531d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset,
532f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    const ConstString &name,
533f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    uint32_t bitfield_bit_size = 0,
534f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    bool is_bitfield = false) :
535d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
536d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
537f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (name),
538f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (bitfield_bit_size),
539f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (is_bitfield)
540d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
541d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
542d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
543d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
544d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset):
545d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
546d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
547f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
548f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
549f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
550d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
5518c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata        if (m_type_impl_sp)
5528c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata            m_name = m_type_impl_sp->GetName();
553d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
554d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
555d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const lldb::TypeImplSP &
556d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetTypeImpl ()
557d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
558d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_type_impl_sp;
559d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
560d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
561d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const ConstString &
562d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetName () const
563d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
564d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_name;
565d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
566dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
567d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t
568d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetBitOffset () const
569d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
570d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_bit_offset;
571d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
572d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
573f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t
574f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetBitfieldBitSize () const
575f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
576f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_bitfield_bit_size;
577f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
578f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
579f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
580f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetBitfieldBitSize (uint32_t bitfield_bit_size)
581f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
582f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size = bitfield_bit_size;
583f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
584f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
585f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool
586f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetIsBitfield () const
587f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
588f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_is_bitfield;
589f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
590f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
591f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
592f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetIsBitfield (bool is_bitfield)
593f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
594f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield = is_bitfield;
595f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
596f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
597d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonprotected:
598d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    lldb::TypeImplSP m_type_impl_sp;
599d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t m_bit_offset;
600d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    ConstString m_name;
601f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t m_bitfield_bit_size; // Bit size for bitfield members only
602f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool m_is_bitfield;
603d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton};
604979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
605979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Type_h_
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
610