//===----------------------------------------------------------------------===// // // 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/Host/Config.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Utility/Log.h" #include "lldb/lldb-enumerations.h" #if LLDB_ENABLE_PYTHON // LLDB Python header must be included first #include "../lldb-python.h" #include "../SWIGPythonBridge.h" #include "../ScriptInterpreterPythonImpl.h" #include "ScriptedFramePythonInterface.h" #include using namespace lldb; using namespace lldb_private; using namespace lldb_private::python; using Locker = ScriptInterpreterPythonImpl::Locker; ScriptedFramePythonInterface::ScriptedFramePythonInterface( ScriptInterpreterPythonImpl &interpreter) : ScriptedFrameInterface(), ScriptedPythonInterface(interpreter) {} llvm::Expected ScriptedFramePythonInterface::CreatePluginObject( const llvm::StringRef class_name, ExecutionContext &exe_ctx, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { ExecutionContextRefSP exe_ctx_ref_sp = std::make_shared(exe_ctx); StructuredDataImpl sd_impl(args_sp); return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, exe_ctx_ref_sp, sd_impl); } lldb::user_id_t ScriptedFramePythonInterface::GetID() { Status error; StructuredData::ObjectSP obj = Dispatch("get_id", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return LLDB_INVALID_FRAME_ID; return obj->GetUnsignedIntegerValue(LLDB_INVALID_FRAME_ID); } lldb::addr_t ScriptedFramePythonInterface::GetPC() { Status error; StructuredData::ObjectSP obj = Dispatch("get_pc", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return LLDB_INVALID_ADDRESS; return obj->GetUnsignedIntegerValue(LLDB_INVALID_ADDRESS); } std::optional ScriptedFramePythonInterface::GetSymbolContext() { Status error; auto sym_ctx = Dispatch("get_symbol_context", error); if (error.Fail()) { return ErrorWithMessage(LLVM_PRETTY_FUNCTION, error.AsCString(), error); } return sym_ctx; } std::optional ScriptedFramePythonInterface::GetFunctionName() { Status error; StructuredData::ObjectSP obj = Dispatch("get_function_name", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return {}; return obj->GetStringValue().str(); } std::optional ScriptedFramePythonInterface::GetDisplayFunctionName() { Status error; StructuredData::ObjectSP obj = Dispatch("get_display_function_name", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return {}; return obj->GetStringValue().str(); } bool ScriptedFramePythonInterface::IsInlined() { Status error; StructuredData::ObjectSP obj = Dispatch("is_inlined", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return false; return obj->GetBooleanValue(); } bool ScriptedFramePythonInterface::IsArtificial() { Status error; StructuredData::ObjectSP obj = Dispatch("is_artificial", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return false; return obj->GetBooleanValue(); } bool ScriptedFramePythonInterface::IsHidden() { Status error; StructuredData::ObjectSP obj = Dispatch("is_hidden", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return false; return obj->GetBooleanValue(); } StructuredData::DictionarySP ScriptedFramePythonInterface::GetRegisterInfo() { Status error; StructuredData::DictionarySP dict = Dispatch("get_register_info", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) return {}; return dict; } std::optional ScriptedFramePythonInterface::GetRegisterContext() { Status error; StructuredData::ObjectSP obj = Dispatch("get_register_context", error); if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) return {}; return obj->GetAsString()->GetValue().str(); } #endif