Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
source/Symbol/TypeSystem.cpp
Show All 14 Lines | |||||
// | // | ||||
#include "lldb/Symbol/TypeSystem.h" | #include "lldb/Symbol/TypeSystem.h" | ||||
#include <set> | #include <set> | ||||
#include "lldb/Core/PluginManager.h" | #include "lldb/Core/PluginManager.h" | ||||
#include "lldb/Symbol/CompilerType.h" | #include "lldb/Symbol/CompilerType.h" | ||||
#include "lldb/Target/Language.h" | |||||
using namespace lldb_private; | using namespace lldb_private; | ||||
using namespace lldb; | using namespace lldb; | ||||
TypeSystem::TypeSystem(LLVMCastKind kind) : m_kind(kind), m_sym_file(nullptr) {} | TypeSystem::TypeSystem(LLVMCastKind kind) : m_kind(kind), m_sym_file(nullptr) {} | ||||
TypeSystem::~TypeSystem() {} | TypeSystem::~TypeSystem() {} | ||||
▲ Show 20 Lines • Show All 162 Lines • ▼ Show 20 Lines | for (auto pair : m_map) { | ||||
if (type_system && !visited.count(type_system)) { | if (type_system && !visited.count(type_system)) { | ||||
visited.insert(type_system); | visited.insert(type_system); | ||||
if (!callback(type_system)) | if (!callback(type_system)) | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, | llvm::Expected<TypeSystem &> | ||||
Module *module, | TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, | ||||
bool can_create) { | Module *module, bool can_create) { | ||||
llvm::Error error = llvm::Error::success(); | |||||
assert(!error); // Check the success value when assertions are enabled | |||||
std::lock_guard<std::mutex> guard(m_mutex); | std::lock_guard<std::mutex> guard(m_mutex); | ||||
if (m_clear_in_progress) { | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"Unable to get TypeSystem because TypeSystemMap is being cleared", | |||||
llvm::inconvertibleErrorCode()); | |||||
} else { | |||||
collection::iterator pos = m_map.find(language); | collection::iterator pos = m_map.find(language); | ||||
if (pos != m_map.end()) | if (pos != m_map.end()) { | ||||
return pos->second.get(); | auto *type_system = pos->second.get(); | ||||
if (type_system) { | |||||
llvm::consumeError(std::move(error)); | |||||
return *type_system; | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
return std::move(error); | |||||
} | |||||
for (const auto &pair : m_map) { | for (const auto &pair : m_map) { | ||||
if (pair.second && pair.second->SupportsLanguage(language)) { | if (pair.second && pair.second->SupportsLanguage(language)) { | ||||
// Add a new mapping for "language" to point to an already existing | // Add a new mapping for "language" to point to an already existing | ||||
// TypeSystem that supports this language | // TypeSystem that supports this language | ||||
AddToMap(language, pair.second); | m_map[language] = pair.second; | ||||
return pair.second.get(); | if (pair.second.get()) { | ||||
llvm::consumeError(std::move(error)); | |||||
return *pair.second.get(); | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
return std::move(error); | |||||
} | } | ||||
} | } | ||||
if (!can_create) | if (!can_create) { | ||||
return nullptr; | error = llvm::make_error<llvm::StringError>( | ||||
"Unable to find type system for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)), | |||||
llvm::inconvertibleErrorCode()); | |||||
} else { | |||||
// Cache even if we get a shared pointer that contains a null type system | |||||
// back | |||||
auto type_system_sp = TypeSystem::CreateInstance(language, module); | |||||
m_map[language] = type_system_sp; | |||||
if (type_system_sp.get()) { | |||||
llvm::consumeError(std::move(error)); | |||||
return *type_system_sp.get(); | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
} | |||||
} | |||||
// Cache even if we get a shared pointer that contains null type system back | return std::move(error); | ||||
lldb::TypeSystemSP type_system_sp = | |||||
TypeSystem::CreateInstance(language, module); | |||||
AddToMap(language, type_system_sp); | |||||
return type_system_sp.get(); | |||||
} | } | ||||
TypeSystem *TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, | llvm::Expected<TypeSystem &> | ||||
Target *target, | TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language, | ||||
bool can_create) { | Target *target, bool can_create) { | ||||
llvm::Error error = llvm::Error::success(); | |||||
assert(!error); // Check the success value when assertions are enabled | |||||
std::lock_guard<std::mutex> guard(m_mutex); | std::lock_guard<std::mutex> guard(m_mutex); | ||||
if (m_clear_in_progress) { | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"Unable to get TypeSystem because TypeSystemMap is being cleared", | |||||
llvm::inconvertibleErrorCode()); | |||||
} else { | |||||
collection::iterator pos = m_map.find(language); | collection::iterator pos = m_map.find(language); | ||||
if (pos != m_map.end()) | if (pos != m_map.end()) { | ||||
return pos->second.get(); | auto *type_system = pos->second.get(); | ||||
if (type_system) { | |||||
llvm::consumeError(std::move(error)); | |||||
return *type_system; | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
return std::move(error); | |||||
} | |||||
for (const auto &pair : m_map) { | for (const auto &pair : m_map) { | ||||
if (pair.second && pair.second->SupportsLanguage(language)) { | if (pair.second && pair.second->SupportsLanguage(language)) { | ||||
// Add a new mapping for "language" to point to an already existing | // Add a new mapping for "language" to point to an already existing | ||||
// TypeSystem that supports this language | // TypeSystem that supports this language | ||||
m_map[language] = pair.second; | |||||
AddToMap(language, pair.second); | if (pair.second.get()) { | ||||
return pair.second.get(); | llvm::consumeError(std::move(error)); | ||||
return *pair.second.get(); | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
return std::move(error); | |||||
} | } | ||||
} | } | ||||
if (!can_create) | if (!can_create) { | ||||
return nullptr; | error = llvm::make_error<llvm::StringError>( | ||||
"Unable to find type system for language " + | |||||
// Cache even if we get a shared pointer that contains null type system back | llvm::toStringRef(Language::GetNameForLanguageType(language)), | ||||
lldb::TypeSystemSP type_system_sp; | llvm::inconvertibleErrorCode()); | ||||
if (!m_clear_in_progress) | } else { | ||||
type_system_sp = TypeSystem::CreateInstance(language, target); | // Cache even if we get a shared pointer that contains a null type system | ||||
// back | |||||
AddToMap(language, type_system_sp); | auto type_system_sp = TypeSystem::CreateInstance(language, target); | ||||
return type_system_sp.get(); | m_map[language] = type_system_sp; | ||||
if (type_system_sp.get()) { | |||||
llvm::consumeError(std::move(error)); | |||||
return *type_system_sp.get(); | |||||
} | |||||
error = llvm::make_error<llvm::StringError>( | |||||
"TypeSystem for language " + | |||||
llvm::toStringRef(Language::GetNameForLanguageType(language)) + | |||||
" doesn't exist", | |||||
llvm::inconvertibleErrorCode()); | |||||
} | |||||
} | } | ||||
void TypeSystemMap::AddToMap(lldb::LanguageType language, | return std::move(error); | ||||
lldb::TypeSystemSP const &type_system_sp) { | |||||
if (!m_clear_in_progress) | |||||
m_map[language] = type_system_sp; | |||||
} | } |