ObjCLanguageRuntime.cpp revision 58513667f6765aa8db13cdc4abd500340c1cac80
1642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//===-- CPPLanguageRuntime.cpp -------------------------------------------------*- 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//===----------------------------------------------------------------------===//
9324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham#include "clang/AST/Type.h"
10642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
11b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Core/Log.h"
12642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham#include "lldb/Core/PluginManager.h"
13324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham#include "lldb/Core/ValueObject.h"
14324067bc91877dbbd6ec3a8663914fa3dbb7e3c9Jim Ingham#include "lldb/Symbol/ClangASTContext.h"
15ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham#include "lldb/Symbol/Type.h"
16b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
17642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
18642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamusing namespace lldb;
19642036f22366d47ea8e6f8498bedb92b88f7f79fJim Inghamusing namespace lldb_private;
20642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
21642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//----------------------------------------------------------------------
22642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham// Destructor
23642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham//----------------------------------------------------------------------
24642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime::~ObjCLanguageRuntime()
25642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
26642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham}
27642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
28642036f22366d47ea8e6f8498bedb92b88f7f79fJim InghamObjCLanguageRuntime::ObjCLanguageRuntime (Process *process) :
29642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham    LanguageRuntime (process)
30642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham{
31642036f22366d47ea8e6f8498bedb92b88f7f79fJim Ingham
32b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
33b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
34b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamvoid
35b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamObjCLanguageRuntime::AddToMethodCache (lldb::addr_t class_addr, lldb::addr_t selector, lldb::addr_t impl_addr)
36b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
37e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
38b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (log)
39b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    {
40b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        log->Printf ("Caching: class 0x%llx selector 0x%llx implementation 0x%llx.", class_addr, selector, impl_addr);
41b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    }
42b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    m_impl_cache.insert (std::pair<ClassAndSel,lldb::addr_t> (ClassAndSel(class_addr, selector), impl_addr));
43b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
44b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham
45b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamlldb::addr_t
46b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim InghamObjCLanguageRuntime::LookupInMethodCache (lldb::addr_t class_addr, lldb::addr_t selector)
47b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham{
48b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    MsgImplMap::iterator pos, end = m_impl_cache.end();
49b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    pos = m_impl_cache.find (ClassAndSel(class_addr, selector));
50b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    if (pos != end)
51b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham        return (*pos).second;
52b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham    return LLDB_INVALID_ADDRESS;
53b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham}
54ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
55ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
56ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const char *name, lldb::TypeSP type_sp)
57ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
58ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
59ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (log)
60ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    {
61ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        log->Printf ("Caching: class 0x%llx name: %s.", class_addr, name);
62ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    }
63ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
64ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    TypeAndOrName class_type_or_name;
65ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
66ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (type_sp != NULL)
67ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        class_type_or_name.SetTypeSP (type_sp);
68ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    else if (name && *name != '\0')
69ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        class_type_or_name.SetName (name);
70ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    else
71ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return;
72ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
73ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
74ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
75ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Inghamvoid
76ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const TypeAndOrName &class_type_or_name)
77ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
78ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
79ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (log)
80ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    {
81ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        log->Printf ("Caching: class 0x%llx name: %s.", class_addr, class_type_or_name.GetName().AsCString());
82ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    }
83ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
84ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
85ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
86ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham
87ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamTypeAndOrName
88ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim InghamObjCLanguageRuntime::LookupInClassNameCache (lldb::addr_t class_addr)
89ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham{
90ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    ClassNameMap::iterator pos, end = m_class_name_cache.end();
91ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    pos = m_class_name_cache.find (class_addr);
92ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    if (pos != end)
93ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        return (*pos).second;
94ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    return TypeAndOrName ();
95ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham}
9658513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
9758513667f6765aa8db13cdc4abd500340c1cac80Jim Inghamsize_t
9858513667f6765aa8db13cdc4abd500340c1cac80Jim InghamObjCLanguageRuntime::GetByteOffsetForIvar (ClangASTType &parent_qual_type, const char *ivar_name)
9958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham{
10058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham    return LLDB_INVALID_IVAR_OFFSET;
10158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham}
10258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
103