diff options
| author | Alex Langford <apl@fb.com> | 2019-05-29 18:08:22 +0000 |
|---|---|---|
| committer | Alex Langford <apl@fb.com> | 2019-05-29 18:08:22 +0000 |
| commit | 03e1a82f52d219225c22f14ac73966bb97d4fd0d (patch) | |
| tree | 10e5db7d8aa209e195d03fab640d985db35fb224 | |
| parent | 83c28abdb252670ccf557e02042195c012b45431 (diff) | |
| download | bcm5719-llvm-03e1a82f52d219225c22f14ac73966bb97d4fd0d.tar.gz bcm5719-llvm-03e1a82f52d219225c22f14ac73966bb97d4fd0d.zip | |
[Target] Introduce Process::GetLanguageRuntimes
Summary:
Currently there's not really a good way to iterate over the language runtimes a
process has. This is sometimes desirable (as seen in my change to Thread).
Additionally, there's not really a good reason to iterate over every available
language, but rather only over languages for which we have a plugin loaded.
Reviewers: JDevlieghere, davide, jingham
Subscribers: lldb-commits
Differential Revision: https://reviews.llvm.org/D62562
llvm-svn: 361999
| -rw-r--r-- | lldb/include/lldb/Target/Language.h | 2 | ||||
| -rw-r--r-- | lldb/include/lldb/Target/Process.h | 3 | ||||
| -rw-r--r-- | lldb/source/Target/Language.cpp | 9 | ||||
| -rw-r--r-- | lldb/source/Target/Process.cpp | 22 | ||||
| -rw-r--r-- | lldb/source/Target/Thread.cpp | 16 |
5 files changed, 42 insertions, 10 deletions
diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index b45a51f7674..6ea6029bdac 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -264,6 +264,8 @@ public: // etc. static lldb::LanguageType GetPrimaryLanguage(lldb::LanguageType language); + static std::set<lldb::LanguageType> GetSupportedLanguages(); + static void GetLanguagesSupportingTypeSystems( std::set<lldb::LanguageType> &languages, std::set<lldb::LanguageType> &languages_for_expressions); diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index 90118c87b2f..2657302340e 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -2178,6 +2178,9 @@ public: OperatingSystem *GetOperatingSystem() { return m_os_up.get(); } + std::vector<LanguageRuntime *> + GetLanguageRuntimes(bool retry_if_null = true); + LanguageRuntime *GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null = true); diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index a1a388d396e..3c3ef2841d4 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -348,6 +348,15 @@ LanguageType Language::GetPrimaryLanguage(LanguageType language) { } } +std::set<lldb::LanguageType> Language::GetSupportedLanguages() { + std::set<lldb::LanguageType> supported_languages; + ForEach([&](Language *lang) { + supported_languages.emplace(lang->GetLanguageType()); + return true; + }); + return supported_languages; +} + void Language::GetLanguagesSupportingTypeSystems( std::set<lldb::LanguageType> &languages, std::set<lldb::LanguageType> &languages_for_expressions) { diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 4162571fbd6..c88ef0dcf81 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -44,6 +44,7 @@ #include "lldb/Target/InstrumentationRuntime.h" #include "lldb/Target/JITLoader.h" #include "lldb/Target/JITLoaderList.h" +#include "lldb/Target/Language.h" #include "lldb/Target/LanguageRuntime.h" #include "lldb/Target/MemoryHistory.h" #include "lldb/Target/MemoryRegionInfo.h" @@ -1547,6 +1548,27 @@ const lldb::ABISP &Process::GetABI() { return m_abi_sp; } +std::vector<LanguageRuntime *> +Process::GetLanguageRuntimes(bool retry_if_null) { + std::vector<LanguageRuntime *> language_runtimes; + + if (m_finalizing) + return language_runtimes; + + std::lock_guard<std::recursive_mutex> guard(m_language_runtimes_mutex); + // Before we pass off a copy of the language runtimes, we must make sure that + // our collection is properly populated. It's possible that some of the + // language runtimes were not loaded yet, either because nobody requested it + // yet or the proper condition for loading wasn't yet met (e.g. libc++.so + // hadn't been loaded). + for (const lldb::LanguageType lang_type : Language::GetSupportedLanguages()) { + if (LanguageRuntime *runtime = GetLanguageRuntime(lang_type, retry_if_null)) + language_runtimes.emplace_back(runtime); + } + + return language_runtimes; +} + LanguageRuntime *Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null) { if (m_finalizing) diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 39086529c11..f248e6b525e 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -2211,11 +2211,9 @@ ValueObjectSP Thread::GetCurrentException() { // NOTE: Even though this behavior is generalized, only ObjC is actually // supported at the moment. - for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; lang++) { - if (auto runtime = GetProcess()->GetLanguageRuntime( - static_cast<lldb::LanguageType>(lang))) - if (auto e = runtime->GetExceptionObjectForThread(shared_from_this())) - return e; + for (LanguageRuntime *runtime : GetProcess()->GetLanguageRuntimes()) { + if (auto e = runtime->GetExceptionObjectForThread(shared_from_this())) + return e; } return ValueObjectSP(); @@ -2228,11 +2226,9 @@ ThreadSP Thread::GetCurrentExceptionBacktrace() { // NOTE: Even though this behavior is generalized, only ObjC is actually // supported at the moment. - for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; lang++) { - if (auto runtime = GetProcess()->GetLanguageRuntime( - static_cast<lldb::LanguageType>(lang))) - if (auto bt = runtime->GetBacktraceThreadFromException(exception)) - return bt; + for (LanguageRuntime *runtime : GetProcess()->GetLanguageRuntimes()) { + if (auto bt = runtime->GetBacktraceThreadFromException(exception)) + return bt; } return ThreadSP(); |

