28#include "llvm/BinaryFormat/ELF.h"
29#include "llvm/Support/Threading.h"
38namespace ELF = llvm::ELF;
43 return "ELF core dump plug-in.";
55 if (crash_file && !can_connect) {
59 const size_t header_size =
sizeof(llvm::ELF::Elf64_Ehdr);
62 crash_file->
GetPath(), header_size, 0);
63 if (data_sp && data_sp->GetByteSize() == header_size &&
68 if (elf_header.
Parse(data, &data_offset)) {
73 if (elf_header.
e_type == llvm::ELF::ET_CORE)
74 process_sp = std::make_shared<ProcessElfCore>(target_sp, listener_sp,
83 bool plugin_specified_by_name) {
88 nullptr,
nullptr,
nullptr));
126 last_entry->
data.GetRangeEnd() == range_entry.
data.GetRangeBase() &&
129 last_entry->
data.SetRangeEnd(range_entry.
data.GetRangeEnd());
136 const uint32_t permissions =
137 ((header.
p_flags & llvm::ELF::PF_R) ? lldb::ePermissionsReadable : 0u) |
138 ((header.
p_flags & llvm::ELF::PF_W) ? lldb::ePermissionsWritable : 0u) |
139 ((header.
p_flags & llvm::ELF::PF_X) ? lldb::ePermissionsExecutable : 0u);
168 if (core ==
nullptr) {
173 llvm::ArrayRef<elf::ELFProgramHeader> segments = core->
ProgramHeaders();
174 if (segments.size() == 0) {
183 bool ranges_are_sorted =
true;
195 if (H.p_type == llvm::ELF::PT_NOTE) {
200 if (H.p_type == llvm::ELF::PT_LOAD) {
202 if (vm_addr > last_addr)
203 ranges_are_sorted =
false;
205 }
else if (H.p_type == llvm::ELF::PT_AARCH64_MEMTAG_MTE) {
207 if (tag_addr > last_addr)
208 ranges_are_sorted =
false;
209 tag_addr = last_addr;
213 if (!ranges_are_sorted) {
231 bool siginfo_signal_found =
false;
232 bool prstatus_signal_found =
false;
235 if (thread_data.siginfo.si_signo != 0)
236 siginfo_signal_found =
true;
237 if (thread_data.prstatus_sig != 0)
238 prstatus_signal_found =
true;
240 if (!siginfo_signal_found) {
243 if (prstatus_signal_found) {
245 thread_data.siginfo.si_signo = thread_data.prstatus_sig;
259 if (!exe_module_sp) {
266 FileSpec::Style::native);
282 if (log && entry.uuid.IsValid())
283 LLDB_LOGF(log,
"%s found UUID @ %16.16" PRIx64
": %s \"%s\"",
284 __FUNCTION__, entry.start, entry.uuid.GetAsString().c_str(),
292 if (path == entry.path)
310 for (
lldb::tid_t tid = 0; tid < num_threads; ++tid) {
315 return new_thread_list.
GetSize(
false) > 0;
330 addr = abi_sp->FixAnyAddress(addr);
342 if (permission_entry) {
343 if (permission_entry->
Contains(load_addr)) {
346 const Flags permissions(permission_entry->
data);
366 }
else if (load_addr < permission_entry->GetRangeBase()) {
392 if (core_objfile ==
nullptr)
398 if (address_range ==
nullptr || address_range->
GetRangeEnd() < addr) {
400 "core file does not contain 0x%" PRIx64, addr);
408 size_t bytes_to_read = size;
409 size_t bytes_copied = 0;
415 if (file_start == file_end)
420 if (file_end > file_start + offset)
421 bytes_left = file_end - (file_start + offset);
423 if (bytes_to_read > bytes_left)
424 bytes_to_read = bytes_left;
429 core_objfile->
CopyData(offset + file_start, bytes_to_read, buf);
434llvm::Expected<std::vector<lldb::addr_t>>
437 if (core_objfile ==
nullptr)
438 return llvm::createStringError(llvm::inconvertibleErrorCode(),
439 "No core object file.");
441 llvm::Expected<const MemoryTagManager *> tag_manager_or_err =
443 if (!tag_manager_or_err)
444 return tag_manager_or_err.takeError();
454 if (!tag_entry || (addr + len) >= tag_entry->
GetRangeEnd())
455 return llvm::createStringError(llvm::inconvertibleErrorCode(),
456 "No tag segment that covers this range.");
461 return core_objfile->
CopyData(offset, length, dst);
473 static llvm::once_flag g_once_flag;
475 llvm::call_once(g_once_flag, []() {
495 int pr_version = data.
GetU32(&offset);
500 LLDB_LOGF(log,
"FreeBSD PRSTATUS unexpected version %d", pr_version);
523 int pr_version = data.
GetU32(&offset);
528 LLDB_LOGF(log,
"FreeBSD PRPSINFO unexpected version %d", pr_version);
542 uint32_t &cpi_siglwp,
546 uint32_t version = data.
GetU32(&offset);
548 return llvm::make_error<llvm::StringError>(
549 "Error parsing NetBSD core(5) notes: Unsupported procinfo version",
550 llvm::inconvertibleErrorCode());
552 uint32_t cpisize = data.
GetU32(&offset);
554 return llvm::make_error<llvm::StringError>(
555 "Error parsing NetBSD core(5) notes: Unsupported procinfo size",
556 llvm::inconvertibleErrorCode());
558 cpi_signo = data.
GetU32(&offset);
565 cpi_pid = data.
GetU32(&offset);
575 cpi_nlwps = data.
GetU32(&offset);
578 cpi_siglwp = data.
GetU32(&offset);
580 return llvm::Error::success();
587 int version = data.
GetU32(&offset);
595llvm::Expected<std::vector<CoreNote>>
598 std::vector<CoreNote> result;
602 if (!
note.Parse(segment, &offset))
603 return llvm::make_error<llvm::StringError>(
604 "Unable to parse note segment", llvm::inconvertibleErrorCode());
606 size_t note_start = offset;
607 size_t note_size = llvm::alignTo(
note.n_descsz, 4);
613 return std::move(result);
618 bool lp64 = (arch.
GetMachine() == llvm::Triple::aarch64 ||
622 bool have_prstatus =
false;
623 bool have_prpsinfo =
false;
625 for (
const auto &
note : notes) {
626 if (
note.info.n_name !=
"FreeBSD")
629 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
630 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
635 have_prstatus =
false;
636 have_prpsinfo =
false;
639 switch (
note.info.n_type) {
640 case ELF::NT_PRSTATUS:
641 have_prstatus =
true;
644 case ELF::NT_PRPSINFO:
645 have_prpsinfo =
true;
648 case ELF::NT_FREEBSD_THRMISC: {
650 thread_data.
name =
note.data.GetCStr(&offset, 20);
653 case ELF::NT_FREEBSD_PROCSTAT_AUXV:
662 if (!have_prstatus) {
663 return llvm::make_error<llvm::StringError>(
664 "Could not find NT_PRSTATUS note in core file.",
665 llvm::inconvertibleErrorCode());
668 return llvm::Error::success();
695 bool had_nt_regs =
false;
704 for (
const auto &
note : notes) {
705 llvm::StringRef name =
note.info.n_name;
707 if (name ==
"NetBSD-CORE") {
717 }
else if (name.consume_front(
"NetBSD-CORE@")) {
719 if (name.getAsInteger(10, tid))
720 return llvm::make_error<llvm::StringError>(
721 "Error parsing NetBSD core(5) notes: Cannot convert LWP ID "
723 llvm::inconvertibleErrorCode());
726 case llvm::Triple::aarch64: {
737 thread_data.
tid = tid;
739 return llvm::make_error<llvm::StringError>(
740 "Could not find general purpose registers note in core file.",
741 llvm::inconvertibleErrorCode());
744 if (!had_nt_regs || tid != thread_data.
tid)
745 return llvm::make_error<llvm::StringError>(
746 "Error parsing NetBSD core(5) notes: Unexpected order "
747 "of NOTEs PT_GETFPREG before PT_GETREG",
748 llvm::inconvertibleErrorCode());
752 case llvm::Triple::x86: {
763 thread_data.
tid = tid;
765 return llvm::make_error<llvm::StringError>(
766 "Could not find general purpose registers note in core file.",
767 llvm::inconvertibleErrorCode());
770 if (!had_nt_regs || tid != thread_data.
tid)
771 return llvm::make_error<llvm::StringError>(
772 "Error parsing NetBSD core(5) notes: Unexpected order "
773 "of NOTEs PT_GETFPREG before PT_GETREG",
774 llvm::inconvertibleErrorCode());
778 case llvm::Triple::x86_64: {
789 thread_data.
tid = tid;
791 return llvm::make_error<llvm::StringError>(
792 "Could not find general purpose registers note in core file.",
793 llvm::inconvertibleErrorCode());
796 if (!had_nt_regs || tid != thread_data.
tid)
797 return llvm::make_error<llvm::StringError>(
798 "Error parsing NetBSD core(5) notes: Unexpected order "
799 "of NOTEs PT_GETFPREG before PT_GETREG",
800 llvm::inconvertibleErrorCode());
815 return llvm::make_error<llvm::StringError>(
816 "Error parsing NetBSD core(5) notes: No threads information "
817 "specified in notes",
818 llvm::inconvertibleErrorCode());
821 return llvm::make_error<llvm::StringError>(
822 "Error parsing NetBSD core(5) notes: Mismatch between the number "
823 "of LWPs in netbsd_elfcore_procinfo and the number of LWPs specified "
825 llvm::inconvertibleErrorCode());
830 data.siginfo.si_signo = signo;
837 if (data.tid == siglwp) {
838 data.siginfo.si_signo = signo;
845 return llvm::make_error<llvm::StringError>(
846 "Error parsing NetBSD core(5) notes: Signal passed to unknown LWP",
847 llvm::inconvertibleErrorCode());
850 return llvm::Error::success();
855 for (
const auto &
note : notes) {
858 if (!llvm::StringRef(
note.info.n_name).starts_with(
"OpenBSD"))
861 switch (
note.info.n_type) {
877 return llvm::make_error<llvm::StringError>(
878 "Could not find general purpose registers note in core file.",
879 llvm::inconvertibleErrorCode());
882 return llvm::Error::success();
899 bool have_prstatus =
false;
900 bool have_prpsinfo =
false;
902 for (
const auto &
note : notes) {
903 if (
note.info.n_name !=
"CORE" &&
note.info.n_name !=
"LINUX")
906 if ((
note.info.n_type == ELF::NT_PRSTATUS && have_prstatus) ||
907 (
note.info.n_type == ELF::NT_PRPSINFO && have_prpsinfo)) {
912 have_prstatus =
false;
913 have_prpsinfo =
false;
916 switch (
note.info.n_type) {
917 case ELF::NT_PRSTATUS: {
918 have_prstatus =
true;
926 size_t len =
note.data.GetByteSize() - header_size;
930 case ELF::NT_PRPSINFO: {
931 have_prpsinfo =
true;
940 case ELF::NT_SIGINFO: {
952 const uint64_t count =
note.data.GetAddress(&offset);
953 note.data.GetAddress(&offset);
954 for (uint64_t i = 0; i < count; ++i) {
956 entry.
start =
note.data.GetAddress(&offset);
957 entry.
end =
note.data.GetAddress(&offset);
961 for (uint64_t i = 0; i < count; ++i) {
962 const char *path =
note.data.GetCStr(&offset);
979 return llvm::Error::success();
988 assert(segment_header.
p_type == llvm::ELF::PT_NOTE);
992 return notes_or_error.takeError();
994 case llvm::Triple::FreeBSD:
996 case llvm::Triple::Linux:
998 case llvm::Triple::NetBSD:
1000 case llvm::Triple::OpenBSD:
1003 return llvm::make_error<llvm::StringError>(
1004 "Don't know how to parse core file. Unsupported OS.",
1005 llvm::inconvertibleErrorCode());
1012 const size_t elf_header_size = addr_size == 4 ?
sizeof(llvm::ELF::Elf32_Ehdr)
1013 :
sizeof(llvm::ELF::Elf64_Ehdr);
1015 std::vector<uint8_t> elf_header_bytes;
1016 elf_header_bytes.resize(elf_header_size);
1020 if (byte_read != elf_header_size ||
1022 return invalid_uuid;
1023 DataExtractor elf_header_data(elf_header_bytes.data(), elf_header_size,
1028 elf_header.
Parse(elf_header_data, &offset);
1032 std::vector<uint8_t> ph_bytes;
1034 for (
unsigned int i = 0; i < elf_header.
e_phnum; ++i) {
1043 program_header.
Parse(program_header_data, &offset);
1044 if (program_header.
p_type != llvm::ELF::PT_NOTE)
1047 std::vector<uint8_t> note_bytes;
1048 note_bytes.resize(program_header.
p_memsz);
1055 if (byte_read != program_header.
p_memsz)
1057 DataExtractor segment_data(note_bytes.data(), note_bytes.size(),
1060 if (!notes_or_error) {
1061 llvm::consumeError(notes_or_error.takeError());
1062 return invalid_uuid;
1065 if (
note.info.n_namesz == 4 &&
1066 note.info.n_type == llvm::ELF::NT_GNU_BUILD_ID &&
1067 "GNU" ==
note.info.n_name &&
1068 note.data.ValidOffsetForDataOfSize(0,
note.info.n_descsz))
1069 return UUID(
note.data.GetData().take_front(
note.info.n_descsz));
1072 return invalid_uuid;
1090 if (target_arch.
IsMIPS()) {
1110 const bool add_exe_file_as_first_arg =
false;
1112 add_exe_file_as_first_arg);
static llvm::raw_ostream & error(Stream &strm)
static llvm::raw_ostream & note(Stream &strm)
#define LLDB_LOGF(log,...)
#define LLDB_PLUGIN_DEFINE(PluginName)
static void ParseOpenBSDProcInfo(ThreadData &thread_data, const DataExtractor &data)
static void ParseFreeBSDPrPsInfo(ProcessElfCore &process, const DataExtractor &data, bool lp64)
static void ParseFreeBSDPrStatus(ThreadData &thread_data, const DataExtractor &data, bool lp64)
static llvm::Error ParseNetBSDProcInfo(const DataExtractor &data, uint32_t &cpi_nlwps, uint32_t &cpi_signo, uint32_t &cpi_siglwp, uint32_t &cpi_pid)
static llvm::StringRef GetPluginNameStatic()
Generic COFF object file reader.
lldb_private::DataExtractor GetSegmentData(const elf::ELFProgramHeader &H)
llvm::ArrayRef< elf::ELFProgramHeader > ProgramHeaders()
std::vector< NT_FILE_Entry > m_nt_file_entries
lldb_private::UUID FindModuleUUID(const llvm::StringRef path) override
lldb::addr_t GetImageInfoAddress() override
Get the image information address for the current process.
lldb::addr_t AddAddressRangeFromMemoryTagSegment(const elf::ELFProgramHeader &header)
lldb_private::DataExtractor m_auxv
llvm::Error parseLinuxNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
A description of a linux process usually contains the following NOTE entries:
llvm::Error ParseThreadContextsFromNoteSegment(const elf::ELFProgramHeader &segment_header, const lldb_private::DataExtractor &segment_data)
Parse Thread context from PT_NOTE segment and store it in the thread list A note segment consists of ...
void UpdateBuildIdForNTFileEntries()
std::vector< ThreadData > m_thread_data
bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list, lldb_private::ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
size_t ReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Status &error) override
Read of memory from a process.
VMRangeToPermissions m_core_range_infos
static llvm::StringRef GetPluginDescriptionStatic()
llvm::Expected< std::vector< lldb_private::CoreNote > > parseSegment(const lldb_private::DataExtractor &segment)
lldb::addr_t AddAddressRangeFromLoadSegment(const elf::ELFProgramHeader &header)
~ProcessElfCore() override
llvm::Error parseFreeBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
lldb_private::UUID FindBuidIdInCoreMemory(lldb::addr_t address)
VMRangeToFileOffset m_core_aranges
lldb_private::Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, lldb_private::MemoryRegionInfo ®ion_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, lldb_private::Status &error) override
Actually do the reading of memory from a process.
VMRangeToFileOffset m_core_tag_ranges
llvm::Error parseNetBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
NetBSD specific Thread context from PT_NOTE segment.
lldb_private::Status DoLoadCore() override
ProcessElfCore(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const lldb_private::FileSpec &core_file)
lldb_private::DynamicLoader * GetDynamicLoader() override
Get the dynamic loader plug-in for this process.
llvm::Expected< std::vector< lldb::addr_t > > ReadMemoryTags(lldb::addr_t addr, size_t len) override
Read memory tags for the range addr to addr+len.
lldb_private::DataExtractor GetAuxvData() override
bool IsAlive() override
Check if a process is still alive.
uint32_t GetNumThreadContexts()
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const lldb_private::FileSpec *crash_file_path, bool can_connect)
llvm::Error parseOpenBSDNotes(llvm::ArrayRef< lldb_private::CoreNote > notes)
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
lldb_private::ArchSpec GetArchitecture()
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
bool GetProcessInfo(lldb_private::ProcessInstanceInfo &info) override
static llvm::StringRef GetPluginNameStatic()
lldb::ModuleSP m_core_module_sp
lldb_private::Status DoDestroy() override
A section + offset based address class.
lldb::addr_t GetLoadAddress(Target *target) const
Get the load address.
bool IsValid() const
Check if the object state is valid.
An architecture specification class.
void MergeFrom(const ArchSpec &other)
Merges fields from another ArchSpec into this ArchSpec.
bool IsMIPS() const
if MIPS architecture return true.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
A plug-in interface definition class for dynamic loaders.
static DynamicLoader * FindPlugin(Process *process, llvm::StringRef plugin_name)
Find a dynamic loader plugin for a given process.
void SetFile(llvm::StringRef path, Style style)
Change the file specified with a new path.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
static FileSystem & Instance()
std::shared_ptr< DataBuffer > CreateDataBuffer(const llvm::Twine &path, uint64_t size=0, uint64_t offset=0)
Create memory buffer from path.
bool Test(ValueType bit) const
Test a single flag bit.
void SetMapped(OptionalBool val)
void SetMemoryTagged(OptionalBool val)
void SetReadable(OptionalBool val)
void SetExecutable(OptionalBool val)
void SetWritable(OptionalBool val)
virtual std::vector< lldb::addr_t > UnpackTagsFromCoreFileSegment(CoreReaderFn reader, lldb::addr_t tag_segment_virtual_address, lldb::addr_t tag_segment_data_address, lldb::addr_t addr, size_t len) const =0
static Status GetSharedModule(const ModuleSpec &module_spec, lldb::ModuleSP &module_sp, const FileSpecList *module_search_paths_ptr, llvm::SmallVectorImpl< lldb::ModuleSP > *old_modules, bool *did_create_ptr, bool always_create=false)
ArchSpec & GetArchitecture()
A plug-in interface definition class for object file parsers.
virtual lldb_private::Address GetImageInfoAddress(Target *target)
Similar to Process::GetImageInfoAddress().
@ eTypeCoreFile
A core file that has a checkpoint of a program's execution state.
size_t CopyData(lldb::offset_t offset, size_t length, void *dst) const
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
Base class for all processes that don't represent a live process, such as coredumps or processes trac...
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
void SetArchitecture(const ArchSpec &arch)
void SetProcessID(lldb::pid_t pid)
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
void SetUnixSignals(lldb::UnixSignalsSP &&signals_sp)
void SetCanJIT(bool can_jit)
Sets whether executing JIT-compiled code in this process is possible.
lldb::DynamicLoaderUP m_dyld_up
llvm::Expected< const MemoryTagManager * > GetMemoryTagManager()
If this architecture and process supports memory tagging, return a tag manager that can be used to ma...
lldb::ByteOrder GetByteOrder() const
void SetID(lldb::pid_t new_pid)
Sets the stored pid.
uint32_t GetAddressByteSize() const
virtual void Finalize(bool destructing)
This object is about to be destroyed, do any necessary cleanup.
ThreadList m_thread_list
The threads for this process as the user will see them.
const lldb::UnixSignalsSP & GetUnixSignals()
const lldb::ABISP & GetABI()
Target & GetTarget()
Get the target object pointer for this module.
const Entry * FindEntryStartsAt(B addr) const
const Entry * FindEntryThatContainsOrFollows(B addr) const
void Append(const Entry &entry)
Entry * FindEntryThatContains(B addr)
llvm::Error ToError() const
FIXME: Replace all uses with takeError() instead.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
bool SetArchitecture(const ArchSpec &arch_spec, bool set_platform=false, bool merge=true)
Set the architecture for this target.
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
const ArchSpec & GetArchitecture() const
void SetExecutableModule(lldb::ModuleSP &module_sp, LoadDependentFiles load_dependent_files=eLoadDependentsDefault)
Set the main executable module.
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
static lldb::UnixSignalsSP Create(const ArchSpec &arch)
#define LLDB_INVALID_ADDRESS
@ NT_PROCINFO_CPI_SIGIGNORE_SIZE
@ NT_PROCINFO_CPI_NAME_SIZE
@ NT_PROCINFO_CPI_RUID_SIZE
@ NT_PROCINFO_CPI_SVUID_SIZE
@ NT_PROCINFO_CPI_SIGCODE_SIZE
@ NT_PROCINFO_CPI_SVGID_SIZE
@ NT_PROCINFO_CPI_EUID_SIZE
@ NT_PROCINFO_CPI_PPID_SIZE
@ NT_PROCINFO_CPI_RGID_SIZE
@ NT_PROCINFO_CPI_SIGCATCH_SIZE
@ NT_PROCINFO_CPI_SIGMASK_SIZE
@ NT_PROCINFO_CPI_SID_SIZE
@ NT_PROCINFO_CPI_SIGPEND_SIZE
@ NT_PROCINFO_CPI_EGID_SIZE
@ NT_PROCINFO_CPI_PGRP_SIZE
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.
std::shared_ptr< lldb_private::ABI > ABISP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::Module > ModuleSP
lldb_private::Status Parse(const lldb_private::DataExtractor &data, const lldb_private::ArchSpec &arch)
static size_t GetSize(const lldb_private::ArchSpec &arch)
lldb_private::Status Parse(const lldb_private::DataExtractor &data, const lldb_private::ArchSpec &arch)
lldb_private::Status Parse(const lldb_private::DataExtractor &data, const lldb_private::ArchSpec &arch, const lldb_private::UnixSignals &unix_signals)
lldb_private::DataExtractor gpregset
std::vector< lldb_private::CoreNote > notes
bool Contains(BaseType r) const
BaseType GetRangeBase() const
void SetRangeEnd(BaseType end)
SizeType GetByteSize() const
void SetRangeBase(BaseType b)
Set the start value for the range, and keep the same size.
BaseType GetRangeEnd() const