LLDB mainline
PlatformLinux.cpp
Go to the documentation of this file.
1//===-- PlatformLinux.cpp -------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "PlatformLinux.h"
10#include "lldb/Host/Config.h"
11
12#include <cstdio>
13#if LLDB_ENABLE_POSIX
14#include <sys/utsname.h>
15#endif
16
19#include "lldb/Core/Debugger.h"
21#include "lldb/Host/HostInfo.h"
23#include "lldb/Target/Process.h"
24#include "lldb/Target/Target.h"
27#include "lldb/Utility/Log.h"
28#include "lldb/Utility/State.h"
29#include "lldb/Utility/Status.h"
31
32// Define these constants from Linux mman.h for use when targeting remote linux
33// systems even when host has different values.
34#define MAP_PRIVATE 2
35#define MAP_ANON 0x20
36
37// For other platforms that use platform linux
38#ifndef SIGILL
39#define SIGILL 4
40#endif
41#ifndef SIGBUS
42#define SIGBUS 7
43#endif
44#ifndef SIGFPE
45#define SIGFPE 8
46#endif
47#ifndef SIGSEGV
48#define SIGSEGV 11
49#endif
50
51using namespace lldb;
52using namespace lldb_private;
53using namespace lldb_private::platform_linux;
54
56
57static uint32_t g_initialize_count = 0;
58
59
62 LLDB_LOG(log, "force = {0}, arch=({1}, {2})", force,
63 arch ? arch->GetArchitectureName() : "<null>",
64 arch ? arch->GetTriple().getTriple() : "<null>");
65
66 bool create = force;
67 if (!create && arch && arch->IsValid()) {
68 const llvm::Triple &triple = arch->GetTriple();
69 switch (triple.getOS()) {
70 case llvm::Triple::Linux:
71 create = true;
72 break;
73
74#if defined(__linux__)
75 // Only accept "unknown" for the OS if the host is linux and it "unknown"
76 // wasn't specified (it was just returned because it was NOT specified)
77 case llvm::Triple::OSType::UnknownOS:
78 create = !arch->TripleOSWasSpecified();
79 break;
80#endif
81 default:
82 break;
83 }
84 }
85
86 LLDB_LOG(log, "create = {0}", create);
87 if (create) {
88 return PlatformSP(new PlatformLinux(false));
89 }
90 return PlatformSP();
91}
92
93llvm::StringRef PlatformLinux::GetPluginDescriptionStatic(bool is_host) {
94 if (is_host)
95 return "Local Linux user platform plug-in.";
96 return "Remote Linux user platform plug-in.";
97}
98
101
102 if (g_initialize_count++ == 0) {
103#if defined(__linux__) && !defined(__ANDROID__)
104 PlatformSP default_platform_sp(new PlatformLinux(true));
105 default_platform_sp->SetSystemArchitecture(HostInfo::GetArchitecture());
106 Platform::SetHostPlatform(default_platform_sp);
107#endif
112 }
113}
114
124
125/// Default Constructor
127 : PlatformPOSIX(is_host) // This is the local host platform
128{
129 if (is_host) {
130 ArchSpec hostArch = HostInfo::GetArchitecture(HostInfo::eArchKindDefault);
131 m_supported_architectures.push_back(hostArch);
132 if (hostArch.GetTriple().isArch64Bit()) {
134 HostInfo::GetArchitecture(HostInfo::eArchKind32));
135 }
136 } else {
138 {llvm::Triple::x86_64, llvm::Triple::x86, llvm::Triple::arm,
139 llvm::Triple::aarch64, llvm::Triple::mips64, llvm::Triple::mips64,
140 llvm::Triple::hexagon, llvm::Triple::mips, llvm::Triple::mips64el,
141 llvm::Triple::mipsel, llvm::Triple::msp430, llvm::Triple::systemz,
142 llvm::Triple::loongarch64, llvm::Triple::ppc64le,
143 llvm::Triple::riscv64},
144 llvm::Triple::Linux);
145 }
146}
147
148std::vector<ArchSpec>
151 return m_remote_platform_sp->GetSupportedArchitectures(process_host_arch);
153}
154
157
158#if LLDB_ENABLE_POSIX
159 // Display local kernel information only when we are running in host mode.
160 // Otherwise, we would end up printing non-Linux information (when running on
161 // Mac OS for example).
162 if (IsHost()) {
163 struct utsname un;
164
165 if (uname(&un))
166 return;
167
168 strm.Printf(" Kernel: %s\n", un.sysname);
169 strm.Printf(" Release: %s\n", un.release);
170 strm.Printf(" Version: %s\n", un.version);
171 }
172#endif
173}
174
175uint32_t
177 uint32_t resume_count = 0;
178
179 // Always resume past the initial stop when we use eLaunchFlagDebug
180 if (launch_info.GetFlags().Test(eLaunchFlagDebug)) {
181 // Resume past the stop for the final exec into the true inferior.
182 ++resume_count;
183 }
184
185 // If we're not launching a shell, we're done.
186 const FileSpec &shell = launch_info.GetShell();
187 if (!shell)
188 return resume_count;
189
190 std::string shell_string = shell.GetPath();
191 // We're in a shell, so for sure we have to resume past the shell exec.
192 ++resume_count;
193
194 // Figure out what shell we're planning on using.
195 const char *shell_name = strrchr(shell_string.c_str(), '/');
196 if (shell_name == nullptr)
197 shell_name = shell_string.c_str();
198 else
199 shell_name++;
200
201 if (strcmp(shell_name, "csh") == 0 || strcmp(shell_name, "tcsh") == 0 ||
202 strcmp(shell_name, "zsh") == 0 || strcmp(shell_name, "sh") == 0) {
203 // These shells seem to re-exec themselves. Add another resume.
204 ++resume_count;
205 }
206
207 return resume_count;
208}
209
211 if (IsHost()) {
212 return true;
213 } else {
214 // If we're connected, we can debug.
215 return IsConnected();
216 }
217}
218
220 m_trap_handlers.push_back(ConstString("_sigtramp"));
221 m_trap_handlers.push_back(ConstString("__kernel_rt_sigreturn"));
222 m_trap_handlers.push_back(ConstString("__restore_rt"));
223}
224
226 UnwindPlanSP unwind_plan_sp;
227 if (name != "__kernel_rt_sigreturn")
228 return unwind_plan_sp;
229
230 UnwindPlan::Row row;
231
232 // In the signal trampoline frame, sp points to an rt_sigframe[1], which is:
233 // - 128-byte siginfo struct
234 // - ucontext struct:
235 // - 8-byte long (uc_flags)
236 // - 8-byte pointer (uc_link)
237 // - 24-byte stack_t
238 // - 128-byte signal set
239 // - 8 bytes of padding because sigcontext has 16-byte alignment
240 // - sigcontext/mcontext_t
241 // [1]
242 // https://github.com/torvalds/linux/blob/master/arch/arm64/kernel/signal.c
243 int32_t offset = 128 + 8 + 8 + 24 + 128 + 8;
244 // Then sigcontext[2] is:
245 // - 8 byte fault address
246 // - 31 8 byte registers
247 // - 8 byte sp
248 // - 8 byte pc
249 // [2]
250 // https://github.com/torvalds/linux/blob/master/arch/arm64/include/uapi/asm/sigcontext.h
251
252 // Skip fault address
253 offset += 8;
255
289
290 // The sigcontext may also contain floating point and SVE registers.
291 // However this would require a dynamic unwind plan so they are not included
292 // here.
293
294 unwind_plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
295 unwind_plan_sp->AppendRow(std::move(row));
296 unwind_plan_sp->SetSourceName("AArch64 Linux sigcontext");
297 unwind_plan_sp->SetSourcedFromCompiler(eLazyBoolYes);
298 // Because sp is the same throughout the function
299 unwind_plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolYes);
300 unwind_plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolYes);
301
302 return unwind_plan_sp;
303}
304
307 ConstString name) {
308 if (triple.isAArch64())
310
311 return {};
312}
313
315 addr_t addr, addr_t length,
316 unsigned prot, unsigned flags,
317 addr_t fd, addr_t offset) {
318 uint64_t flags_platform = 0;
319 uint64_t map_anon = arch.IsMIPS() ? 0x800 : MAP_ANON;
320
321 if (flags & eMmapFlagsPrivate)
322 flags_platform |= MAP_PRIVATE;
323 if (flags & eMmapFlagsAnon)
324 flags_platform |= map_anon;
325
326 MmapArgList args({addr, length, prot, flags_platform, fd, offset});
327 return args;
328}
329
330CompilerType PlatformLinux::GetSiginfoType(const llvm::Triple &triple) {
331 {
332 std::lock_guard<std::mutex> guard(m_mutex);
333 if (!m_type_system)
334 m_type_system = std::make_shared<TypeSystemClang>("siginfo", triple);
335 }
336 TypeSystemClang *ast = m_type_system.get();
337
338 bool si_errno_then_code = true;
339
340 switch (triple.getArch()) {
341 case llvm::Triple::mips:
342 case llvm::Triple::mipsel:
343 case llvm::Triple::mips64:
344 case llvm::Triple::mips64el:
345 // mips has si_code and si_errno swapped
346 si_errno_then_code = false;
347 break;
348 default:
349 break;
350 }
351
352 // generic types
353 CompilerType int_type = ast->GetBasicType(eBasicTypeInt);
355 CompilerType short_type = ast->GetBasicType(eBasicTypeShort);
356 CompilerType long_type = ast->GetBasicType(eBasicTypeLong);
358
359 // platform-specific types
360 CompilerType &pid_type = int_type;
361 CompilerType &uid_type = uint_type;
362 CompilerType &clock_type = long_type;
363 CompilerType &band_type = long_type;
364
365 CompilerType sigval_type = ast->CreateRecordType(
366 nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "__lldb_sigval_t",
367 llvm::to_underlying(clang::TagTypeKind::Union), lldb::eLanguageTypeC);
368 ast->StartTagDeclarationDefinition(sigval_type);
369 ast->AddFieldToRecordType(sigval_type, "sival_int", int_type,
371 ast->AddFieldToRecordType(sigval_type, "sival_ptr", voidp_type,
373 ast->CompleteTagDeclarationDefinition(sigval_type);
374
375 CompilerType sigfault_bounds_type = ast->CreateRecordType(
377 llvm::to_underlying(clang::TagTypeKind::Union), lldb::eLanguageTypeC);
378 ast->StartTagDeclarationDefinition(sigfault_bounds_type);
380 sigfault_bounds_type, "_addr_bnd",
381 ast->CreateStructForIdentifier(llvm::StringRef(),
382 {
383 {"_lower", voidp_type},
384 {"_upper", voidp_type},
385 }),
387 ast->AddFieldToRecordType(sigfault_bounds_type, "_pkey", uint_type,
389 ast->CompleteTagDeclarationDefinition(sigfault_bounds_type);
390
391 // siginfo_t
392 CompilerType siginfo_type = ast->CreateRecordType(
393 nullptr, OptionalClangModuleID(), lldb::eAccessPublic, "__lldb_siginfo_t",
394 llvm::to_underlying(clang::TagTypeKind::Struct), lldb::eLanguageTypeC);
395 ast->StartTagDeclarationDefinition(siginfo_type);
396 ast->AddFieldToRecordType(siginfo_type, "si_signo", int_type,
398
399 if (si_errno_then_code) {
400 ast->AddFieldToRecordType(siginfo_type, "si_errno", int_type,
402 ast->AddFieldToRecordType(siginfo_type, "si_code", int_type,
404 } else {
405 ast->AddFieldToRecordType(siginfo_type, "si_code", int_type,
407 ast->AddFieldToRecordType(siginfo_type, "si_errno", int_type,
409 }
410
411 // the structure is padded on 64-bit arches to fix alignment
412 if (triple.isArch64Bit())
413 ast->AddFieldToRecordType(siginfo_type, "__pad0", int_type,
415
416 // union used to hold the signal data
417 CompilerType union_type = ast->CreateRecordType(
419 llvm::to_underlying(clang::TagTypeKind::Union), lldb::eLanguageTypeC);
420 ast->StartTagDeclarationDefinition(union_type);
421
422 ast->AddFieldToRecordType(
423 union_type, "_kill",
424 ast->CreateStructForIdentifier(llvm::StringRef(),
425 {
426 {"si_pid", pid_type},
427 {"si_uid", uid_type},
428 }),
430
431 ast->AddFieldToRecordType(
432 union_type, "_timer",
433 ast->CreateStructForIdentifier(llvm::StringRef(),
434 {
435 {"si_tid", int_type},
436 {"si_overrun", int_type},
437 {"si_sigval", sigval_type},
438 }),
440
441 ast->AddFieldToRecordType(
442 union_type, "_rt",
443 ast->CreateStructForIdentifier(llvm::StringRef(),
444 {
445 {"si_pid", pid_type},
446 {"si_uid", uid_type},
447 {"si_sigval", sigval_type},
448 }),
450
451 ast->AddFieldToRecordType(
452 union_type, "_sigchld",
453 ast->CreateStructForIdentifier(llvm::StringRef(),
454 {
455 {"si_pid", pid_type},
456 {"si_uid", uid_type},
457 {"si_status", int_type},
458 {"si_utime", clock_type},
459 {"si_stime", clock_type},
460 }),
462
463 ast->AddFieldToRecordType(
464 union_type, "_sigfault",
465 ast->CreateStructForIdentifier(llvm::StringRef(),
466 {
467 {"si_addr", voidp_type},
468 {"si_addr_lsb", short_type},
469 {"_bounds", sigfault_bounds_type},
470 }),
472
473 ast->AddFieldToRecordType(
474 union_type, "_sigpoll",
475 ast->CreateStructForIdentifier(llvm::StringRef(),
476 {
477 {"si_band", band_type},
478 {"si_fd", int_type},
479 }),
481
482 // NB: SIGSYS is not present on ia64 but we don't seem to support that
483 ast->AddFieldToRecordType(
484 union_type, "_sigsys",
485 ast->CreateStructForIdentifier(llvm::StringRef(),
486 {
487 {"_call_addr", voidp_type},
488 {"_syscall", int_type},
489 {"_arch", uint_type},
490 }),
492
493 ast->CompleteTagDeclarationDefinition(union_type);
494 ast->AddFieldToRecordType(siginfo_type, "_sifields", union_type,
496
497 ast->CompleteTagDeclarationDefinition(siginfo_type);
498 return siginfo_type;
499}
500
501static std::string GetDescriptionFromSiginfo(lldb::ValueObjectSP siginfo_sp) {
502 if (!siginfo_sp)
503 return "";
504
505 lldb_private::LinuxSignals linux_signals;
506 int code = siginfo_sp->GetChildMemberWithName("si_code")->GetValueAsSigned(0);
507 int signo =
508 siginfo_sp->GetChildMemberWithName("si_signo")->GetValueAsSigned(-1);
509
510 auto sifields = siginfo_sp->GetChildMemberWithName("_sifields");
511 if (!sifields)
512 return linux_signals.GetSignalDescription(signo, code);
513
514 // declare everything that we can populate later.
515 std::optional<lldb::addr_t> addr;
516 std::optional<lldb::addr_t> upper;
517 std::optional<lldb::addr_t> lower;
518 std::optional<uint32_t> pid;
519 std::optional<uint32_t> uid;
520
521 // The negative si_codes are special and mean this signal was sent from user
522 // space not the kernel. These take precedence because they break some of the
523 // invariants around kernel sent signals. Such as SIGSEGV won't have an
524 // address.
525 if (code < 0) {
526 auto sikill = sifields->GetChildMemberWithName("_kill");
527 if (sikill) {
528 auto pid_sp = sikill->GetChildMemberWithName("si_pid");
529 if (pid_sp)
530 pid = pid_sp->GetValueAsUnsigned(-1);
531 auto uid_sp = sikill->GetChildMemberWithName("si_uid");
532 if (uid_sp)
533 uid = uid_sp->GetValueAsUnsigned(-1);
534 }
535 } else {
536
537 switch (signo) {
538 case SIGILL:
539 case SIGFPE:
540 case SIGBUS: {
541 auto sigfault = sifields->GetChildMemberWithName("_sigfault");
542 if (!sigfault)
543 break;
544
545 auto addr_sp = sigfault->GetChildMemberWithName("si_addr");
546 if (addr_sp)
547 addr = addr_sp->GetValueAsUnsigned(-1);
548 break;
549 }
550 case SIGSEGV: {
551 auto sigfault = sifields->GetChildMemberWithName("_sigfault");
552 if (!sigfault)
553 break;
554
555 auto addr_sp = sigfault->GetChildMemberWithName("si_addr");
556 if (addr_sp)
557 addr = addr_sp->GetValueAsUnsigned(-1);
558
559 auto bounds_sp = sigfault->GetChildMemberWithName("_bounds");
560 if (!bounds_sp)
561 break;
562
563 auto addr_bnds_sp = bounds_sp->GetChildMemberWithName("_addr_bnd");
564 if (!addr_bnds_sp)
565 break;
566
567 auto lower_sp = addr_bnds_sp->GetChildMemberWithName("_lower");
568 if (lower_sp)
569 lower = lower_sp->GetValueAsUnsigned(-1);
570
571 auto upper_sp = addr_bnds_sp->GetChildMemberWithName("_upper");
572 if (upper_sp)
573 upper = upper_sp->GetValueAsUnsigned(-1);
574
575 break;
576 }
577 default:
578 break;
579 }
580 }
581
582 return linux_signals.GetSignalDescription(signo, code, addr, lower, upper,
583 pid, uid);
584}
585
587 ValueObjectSP siginfo_sp = thread.GetSiginfoValue();
588 if (!siginfo_sp)
589 return {};
590 auto signo_sp = siginfo_sp->GetChildMemberWithName("si_signo");
591 auto sicode_sp = siginfo_sp->GetChildMemberWithName("si_code");
592 if (!signo_sp || !sicode_sp)
593 return {};
594
595 std::string siginfo_description = GetDescriptionFromSiginfo(siginfo_sp);
596 if (siginfo_description.empty())
598 thread, signo_sp->GetValueAsUnsigned(-1));
599
601 thread, signo_sp->GetValueAsUnsigned(-1), siginfo_description.c_str(),
602 sicode_sp->GetValueAsUnsigned(0));
603}
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
Definition Log.h:369
static uint32_t g_initialize_count
#define MAP_ANON
#define MAP_PRIVATE
static lldb::UnwindPlanSP GetAArch64TrapHandlerUnwindPlan(ConstString name)
static std::string GetDescriptionFromSiginfo(lldb::ValueObjectSP siginfo_sp)
#define SIGILL
#define SIGFPE
#define SIGSEGV
#define SIGBUS
#define LLDB_PLUGIN_DEFINE(PluginName)
PlatformPOSIX(bool is_host)
Default Constructor.
An architecture specification class.
Definition ArchSpec.h:31
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:468
bool IsMIPS() const
if MIPS architecture return true.
Definition ArchSpec.cpp:555
Generic representation of a type in a programming language.
CompilerType GetPointerType() const
Return a new CompilerType that is a pointer to this type.
A uniqued constant string class.
Definition ConstString.h:40
A file utility class.
Definition FileSpec.h:57
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
Definition FileSpec.cpp:374
bool Test(ValueType bit) const
Test a single flag bit.
Definition Flags.h:96
Linux specific set of Unix signals.
std::vector< ConstString > m_trap_handlers
Definition Platform.h:1024
static void Terminate()
Definition Platform.cpp:138
static void SetHostPlatform(const lldb::PlatformSP &platform_sp)
Definition Platform.cpp:145
virtual void GetStatus(Stream &strm)
Report the current status for this platform.
Definition Platform.cpp:248
static void Initialize()
Definition Platform.cpp:136
static std::vector< ArchSpec > CreateArchList(llvm::ArrayRef< llvm::Triple::ArchType > archs, llvm::Triple::OSType os)
Create a list of ArchSpecs with the given OS and a architectures.
bool IsHost() const
Definition Platform.h:503
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
const FileSpec & GetShell() const
static lldb::StopInfoSP CreateStopReasonWithSignal(Thread &thread, int signo, const char *description=nullptr, std::optional< int > code=std::nullopt)
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
A TypeSystem implementation based on Clang.
CompilerType GetBasicType(lldb::BasicType type)
static clang::FieldDecl * AddFieldToRecordType(const CompilerType &type, llvm::StringRef name, const CompilerType &field_type, lldb::AccessType access, uint32_t bitfield_bit_size)
CompilerType CreateStructForIdentifier(llvm::StringRef type_name, const std::initializer_list< std::pair< const char *, CompilerType > > &type_fields, bool packed=false)
static bool CompleteTagDeclarationDefinition(const CompilerType &type)
CompilerType CreateRecordType(clang::DeclContext *decl_ctx, OptionalClangModuleID owning_module, lldb::AccessType access_type, llvm::StringRef name, int kind, lldb::LanguageType language, std::optional< ClangASTMetadata > metadata=std::nullopt, bool exports_symbols=false)
static bool StartTagDeclarationDefinition(const CompilerType &type)
std::string GetSignalDescription(int32_t signo, std::optional< int32_t > code=std::nullopt, std::optional< lldb::addr_t > addr=std::nullopt, std::optional< lldb::addr_t > lower=std::nullopt, std::optional< lldb::addr_t > upper=std::nullopt, std::optional< uint32_t > pid=std::nullopt, std::optional< uint32_t > uid=std::nullopt) const
void SetIsRegisterPlusOffset(uint32_t reg_num, int32_t offset)
Definition UnwindPlan.h:240
bool SetRegisterLocationToAtCFAPlusOffset(uint32_t reg_num, int32_t offset, bool can_replace)
const FAValue & GetCFAValue() const
Definition UnwindPlan.h:365
void GetStatus(Stream &strm) override
Report the current status for this platform.
void CalculateTrapHandlerSymbolNames() override
Ask the Platform subclass to fill in the list of trap handler names.
PlatformLinux(bool is_host)
Default Constructor.
std::vector< ArchSpec > GetSupportedArchitectures(const ArchSpec &process_host_arch) override
Get the platform's supported architectures in the order in which they should be searched.
lldb::StopInfoSP GetStopInfoFromSiginfo(Thread &thread) override
std::shared_ptr< TypeSystemClang > m_type_system
static llvm::StringRef GetPluginDescriptionStatic(bool is_host)
static lldb::PlatformSP CreateInstance(bool force, const ArchSpec *arch)
lldb::UnwindPlanSP GetTrapHandlerUnwindPlan(const llvm::Triple &triple, ConstString name) override
Try to get a specific unwind plan for a named trap handler.
static llvm::StringRef GetPluginNameStatic(bool is_host)
MmapArgList GetMmapArgumentList(const ArchSpec &arch, lldb::addr_t addr, lldb::addr_t length, unsigned prot, unsigned flags, lldb::addr_t fd, lldb::addr_t offset) override
uint32_t GetResumeCountForLaunchInfo(ProcessLaunchInfo &launch_info) override
std::vector< ArchSpec > m_supported_architectures
bool CanDebugProcess() override
Not all platforms will support debugging a process by spawning somehow halted for a debugger (specifi...
CompilerType GetSiginfoType(const llvm::Triple &triple) override
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:332
llvm::SmallVector< lldb::addr_t, 6 > MmapArgList
Definition Platform.h:64
@ eMmapFlagsPrivate
Definition Platform.h:46
@ eBasicTypeUnsignedInt
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::Platform > PlatformSP
@ eLanguageTypeC
Non-standardized C, such as K&R.
std::shared_ptr< lldb_private::UnwindPlan > UnwindPlanSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
uint64_t addr_t
Definition lldb-types.h:80
@ eRegisterKindDWARF
the register numbers seen DWARF