================ @@ -0,0 +1,201 @@ +//===-- AbortWithPayloadFrameRecognizer.cpp -------------------------------===// +// +// 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 "AbortWithPayloadFrameRecognizer.h" + +#include "lldb/Core/Value.h" +#include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Target/ABI.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/StackFrame.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" +#include "lldb/Utility/LLDBLog.h" +#include "lldb/Utility/Log.h" +#include "lldb/Utility/StructuredData.h" + +#include "Plugins/TypeSystem/Clang/TypeSystemClang.h" + +using namespace lldb; +using namespace lldb_private; + +namespace lldb_private { +void RegisterAbortWithPayloadFrameRecognizer(Process *process) { + // There are two user-level API's that this recognizer captures, + // abort_with_reason and abort_with_payload. But they both call the private + // __abort_with_payload, the abort_with_reason call fills in a null payload. + static ConstString module_name("libsystem_kernel.dylib"); + static ConstString sym_name("__abort_with_payload"); + + if (!process) + return; + ConstString sym_arr[1] = {sym_name}; + + process->GetTarget().GetFrameRecognizerManager().AddRecognizer( + std::make_shared<AbortWithPayloadFrameRecognizer>(), module_name, sym_arr, + /*first_instruction_only*/ false); +} + +RecognizedStackFrameSP +AbortWithPayloadFrameRecognizer::RecognizeFrame(lldb::StackFrameSP frame_sp) { + // We have two jobs: + // 1) to add the data passed to abort_with_payload to the + // ExtraCrashInformation dictionary. + // 2) To make up faux arguments for this frame. + static constexpr llvm::StringLiteral namespace_key("namespace"); + static constexpr llvm::StringLiteral code_key("code"); + static constexpr llvm::StringLiteral payload_addr_key("payload_addr"); + static constexpr llvm::StringLiteral payload_size_key("payload_size"); + static constexpr llvm::StringLiteral reason_key("reason"); + static constexpr llvm::StringLiteral flags_key("flags"); + static constexpr llvm::StringLiteral info_key("abort_with_payload"); + + // We are fetching the data from registers. + Thread *thread = frame_sp->GetThread().get(); + Process *process = thread->GetProcess().get(); + + // FIXME: Add logging for these errors ---------------- jimingham wrote:
I fixed the FIXME... https://github.com/llvm/llvm-project/pull/101365 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits