Ryan Brown 65d4d5c3c6 Add an OperatingSystem plugin to support goroutines
The Go runtime schedules user level threads (goroutines) across real threads.
This adds an OS plugin to create memory threads for goroutines.
It supports the 1.4 and 1.5 go runtime.

Differential Revision: http://reviews.llvm.org/D5871

llvm-svn: 247852
2015-09-16 21:20:44 +00:00

86 lines
3.1 KiB
C++

//===-- 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_
#include <iostream>
#include "lldb/Target/OperatingSystem.h"
class DynamicRegisterInfo;
class OperatingSystemGo : public lldb_private::OperatingSystem
{
public:
//------------------------------------------------------------------
// 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();
//------------------------------------------------------------------
// Class Methods
//------------------------------------------------------------------
OperatingSystemGo(lldb_private::Process *process);
virtual ~OperatingSystemGo();
//------------------------------------------------------------------
// lldb_private::PluginInterface Methods
//------------------------------------------------------------------
virtual lldb_private::ConstString GetPluginName();
virtual uint32_t GetPluginVersion();
//------------------------------------------------------------------
// lldb_private::OperatingSystem Methods
//------------------------------------------------------------------
virtual bool UpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &real_thread_list,
lldb_private::ThreadList &new_thread_list);
virtual void ThreadWasSelected(lldb_private::Thread *thread);
virtual lldb::RegisterContextSP CreateRegisterContextForThread(lldb_private::Thread *thread,
lldb::addr_t reg_data_addr);
virtual lldb::StopInfoSP CreateThreadStopReason(lldb_private::Thread *thread);
//------------------------------------------------------------------
// Method for lazy creation of threads on demand
//------------------------------------------------------------------
virtual lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context);
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::Error &err);
std::unique_ptr<DynamicRegisterInfo> m_reginfo;
lldb::ValueObjectSP m_allg_sp;
lldb::ValueObjectSP m_allglen_sp;
};
#endif // #ifndef liblldb_OperatingSystemGo_h_