summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/OperatingSystem
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/OperatingSystem')
-rw-r--r--lldb/source/Plugins/OperatingSystem/CMakeLists.txt1
-rw-r--r--lldb/source/Plugins/OperatingSystem/Go/CMakeLists.txt10
-rw-r--r--lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.cpp497
-rw-r--r--lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.h90
4 files changed, 0 insertions, 598 deletions
diff --git a/lldb/source/Plugins/OperatingSystem/CMakeLists.txt b/lldb/source/Plugins/OperatingSystem/CMakeLists.txt
index 1f017adcd02..655007a0aab 100644
--- a/lldb/source/Plugins/OperatingSystem/CMakeLists.txt
+++ b/lldb/source/Plugins/OperatingSystem/CMakeLists.txt
@@ -1,2 +1 @@
-add_subdirectory(Go)
add_subdirectory(Python)
diff --git a/lldb/source/Plugins/OperatingSystem/Go/CMakeLists.txt b/lldb/source/Plugins/OperatingSystem/Go/CMakeLists.txt
deleted file mode 100644
index 27e952a84df..00000000000
--- a/lldb/source/Plugins/OperatingSystem/Go/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-add_lldb_library(lldbPluginOSGo PLUGIN
- OperatingSystemGo.cpp
-
- LINK_LIBS
- lldbCore
- lldbInterpreter
- lldbSymbol
- lldbTarget
- lldbPluginProcessUtility
- )
diff --git a/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.cpp b/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.cpp
deleted file mode 100644
index 600a67fc6f8..00000000000
--- a/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.cpp
+++ /dev/null
@@ -1,497 +0,0 @@
-//===-- OperatingSystemGo.cpp -----------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// C Includes
-// C++ Includes
-#include <unordered_map>
-
-// Other libraries and framework includes
-// Project includes
-#include "OperatingSystemGo.h"
-
-#include "Plugins/Process/Utility/DynamicRegisterInfo.h"
-#include "Plugins/Process/Utility/RegisterContextMemory.h"
-#include "Plugins/Process/Utility/ThreadMemory.h"
-#include "lldb/Core/Debugger.h"
-#include "lldb/Core/Module.h"
-#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/Section.h"
-#include "lldb/Core/ValueObjectVariable.h"
-#include "lldb/Interpreter/CommandInterpreter.h"
-#include "lldb/Interpreter/OptionGroupBoolean.h"
-#include "lldb/Interpreter/OptionGroupUInt64.h"
-#include "lldb/Interpreter/OptionValueProperties.h"
-#include "lldb/Interpreter/Options.h"
-#include "lldb/Interpreter/Property.h"
-#include "lldb/Symbol/ObjectFile.h"
-#include "lldb/Symbol/Type.h"
-#include "lldb/Symbol/VariableList.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Target/StopInfo.h"
-#include "lldb/Target/Target.h"
-#include "lldb/Target/Thread.h"
-#include "lldb/Target/ThreadList.h"
-#include "lldb/Utility/DataBufferHeap.h"
-#include "lldb/Utility/RegisterValue.h"
-#include "lldb/Utility/StreamString.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-namespace {
-
-static constexpr PropertyDefinition g_properties[] = {
- {"enable", OptionValue::eTypeBoolean, true, true, nullptr, {},
- "Specify whether goroutines should be treated as threads."}};
-
-enum {
- ePropertyEnableGoroutines,
-};
-
-class PluginProperties : public Properties {
-public:
- PluginProperties() : Properties() {
- m_collection_sp.reset(new OptionValueProperties(GetSettingName()));
- m_collection_sp->Initialize(g_properties);
- }
-
- ~PluginProperties() override = default;
-
- static ConstString GetSettingName() {
- return OperatingSystemGo::GetPluginNameStatic();
- }
-
- bool GetEnableGoroutines() {
- const uint32_t idx = ePropertyEnableGoroutines;
- return m_collection_sp->GetPropertyAtIndexAsBoolean(
- NULL, idx, g_properties[idx].default_uint_value);
- }
-
- bool SetEnableGoroutines(bool enable) {
- const uint32_t idx = ePropertyEnableGoroutines;
- return m_collection_sp->SetPropertyAtIndexAsUInt64(NULL, idx, enable);
- }
-};
-
-typedef std::shared_ptr<PluginProperties> OperatingSystemGoPropertiesSP;
-
-static const OperatingSystemGoPropertiesSP &GetGlobalPluginProperties() {
- static OperatingSystemGoPropertiesSP g_settings_sp;
- if (!g_settings_sp)
- g_settings_sp.reset(new PluginProperties());
- return g_settings_sp;
-}
-
-class RegisterContextGo : public RegisterContextMemory {
-public:
- RegisterContextGo(lldb_private::Thread &thread, uint32_t concrete_frame_idx,
- DynamicRegisterInfo &reg_info, lldb::addr_t reg_data_addr)
- : RegisterContextMemory(thread, concrete_frame_idx, reg_info,
- reg_data_addr) {
- const RegisterInfo *sp = reg_info.GetRegisterInfoAtIndex(
- reg_info.ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
- LLDB_REGNUM_GENERIC_SP));
- const RegisterInfo *pc = reg_info.GetRegisterInfoAtIndex(
- reg_info.ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
- LLDB_REGNUM_GENERIC_PC));
- size_t byte_size = std::max(sp->byte_offset + sp->byte_size,
- pc->byte_offset + pc->byte_size);
-
- DataBufferSP reg_data_sp(new DataBufferHeap(byte_size, 0));
- m_reg_data.SetData(reg_data_sp);
- }
-
- ~RegisterContextGo() override = default;
-
- bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
- lldb_private::RegisterValue &reg_value) override {
- switch (reg_info->kinds[eRegisterKindGeneric]) {
- case LLDB_REGNUM_GENERIC_SP:
- case LLDB_REGNUM_GENERIC_PC:
- return RegisterContextMemory::ReadRegister(reg_info, reg_value);
- default:
- reg_value.SetValueToInvalid();
- return true;
- }
- }
-
- bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
- const lldb_private::RegisterValue &reg_value) override {
- switch (reg_info->kinds[eRegisterKindGeneric]) {
- case LLDB_REGNUM_GENERIC_SP:
- case LLDB_REGNUM_GENERIC_PC:
- return RegisterContextMemory::WriteRegister(reg_info, reg_value);
- default:
- return false;
- }
- }
-
-private:
- DISALLOW_COPY_AND_ASSIGN(RegisterContextGo);
-};
-
-} // anonymous namespace
-
-struct OperatingSystemGo::Goroutine {
- uint64_t m_lostack;
- uint64_t m_histack;
- uint64_t m_goid;
- addr_t m_gobuf;
- uint32_t m_status;
-};
-
-void OperatingSystemGo::Initialize() {
- PluginManager::RegisterPlugin(GetPluginNameStatic(),
- GetPluginDescriptionStatic(), CreateInstance,
- DebuggerInitialize);
-}
-
-void OperatingSystemGo::DebuggerInitialize(Debugger &debugger) {
- if (!PluginManager::GetSettingForOperatingSystemPlugin(
- debugger, PluginProperties::GetSettingName())) {
- const bool is_global_setting = true;
- PluginManager::CreateSettingForOperatingSystemPlugin(
- debugger, GetGlobalPluginProperties()->GetValueProperties(),
- ConstString("Properties for the goroutine thread plug-in."),
- is_global_setting);
- }
-}
-
-void OperatingSystemGo::Terminate() {
- PluginManager::UnregisterPlugin(CreateInstance);
-}
-
-OperatingSystem *OperatingSystemGo::CreateInstance(Process *process,
- bool force) {
- if (!force) {
- TargetSP target_sp = process->CalculateTarget();
- if (!target_sp)
- return nullptr;
- ModuleList &module_list = target_sp->GetImages();
- std::lock_guard<std::recursive_mutex> guard(module_list.GetMutex());
- const size_t num_modules = module_list.GetSize();
- bool found_go_runtime = false;
- for (size_t i = 0; i < num_modules; ++i) {
- Module *module = module_list.GetModulePointerAtIndexUnlocked(i);
- const SectionList *section_list = module->GetSectionList();
- if (section_list) {
- SectionSP section_sp(
- section_list->FindSectionByType(eSectionTypeGoSymtab, true));
- if (section_sp) {
- found_go_runtime = true;
- break;
- }
- }
- }
- if (!found_go_runtime)
- return nullptr;
- }
- return new OperatingSystemGo(process);
-}
-
-OperatingSystemGo::OperatingSystemGo(lldb_private::Process *process)
- : OperatingSystem(process), m_reginfo(new DynamicRegisterInfo) {}
-
-OperatingSystemGo::~OperatingSystemGo() = default;
-
-ConstString OperatingSystemGo::GetPluginNameStatic() {
- static ConstString g_name("goroutines");
- return g_name;
-}
-
-const char *OperatingSystemGo::GetPluginDescriptionStatic() {
- return "Operating system plug-in that reads runtime data-structures for "
- "goroutines.";
-}
-
-bool OperatingSystemGo::Init(ThreadList &threads) {
- if (threads.GetSize(false) < 1)
- return false;
- TargetSP target_sp = m_process->CalculateTarget();
- if (!target_sp)
- return false;
- // Go 1.6 stores goroutines in a slice called runtime.allgs
- ValueObjectSP allgs_sp = FindGlobal(target_sp, "runtime.allgs");
- if (allgs_sp) {
- m_allg_sp = allgs_sp->GetChildMemberWithName(ConstString("array"), true);
- m_allglen_sp = allgs_sp->GetChildMemberWithName(ConstString("len"), true);
- } else {
- // Go 1.4 stores goroutines in the variable runtime.allg.
- m_allg_sp = FindGlobal(target_sp, "runtime.allg");
- m_allglen_sp = FindGlobal(target_sp, "runtime.allglen");
- }
-
- if (m_allg_sp && !m_allglen_sp) {
- StreamSP error_sp = target_sp->GetDebugger().GetAsyncErrorStream();
- error_sp->Printf("Unsupported Go runtime version detected.");
- return false;
- }
-
- if (!m_allg_sp)
- return false;
-
- RegisterContextSP real_registers_sp =
- threads.GetThreadAtIndex(0, false)->GetRegisterContext();
-
- std::unordered_map<size_t, ConstString> register_sets;
- for (size_t set_idx = 0; set_idx < real_registers_sp->GetRegisterSetCount();
- ++set_idx) {
- const RegisterSet *set = real_registers_sp->GetRegisterSet(set_idx);
- ConstString name(set->name);
- for (size_t reg_idx = 0; reg_idx < set->num_registers; ++reg_idx) {
- register_sets[reg_idx] = name;
- }
- }
- TypeSP gobuf_sp = FindType(target_sp, "runtime.gobuf");
- if (!gobuf_sp) {
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OS));
-
- if (log)
- log->Printf("OperatingSystemGo unable to find struct Gobuf");
- return false;
- }
- CompilerType gobuf_type(gobuf_sp->GetLayoutCompilerType());
- for (size_t idx = 0; idx < real_registers_sp->GetRegisterCount(); ++idx) {
- RegisterInfo reg = *real_registers_sp->GetRegisterInfoAtIndex(idx);
- int field_index = -1;
- if (reg.kinds[eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_SP) {
- field_index = 0;
- } else if (reg.kinds[eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_PC) {
- field_index = 1;
- }
- if (field_index == -1) {
- reg.byte_offset = ~0;
- } else {
- std::string field_name;
- uint64_t bit_offset = 0;
- CompilerType field_type = gobuf_type.GetFieldAtIndex(
- field_index, field_name, &bit_offset, nullptr, nullptr);
- reg.byte_size = field_type.GetByteSize(nullptr);
- reg.byte_offset = bit_offset / 8;
- }
- ConstString name(reg.name);
- ConstString alt_name(reg.alt_name);
- m_reginfo->AddRegister(reg, name, alt_name, register_sets[idx]);
- }
- return true;
-}
-
-//------------------------------------------------------------------
-// PluginInterface protocol
-//------------------------------------------------------------------
-ConstString OperatingSystemGo::GetPluginName() { return GetPluginNameStatic(); }
-
-uint32_t OperatingSystemGo::GetPluginVersion() { return 1; }
-
-bool OperatingSystemGo::UpdateThreadList(ThreadList &old_thread_list,
- ThreadList &real_thread_list,
- ThreadList &new_thread_list) {
- new_thread_list = real_thread_list;
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OS));
-
- if (!(m_allg_sp || Init(real_thread_list)) || (m_allg_sp && !m_allglen_sp) ||
- !GetGlobalPluginProperties()->GetEnableGoroutines()) {
- return new_thread_list.GetSize(false) > 0;
- }
-
- if (log)
- log->Printf("OperatingSystemGo::UpdateThreadList(%d, %d, %d) fetching "
- "thread data from Go for pid %" PRIu64,
- old_thread_list.GetSize(false), real_thread_list.GetSize(false),
- new_thread_list.GetSize(0), m_process->GetID());
- uint64_t allglen = m_allglen_sp->GetValueAsUnsigned(0);
- if (allglen == 0) {
- return new_thread_list.GetSize(false) > 0;
- }
- std::vector<Goroutine> goroutines;
- // The threads that are in "new_thread_list" upon entry are the threads from
- // the lldb_private::Process subclass, no memory threads will be in this
- // list.
-
- Status err;
- for (uint64_t i = 0; i < allglen; ++i) {
- goroutines.push_back(CreateGoroutineAtIndex(i, err));
- if (err.Fail()) {
- LLDB_LOG(log, "error: {0}", err);
- return new_thread_list.GetSize(false) > 0;
- }
- }
- // Make a map so we can match goroutines with backing threads.
- std::map<uint64_t, ThreadSP> stack_map;
- for (uint32_t i = 0; i < real_thread_list.GetSize(false); ++i) {
- ThreadSP thread = real_thread_list.GetThreadAtIndex(i, false);
- stack_map[thread->GetRegisterContext()->GetSP()] = thread;
- }
- for (const Goroutine &goroutine : goroutines) {
- if (0 /* Gidle */ == goroutine.m_status ||
- 6 /* Gdead */ == goroutine.m_status) {
- continue;
- }
- ThreadSP memory_thread =
- old_thread_list.FindThreadByID(goroutine.m_goid, false);
- if (memory_thread && IsOperatingSystemPluginThread(memory_thread) &&
- memory_thread->IsValid()) {
- memory_thread->ClearBackingThread();
- } else {
- memory_thread.reset(new ThreadMemory(*m_process, goroutine.m_goid, "", "",
- goroutine.m_gobuf));
- }
- // Search for the backing thread if the goroutine is running.
- if (2 == (goroutine.m_status & 0xfff)) {
- auto backing_it = stack_map.lower_bound(goroutine.m_lostack);
- if (backing_it != stack_map.end()) {
- if (goroutine.m_histack >= backing_it->first) {
- if (log)
- log->Printf(
- "OperatingSystemGo::UpdateThreadList found backing thread "
- "%" PRIx64 " (%" PRIx64 ") for thread %" PRIx64 "",
- backing_it->second->GetID(),
- backing_it->second->GetProtocolID(), memory_thread->GetID());
- memory_thread->SetBackingThread(backing_it->second);
- new_thread_list.RemoveThreadByID(backing_it->second->GetID(), false);
- }
- }
- }
- new_thread_list.AddThread(memory_thread);
- }
-
- return new_thread_list.GetSize(false) > 0;
-}
-
-void OperatingSystemGo::ThreadWasSelected(Thread *thread) {}
-
-RegisterContextSP
-OperatingSystemGo::CreateRegisterContextForThread(Thread *thread,
- addr_t reg_data_addr) {
- RegisterContextSP reg_ctx_sp;
- if (!thread)
- return reg_ctx_sp;
-
- if (!IsOperatingSystemPluginThread(thread->shared_from_this()))
- return reg_ctx_sp;
-
- reg_ctx_sp.reset(
- new RegisterContextGo(*thread, 0, *m_reginfo, reg_data_addr));
- return reg_ctx_sp;
-}
-
-StopInfoSP
-OperatingSystemGo::CreateThreadStopReason(lldb_private::Thread *thread) {
- StopInfoSP stop_info_sp;
- return stop_info_sp;
-}
-
-lldb::ThreadSP OperatingSystemGo::CreateThread(lldb::tid_t tid,
- addr_t context) {
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OS));
-
- if (log)
- log->Printf("OperatingSystemGo::CreateThread (tid = 0x%" PRIx64
- ", context = 0x%" PRIx64 ") not implemented",
- tid, context);
-
- return ThreadSP();
-}
-
-ValueObjectSP OperatingSystemGo::FindGlobal(TargetSP target, const char *name) {
- VariableList variable_list;
-
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OS));
-
- if (log) {
- log->Printf(
- "exe: %s",
- target->GetExecutableModule()->GetSpecificationDescription().c_str());
- log->Printf("modules: %zu", target->GetImages().GetSize());
- }
-
- uint32_t match_count = target->GetImages().FindGlobalVariables(
- ConstString(name), 1, variable_list);
- if (match_count > 0) {
- ExecutionContextScope *exe_scope = target->GetProcessSP().get();
- if (exe_scope == NULL)
- exe_scope = target.get();
- return ValueObjectVariable::Create(exe_scope,
- variable_list.GetVariableAtIndex(0));
- }
- return ValueObjectSP();
-}
-
-TypeSP OperatingSystemGo::FindType(TargetSP target_sp, const char *name) {
- ConstString const_typename(name);
- SymbolContext sc;
- const bool exact_match = false;
-
- const ModuleList &module_list = target_sp->GetImages();
- size_t count = module_list.GetSize();
- for (size_t idx = 0; idx < count; idx++) {
- ModuleSP module_sp(module_list.GetModuleAtIndex(idx));
- if (module_sp) {
- TypeSP type_sp(module_sp->FindFirstType(sc, const_typename, exact_match));
- if (type_sp)
- return type_sp;
- }
- }
- Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OS));
-
- if (log)
- log->Printf("OperatingSystemGo::FindType(%s): not found", name);
- return TypeSP();
-}
-
-OperatingSystemGo::Goroutine
-OperatingSystemGo::CreateGoroutineAtIndex(uint64_t idx, Status &err) {
- err.Clear();
- Goroutine result = {};
- ValueObjectSP g =
- m_allg_sp->GetSyntheticArrayMember(idx, true)->Dereference(err);
- if (err.Fail()) {
- return result;
- }
-
- ConstString name("goid");
- ValueObjectSP val = g->GetChildMemberWithName(name, true);
- bool success = false;
- result.m_goid = val->GetValueAsUnsigned(0, &success);
- if (!success) {
- err.SetErrorToGenericError();
- err.SetErrorString("unable to read goid");
- return result;
- }
- name.SetCString("atomicstatus");
- val = g->GetChildMemberWithName(name, true);
- result.m_status = (uint32_t)val->GetValueAsUnsigned(0, &success);
- if (!success) {
- err.SetErrorToGenericError();
- err.SetErrorString("unable to read atomicstatus");
- return result;
- }
- name.SetCString("sched");
- val = g->GetChildMemberWithName(name, true);
- result.m_gobuf = val->GetAddressOf(false);
- name.SetCString("stack");
- val = g->GetChildMemberWithName(name, true);
- name.SetCString("lo");
- ValueObjectSP child = val->GetChildMemberWithName(name, true);
- result.m_lostack = child->GetValueAsUnsigned(0, &success);
- if (!success) {
- err.SetErrorToGenericError();
- err.SetErrorString("unable to read stack.lo");
- return result;
- }
- name.SetCString("hi");
- child = val->GetChildMemberWithName(name, true);
- result.m_histack = child->GetValueAsUnsigned(0, &success);
- if (!success) {
- err.SetErrorToGenericError();
- err.SetErrorString("unable to read stack.hi");
- return result;
- }
- return result;
-}
diff --git a/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.h b/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.h
deleted file mode 100644
index 5d255a348a6..00000000000
--- a/lldb/source/Plugins/OperatingSystem/Go/OperatingSystemGo.h
+++ /dev/null
@@ -1,90 +0,0 @@
-//===-- OperatingSystemGo.h -------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _liblldb_OperatingSystemGo_h_
-#define _liblldb_OperatingSystemGo_h_
-
-// C Includes
-// C++ Includes
-#include <memory>
-
-// Other libraries and framework includes
-// Project includes
-#include "lldb/Target/OperatingSystem.h"
-
-class DynamicRegisterInfo;
-
-class OperatingSystemGo : public lldb_private::OperatingSystem {
-public:
- OperatingSystemGo(lldb_private::Process *process);
-
- ~OperatingSystemGo() override;
-
- //------------------------------------------------------------------
- // Static Functions
- //------------------------------------------------------------------
- static lldb_private::OperatingSystem *
- CreateInstance(lldb_private::Process *process, bool force);
-
- static void Initialize();
-
- static void DebuggerInitialize(lldb_private::Debugger &debugger);
-
- static void Terminate();
-
- static lldb_private::ConstString GetPluginNameStatic();
-
- static const char *GetPluginDescriptionStatic();
-
- //------------------------------------------------------------------
- // lldb_private::PluginInterface Methods
- //------------------------------------------------------------------
- lldb_private::ConstString GetPluginName() override;
-
- uint32_t GetPluginVersion() override;
-
- //------------------------------------------------------------------
- // lldb_private::OperatingSystem Methods
- //------------------------------------------------------------------
- bool UpdateThreadList(lldb_private::ThreadList &old_thread_list,
- lldb_private::ThreadList &real_thread_list,
- lldb_private::ThreadList &new_thread_list) override;
-
- void ThreadWasSelected(lldb_private::Thread *thread) override;
-
- lldb::RegisterContextSP
- CreateRegisterContextForThread(lldb_private::Thread *thread,
- lldb::addr_t reg_data_addr) override;
-
- lldb::StopInfoSP
- CreateThreadStopReason(lldb_private::Thread *thread) override;
-
- //------------------------------------------------------------------
- // Method for lazy creation of threads on demand
- //------------------------------------------------------------------
- lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context) override;
-
-private:
- struct Goroutine;
-
- static lldb::ValueObjectSP FindGlobal(lldb::TargetSP target,
- const char *name);
-
- static lldb::TypeSP FindType(lldb::TargetSP target_sp, const char *name);
-
- bool Init(lldb_private::ThreadList &threads);
-
- Goroutine CreateGoroutineAtIndex(uint64_t idx, lldb_private::Status &err);
-
- std::unique_ptr<DynamicRegisterInfo> m_reginfo;
- lldb::ValueObjectSP m_allg_sp;
- lldb::ValueObjectSP m_allglen_sp;
-};
-
-#endif // liblldb_OperatingSystemGo_h_
OpenPOWER on IntegriCloud