Skip to content

Commit

Permalink
[Target] Introduce Process::GetLanguageRuntimes
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bulbazord committed May 29, 2019
1 parent 83c28ab commit 03e1a82
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 10 deletions.
2 changes: 2 additions & 0 deletions lldb/include/lldb/Target/Language.h
Expand Up @@ -264,6 +264,8 @@ class Language : public PluginInterface {
// 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);
Expand Down
3 changes: 3 additions & 0 deletions lldb/include/lldb/Target/Process.h
Expand Up @@ -2178,6 +2178,9 @@ class Process : public std::enable_shared_from_this<Process>,

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);

Expand Down
9 changes: 9 additions & 0 deletions lldb/source/Target/Language.cpp
Expand Up @@ -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) {
Expand Down
22 changes: 22 additions & 0 deletions lldb/source/Target/Process.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down
16 changes: 6 additions & 10 deletions lldb/source/Target/Thread.cpp
Expand Up @@ -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();
Expand All @@ -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();
Expand Down

0 comments on commit 03e1a82

Please sign in to comment.