POSIXThread.h revision 863aa28adf536c9c008e1590f25da662431d6f13
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>
162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes
182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/Target/Thread.h"
192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "RegisterContextPOSIX.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMessage;
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass ProcessMonitor;
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass RegisterContextPOSIX;
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//------------------------------------------------------------------------------
262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// @class POSIXThread
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// @brief Abstraction of a linux process (thread).
282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass POSIXThread
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    : public lldb_private::Thread
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen{
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic:
325e91e379b3be10738ab5aeae87b47001de16cd7cGreg Clayton    POSIXThread(lldb_private::Process &process, lldb::tid_t tid);
332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual ~POSIXThread();
352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RefreshStateAfterStop();
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
39a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    virtual void
402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    WillResume(lldb::StateType resume_state);
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    const char *
432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetInfo();
442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::RegisterContextSP
462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterContext();
472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    virtual lldb::RegisterContextSP
492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //--------------------------------------------------------------------------
522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // These static functions provide a mapping from the register offset
532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // back to the register index or name for use in debugging or log
542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // output.
552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    static unsigned
572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterIndexFromOffset(unsigned offset);
582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    static const char *
602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterName(unsigned reg);
612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    static const char *
632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterNameFromOffset(unsigned offset);
642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //--------------------------------------------------------------------------
662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // These methods form a specialized interface to linux threads.
672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    //
682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool Resume();
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void Notify(const ProcessMessage &message);
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
723d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    //--------------------------------------------------------------------------
733d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    // These methods provide an interface to watchpoints
743d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    //
753d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);
763d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
773d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);
783d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
793d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    uint32_t NumSupportedHardwareWatchpoints();
803d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprivate:
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RegisterContextPOSIX *
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterContextPOSIX ()
842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        if (!m_reg_context_sp)
862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            m_reg_context_sp = GetRegisterContext();
872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#if 0
882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get());
892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif
902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return (RegisterContextPOSIX *)m_reg_context_sp.get();
912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
93102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;
942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::BreakpointSiteSP m_breakpoint;
962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor &
982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetMonitor();
992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
100863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    virtual bool
101863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    CalculateStopInfo();
1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void BreakNotify(const ProcessMessage &message);
1043d4d51cd1bdef32ab61ba9e1de75d5a4f4c1dbedMatt Kopec    void WatchNotify(const ProcessMessage &message);
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void TraceNotify(const ProcessMessage &message);
1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void LimboNotify(const ProcessMessage &message);
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalNotify(const ProcessMessage &message);
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalDeliveredNotify(const ProcessMessage &message);
1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void CrashNotify(const ProcessMessage &message);
110f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec    void ThreadNotify(const ProcessMessage &message);
1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Unwind *
1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetUnwinder();
1142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen};
1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // #ifndef liblldb_POSIXThread_H_
117