diff options
author | 2020-08-03 14:33:06 +0000 | |
---|---|---|
committer | 2020-08-03 14:33:06 +0000 | |
commit | 061da546b983eb767bad15e67af1174fb0bcf31c (patch) | |
tree | 83c78b820819d70aa40c36d90447978b300078c5 /gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp | |
parent | Import LLVM 10.0.0 release including clang, lld and lldb. (diff) | |
download | wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.tar.xz wireguard-openbsd-061da546b983eb767bad15e67af1174fb0bcf31c.zip |
Import LLVM 10.0.0 release including clang, lld and lldb.
ok hackroom
tested by plenty
Diffstat (limited to 'gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp')
-rw-r--r-- | gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp b/gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp new file mode 100644 index 00000000000..4c2eb064fbb --- /dev/null +++ b/gnu/llvm/lldb/source/Target/InstrumentationRuntime.cpp @@ -0,0 +1,75 @@ +//===-- InstrumentationRuntime.cpp ------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===---------------------------------------------------------------------===// + +#include "lldb/Target/InstrumentationRuntime.h" +#include "lldb/Core/Module.h" +#include "lldb/Core/ModuleList.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Target/Process.h" +#include "lldb/Utility/RegularExpression.h" +#include "lldb/lldb-private.h" + +using namespace lldb; +using namespace lldb_private; + +void InstrumentationRuntime::ModulesDidLoad( + lldb_private::ModuleList &module_list, lldb_private::Process *process, + InstrumentationRuntimeCollection &runtimes) { + InstrumentationRuntimeCreateInstance create_callback = nullptr; + InstrumentationRuntimeGetType get_type_callback; + for (uint32_t idx = 0;; ++idx) { + create_callback = + PluginManager::GetInstrumentationRuntimeCreateCallbackAtIndex(idx); + if (create_callback == nullptr) + break; + get_type_callback = + PluginManager::GetInstrumentationRuntimeGetTypeCallbackAtIndex(idx); + InstrumentationRuntimeType type = get_type_callback(); + + InstrumentationRuntimeCollection::iterator pos; + pos = runtimes.find(type); + if (pos == runtimes.end()) { + runtimes[type] = create_callback(process->shared_from_this()); + } + } +} + +void InstrumentationRuntime::ModulesDidLoad( + lldb_private::ModuleList &module_list) { + if (IsActive()) + return; + + if (GetRuntimeModuleSP()) { + Activate(); + return; + } + + module_list.ForEach([this](const lldb::ModuleSP module_sp) -> bool { + const FileSpec &file_spec = module_sp->GetFileSpec(); + if (!file_spec) + return true; // Keep iterating. + + const RegularExpression &runtime_regex = GetPatternForRuntimeLibrary(); + if (runtime_regex.Execute(file_spec.GetFilename().GetCString()) || + module_sp->IsExecutable()) { + if (CheckIfRuntimeIsValid(module_sp)) { + SetRuntimeModuleSP(module_sp); + Activate(); + return false; // Stop iterating, we're done. + } + } + + return true; + }); +} + +lldb::ThreadCollectionSP +InstrumentationRuntime::GetBacktracesFromExtendedStopInfo( + StructuredData::ObjectSP info) { + return ThreadCollectionSP(new ThreadCollection()); +} |