blob: 3dcf9051d0a486b771924bbbd3cc953badb3975a [file] [log] [blame]
Sean Callanan3b107b12011-12-03 03:15:28 +00001//===-- ClangExternalASTSourceCommon.cpp ------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Sean Callanan3b107b12011-12-03 03:15:28 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000010#include "lldb/Utility/Stream.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000011
Sean Callananafc70ab2017-07-25 17:33:37 +000012#include <mutex>
13
Sean Callanan3b107b12011-12-03 03:15:28 +000014using namespace lldb_private;
15
Sean Callanan60217122012-04-13 00:10:03 +000016uint64_t g_TotalSizeOfMetadata = 0;
17
Kate Stoneb9c1b512016-09-06 20:57:50 +000018typedef llvm::DenseMap<clang::ExternalASTSource *,
19 ClangExternalASTSourceCommon *>
20 ASTSourceMap;
Sean Callananceeb74e2014-12-06 01:03:30 +000021
Sean Callananafc70ab2017-07-25 17:33:37 +000022static ASTSourceMap &GetSourceMap(std::unique_lock<std::mutex> &guard) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000023 // Intentionally leaked to avoid problems with global destructors.
24 static ASTSourceMap *s_source_map = new ASTSourceMap;
Sean Callananafc70ab2017-07-25 17:33:37 +000025 static std::mutex s_mutex;
26 std::unique_lock<std::mutex> locked_guard(s_mutex);
27 guard.swap(locked_guard);
Kate Stoneb9c1b512016-09-06 20:57:50 +000028 return *s_source_map;
Sean Callananceeb74e2014-12-06 01:03:30 +000029}
30
31ClangExternalASTSourceCommon *
Kate Stoneb9c1b512016-09-06 20:57:50 +000032ClangExternalASTSourceCommon::Lookup(clang::ExternalASTSource *source) {
Sean Callananafc70ab2017-07-25 17:33:37 +000033 std::unique_lock<std::mutex> guard;
34 ASTSourceMap &source_map = GetSourceMap(guard);
Kate Stoneb9c1b512016-09-06 20:57:50 +000035
36 ASTSourceMap::iterator iter = source_map.find(source);
37
38 if (iter != source_map.end()) {
39 return iter->second;
40 } else {
41 return nullptr;
42 }
Sean Callananceeb74e2014-12-06 01:03:30 +000043}
44
Kate Stoneb9c1b512016-09-06 20:57:50 +000045ClangExternalASTSourceCommon::ClangExternalASTSourceCommon()
46 : clang::ExternalASTSource() {
47 g_TotalSizeOfMetadata += m_metadata.size();
Sean Callananafc70ab2017-07-25 17:33:37 +000048 std::unique_lock<std::mutex> guard;
49 GetSourceMap(guard)[this] = this;
Sean Callanan60217122012-04-13 00:10:03 +000050}
51
Kate Stoneb9c1b512016-09-06 20:57:50 +000052ClangExternalASTSourceCommon::~ClangExternalASTSourceCommon() {
Sean Callananafc70ab2017-07-25 17:33:37 +000053 std::unique_lock<std::mutex> guard;
54 GetSourceMap(guard).erase(this);
Kate Stoneb9c1b512016-09-06 20:57:50 +000055 g_TotalSizeOfMetadata -= m_metadata.size();
Sean Callanan3b107b12011-12-03 03:15:28 +000056}
57
Jim Ingham379397632012-10-27 02:54:13 +000058ClangASTMetadata *
Kate Stoneb9c1b512016-09-06 20:57:50 +000059ClangExternalASTSourceCommon::GetMetadata(const void *object) {
60 if (HasMetadata(object))
61 return &m_metadata[object];
62 else
63 return nullptr;
Sean Callanan3b107b12011-12-03 03:15:28 +000064}
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066void ClangExternalASTSourceCommon::SetMetadata(const void *object,
67 ClangASTMetadata &metadata) {
68 uint64_t orig_size = m_metadata.size();
69 m_metadata[object] = metadata;
70 uint64_t new_size = m_metadata.size();
71 g_TotalSizeOfMetadata += (new_size - orig_size);
Sean Callanan3b107b12011-12-03 03:15:28 +000072}
73
Kate Stoneb9c1b512016-09-06 20:57:50 +000074bool ClangExternalASTSourceCommon::HasMetadata(const void *object) {
75 return m_metadata.find(object) != m_metadata.end();
Greg Clayton1075aca2011-12-03 20:02:42 +000076}
Greg Claytond0029442013-03-27 01:48:02 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078void ClangASTMetadata::Dump(Stream *s) {
79 lldb::user_id_t uid = GetUserID();
Greg Claytond0029442013-03-27 01:48:02 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 if (uid != LLDB_INVALID_UID) {
82 s->Printf("uid=0x%" PRIx64, uid);
83 }
84
85 uint64_t isa_ptr = GetISAPtr();
86 if (isa_ptr != 0) {
87 s->Printf("isa_ptr=0x%" PRIx64, isa_ptr);
88 }
89
90 const char *obj_ptr_name = GetObjectPtrName();
91 if (obj_ptr_name) {
92 s->Printf("obj_ptr_name=\"%s\" ", obj_ptr_name);
93 }
94
95 if (m_is_dynamic_cxx) {
96 s->Printf("is_dynamic_cxx=%i ", m_is_dynamic_cxx);
97 }
98 s->EOL();
99}