1 //===-- TypeSystem.cpp ------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 // Created by Ryan Brown on 3/29/15.
18 #include "lldb/Symbol/TypeSystem.h"
22 #include "lldb/Core/PluginManager.h"
23 #include "lldb/Symbol/CompilerType.h"
25 using namespace lldb_private;
28 TypeSystem::TypeSystem(LLVMCastKind kind) : m_kind(kind), m_sym_file(nullptr) {}
30 TypeSystem::~TypeSystem() {}
32 static lldb::TypeSystemSP CreateInstanceHelper(lldb::LanguageType language,
33 Module *module, Target *target) {
35 TypeSystemCreateInstance create_callback;
36 while ((create_callback = PluginManager::GetTypeSystemCreateCallbackAtIndex(
38 lldb::TypeSystemSP type_system_sp =
39 create_callback(language, module, target);
41 return type_system_sp;
44 return lldb::TypeSystemSP();
47 lldb::TypeSystemSP TypeSystem::CreateInstance(lldb::LanguageType language,
49 return CreateInstanceHelper(language, module, nullptr);
52 lldb::TypeSystemSP TypeSystem::CreateInstance(lldb::LanguageType language,
54 return CreateInstanceHelper(language, nullptr, target);
57 bool TypeSystem::IsAnonymousType(lldb::opaque_compiler_type_t type) {
61 CompilerType TypeSystem::GetArrayType(lldb::opaque_compiler_type_t type,
63 return CompilerType();
67 TypeSystem::GetLValueReferenceType(lldb::opaque_compiler_type_t type) {
68 return CompilerType();
72 TypeSystem::GetRValueReferenceType(lldb::opaque_compiler_type_t type) {
73 return CompilerType();
76 CompilerType TypeSystem::AddConstModifier(lldb::opaque_compiler_type_t type) {
77 return CompilerType();
81 TypeSystem::AddVolatileModifier(lldb::opaque_compiler_type_t type) {
82 return CompilerType();
86 TypeSystem::AddRestrictModifier(lldb::opaque_compiler_type_t type) {
87 return CompilerType();
90 CompilerType TypeSystem::CreateTypedef(lldb::opaque_compiler_type_t type,
92 const CompilerDeclContext &decl_ctx) {
93 return CompilerType();
96 CompilerType TypeSystem::GetBuiltinTypeByName(const ConstString &name) {
97 return CompilerType();
100 CompilerType TypeSystem::GetTypeForFormatters(void *type) {
101 return CompilerType(this, type);
105 TypeSystem::GetTemplateArgumentKind(opaque_compiler_type_t type, size_t idx) {
106 return eTemplateArgumentKindNull;
109 CompilerType TypeSystem::GetTypeTemplateArgument(opaque_compiler_type_t type,
111 return CompilerType();
114 llvm::Optional<CompilerType::IntegralTemplateArgument>
115 TypeSystem::GetIntegralTemplateArgument(opaque_compiler_type_t type,
120 LazyBool TypeSystem::ShouldPrintAsOneLiner(void *type, ValueObject *valobj) {
121 return eLazyBoolCalculate;
124 bool TypeSystem::IsMeaninglessWithoutDynamicResolution(void *type) {
128 ConstString TypeSystem::DeclGetMangledName(void *opaque_decl) {
129 return ConstString();
132 CompilerDeclContext TypeSystem::DeclGetDeclContext(void *opaque_decl) {
133 return CompilerDeclContext();
136 CompilerType TypeSystem::DeclGetFunctionReturnType(void *opaque_decl) {
137 return CompilerType();
140 size_t TypeSystem::DeclGetFunctionNumArguments(void *opaque_decl) { return 0; }
142 CompilerType TypeSystem::DeclGetFunctionArgumentType(void *opaque_decl,
144 return CompilerType();
147 std::vector<CompilerDecl>
148 TypeSystem::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
149 bool ignore_imported_decls) {
150 return std::vector<CompilerDecl>();
153 #pragma mark TypeSystemMap
155 TypeSystemMap::TypeSystemMap()
156 : m_mutex(), m_map(), m_clear_in_progress(false) {}
158 TypeSystemMap::~TypeSystemMap() {}
160 void TypeSystemMap::Clear() {
163 std::lock_guard<std::mutex> guard(m_mutex);
165 m_clear_in_progress = true;
167 std::set<TypeSystem *> visited;
168 for (auto pair : map) {
169 TypeSystem *type_system = pair.second.get();
170 if (type_system && !visited.count(type_system)) {
171 visited.insert(type_system);
172 type_system->Finalize();
177 std::lock_guard<std::mutex> guard(m_mutex);
179 m_clear_in_progress = false;
183 void TypeSystemMap::ForEach(std::function<bool(TypeSystem *)> const &callback) {
184 std::lock_guard<std::mutex> guard(m_mutex);
185 // Use a std::set so we only call the callback once for each unique
186 // TypeSystem instance
187 std::set<TypeSystem *> visited;
188 for (auto pair : m_map) {
189 TypeSystem *type_system = pair.second.get();
190 if (type_system && !visited.count(type_system)) {
191 visited.insert(type_system);
192 if (callback(type_system) == false)
198 TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
201 std::lock_guard<std::mutex> guard(m_mutex);
202 collection::iterator pos = m_map.find(language);
203 if (pos != m_map.end())
204 return pos->second.get();
206 for (const auto &pair : m_map) {
207 if (pair.second && pair.second->SupportsLanguage(language)) {
208 // Add a new mapping for "language" to point to an already existing
209 // TypeSystem that supports this language
210 AddToMap(language, pair.second);
211 return pair.second.get();
218 // Cache even if we get a shared pointer that contains null type system back
219 lldb::TypeSystemSP type_system_sp =
220 TypeSystem::CreateInstance(language, module);
221 AddToMap(language, type_system_sp);
222 return type_system_sp.get();
225 TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
228 std::lock_guard<std::mutex> guard(m_mutex);
229 collection::iterator pos = m_map.find(language);
230 if (pos != m_map.end())
231 return pos->second.get();
233 for (const auto &pair : m_map) {
234 if (pair.second && pair.second->SupportsLanguage(language)) {
235 // Add a new mapping for "language" to point to an already existing
236 // TypeSystem that supports this language
238 AddToMap(language, pair.second);
239 return pair.second.get();
246 // Cache even if we get a shared pointer that contains null type system back
247 lldb::TypeSystemSP type_system_sp;
248 if (!m_clear_in_progress)
249 type_system_sp = TypeSystem::CreateInstance(language, target);
251 AddToMap(language, type_system_sp);
252 return type_system_sp.get();
255 void TypeSystemMap::AddToMap(lldb::LanguageType language,
256 lldb::TypeSystemSP const &type_system_sp) {
257 if (!m_clear_in_progress)
258 m_map[language] = type_system_sp;