diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:06:29 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:06:29 +0000 | 
| commit | 94994d372d014ce4c8758b9605d63fae651bd8aa (patch) | |
| tree | 51c0b708bd59f205d6b35cb2a8c24d62f0c33d77 /source/Target/Language.cpp | |
| parent | 39be7ce23363d12ae3e49aeb1fdb2bfeb892e836 (diff) | |
Notes
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 cde6f8654aec2..5c7a4097dd6ff 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()) {  | 
