124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Driver.h ------------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef lldb_Driver_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define lldb_Driver_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13dea5ea78ef9bf371a0d19590c6b7c6989cba9a89Jason Molenda#include "lldb/Utility/PseudoTerminal.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <bitset>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBDefines.h"
21fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBBroadcaster.h"
2263094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/API/SBDebugger.h"
23fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBError.h"
24fdd10d62bb2c1ccaf348015daae5e72d39fe19a6Eli Friedman#include "lldb/API/SBInputReader.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264a348081030cdd2af758fddc869518357d9befd3Caroline Tice#define ASYNC true
274a348081030cdd2af758fddc869518357d9befd3Caroline Tice#define NO_ASYNC false
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass IOChannel;
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class SBInputReader;
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Driver : public lldb::SBBroadcaster
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum {
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eBroadcastBitReadyForInput    = (1 << 0),
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eBroadcastBitThreadShouldExit = (1 << 1)
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Driver ();
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Driver ();
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MainLoop ();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutSTDIN (const char *src, size_t src_len);
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFromMaster (const char *src, size_t src_len);
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    HandleIOEvent (const lldb::SBEvent &event);
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    HandleProcessEvent (const lldb::SBEvent &event);
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6528e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    void
6628e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham    HandleBreakpointEvent (const lldb::SBEvent &event);
6728e23861bedbeb5e46be7d2af4c33bf5132422c6Jim Ingham
6894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    void
6994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    HandleThreadEvent (const lldb::SBEvent &event);
7094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
7163094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::SBError
7263094e0bb161580564954dee512955c1c79d3476Greg Clayton    ParseArgs (int argc, const char *argv[], FILE *out_fh, bool &do_exit);
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFilename() const;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCrashLogFilename() const;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetArchName() const;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ScriptLanguage
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetScriptLanguage() const;
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumSourceCommandFiles () const;
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSourceCommandFileAtIndex (uint32_t idx) const;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDebugMode() const;
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class OptionData
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionData ();
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner       ~OptionData ();
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear();
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        //static OptionDefinition m_cmd_option_table[];
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1074dc1892eefc8ccaceec79c09b63fa198b40b4ab9Greg Clayton        std::vector<std::string> m_args;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::ScriptLanguage m_script_lang;
1096c061beb3f9b60380b9638a4eacb3bc46ad38fc5Johnny Chen        std::string m_core_file;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string m_crash_log;
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::vector<std::string> m_source_command_files;
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool m_debug_mode;
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool m_print_version;
114aa93c931a4c1275b2fecec23ef34f231afda4773Jim Ingham        bool m_print_python_path;
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool m_print_help;
11683dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham        bool m_wait_for;
11783dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham        std::string m_process_name;
11883dd2039d86b79e9cd5cf320bdb50c838fcb7b9cJim Ingham        lldb::pid_t m_process_pid;
11974989e88af7e04f3fe0bb3a800163113d7e0ca12Jim Ingham        bool m_use_external_editor;  // FIXME: When we have set/show variables we can remove this from here.
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef std::set<char> OptionSet;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionSet m_seen_options;
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb::SBError
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetOptionValue (int option_idx,
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *option_arg,
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    Driver::OptionData &data);
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13163094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::SBDebugger &
13263094e0bb161580564954dee512955c1c79d3476Greg Clayton    GetDebugger()
13363094e0bb161580564954dee512955c1c79d3476Greg Clayton    {
13463094e0bb161580564954dee512955c1c79d3476Greg Clayton        return m_debugger;
13563094e0bb161580564954dee512955c1c79d3476Greg Clayton    }
136b38df1e945846a5d956974ec157902a6ad748868Caroline Tice
137b38df1e945846a5d956974ec157902a6ad748868Caroline Tice    bool
138b38df1e945846a5d956974ec157902a6ad748868Caroline Tice    EditlineReaderIsTop ()
139b38df1e945846a5d956974ec157902a6ad748868Caroline Tice    {
140b38df1e945846a5d956974ec157902a6ad748868Caroline Tice        return m_debugger.InputReaderIsTopReader (m_editline_reader);
141b38df1e945846a5d956974ec157902a6ad748868Caroline Tice    }
14263094e0bb161580564954dee512955c1c79d3476Greg Clayton
143f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    bool
144f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    GetIsDone () const
145f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    {
146f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton        return m_done;
147f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    }
148f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton
149f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    void
150f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    SetIsDone ()
151f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    {
152f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton        m_done = true;
153f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    }
1542eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham
1552eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham    void
1562eaca13a907b3c2ce41602b646d073851dc696ebJim Ingham    ResizeWindow (unsigned short col);
157f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
15963094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::SBDebugger m_debugger;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_utility::PseudoTerminal m_editline_pty;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FILE *m_editline_slave_fh;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SBInputReader m_editline_reader;
163102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<IOChannel> m_io_channel_ap;
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionData m_option_data;
1654084fe70b71aef8d9d90186f9f54cd8a4d4c6861Greg Clayton    bool m_executing_user_command;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool m_waiting_for_command;
167f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    bool m_done;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ResetOptionValues ();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172757500e29b7856823f2f4aedd30f206ec009147eCaroline Tice    size_t
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcessSTDOUT ();
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175757500e29b7856823f2f4aedd30f206ec009147eCaroline Tice    size_t
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcessSTDERR ();
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
179c833295baeec641086f536e78050388af36784f8Jim Ingham    UpdateSelectedThread ();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CloseIOChannelFile ();
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static size_t
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    EditLineInputReaderCallback (void *baton,
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 lldb::SBInputReader *reader,
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 lldb::InputReaderAction notification,
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const char *bytes,
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 size_t bytes_len);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadThreadBytesReceived (void *baton, const void *src, size_t src_len);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MasterThreadBytesReceived (void *baton, const void *src, size_t src_len);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadyForCommand ();
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201f2f321d826c21c674ca5787b18e8b3e0edaa214bEli Friedman#endif // lldb_Driver_h_
202