1 //===-- TypeSystem.cpp ------------------------------------------*- C++ -*-===//
3 // 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
7 //===----------------------------------------------------------------------===//
13 // Created by Ryan Brown on 3/29/15.
17 #include "lldb/Symbol/TypeSystem.h"
21 #include "lldb/Core/PluginManager.h"
22 #include "lldb/Symbol/CompilerType.h"
24 using namespace lldb_private;
27 TypeSystem::TypeSystem(LLVMCastKind kind) : m_kind(kind), m_sym_file(nullptr) {}
29 TypeSystem::~TypeSystem() {}
31 static lldb::TypeSystemSP CreateInstanceHelper(lldb::LanguageType language,
32 Module *module, Target *target) {
34 TypeSystemCreateInstance create_callback;
35 while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex(
37 lldb::TypeSystemSP type_system_sp =
38 create_callback(language, module, target);
40 return type_system_sp;
43 return lldb::TypeSystemSP();
46 lldb::TypeSystemSP TypeSystem::CreateInstance(lldb::LanguageType language,
48 return CreateInstanceHelper(language, module, nullptr);
51 lldb::TypeSystemSP TypeSystem::CreateInstance(lldb::LanguageType language,
53 return CreateInstanceHelper(language, nullptr, target);
56 bool TypeSystem::IsAnonymousType(lldb::opaque_compiler_type_t type) {
60 CompilerType TypeSystem::GetArrayType(lldb::opaque_compiler_type_t type,
62 return CompilerType();
66 TypeSystem::GetLValueReferenceType(lldb::opaque_compiler_type_t type) {
67 return CompilerType();
71 TypeSystem::GetRValueReferenceType(lldb::opaque_compiler_type_t type) {
72 return CompilerType();
75 CompilerType TypeSystem::AddConstModifier(lldb::opaque_compiler_type_t type) {
76 return CompilerType();
80 TypeSystem::AddVolatileModifier(lldb::opaque_compiler_type_t type) {
81 return CompilerType();
85 TypeSystem::AddRestrictModifier(lldb::opaque_compiler_type_t type) {
86 return CompilerType();
89 CompilerType TypeSystem::CreateTypedef(lldb::opaque_compiler_type_t type,
91 const CompilerDeclContext &decl_ctx) {
92 return CompilerType();
95 CompilerType TypeSystem::GetBuiltinTypeByName(ConstString name) {
96 return CompilerType();
99 CompilerType TypeSystem::GetTypeForFormatters(void *type) {
100 return CompilerType(this, type);
103 size_t TypeSystem::GetNumTemplateArguments(lldb::opaque_compiler_type_t type) {
108 TypeSystem::GetTemplateArgumentKind(opaque_compiler_type_t type, size_t idx) {
109 return eTemplateArgumentKindNull;
112 CompilerType TypeSystem::GetTypeTemplateArgument(opaque_compiler_type_t type,
114 return CompilerType();
117 llvm::Optional<CompilerType::IntegralTemplateArgument>
118 TypeSystem::GetIntegralTemplateArgument(opaque_compiler_type_t type,
123 LazyBool TypeSystem::ShouldPrintAsOneLiner(void *type, ValueObject *valobj) {
124 return eLazyBoolCalculate;
127 bool TypeSystem::IsMeaninglessWithoutDynamicResolution(void *type) {
131 ConstString TypeSystem::DeclGetMangledName(void *opaque_decl) {
132 return ConstString();
135 CompilerDeclContext TypeSystem::DeclGetDeclContext(void *opaque_decl) {
136 return CompilerDeclContext();
139 CompilerType TypeSystem::DeclGetFunctionReturnType(void *opaque_decl) {
140 return CompilerType();
143 size_t TypeSystem::DeclGetFunctionNumArguments(void *opaque_decl) { return 0; }
145 CompilerType TypeSystem::DeclGetFunctionArgumentType(void *opaque_decl,
147 return CompilerType();
150 std::vector<CompilerDecl>
151 TypeSystem::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
152 bool ignore_imported_decls) {
153 return std::vector<CompilerDecl>();
156 #pragma mark TypeSystemMap
158 TypeSystemMap::TypeSystemMap()
159 : m_mutex(), m_map(), m_clear_in_progress(false) {}
161 TypeSystemMap::~TypeSystemMap() {}
163 void TypeSystemMap::Clear() {
166 std::lock_guard<std::mutex> guard(m_mutex);
168 m_clear_in_progress = true;
170 std::set<TypeSystem *> visited;
171 for (auto pair : map) {
172 TypeSystem *type_system = pair.second.get();
173 if (type_system && !visited.count(type_system)) {
174 visited.insert(type_system);
175 type_system->Finalize();
180 std::lock_guard<std::mutex> guard(m_mutex);
182 m_clear_in_progress = false;
186 void TypeSystemMap::ForEach(std::function<bool(TypeSystem *)> const &callback) {
187 std::lock_guard<std::mutex> guard(m_mutex);
188 // Use a std::set so we only call the callback once for each unique
189 // TypeSystem instance
190 std::set<TypeSystem *> visited;
191 for (auto pair : m_map) {
192 TypeSystem *type_system = pair.second.get();
193 if (type_system && !visited.count(type_system)) {
194 visited.insert(type_system);
195 if (!callback(type_system))
201 TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
204 std::lock_guard<std::mutex> guard(m_mutex);
205 collection::iterator pos = m_map.find(language);
206 if (pos != m_map.end())
207 return pos->second.get();
209 for (const auto &pair : m_map) {
210 if (pair.second && pair.second->SupportsLanguage(language)) {
211 // Add a new mapping for "language" to point to an already existing
212 // TypeSystem that supports this language
213 AddToMap(language, pair.second);
214 return pair.second.get();
221 // Cache even if we get a shared pointer that contains null type system back
222 lldb::TypeSystemSP type_system_sp =
223 TypeSystem::CreateInstance(language, module);
224 AddToMap(language, type_system_sp);
225 return type_system_sp.get();
228 TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
231 std::lock_guard<std::mutex> guard(m_mutex);
232 collection::iterator pos = m_map.find(language);
233 if (pos != m_map.end())
234 return pos->second.get();
236 for (const auto &pair : m_map) {
237 if (pair.second && pair.second->SupportsLanguage(language)) {
238 // Add a new mapping for "language" to point to an already existing
239 // TypeSystem that supports this language
241 AddToMap(language, pair.second);
242 return pair.second.get();
249 // Cache even if we get a shared pointer that contains null type system back
250 lldb::TypeSystemSP type_system_sp;
251 if (!m_clear_in_progress)
252 type_system_sp = TypeSystem::CreateInstance(language, target);
254 AddToMap(language, type_system_sp);
255 return type_system_sp.get();
258 void TypeSystemMap::AddToMap(lldb::LanguageType language,
259 lldb::TypeSystemSP const &type_system_sp) {
260 if (!m_clear_in_progress)
261 m_map[language] = type_system_sp;