diff options
Diffstat (limited to 'lldb/tools/lldb-vscode/VSCode.h')
-rw-r--r-- | lldb/tools/lldb-vscode/VSCode.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/lldb/tools/lldb-vscode/VSCode.h b/lldb/tools/lldb-vscode/VSCode.h new file mode 100644 index 00000000000..142be331836 --- /dev/null +++ b/lldb/tools/lldb-vscode/VSCode.h @@ -0,0 +1,146 @@ +//===-- VSCode.h ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLDBVSCODE_VSCODE_H_ +#define LLDBVSCODE_VSCODE_H_ + +#include <iosfwd> +#include <map> +#include <set> +#include <stdio.h> +#include <thread> + +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/StringMap.h" +#include "llvm/ADT/StringRef.h" + +#include "lldb/API/SBAttachInfo.h" +#include "lldb/API/SBBreakpoint.h" +#include "lldb/API/SBBreakpointLocation.h" +#include "lldb/API/SBCommandInterpreter.h" +#include "lldb/API/SBCommandReturnObject.h" +#include "lldb/API/SBCommunication.h" +#include "lldb/API/SBDebugger.h" +#include "lldb/API/SBEvent.h" +#include "lldb/API/SBHostOS.h" +#include "lldb/API/SBInstruction.h" +#include "lldb/API/SBInstructionList.h" +#include "lldb/API/SBLanguageRuntime.h" +#include "lldb/API/SBLaunchInfo.h" +#include "lldb/API/SBLineEntry.h" +#include "lldb/API/SBListener.h" +#include "lldb/API/SBProcess.h" +#include "lldb/API/SBStream.h" +#include "lldb/API/SBStringList.h" +#include "lldb/API/SBTarget.h" +#include "lldb/API/SBThread.h" + +#include "ExceptionBreakpoint.h" +#include "FunctionBreakpoint.h" +#include "SourceBreakpoint.h" +#include "SourceReference.h" + +#define VARREF_LOCALS (int64_t)1 +#define VARREF_GLOBALS (int64_t)2 +#define VARREF_REGS (int64_t)3 +#define VARREF_FIRST_VAR_IDX (int64_t)4 +#define VARREF_IS_SCOPE(v) (VARREF_LOCALS <= 1 && v < VARREF_FIRST_VAR_IDX) +#define VARIDX_TO_VARREF(i) ((i) + VARREF_FIRST_VAR_IDX) +#define VARREF_TO_VARIDX(v) ((v)-VARREF_FIRST_VAR_IDX) +#define NO_TYPENAME "<no-type>" + +namespace lldb_vscode { + +typedef llvm::DenseMap<uint32_t, SourceBreakpoint> SourceBreakpointMap; +typedef llvm::StringMap<FunctionBreakpoint> FunctionBreakpointMap; +enum class OutputType { Console, Stdout, Stderr, Telemetry }; + +struct VSCode { + FILE *in; + FILE *out; + lldb::SBDebugger debugger; + lldb::SBTarget target; + lldb::SBAttachInfo attach_info; + lldb::SBLaunchInfo launch_info; + lldb::SBValueList variables; + lldb::SBBroadcaster broadcaster; + int64_t num_regs; + int64_t num_locals; + int64_t num_globals; + std::thread event_thread; + std::unique_ptr<std::ofstream> log; + llvm::DenseMap<lldb::addr_t, int64_t> addr_to_source_ref; + llvm::DenseMap<int64_t, SourceReference> source_map; + llvm::StringMap<SourceBreakpointMap> source_breakpoints; + FunctionBreakpointMap function_breakpoints; + std::vector<ExceptionBreakpoint> exception_breakpoints; + std::vector<std::string> init_commands; + std::vector<std::string> pre_run_commands; + std::vector<std::string> exit_commands; + std::vector<std::string> stop_commands; + lldb::tid_t focus_tid; + bool sent_terminated_event; + bool stop_at_entry; + // Keep track of the last stop thread index IDs as threads won't go away + // unless we send a "thread" event to indicate the thread exited. + llvm::DenseSet<lldb::tid_t> thread_ids; + VSCode(); + ~VSCode(); + VSCode(const VSCode &rhs) = delete; + void operator=(const VSCode &rhs) = delete; + void CloseInputStream(); + void CloseOutputStream(); + int64_t GetLineForPC(int64_t sourceReference, lldb::addr_t pc) const; + ExceptionBreakpoint *GetExceptionBreakpoint(const std::string &filter); + ExceptionBreakpoint *GetExceptionBreakpoint(const lldb::break_id_t bp_id); + //---------------------------------------------------------------------- + // Send the JSON in "json_str" to the "out" stream. Correctly send the + // "Content-Length:" field followed by the length, followed by the raw + // JSON bytes. + //---------------------------------------------------------------------- + void SendJSON(const std::string &json_str); + + //---------------------------------------------------------------------- + // Serialize the JSON value into a string and send the JSON packet to + // the "out" stream. + //---------------------------------------------------------------------- + void SendJSON(const llvm::json::Value &json); + + std::string ReadJSON(); + + void SendOutput(OutputType o, const llvm::StringRef output); + + void __attribute__((format(printf, 3, 4))) + SendFormattedOutput(OutputType o, const char *format, ...); + + static int64_t GetNextSourceReference(); + + ExceptionBreakpoint *GetExceptionBPFromStopReason(lldb::SBThread &thread); + + lldb::SBThread GetLLDBThread(const llvm::json::Object &arguments); + + lldb::SBFrame GetLLDBFrame(const llvm::json::Object &arguments); + + llvm::json::Value CreateTopLevelScopes(); + + void RunLLDBCommands(llvm::StringRef prefix, + const std::vector<std::string> &commands); + + void RunInitCommands(); + void RunPreRunCommands(); + void RunStopCommands(); + void RunExitCommands(); +}; + +extern VSCode g_vsc; + +} // namespace lldb_vscode + +#endif |