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"
1952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
2437bb8ddd443da172f42bb8657f15ec856a525c84Greg Claytonclass SymbolFileType :
25102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    public std::enable_shared_from_this<SymbolFileType>,
2637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    public UserID
2737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    {
2837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    public:
2937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        SymbolFileType (SymbolFile &symbol_file, lldb::user_id_t uid) :
3037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            UserID (uid),
3137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            m_symbol_file (symbol_file)
3237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
3337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
3437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
3537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        ~SymbolFileType ()
3637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
3737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
3837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
3937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        Type *
4037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        operator->()
4137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        {
4237bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton            return GetType ();
4337bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        }
4437bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
4537bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        Type *
4637bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        GetType ();
4737bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton
4837bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    protected:
4937bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        SymbolFile &m_symbol_file;
5037bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton        lldb::TypeSP m_type_sp;
5137bb8ddd443da172f42bb8657f15ec856a525c84Greg Clayton    };
52979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
534c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Claytonclass Type :
54102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    public std::enable_shared_from_this<Type>,
554c8353bd5be6e5abcab8fe27965d477aace75cf2Greg Clayton    public UserID
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
586916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    typedef enum EncodingDataTypeTag
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
604b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingInvalid,
616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eEncodingIsUID,                 ///< This type is the type whose UID is m_encoding_uid
624b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsConstUID,            ///< This type is the type whose UID is m_encoding_uid with the const qualifier added
634b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsRestrictUID,         ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added
644b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsVolatileUID,         ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added
654b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsTypedefUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
664b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsPointerUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
674b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsLValueReferenceUID,  ///< This type is L value reference to a type whose UID is m_encoding_uid
684b40711e7950310afb74835820eb669004cd8c44Greg Clayton        eEncodingIsRValueReferenceUID,  ///< This type is R value reference to a type whose UID is m_encoding_uid
69ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        eEncodingIsSyntheticUID
704b40711e7950310afb74835820eb669004cd8c44Greg Clayton    } EncodingDataType;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    typedef enum ResolveStateTag
736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    {
746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateUnresolved = 0,
756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateForward    = 1,
766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateLayout     = 2,
776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        eResolveStateFull       = 3
786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    } ResolveState;
796916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
80462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    Type (lldb::user_id_t uid,
81462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolFile* symbol_file,
82462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const ConstString &name,
83fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton          uint64_t byte_size,
84462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolContextScope *context,
85bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton          lldb::user_id_t encoding_uid,
86bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton          EncodingDataType encoding_uid_type,
87462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const Declaration& decl,
8852f792329be5db8e38961350589e97e8f2823acdGreg Clayton          const ClangASTType &clang_qual_type,
896916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton          ResolveState clang_type_resolve_state);
90462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This makes an invalid type.  Used for functions that return a Type when they
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // get an error.
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type();
94bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton
95bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    Type (const Type &rhs);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type&
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator= (const Type& rhs);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s, bool show_context);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpTypeName(Stream *s);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10612bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
10712bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void
10812bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name);
10912bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile()
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolFile *
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile() const
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList*
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTypeList();
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString&
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName();
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetByteSize();
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumChildren (bool omit_empty_base_classes);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsAggregateType ();
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValidType ()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
139ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton        return m_encoding_uid_type != eEncodingInvalid;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1420cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    bool
1430cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    IsTypedef ()
1440cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    {
1450cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton        return m_encoding_uid_type == eEncodingIsTypedefUID;
1460cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    }
1470cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
1480cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    lldb::TypeSP
1490cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton    GetTypedefType();
1500cbaacd31bce2f37aaa9ecb2f31b3e8bf84d25b4Greg Clayton
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_name;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    ConstString
158dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    GetQualifiedName ();
159dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValue(ExecutionContext *exe_ctx,
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Stream *s,
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const DataExtractor &data,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              uint32_t data_offset,
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_type,
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_summary,
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool verbose,
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              lldb::Format format = lldb::eFormatDefault);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValueInMemory(ExecutionContext *exe_ctx,
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      Stream *s,
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      lldb::addr_t address,
174b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                      AddressType address_type,
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_types,
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_summary,
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool verbose);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadFromMemory (ExecutionContext *exe_ctx,
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::addr_t address,
182b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                    AddressType address_type,
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DataExtractor &data);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToMemory (ExecutionContext *exe_ctx,
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   lldb::addr_t address,
188b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                   AddressType address_type,
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   DataExtractor &data);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsDeclaration() const;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsDeclaration(bool b);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsExternal() const;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsExternal(bool b);
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFormat ();
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Encoding
207fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    GetEncoding (uint64_t &count);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope()
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContextScope *
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope() const
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetSymbolContextScope(SymbolContextScope *context)
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context = context;
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2250bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    const lldb_private::Declaration &
2260bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    GetDeclaration () const;
2270bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham
228b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type, and resolve definitions for any
229b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // class/struct/union/enum types completely.
23052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
23104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    GetClangFullType ();
232b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton
2336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // Get the clang type, and resolve definitions enough so that the type could
2346916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // have layout performed. This allows ptrs and refs to class/struct/union/enum
2356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    // types remain forward declarations.
23652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
2376916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    GetClangLayoutType ();
2386916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
239b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // Get the clang type and leave class/struct/union/enum types as forward
240b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    // declarations if they haven't already been fully defined.
24152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
242b433a3d8b910d571c0bcdcd5018778ac3763e703Greg Clayton    GetClangForwardType ();
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangASTContext &
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangASTContext ();
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const Type &a, const Type &b);
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
250dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // From a fully qualified typename, split the type into the type basename
251dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    // and the remaining type scope (namespaces/classes).
252dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    static bool
253b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    GetTypeScopeAndBasename (const char* &name_cstr,
254dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                             std::string &scope,
255b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                             std::string &basename,
256b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton                             lldb::TypeClass &type_class);
2576916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    void
2586916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    SetEncodingType (Type *encoding_type)
2596916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    {
2606916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        m_encoding_type = encoding_type;
2616916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    }
2626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2632403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    uint32_t
2642403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton    GetEncodingMask ();
26552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
26652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType
267b01000fd063629facd45044f137446fb748ee179Greg Clayton    CreateClangTypedefType (Type *typedef_type, Type *base_type);
268b01000fd063629facd45044f137446fb748ee179Greg Clayton
269f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    bool
270f03d97e519811a029578cc120a7a2725cdf2aad1Jim Ingham    IsRealObjCClass();
271931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
272931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    bool
273931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    IsCompleteObjCClass()
274931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
275931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        return m_flags.is_complete_objc_class;
276931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
277931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
278931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    void
279931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    SetIsCompleteObjCClass(bool is_complete_objc_class)
280931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    {
281931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        m_flags.is_complete_objc_class = is_complete_objc_class;
282931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    }
283b01000fd063629facd45044f137446fb748ee179Greg Clayton
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *m_symbol_file;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *m_context; // The symbol context in which this type is defined
288ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    Type *m_encoding_type;
2891b888f8af37eb363d5026ee1bd3eea409be8eae3Greg Clayton    lldb::user_id_t m_encoding_uid;
290bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    EncodingDataType m_encoding_uid_type;
291fe6dc6e241c52822710380cec0931351a1d7b2d3Greg Clayton    uint64_t m_byte_size;
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_decl;
29352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType m_clang_type;
294931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
295931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    struct Flags {
296931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        ResolveState    clang_type_resolve_state : 2;
297931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan        bool            is_complete_objc_class   : 1;
298931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan    } m_flags;
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3004b40711e7950310afb74835820eb669004cd8c44Greg Clayton    Type *
301ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton    GetEncodingType ();
302ea58a3cfac7ff90cd86c707d65dbd7d345a12bbeGreg Clayton
303bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    bool
304bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    ResolveClangType (ResolveState clang_type_resolve_state);
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
307ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
308ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
309ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// Sometimes you can find the name of the type corresponding to an object, but we don't have debug
310ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// information for it.  If that is the case, you can return one of these objects, and then if it
311ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// has a full type, you can use that, but if not at least you can print the name for informational
312ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham/// purposes.
313ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham///
314ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
315ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamclass TypeAndOrName
316ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
317ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghampublic:
318ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName ();
319ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (lldb::TypeSP &type_sp);
320ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const char *type_str);
321ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (const TypeAndOrName &rhs);
322ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName (ConstString &type_const_string);
323ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
324ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName &
325ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    operator= (const TypeAndOrName &rhs);
326ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3271a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3281a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator==(const TypeAndOrName &other) const;
3291a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3301a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3311a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator!=(const TypeAndOrName &other) const;
3321a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
333ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString GetName () const;
3340fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3350fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP
3360fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeSP () const
3370fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
338ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return m_type_sp;
3390fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
340ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
341ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
342ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    SetName (const ConstString &type_name);
343ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
344ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
345ef22b90240618ed8056dac14a756dff574f8218aGreg Clayton    SetName (const char *type_name_cstr);
346ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
347ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    void
348ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    SetTypeSP (lldb::TypeSP type_sp);
349ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
350ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    bool
351ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    IsEmpty ();
352ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
3531a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3541a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    HasName ();
3551a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3561a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool
3571a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    HasTypeSP ();
3581a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3591a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    void
3601a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    Clear ();
3611a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
3621a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    operator
3631a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    bool ()
3641a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    {
3651a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata        return !IsEmpty();
3661a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata    }
3671a469c75c0597abc2a9abdf86b624b2e71ea8650Enrico Granata
368ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamprivate:
369ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    lldb::TypeSP m_type_sp;
370ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ConstString m_type_name;
371ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham};
372ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
373979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the two classes here are used by the public API as a backend to
374979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// the SBType and SBTypeList classes
375979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
376979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeImpl
377979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
378979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
379979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
380979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl() :
3810fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(),
3820fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp()
3830fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
3840fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
385979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
386979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl(const TypeImpl& rhs) :
3870fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_clang_ast_type(rhs.m_clang_ast_type),
3880fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_type_sp(rhs.m_type_sp)
3890fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
3900fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
3910fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3920fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb_private::ClangASTType& type);
3930fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
3940fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    TypeImpl(const lldb::TypeSP& type);
395979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
396979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeImpl&
397979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    operator = (const TypeImpl& rhs);
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    operator != (const TypeImpl& rhs)
407979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4080fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type != rhs.m_clang_ast_type || m_type_sp.get() != rhs.m_type_sp.get();
409979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
410979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
411979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    bool
412979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    IsValid()
413979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4140fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_type_sp.get() != NULL || m_clang_ast_type.IsValid();
415979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
416979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4170fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    const lldb_private::ClangASTType &
4180fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetClangASTType() const
419979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4200fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return m_clang_ast_type;
421979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
422979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
423979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    clang::ASTContext*
424979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetASTContext();
425979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
426979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    lldb::clang_type_t
427979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetOpaqueQualType();
4280fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton
429d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    lldb::TypeSP
430d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    GetTypeSP ()
431d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    {
432d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata        return m_type_sp;
433d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata    }
4348c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata
4358c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    ConstString
4368c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata    GetName ();
437d760907c1d42726fa0c8c48efa28385ed339bb94Enrico Granata
43896154be69fa240a662419183ed08e1cfc5418164Greg Clayton    bool
43996154be69fa240a662419183ed08e1cfc5418164Greg Clayton    GetDescription (lldb_private::Stream &strm,
44096154be69fa240a662419183ed08e1cfc5418164Greg Clayton                    lldb::DescriptionLevel description_level);
44196154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4427dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    void
4437dd5c51fbab8384b18f20ecc125f9a1bb3c9bcb2Greg Clayton    SetType (const lldb::TypeSP &type_sp);
44496154be69fa240a662419183ed08e1cfc5418164Greg Clayton
4450fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Claytonprivate:
4460fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    ClangASTType m_clang_ast_type;
4470fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeSP m_type_sp;
448979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
449979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
450979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataclass TypeListImpl
451979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
452979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatapublic:
453979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    TypeListImpl() :
4540fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        m_content()
4550fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    {
4560fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    }
457979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
458979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    void
4590fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    Append (const lldb::TypeImplSP& type)
460979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
461979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        m_content.push_back(type);
462979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
463979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
464a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    class AppendVisitor
465a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    {
466a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    public:
467a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        AppendVisitor(TypeListImpl &type_list) :
468a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            m_type_list(type_list)
469a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
470a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
471a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
472a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        void
473a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        operator() (const lldb::TypeImplSP& type)
474a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        {
475a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton            m_type_list.Append(type);
476a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        }
477a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
478a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    private:
479a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton        TypeListImpl &m_type_list;
480a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    };
481a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
482a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    void
483a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton    Append (const lldb_private::TypeList &type_list);
484a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton
4850fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    lldb::TypeImplSP
4860fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    GetTypeAtIndex(size_t idx)
487979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
4880fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        lldb::TypeImplSP type_sp;
4890fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        if (idx < GetSize())
4900fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton            type_sp = m_content[idx];
4910fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton        return type_sp;
492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
4940fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    size_t
495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    GetSize()
496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return m_content.size();
498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granataprivate:
5010fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton    std::vector<lldb::TypeImplSP> m_content;
502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata};
503d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
504d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonclass TypeMemberImpl
505d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton{
506d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonpublic:
507d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl () :
508d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (),
509d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (0),
510f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
511f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
512f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
513f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
514d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
515d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
516d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
517d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
518d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset,
519f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    const ConstString &name,
520f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    uint32_t bitfield_bit_size = 0,
521f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton                    bool is_bitfield = false) :
522d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
523d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
524f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (name),
525f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (bitfield_bit_size),
526f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (is_bitfield)
527d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
528d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
529d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
530d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    TypeMemberImpl (const lldb::TypeImplSP &type_impl_sp,
531d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton                    uint64_t bit_offset):
532d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_type_impl_sp (type_impl_sp),
533d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        m_bit_offset (bit_offset),
534f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_name (),
535f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size (0),
536f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield (false)
537d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
5388c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata        if (m_type_impl_sp)
5398c3391ba76c5e3440a0cc10296dbde1b44300509Enrico Granata            m_name = m_type_impl_sp->GetName();
540d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
541d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
542d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const lldb::TypeImplSP &
543d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetTypeImpl ()
544d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
545d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_type_impl_sp;
546d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
547d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
548d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    const ConstString &
549d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetName () const
550d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
551d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_name;
552d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
553dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
554d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t
555d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    GetBitOffset () const
556d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    {
557d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton        return m_bit_offset;
558d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    }
559d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton
560f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t
561f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetBitfieldBitSize () const
562f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
563f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_bitfield_bit_size;
564f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
565f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
566f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
567f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetBitfieldBitSize (uint32_t bitfield_bit_size)
568f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
569f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_bitfield_bit_size = bitfield_bit_size;
570f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
571f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
572f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool
573f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    GetIsBitfield () const
574f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
575f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        return m_is_bitfield;
576f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
577f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
578f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    void
579f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    SetIsBitfield (bool is_bitfield)
580f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    {
581f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton        m_is_bitfield = is_bitfield;
582f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    }
583f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton
584d68e089f8353eaf845c3559dac6d47b32830974fGreg Claytonprotected:
585d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    lldb::TypeImplSP m_type_impl_sp;
586d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    uint64_t m_bit_offset;
587d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton    ConstString m_name;
588f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    uint32_t m_bitfield_bit_size; // Bit size for bitfield members only
589f6132ef983e8a5b98fbe5e184f5128eff8c04730Greg Clayton    bool m_is_bitfield;
590d68e089f8353eaf845c3559dac6d47b32830974fGreg Clayton};
591979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
592979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Type_h_
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
597