diff options
Diffstat (limited to 'source/Target/Language.cpp')
-rw-r--r-- | source/Target/Language.cpp | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/source/Target/Language.cpp b/source/Target/Language.cpp index cde6f8654aec..5c7a4097dd6f 100644 --- a/source/Target/Language.cpp +++ b/source/Target/Language.cpp @@ -77,7 +77,39 @@ Language *Language::FindPlugin(lldb::LanguageType language) { return nullptr; } +Language *Language::FindPlugin(llvm::StringRef file_path) { + Language *result = nullptr; + ForEach([&result, file_path](Language *language) { + if (language->IsSourceFile(file_path)) { + result = language; + return false; + } + return true; + }); + return result; +} + +Language *Language::FindPlugin(LanguageType language, + llvm::StringRef file_path) { + Language *result = FindPlugin(language); + // Finding a language by file path is slower, we so we use this as the + // fallback. + if (!result) + result = FindPlugin(file_path); + return result; +} + void Language::ForEach(std::function<bool(Language *)> callback) { + // If we want to iterate over all languages, we first have to complete the + // LanguagesMap. + static llvm::once_flag g_initialize; + llvm::call_once(g_initialize, [] { + for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; + ++lang) { + FindPlugin(static_cast<lldb::LanguageType>(lang)); + } + }); + std::lock_guard<std::mutex> guard(GetLanguagesMutex()); LanguagesMap &map(GetLanguagesMap()); for (const auto &entry : map) { @@ -353,11 +385,10 @@ bool Language::ImageListTypeScavenger::Find_Impl( Target *target = exe_scope->CalculateTarget().get(); if (target) { const auto &images(target->GetImages()); - SymbolContext null_sc; ConstString cs_key(key); llvm::DenseSet<SymbolFile *> searched_sym_files; TypeList matches; - images.FindTypes(null_sc, cs_key, false, UINT32_MAX, searched_sym_files, + images.FindTypes(nullptr, cs_key, false, UINT32_MAX, searched_sym_files, matches); for (const auto &match : matches.Types()) { if (match.get()) { |