POSIXThread.h revision 102b2c2681c9a830afe25bfea35557421905e42c
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
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
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
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprivate:
732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    RegisterContextPOSIX *
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRegisterContextPOSIX ()
752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    {
762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        if (!m_reg_context_sp)
772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            m_reg_context_sp = GetRegisterContext();
782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#if 0
792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return dynamic_cast<RegisterContextPOSIX*>(m_reg_context_sp.get());
802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        return (RegisterContextPOSIX *)m_reg_context_sp.get();
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    }
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
84102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<lldb_private::StackFrame> m_frame_ap;
852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::BreakpointSiteSP m_breakpoint;
872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::StopInfoSP m_stop_info;
882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ProcessMonitor &
902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetMonitor();
912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::StopInfoSP
932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetPrivateStopReason();
942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void BreakNotify(const ProcessMessage &message);
962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void TraceNotify(const ProcessMessage &message);
972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void LimboNotify(const ProcessMessage &message);
982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalNotify(const ProcessMessage &message);
992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void SignalDeliveredNotify(const ProcessMessage &message);
1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void CrashNotify(const ProcessMessage &message);
101f1fda3748c39c92d2e79aeba0715baffabd3286bMatt Kopec    void ThreadNotify(const ProcessMessage &message);
1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Unwind *
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetUnwinder();
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen};
1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif // #ifndef liblldb_POSIXThread_H_
108