aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp')
-rw-r--r--contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp110
1 files changed, 31 insertions, 79 deletions
diff --git a/contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp b/contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp
index 5e57813c28bd..2adf36fa8276 100644
--- a/contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp
+++ b/contrib/llvm-project/lldb/source/Symbol/TypeSystem.cpp
@@ -6,22 +6,14 @@
//
//===----------------------------------------------------------------------===//
-//
-// TypeSystem.cpp
-// lldb
-//
-// Created by Ryan Brown on 3/29/15.
-//
-//
-
#include "lldb/Symbol/TypeSystem.h"
-
-#include <set>
-
#include "lldb/Core/PluginManager.h"
+#include "lldb/Expression/UtilityFunction.h"
#include "lldb/Symbol/CompilerType.h"
#include "lldb/Target/Language.h"
+#include <set>
+
using namespace lldb_private;
using namespace lldb;
@@ -179,6 +171,11 @@ TypeSystem::DeclContextFindDeclByName(void *opaque_decl_ctx, ConstString name,
return std::vector<CompilerDecl>();
}
+std::unique_ptr<UtilityFunction>
+TypeSystem::CreateUtilityFunction(std::string text, std::string name) {
+ return {};
+}
+
#pragma mark TypeSystemMap
TypeSystemMap::TypeSystemMap()
@@ -224,9 +221,9 @@ void TypeSystemMap::ForEach(std::function<bool(TypeSystem *)> const &callback) {
}
}
-llvm::Expected<TypeSystem &>
-TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
- Module *module, bool can_create) {
+llvm::Expected<TypeSystem &> TypeSystemMap::GetTypeSystemForLanguage(
+ lldb::LanguageType language,
+ llvm::Optional<CreateCallback> create_callback) {
llvm::Error error = llvm::Error::success();
assert(!error); // Check the success value when assertions are enabled
std::lock_guard<std::mutex> guard(m_mutex);
@@ -268,7 +265,7 @@ TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
}
}
- if (!can_create) {
+ if (!create_callback) {
error = llvm::make_error<llvm::StringError>(
"Unable to find type system for language " +
llvm::StringRef(Language::GetNameForLanguageType(language)),
@@ -276,7 +273,7 @@ TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
} else {
// Cache even if we get a shared pointer that contains a null type system
// back
- auto type_system_sp = TypeSystem::CreateInstance(language, module);
+ TypeSystemSP type_system_sp = (*create_callback)();
m_map[language] = type_system_sp;
if (type_system_sp.get()) {
llvm::consumeError(std::move(error));
@@ -295,69 +292,24 @@ TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
llvm::Expected<TypeSystem &>
TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
- 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);
- 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);
- if (pos != m_map.end()) {
- 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::StringRef(Language::GetNameForLanguageType(language)) +
- " doesn't exist",
- llvm::inconvertibleErrorCode());
- return std::move(error);
- }
-
- for (const auto &pair : m_map) {
- if (pair.second && pair.second->SupportsLanguage(language)) {
- // Add a new mapping for "language" to point to an already existing
- // TypeSystem that supports this language
- m_map[language] = pair.second;
- if (pair.second.get()) {
- llvm::consumeError(std::move(error));
- return *pair.second.get();
- }
- error = llvm::make_error<llvm::StringError>(
- "TypeSystem for language " +
- llvm::StringRef(Language::GetNameForLanguageType(language)) +
- " doesn't exist",
- llvm::inconvertibleErrorCode());
- return std::move(error);
- }
- }
-
- if (!can_create) {
- error = llvm::make_error<llvm::StringError>(
- "Unable to find type system for language " +
- llvm::StringRef(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, target);
- 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::StringRef(Language::GetNameForLanguageType(language)) +
- " doesn't exist",
- llvm::inconvertibleErrorCode());
- }
+ Module *module, bool can_create) {
+ if (can_create) {
+ return GetTypeSystemForLanguage(
+ language, llvm::Optional<CreateCallback>([language, module]() {
+ return TypeSystem::CreateInstance(language, module);
+ }));
}
+ return GetTypeSystemForLanguage(language);
+}
- return std::move(error);
+llvm::Expected<TypeSystem &>
+TypeSystemMap::GetTypeSystemForLanguage(lldb::LanguageType language,
+ Target *target, bool can_create) {
+ if (can_create) {
+ return GetTypeSystemForLanguage(
+ language, llvm::Optional<CreateCallback>([language, target]() {
+ return TypeSystem::CreateInstance(language, target);
+ }));
+ }
+ return GetTypeSystemForLanguage(language);
}