2018-08-17 01:59:38 +08:00
|
|
|
//===-- VSCode.h ------------------------------------------------*- C++ -*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2018-08-17 01:59:38 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#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"
|
2019-03-08 05:23:21 +08:00
|
|
|
#include "llvm/Support/raw_ostream.h"
|
2018-08-17 01:59:38 +08:00
|
|
|
|
|
|
|
#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"
|
2019-03-08 05:23:21 +08:00
|
|
|
#include "IOStream.h"
|
2018-08-17 01:59:38 +08:00
|
|
|
#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 {
|
2019-03-08 05:23:21 +08:00
|
|
|
InputStream input;
|
|
|
|
OutputStream output;
|
2018-08-17 01:59:38 +08:00
|
|
|
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;
|
|
|
|
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
|