diff options
author | Adrian Prantl <aprantl@apple.com> | 2019-08-22 21:45:58 +0000 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2019-08-22 21:45:58 +0000 |
commit | aa97a89d832b5c0b7340d12fb3a889d78bdd62e7 (patch) | |
tree | 9944d8818d0cce27dae9666f02d6f65f9ff47073 /lldb/source/Target | |
parent | f88dfd8309b4f4852de657c41a29620f08f171a9 (diff) | |
download | bcm5719-llvm-aa97a89d832b5c0b7340d12fb3a889d78bdd62e7.tar.gz bcm5719-llvm-aa97a89d832b5c0b7340d12fb3a889d78bdd62e7.zip |
Extend FindTypes with CompilerContext to allow filtering by language.
This patch is also motivated by the Swift branch and is effectively NFC for the single-TypeSystem llvm.org branch.
In multi-language projects it is extremely common to have, e.g., a
Clang type and a similarly-named rendition of that same type in
another language. When searching for a type It is much cheaper to pass
a set of supported languages to the SymbolFile than having it
materialize every result and then rejecting the materialized types
that have the wrong language.
Differential Revision: https://reviews.llvm.org/D66546
<rdar://problem/54471165>
This reapplies r369690 with a previously missing constructor for LanguageSet.
llvm-svn: 369710
Diffstat (limited to 'lldb/source/Target')
-rw-r--r-- | lldb/source/Target/Language.cpp | 24 | ||||
-rw-r--r-- | lldb/source/Target/Target.cpp | 39 |
2 files changed, 22 insertions, 41 deletions
diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 3c3ef2841d4..43d0be0f737 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -357,26 +357,16 @@ std::set<lldb::LanguageType> Language::GetSupportedLanguages() { return supported_languages; } -void Language::GetLanguagesSupportingTypeSystems( - std::set<lldb::LanguageType> &languages, - std::set<lldb::LanguageType> &languages_for_expressions) { - uint32_t idx = 0; - - while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager:: - GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) { - (*enumerate)(languages, languages_for_expressions); - } +LanguageSet Language::GetLanguagesSupportingTypeSystems() { + return PluginManager::GetAllTypeSystemSupportedLanguagesForTypes(); } -void Language::GetLanguagesSupportingREPLs( - std::set<lldb::LanguageType> &languages) { - uint32_t idx = 0; +LanguageSet Language::GetLanguagesSupportingTypeSystemsForExpressions() { + return PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions(); +} - while (REPLEnumerateSupportedLanguages enumerate = - PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex( - idx++)) { - (*enumerate)(languages); - } +LanguageSet Language::GetLanguagesSupportingREPLs() { + return PluginManager::GetREPLAllTypeSystemSupportedLanguages(); } std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() { diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 2368fa18ce7..957b97e429d 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -206,13 +206,11 @@ const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; } lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language, const char *repl_options, bool can_create) { if (language == eLanguageTypeUnknown) { - std::set<LanguageType> repl_languages; + LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs(); - Language::GetLanguagesSupportingREPLs(repl_languages); - - if (repl_languages.size() == 1) { - language = *repl_languages.begin(); - } else if (repl_languages.size() == 0) { + if (auto single_lang = repl_languages.GetSingularLanguage()) { + language = *single_lang; + } else if (repl_languages.Empty()) { err.SetErrorStringWithFormat( "LLDB isn't configured with REPL support for any languages."); return REPLSP(); @@ -2129,23 +2127,18 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all // assembly code || language == eLanguageTypeUnknown) { - std::set<lldb::LanguageType> languages_for_types; - std::set<lldb::LanguageType> languages_for_expressions; - - Language::GetLanguagesSupportingTypeSystems(languages_for_types, - languages_for_expressions); + LanguageSet languages_for_expressions = + Language::GetLanguagesSupportingTypeSystemsForExpressions(); - if (languages_for_expressions.count(eLanguageTypeC)) { + if (languages_for_expressions[eLanguageTypeC]) { language = eLanguageTypeC; // LLDB's default. Override by setting the // target language. } else { - if (languages_for_expressions.empty()) { + if (languages_for_expressions.Empty()) return llvm::make_error<llvm::StringError>( "No expression support for any languages", llvm::inconvertibleErrorCode()); - } else { - language = *languages_for_expressions.begin(); - } + language = (LanguageType)languages_for_expressions.bitvector.find_first(); } } @@ -2159,21 +2152,19 @@ std::vector<TypeSystem *> Target::GetScratchTypeSystems(bool create_on_demand) { std::vector<TypeSystem *> scratch_type_systems; - std::set<lldb::LanguageType> languages_for_types; - std::set<lldb::LanguageType> languages_for_expressions; - - Language::GetLanguagesSupportingTypeSystems(languages_for_types, - languages_for_expressions); + LanguageSet languages_for_expressions = + Language::GetLanguagesSupportingTypeSystemsForExpressions(); - for (auto lang : languages_for_expressions) { + for (auto bit : languages_for_expressions.bitvector.set_bits()) { + auto language = (LanguageType)bit; auto type_system_or_err = - GetScratchTypeSystemForLanguage(lang, create_on_demand); + GetScratchTypeSystemForLanguage(language, create_on_demand); if (!type_system_or_err) LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET), type_system_or_err.takeError(), "Language '{}' has expression support but no scratch type " "system available", - Language::GetNameForLanguageType(lang)); + Language::GetNameForLanguageType(language)); else scratch_type_systems.emplace_back(&type_system_or_err.get()); } |