81 changes: 81 additions & 0 deletions lldb/source/Plugins/Process/Windows/RegisterContextWindows_x86.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
//===-- RegisterContextWindows_x86.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_RegisterContextWindows_x86_H_
#define liblldb_RegisterContextWindows_x86_H_

#include "lldb/lldb-forward.h"
#include "lldb/Target/RegisterContext.h"

namespace lldb_private
{

class Thread;

class RegisterContextWindows_x86 : public lldb_private::RegisterContext
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
RegisterContextWindows_x86(Thread &thread, uint32_t concrete_frame_idx);

virtual ~RegisterContextWindows_x86();

//------------------------------------------------------------------
// Subclasses must override these functions
//------------------------------------------------------------------
void InvalidateAllRegisters() override;

size_t GetRegisterCount() override;

const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;

size_t GetRegisterSetCount() override;

const RegisterSet *GetRegisterSet(size_t reg_set) override;

bool ReadRegister(const RegisterInfo *reg_info, RegisterValue &reg_value) override;

bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &reg_value) override;

bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;

bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;

uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override;

//------------------------------------------------------------------
// Subclasses can override these functions if desired
//------------------------------------------------------------------
uint32_t NumSupportedHardwareBreakpoints() override;

uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;

bool ClearHardwareBreakpoint(uint32_t hw_idx) override;

uint32_t NumSupportedHardwareWatchpoints() override;

uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read, bool write) override;

bool ClearHardwareWatchpoint(uint32_t hw_index) override;

bool HardwareSingleStep(bool enable) override;

private:
CONTEXT *GetSystemContext();

bool CacheAllRegisterValues();

lldb::DataBufferSP m_cached_context;
bool m_context_valid;
};
}

#endif // #ifndef liblldb_RegisterContextPOSIX_x86_H_
48 changes: 43 additions & 5 deletions lldb/source/Plugins/Process/Windows/TargetThreadWindows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,16 @@
//
//===----------------------------------------------------------------------===//

#include "TargetThreadWindows.h"
#include "ProcessWindows.h"
#include "lldb/Host/HostInfo.h"
#include "lldb/Host/HostNativeThreadBase.h"
#include "lldb/Host/windows/HostThreadWindows.h"
#include "lldb/Host/windows/windows.h"
#include "lldb/Target/RegisterContext.h"

#include "TargetThreadWindows.h"
#include "ProcessWindows.h"
#include "RegisterContextWindows_x86.h"
#include "UnwindLLDB.h"

using namespace lldb;
using namespace lldb_private;
Expand All @@ -30,6 +35,7 @@ TargetThreadWindows::~TargetThreadWindows()
void
TargetThreadWindows::RefreshStateAfterStop()
{
GetRegisterContext()->InvalidateIfNeeded(false);
}

void
Expand All @@ -45,19 +51,51 @@ TargetThreadWindows::DidStop()
RegisterContextSP
TargetThreadWindows::GetRegisterContext()
{
return RegisterContextSP();
if (!m_reg_context_sp)
m_reg_context_sp = CreateRegisterContextForFrameIndex(0);

return m_reg_context_sp;
}

RegisterContextSP
TargetThreadWindows::CreateRegisterContextForFrame(StackFrame *frame)
{
return RegisterContextSP();
return CreateRegisterContextForFrameIndex(frame->GetConcreteFrameIndex());
}

RegisterContextSP
TargetThreadWindows::CreateRegisterContextForFrameIndex(uint32_t idx)
{
if (!m_reg_context_sp)
{
ArchSpec arch = HostInfo::GetArchitecture();
switch (arch.GetMachine())
{
case llvm::Triple::x86:
m_reg_context_sp.reset(new RegisterContextWindows_x86(*this, idx));
break;
default:
// FIXME: Support x64 by creating a RegisterContextWindows_x86_64
break;
}
}
return m_reg_context_sp;
}

bool
TargetThreadWindows::CalculateStopInfo()
{
return false;
SetStopInfo(m_stop_info_sp);
return true;
}

Unwind *
TargetThreadWindows::GetUnwinder()
{
// FIXME: Implement an unwinder based on the Windows unwinder exposed through DIA SDK.
if (m_unwinder_ap.get() == NULL)
m_unwinder_ap.reset(new UnwindLLDB(*this));
return m_unwinder_ap.get();
}

bool
Expand Down
22 changes: 16 additions & 6 deletions lldb/source/Plugins/Process/Windows/TargetThreadWindows.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,26 @@ class TargetThreadWindows : public lldb_private::Thread
TargetThreadWindows(ProcessWindows &process, const HostThread &thread);
virtual ~TargetThreadWindows();

virtual void RefreshStateAfterStop() override;
virtual void WillResume(lldb::StateType resume_state) override;
virtual void DidStop() override;
virtual lldb::RegisterContextSP GetRegisterContext() override;
virtual lldb::RegisterContextSP CreateRegisterContextForFrame(StackFrame *frame) override;
virtual bool CalculateStopInfo() override;
// lldb_private::Thread overrides
void RefreshStateAfterStop() override;
void WillResume(lldb::StateType resume_state) override;
void DidStop() override;
lldb::RegisterContextSP GetRegisterContext() override;
lldb::RegisterContextSP CreateRegisterContextForFrame(StackFrame *frame) override;
bool CalculateStopInfo() override;
Unwind *GetUnwinder() override;

bool DoResume();

HostThread
GetHostThread() const
{
return m_host_thread;
}

private:
lldb::RegisterContextSP CreateRegisterContextForFrameIndex(uint32_t idx);

lldb::StackFrameUP m_stack_frame;

HostThread m_host_thread;
Expand Down