mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-20 12:05:48 -04:00

For example, it is pretty easy to write a breakpoint command that implements "stop when my caller is Foo", and it is pretty easy to write a breakpoint command that implements "stop when my caller is Bar". But there's no way to write a generic "stop when my caller is..." function, and then specify the caller when you add the command to a breakpoint. With this patch, you can pass this data in a SBStructuredData dictionary. That will get stored in the PythonCommandBaton for the breakpoint, and passed to the implementation function (if it has the right signature) when the breakpoint is hit. Then in lldb, you can say: (lldb) break com add -F caller_is -k caller_name -v Foo More generally this will allow us to write reusable Python breakpoint commands. Differential Revision: https://reviews.llvm.org/D68671
103 lines
3.2 KiB
C++
103 lines
3.2 KiB
C++
//===-- ScriptInterpreter.cpp -----------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Interpreter/ScriptInterpreter.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
|
|
#include "lldb/Host/PseudoTerminal.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Utility/Status.h"
|
|
#include "lldb/Utility/Stream.h"
|
|
#include "lldb/Utility/StringList.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
ScriptInterpreter::ScriptInterpreter(Debugger &debugger,
|
|
lldb::ScriptLanguage script_lang)
|
|
: m_debugger(debugger), m_script_lang(script_lang) {}
|
|
|
|
ScriptInterpreter::~ScriptInterpreter() {}
|
|
|
|
void ScriptInterpreter::CollectDataForBreakpointCommandCallback(
|
|
std::vector<BreakpointOptions *> &bp_options_vec,
|
|
CommandReturnObject &result) {
|
|
result.SetStatus(eReturnStatusFailed);
|
|
result.AppendError(
|
|
"ScriptInterpreter::GetScriptCommands(StringList &) is not implemented.");
|
|
}
|
|
|
|
void ScriptInterpreter::CollectDataForWatchpointCommandCallback(
|
|
WatchpointOptions *bp_options, CommandReturnObject &result) {
|
|
result.SetStatus(eReturnStatusFailed);
|
|
result.AppendError(
|
|
"ScriptInterpreter::GetScriptCommands(StringList &) is not implemented.");
|
|
}
|
|
|
|
std::string ScriptInterpreter::LanguageToString(lldb::ScriptLanguage language) {
|
|
std::string return_value;
|
|
|
|
switch (language) {
|
|
case eScriptLanguageNone:
|
|
return_value = "None";
|
|
break;
|
|
case eScriptLanguagePython:
|
|
return_value = "Python";
|
|
break;
|
|
case eScriptLanguageUnknown:
|
|
return_value = "Unknown";
|
|
break;
|
|
}
|
|
|
|
return return_value;
|
|
}
|
|
|
|
lldb::ScriptLanguage
|
|
ScriptInterpreter::StringToLanguage(const llvm::StringRef &language) {
|
|
if (language.equals_lower(LanguageToString(eScriptLanguageNone)))
|
|
return eScriptLanguageNone;
|
|
if (language.equals_lower(LanguageToString(eScriptLanguagePython)))
|
|
return eScriptLanguagePython;
|
|
return eScriptLanguageUnknown;
|
|
}
|
|
|
|
Status ScriptInterpreter::SetBreakpointCommandCallback(
|
|
std::vector<BreakpointOptions *> &bp_options_vec,
|
|
const char *callback_text) {
|
|
Status return_error;
|
|
for (BreakpointOptions *bp_options : bp_options_vec) {
|
|
return_error = SetBreakpointCommandCallback(bp_options, callback_text);
|
|
if (return_error.Success())
|
|
break;
|
|
}
|
|
return return_error;
|
|
}
|
|
|
|
Status ScriptInterpreter::SetBreakpointCommandCallbackFunction(
|
|
std::vector<BreakpointOptions *> &bp_options_vec,
|
|
const char *function_name,
|
|
StructuredData::ObjectSP extra_args_sp) {
|
|
Status error;
|
|
for (BreakpointOptions *bp_options : bp_options_vec) {
|
|
error = SetBreakpointCommandCallbackFunction(bp_options, function_name,
|
|
extra_args_sp);
|
|
if (!error.Success())
|
|
return error;
|
|
}
|
|
return error;
|
|
}
|
|
|
|
std::unique_ptr<ScriptInterpreterLocker>
|
|
ScriptInterpreter::AcquireInterpreterLock() {
|
|
return std::unique_ptr<ScriptInterpreterLocker>(
|
|
new ScriptInterpreterLocker());
|
|
}
|