1642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//===-- CPPLanguageRuntime.h ---------------------------------------------------*- C++ -*-===//
2642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//
3642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//                     The LLVM Compiler Infrastructure
4642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//
5642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// This file is distributed under the University of Illinois Open Source
6642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// License. See LICENSE.TXT for details.
7642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//
8642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//===----------------------------------------------------------------------===//
9642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
10642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#ifndef liblldb_CPPLanguageRuntime_h_
11642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#define liblldb_CPPLanguageRuntime_h_
12642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
13642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// C Includes
14642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// C++ Includes
15bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata#include <vector>
16642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// Other libraries and framework includes
17642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// Project includes
18642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Core/PluginInterface.h"
19642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/lldb-private.h"
20642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Target/LanguageRuntime.h"
21642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
22642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamnamespace lldb_private {
23642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
24642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamclass CPPLanguageRuntime :
25642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    public LanguageRuntime
26642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
27642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghampublic:
28296b06d325413723f5aac5988eed977b278a7807Greg Clayton
29296b06d325413723f5aac5988eed977b278a7807Greg Clayton    class MethodName
30296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
31296b06d325413723f5aac5988eed977b278a7807Greg Clayton    public:
32296b06d325413723f5aac5988eed977b278a7807Greg Clayton        enum Type
33296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
34296b06d325413723f5aac5988eed977b278a7807Greg Clayton            eTypeInvalid,
35296b06d325413723f5aac5988eed977b278a7807Greg Clayton            eTypeUnknownMethod,
36296b06d325413723f5aac5988eed977b278a7807Greg Clayton            eTypeClassMethod,
37296b06d325413723f5aac5988eed977b278a7807Greg Clayton            eTypeInstanceMethod
38296b06d325413723f5aac5988eed977b278a7807Greg Clayton        };
39296b06d325413723f5aac5988eed977b278a7807Greg Clayton
40296b06d325413723f5aac5988eed977b278a7807Greg Clayton        MethodName () :
41296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_full(),
42296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_basename(),
43296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_context(),
44296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_arguments(),
45296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_qualifiers(),
46296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_type (eTypeInvalid),
47296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_parsed (false),
48296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_parse_error (false)
49296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
50296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
51296b06d325413723f5aac5988eed977b278a7807Greg Clayton
52296b06d325413723f5aac5988eed977b278a7807Greg Clayton        MethodName (const ConstString &s) :
53296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_full(s),
54296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_basename(),
55296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_context(),
56296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_arguments(),
57296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_qualifiers(),
58296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_type (eTypeInvalid),
59296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_parsed (false),
60296b06d325413723f5aac5988eed977b278a7807Greg Clayton            m_parse_error (false)
61296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
62296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
63296b06d325413723f5aac5988eed977b278a7807Greg Clayton
64296b06d325413723f5aac5988eed977b278a7807Greg Clayton        void
65296b06d325413723f5aac5988eed977b278a7807Greg Clayton        Clear();
66296b06d325413723f5aac5988eed977b278a7807Greg Clayton
67296b06d325413723f5aac5988eed977b278a7807Greg Clayton        bool
68296b06d325413723f5aac5988eed977b278a7807Greg Clayton        IsValid () const
69296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
70296b06d325413723f5aac5988eed977b278a7807Greg Clayton            if (m_parse_error)
71296b06d325413723f5aac5988eed977b278a7807Greg Clayton                return false;
72296b06d325413723f5aac5988eed977b278a7807Greg Clayton            if (m_type == eTypeInvalid)
73296b06d325413723f5aac5988eed977b278a7807Greg Clayton                return false;
74296b06d325413723f5aac5988eed977b278a7807Greg Clayton            return (bool)m_full;
75296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
76296b06d325413723f5aac5988eed977b278a7807Greg Clayton
77296b06d325413723f5aac5988eed977b278a7807Greg Clayton        Type
78296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetType () const
79296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
80296b06d325413723f5aac5988eed977b278a7807Greg Clayton            return m_type;
81296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
82296b06d325413723f5aac5988eed977b278a7807Greg Clayton
83296b06d325413723f5aac5988eed977b278a7807Greg Clayton        const ConstString &
84296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetFullName () const
85296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
86296b06d325413723f5aac5988eed977b278a7807Greg Clayton            return m_full;
87296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
88296b06d325413723f5aac5988eed977b278a7807Greg Clayton
8983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton        llvm::StringRef
90296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetBasename ();
91296b06d325413723f5aac5988eed977b278a7807Greg Clayton
92296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef
93296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetContext ();
94296b06d325413723f5aac5988eed977b278a7807Greg Clayton
95296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef
96296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetArguments ();
97296b06d325413723f5aac5988eed977b278a7807Greg Clayton
98296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef
99296b06d325413723f5aac5988eed977b278a7807Greg Clayton        GetQualifiers ();
100296b06d325413723f5aac5988eed977b278a7807Greg Clayton
101296b06d325413723f5aac5988eed977b278a7807Greg Clayton    protected:
102296b06d325413723f5aac5988eed977b278a7807Greg Clayton        void
103296b06d325413723f5aac5988eed977b278a7807Greg Clayton        Parse();
104296b06d325413723f5aac5988eed977b278a7807Greg Clayton
105296b06d325413723f5aac5988eed977b278a7807Greg Clayton        ConstString     m_full;         // Full name:    "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const"
10683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton        llvm::StringRef m_basename;     // Basename:     "GetBreakpointAtIndex"
107296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef m_context;      // Decl context: "lldb::SBTarget"
108296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef m_arguments;    // Arguments:    "(unsigned int)"
109296b06d325413723f5aac5988eed977b278a7807Greg Clayton        llvm::StringRef m_qualifiers;   // Qualifiers:   "const"
110296b06d325413723f5aac5988eed977b278a7807Greg Clayton        Type m_type;
111296b06d325413723f5aac5988eed977b278a7807Greg Clayton        bool m_parsed;
112296b06d325413723f5aac5988eed977b278a7807Greg Clayton        bool m_parse_error;
113296b06d325413723f5aac5988eed977b278a7807Greg Clayton    };
114296b06d325413723f5aac5988eed977b278a7807Greg Clayton
115642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    virtual
116642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    ~CPPLanguageRuntime();
117642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
118642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    virtual lldb::LanguageType
119642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    GetLanguageType () const
120642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    {
121642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham        return lldb::eLanguageTypeC_plus_plus;
122642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    }
123642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
124642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    virtual bool
125642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    IsVTableName (const char *name) = 0;
126642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
127b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    virtual bool
1280de37195f17fefb536157b3296a18999116b8125Jim Ingham    GetObjectDescription (Stream &str, ValueObject &object);
129b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
130324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    virtual bool
131324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham    GetObjectDescription (Stream &str, Value &value, ExecutionContextScope *exe_scope);
132324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham
1338b7b2276132c7353cabd22000287b42badc26613Jim Ingham    static bool
1348b7b2276132c7353cabd22000287b42badc26613Jim Ingham    IsCPPMangledName(const char *name);
1358b7b2276132c7353cabd22000287b42badc26613Jim Ingham
1368b7b2276132c7353cabd22000287b42badc26613Jim Ingham    static bool
1378b7b2276132c7353cabd22000287b42badc26613Jim Ingham    StripNamespacesFromVariableName (const char *name, const char *&base_name_start, const char *&base_name_end);
138bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata
139bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    // in some cases, compilers will output different names for one same type. when tht happens, it might be impossible
140bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    // to construct SBType objects for a valid type, because the name that is available is not the same as the name that
141bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    // can be used as a search key in FindTypes(). the equivalents map here is meant to return possible alternative names
142bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    // for a type through which a search can be conducted. Currently, this is only enabled for C++ but can be extended
143bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    // to ObjC or other languages if necessary
144bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    static uint32_t
145bad9753828b6e0e415e38094bb9627e41d57874cEnrico Granata    FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents);
1468b7b2276132c7353cabd22000287b42badc26613Jim Ingham
147642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamprotected:
148642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    //------------------------------------------------------------------
149642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    // Classes that inherit from CPPLanguageRuntime can see and modify these
150642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    //------------------------------------------------------------------
151642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    CPPLanguageRuntime(Process *process);
152642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamprivate:
153642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    DISALLOW_COPY_AND_ASSIGN (CPPLanguageRuntime);
154642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham};
155642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
156642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham} // namespace lldb_private
157642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
158642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#endif  // liblldb_CPPLanguageRuntime_h_
159