//===-- FreeBSDThread.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_FreeBSDThread_H_
#define liblldb_FreeBSDThread_H_

// C++ Includes
#include <memory>
#include <string>

// Other libraries and framework includes
#include "RegisterContextPOSIX.h"
#include "lldb/Target/Thread.h"

class ProcessMessage;
class ProcessMonitor;
class POSIXBreakpointProtocol;

//------------------------------------------------------------------------------
// @class FreeBSDThread
// Abstraction of a FreeBSD thread.
class FreeBSDThread : public lldb_private::Thread {
public:
  //------------------------------------------------------------------
  // Constructors and destructors
  //------------------------------------------------------------------
  FreeBSDThread(lldb_private::Process &process, lldb::tid_t tid);

  virtual ~FreeBSDThread();

  // POSIXThread
  void RefreshStateAfterStop() override;

  // This notifies the thread when a private stop occurs.
  void DidStop() override;

  const char *GetInfo() override;

  void SetName(const char *name) override;

  const char *GetName() override;

  lldb::RegisterContextSP GetRegisterContext() override;

  lldb::RegisterContextSP
  CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;

  lldb::addr_t GetThreadPointer() override;

  //--------------------------------------------------------------------------
  // These functions provide a mapping from the register offset
  // back to the register index or name for use in debugging or log
  // output.

  unsigned GetRegisterIndexFromOffset(unsigned offset);

  const char *GetRegisterName(unsigned reg);

  const char *GetRegisterNameFromOffset(unsigned offset);

  //--------------------------------------------------------------------------
  // These methods form a specialized interface to POSIX threads.
  //
  bool Resume();

  void Notify(const ProcessMessage &message);

  //--------------------------------------------------------------------------
  // These methods provide an interface to watchpoints
  //
  bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);

  bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);

  uint32_t NumSupportedHardwareWatchpoints();

  uint32_t FindVacantWatchpointIndex();

protected:
  POSIXBreakpointProtocol *GetPOSIXBreakpointProtocol() {
    if (!m_reg_context_sp)
      m_reg_context_sp = GetRegisterContext();
    return m_posix_thread;
  }

  std::unique_ptr<lldb_private::StackFrame> m_frame_ap;

  lldb::BreakpointSiteSP m_breakpoint;

  bool m_thread_name_valid;
  std::string m_thread_name;
  POSIXBreakpointProtocol *m_posix_thread;

  ProcessMonitor &GetMonitor();

  bool CalculateStopInfo() override;

  void BreakNotify(const ProcessMessage &message);
  void WatchNotify(const ProcessMessage &message);
  virtual void TraceNotify(const ProcessMessage &message);
  void LimboNotify(const ProcessMessage &message);
  void SignalNotify(const ProcessMessage &message);
  void SignalDeliveredNotify(const ProcessMessage &message);
  void CrashNotify(const ProcessMessage &message);
  void ExitNotify(const ProcessMessage &message);
  void ExecNotify(const ProcessMessage &message);

  lldb_private::Unwind *GetUnwinder() override;

  //--------------------------------------------------------------------------
  // FreeBSDThread internal API.

  // POSIXThread override
  virtual void WillResume(lldb::StateType resume_state) override;
};

#endif // #ifndef liblldb_FreeBSDThread_H_
