1fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com//===-- ClangExternalASTSourceCommon.cpp ------------------------*- C++ -*-===//
2fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com//
3fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com//                     The LLVM Compiler Infrastructure
4fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com//
5fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com// This file is distributed under the University of Illinois Open Source
6fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com// License. See LICENSE.TXT for details.
7b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com//
8fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com//===----------------------------------------------------------------------===//
9fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
10fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
11fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com#include "lldb/Core/Stream.h"
1215fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com
1315fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.comusing namespace lldb_private;
1415fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com
15b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com#define ClangExternalASTSourceCommon_MAGIC  (0x00112233aabbccddull)
16b45a1b46ee25e9b19800b028bb1ca925212ac7b4caryclark@google.com
1715fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.comuint64_t g_TotalSizeOfMetadata = 0;
1815fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com
1915fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.comClangExternalASTSourceCommon::ClangExternalASTSourceCommon() : clang::ExternalASTSource()
2015fa138f2276a77679530fb608463ff5b4133f7bcaryclark@google.com{
21fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    m_magic = ClangExternalASTSourceCommon_MAGIC;
22fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
23fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    g_TotalSizeOfMetadata += m_metadata.size();
24fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com}
25fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
26fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comClangExternalASTSourceCommon::~ClangExternalASTSourceCommon()
27fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com{
288dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    g_TotalSizeOfMetadata -= m_metadata.size();
29fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com}
3065f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com
31027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.comClangASTMetadata *
328dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comClangExternalASTSourceCommon::GetMetadata (const void *object)
3365f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com{
348dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    assert (m_magic == ClangExternalASTSourceCommon_MAGIC);
35fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
36fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (HasMetadata (object))
37fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        return &m_metadata[object];
38fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    else
39fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        return NULL;
4065f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com}
41fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
428dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.comvoid
43fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comClangExternalASTSourceCommon::SetMetadata (const void *object, ClangASTMetadata &metadata)
4465f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com{
45027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com    assert (m_magic == ClangExternalASTSourceCommon_MAGIC);
46fa4a6e964691ff9a88bc047418abe2d4324dfcaecaryclark@google.com
4765f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com    uint64_t orig_size = m_metadata.size();
48fa4a6e964691ff9a88bc047418abe2d4324dfcaecaryclark@google.com    m_metadata[object] = metadata;
49fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    uint64_t new_size = m_metadata.size();
50fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    g_TotalSizeOfMetadata += (new_size - orig_size);
51fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com}
52027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com
53027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.combool
54027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.comClangExternalASTSourceCommon::HasMetadata (const void *object)
55027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com{
56027de226c144d9e6b7a76acb2e904952b5620a5ecaryclark@google.com    assert (m_magic == ClangExternalASTSourceCommon_MAGIC);
57fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
58fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    return m_metadata.find(object) != m_metadata.end();
5965f9f0a1664a9cb38157ccfbcc3e0e936af0a58ecaryclark@google.com}
60fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
61fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comvoid
62fa0588ff672564af1c235a63589573829035a60bcaryclark@google.comClangASTMetadata::Dump (Stream *s)
63fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com{
648dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    lldb::user_id_t uid = GetUserID ();
658dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com
668dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    if (uid != LLDB_INVALID_UID)
678dcf114db9762c02d217beba6e29dffa4e92d298caryclark@google.com    {
68fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        s->Printf ("uid=0x%" PRIx64, uid);
69fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
70fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
71fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    uint64_t isa_ptr = GetISAPtr ();
72fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (isa_ptr != 0)
73fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    {
74fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        s->Printf ("isa_ptr=0x%" PRIx64, isa_ptr);
75fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
76fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
77fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    const char *obj_ptr_name = GetObjectPtrName();
78fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (obj_ptr_name)
79fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    {
80fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        s->Printf ("obj_ptr_name=\"%s\" ", obj_ptr_name);
81fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
82fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
83fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    if (m_is_dynamic_cxx)
84fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    {
85fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com        s->Printf ("is_dynamic_cxx=%i ", m_is_dynamic_cxx);
86fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    }
87fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com    s->EOL();
88fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com}
89fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com
90fa0588ff672564af1c235a63589573829035a60bcaryclark@google.com