Type.h revision 462d4147f3bb9141bf62d904f58a623db00669df
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"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Declaration.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Type : public UserID
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef enum
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eTypeInvalid,
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eIsTypeWithUID,                 ///< This type is the type whose UID is m_encoding_uid
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eIsConstTypeWithUID,            ///< This type is the type whose UID is m_encoding_uid with the const qualifier added
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eIsRestrictTypeWithUID,         ///< This type is the type whose UID is m_encoding_uid with the restrict qualifier added
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eIsVolatileTypeWithUID,         ///< This type is the type whose UID is m_encoding_uid with the volatile qualifier added
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eTypedefToTypeWithUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ePointerToTypeWithUID,          ///< This type is pointer to a type whose UID is m_encoding_uid
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eLValueReferenceToTypeWithUID,  ///< This type is L value reference to a type whose UID is m_encoding_uid
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eRValueReferenceToTypeWithUID,   ///< This type is R value reference to a type whose UID is m_encoding_uid
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eTypeUIDSynthetic
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    } EncodingUIDType;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    Type (lldb::user_id_t uid,
39462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolFile* symbol_file,
40462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const ConstString &name,
41462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          uint64_t byte_size,
42462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          SymbolContextScope *context,
43462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          lldb::user_id_t encoding_uid,
44462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          EncodingUIDType encoding_type,
45462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          const Declaration& decl,
46462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton          lldb::clang_type_t clang_qual_type);
47462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This makes an invalid type.  Used for functions that return a Type when they
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // get an error.
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type();
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Type&
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator= (const Type& rhs);
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Dump(Stream *s, bool show_context);
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpTypeName(Stream *s);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
6212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    void
6312bec71b323dc520f0e985a86e09c4712559e115Greg Clayton    GetDescription (Stream *s, lldb::DescriptionLevel level, bool show_name);
6412bec71b323dc520f0e985a86e09c4712559e115Greg Clayton
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile()
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolFile *
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolFile() const
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_symbol_file;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList*
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetTypeList();
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString&
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName();
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetByteSize();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumChildren (bool omit_empty_base_classes);
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsAggregateType ();
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValidType ()
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_encoding_uid_type != eTypeInvalid;
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetByteSize(uint32_t byte_size);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const ConstString &
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_name;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValue(ExecutionContext *exe_ctx,
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              Stream *s,
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              const DataExtractor &data,
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              uint32_t data_offset,
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_type,
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_summary,
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool verbose,
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              lldb::Format format = lldb::eFormatDefault);
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpValueInMemory(ExecutionContext *exe_ctx,
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      Stream *s,
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      lldb::addr_t address,
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      lldb::AddressType address_type,
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_types,
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool show_summary,
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                      bool verbose);
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadFromMemory (ExecutionContext *exe_ctx,
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::addr_t address,
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::AddressType address_type,
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    DataExtractor &data);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WriteToMemory (ExecutionContext *exe_ctx,
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   lldb::addr_t address,
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   lldb::AddressType address_type,
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                   DataExtractor &data);
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsDeclaration() const;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsDeclaration(bool b);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIsExternal() const;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetIsExternal(bool b);
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Format
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFormat ();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Encoding
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetEncoding (uint32_t &count);
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope()
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContextScope *
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSymbolContextScope() const
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_context;
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetSymbolContextScope(SymbolContextScope *context)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_context = context;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1710bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    const lldb_private::Declaration &
1720bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham    GetDeclaration () const;
1730bda40346c10604b3cef2e42bef4f4d6f534e18bJim Ingham
174462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::clang_type_t
175462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    GetClangType (bool forward_decl_is_ok = false);
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangAST ();
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangASTContext &
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetClangASTContext ();
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::clang_type_t
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetChildClangTypeAtIndex (const char *parent_name,
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t idx,
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              bool transparent_pointers,
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              bool omit_empty_base_classes,
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              ConstString& name,
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t &child_byte_size,
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              int32_t &child_byte_offset,
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t &child_bitfield_bit_size,
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t &child_bitfield_bit_offset);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static int
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Compare(const Type &a, const Type &b);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString m_name;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint64_t m_byte_size;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolFile *m_symbol_file;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContextScope *m_context; // The symbol context in which this type is defined
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t m_encoding_uid;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EncodingUIDType m_encoding_uid_type;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Declaration m_decl;
205462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    lldb::clang_type_t m_clang_qual_type;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
207462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    bool ResolveClangType(bool forward_decl_is_ok = false);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Type_h_
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
214