152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//===-- UniqueDWARFASTType.h ------------------------------------*- C++ -*-===//
252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//
352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//                     The LLVM Compiler Infrastructure
452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//
552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// This file is distributed under the University of Illinois Open Source
652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// License. See LICENSE.TXT for details.
752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//
852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton//===----------------------------------------------------------------------===//
952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
1052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#ifndef lldb_UniqueDWARFASTType_h_
1152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#define lldb_UniqueDWARFASTType_h_
1252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
1352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// C Includes
1452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// C++ Includes
1552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#include <vector>
1652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
1752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// Other libraries and framework includes
1852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#include "llvm/ADT/DenseMap.h"
1952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
2052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton// Project includes
2152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#include "lldb/Symbol/Declaration.h"
2252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
2352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass DWARFCompileUnit;
2452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass DWARFDebugInfoEntry;
2552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass SymbolFileDWARF;
2652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
2752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass UniqueDWARFASTType
2852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{
2952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonpublic:
3052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	//------------------------------------------------------------------
3152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	// Constructors and Destructors
3252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	//------------------------------------------------------------------
3352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	UniqueDWARFASTType () :
3452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_type_sp (),
35f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_symfile (NULL),
36f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_cu (NULL),
3752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_die (NULL),
38f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_declaration (),
39f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_byte_size (-1) // Set to negative value to make sure we have a valid value
4052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
4152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
4252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
4352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	UniqueDWARFASTType (lldb::TypeSP &type_sp,
44f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton                        SymbolFileDWARF *symfile,
45f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton                        DWARFCompileUnit *cu,
4652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton                        DWARFDebugInfoEntry *die,
47f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton                        const lldb_private::Declaration &decl,
48f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton                        int32_t byte_size) :
4952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_type_sp (type_sp),
50f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_symfile (symfile),
51f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_cu (cu),
5252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_die (die),
53f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_declaration (decl),
54f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_byte_size (byte_size)
5552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
5652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
5752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
5852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    UniqueDWARFASTType (const UniqueDWARFASTType &rhs) :
5952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_type_sp (rhs.m_type_sp),
60f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_symfile (rhs.m_symfile),
61f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_cu (rhs.m_cu),
6252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_die (rhs.m_die),
63f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_declaration (rhs.m_declaration),
64f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton        m_byte_size (rhs.m_byte_size)
6552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
6652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
6752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
6852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton	~UniqueDWARFASTType()
6952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
7052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
7152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
7252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    UniqueDWARFASTType &
7352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    operator= (const UniqueDWARFASTType &rhs)
7452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
7552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        if (this != &rhs)
7652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        {
7752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton            m_type_sp = rhs.m_type_sp;
78f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton            m_symfile = rhs.m_symfile;
79f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton            m_cu = rhs.m_cu;
8052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton            m_die = rhs.m_die;
8152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton            m_declaration = rhs.m_declaration;
82f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton            m_byte_size = rhs.m_byte_size;
8352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        }
8452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        return *this;
8552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
8652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
8752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    lldb::TypeSP m_type_sp;
88f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton    SymbolFileDWARF *m_symfile;
89f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton    const DWARFCompileUnit *m_cu;
9052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    const DWARFDebugInfoEntry *m_die;
91f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton    lldb_private::Declaration m_declaration;
92f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton    int32_t m_byte_size;
9352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton};
9452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
9552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass UniqueDWARFASTTypeList
9652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{
9752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonpublic:
9852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    UniqueDWARFASTTypeList () :
9952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_collection()
10052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
10152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
10252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
10352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    ~UniqueDWARFASTTypeList ()
10452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
10552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
10652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
10752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    uint32_t
10852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    GetSize()
10952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
11052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        return (uint32_t)m_collection.size();
11152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
11252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
11352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    void
11452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    Append (const UniqueDWARFASTType &entry)
11552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
11652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_collection.push_back (entry);
11752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
11852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
11952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    bool
120f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton    Find (SymbolFileDWARF *symfile,
121f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          const DWARFCompileUnit *cu,
122f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          const DWARFDebugInfoEntry *die,
12352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton          const lldb_private::Declaration &decl,
124f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          const int32_t byte_size,
12552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton          UniqueDWARFASTType &entry) const;
12652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
12752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonprotected:
12852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    typedef std::vector<UniqueDWARFASTType> collection;
12952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    collection m_collection;
13052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton};
13152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
13252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonclass UniqueDWARFASTTypeMap
13352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton{
13452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonpublic:
13552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    UniqueDWARFASTTypeMap () :
13652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_collection ()
13752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
13852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
13952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
14052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    ~UniqueDWARFASTTypeMap ()
14152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
14252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
14352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
14452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    void
14552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    Insert (const lldb_private::ConstString &name,
14652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton            const UniqueDWARFASTType &entry)
14752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
14852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        m_collection[name.GetCString()].Append (entry);
14952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
15052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
15152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    bool
15252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    Find (const lldb_private::ConstString &name,
153f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          SymbolFileDWARF *symfile,
154f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          const DWARFCompileUnit *cu,
15552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton          const DWARFDebugInfoEntry *die,
15652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton          const lldb_private::Declaration &decl,
157f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton          const int32_t byte_size,
15852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton          UniqueDWARFASTType &entry) const
15952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    {
16052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        const char *unique_name_cstr = name.GetCString();
16152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        collection::const_iterator pos = m_collection.find (unique_name_cstr);
16252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        if (pos != m_collection.end())
16352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        {
164f1b73af504369d6f6eb113b98d77b06a3c8527d5Greg Clayton            return pos->second.Find (symfile, cu, die, decl, byte_size, entry);
16552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        }
16652fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton        return false;
16752fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    }
16852fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
16952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Claytonprotected:
17052fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    // A unique name string should be used
17152fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    typedef llvm::DenseMap<const char *, UniqueDWARFASTTypeList> collection;
17252fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    collection m_collection;
17352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton};
17452fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton
17552fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton#endif	// lldb_UniqueDWARFASTType_h_
176