12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- POSIXThread.h -------------------------------------------*- C++ -*-===//
22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//                     The LLVM Compiler Infrastructure
42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source
62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details.
72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===//
92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_POSIXThread_H_
112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_POSIXThread_H_
122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes
142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes
152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <memory>
160ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec#include <string>
172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes
192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Thread.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContextPOSIX.h"
212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMessage;
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor;
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass RegisterContextPOSIX;
252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// @class POSIXThread
2843d853f67b3b176ee6c258fea52ffdefb810a915Ed Maste// @brief Abstraction of a POSIX thread.
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass POSIXThread
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    : public lldb_private::Thread
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic:
335e91e379b3be10738ab5aeae87b47001de16cd7cGreg Clayton    POSIXThread(lldb_private::Process &process, lldb::tid_t tid);
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual ~POSIXThread();
362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RefreshStateAfterStop();
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
40a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    virtual void
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    WillResume(lldb::StateType resume_state);
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
433bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    // This notifies the thread when a private stop occurs.
443bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    virtual void
453bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    DidStop ();
463bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor
472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *
482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetInfo();
492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
500ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    void
510ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    SetName (const char *name);
520ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
530ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    const char *
540ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    GetName ();
550ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::RegisterContextSP
572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterContext();
582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::RegisterContextSP
602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //--------------------------------------------------------------------------
63c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi    // These functions provide a mapping from the register offset
642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // back to the register index or name for use in debugging or log
652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // output.
662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
67c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi    unsigned
682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterIndexFromOffset(unsigned offset);
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
70c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi    const char *
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterName(unsigned reg);
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
73c73fedb63ab170d711fb73d198451eb8db710e8dAshok Thirumurthi    const char *
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterNameFromOffset(unsigned offset);
752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //--------------------------------------------------------------------------
7743d853f67b3b176ee6c258fea52ffdefb810a915Ed Maste    // These methods form a specialized interface to POSIX threads.
782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //
792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool Resume();
802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void Notify(const ProcessMessage &message);
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
833d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    //--------------------------------------------------------------------------
843d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    // These methods provide an interface to watchpoints
853d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    //
863d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);
873d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
883d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);
893d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
903d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    uint32_t NumSupportedHardwareWatchpoints();
913d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
9212c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec    uint32_t FindVacantWatchpointIndex();
9312c5bf31a5a3f96970b4101495ecbcc8449e12f6Matt Kopec
944349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartainprotected:
952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RegisterContextPOSIX *
962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterContextPOSIX ()
972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        if (!m_reg_context_sp)
992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            m_reg_context_sp = GetRegisterContext();
1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#if 0
1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get());
1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif
1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return (RegisterContextPOSIX *)m_reg_context_sp.get();
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
106102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::BreakpointSiteSP m_breakpoint;
1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1104349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    bool m_thread_name_valid;
1110ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec    std::string m_thread_name;
1120ba7548c72ed9a242415cb78f2351146d7afe3b7Matt Kopec
1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor &
1142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetMonitor();
1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
116863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    virtual bool
117863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    CalculateStopInfo();
1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void BreakNotify(const ProcessMessage &message);
1203d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    void WatchNotify(const ProcessMessage &message);
1214349bcb8ec51f3fd447b511b2ce8292a92d3c771Michael Sartain    virtual void TraceNotify(const ProcessMessage &message);
1222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void LimboNotify(const ProcessMessage &message);
1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalNotify(const ProcessMessage &message);
1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalDeliveredNotify(const ProcessMessage &message);
1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void CrashNotify(const ProcessMessage &message);
126f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec    void ThreadNotify(const ProcessMessage &message);
1273bd2ebd670677dae45010bf53084ff85da7c6a5eAndrew Kaylor    void ExitNotify(const ProcessMessage &message);
1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Unwind *
1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetUnwinder();
1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen};
1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // #ifndef liblldb_POSIXThread_H_
134