Loading libbacktrace/UnwindStack.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -160,7 +160,8 @@ bool UnwindStackCurrent::UnwindFromContext(size_t num_ignore_frames, ucontext_t* // one extra function call appearing in the unwind. unwindstack::RegsGetLocal(regs.get()); } else { regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::GetMachineType(), ucontext)); regs.reset( unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentMachineType(), ucontext)); } error_ = BACKTRACE_UNWIND_NO_ERROR; Loading @@ -177,10 +178,10 @@ std::string UnwindStackPtrace::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offse bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, ucontext_t* context) { std::unique_ptr<unwindstack::Regs> regs; if (context == nullptr) { uint32_t machine_type; regs.reset(unwindstack::Regs::RemoteGet(Tid(), &machine_type)); regs.reset(unwindstack::Regs::RemoteGet(Tid())); } else { regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::GetMachineType(), context)); regs.reset( unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentMachineType(), context)); } error_ = BACKTRACE_UNWIND_NO_ERROR; Loading libunwindstack/Regs.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ bool RegsImpl<AddressType>::GetReturnAddressFromDefault(Memory* memory, uint64_t RegsArm::RegsArm() : RegsImpl<uint32_t>(ARM_REG_LAST, ARM_REG_SP, Location(LOCATION_REGISTER, ARM_REG_LR)) {} uint32_t RegsArm::MachineType() { return EM_ARM; } uint64_t RegsArm::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading Loading @@ -90,6 +94,10 @@ void RegsArm::SetFromRaw() { RegsArm64::RegsArm64() : RegsImpl<uint64_t>(ARM64_REG_LAST, ARM64_REG_SP, Location(LOCATION_REGISTER, ARM64_REG_LR)) {} uint32_t RegsArm64::MachineType() { return EM_AARCH64; } uint64_t RegsArm64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading @@ -109,6 +117,10 @@ void RegsArm64::SetFromRaw() { RegsX86::RegsX86() : RegsImpl<uint32_t>(X86_REG_LAST, X86_REG_SP, Location(LOCATION_SP_OFFSET, -4)) {} uint32_t RegsX86::MachineType() { return EM_386; } uint64_t RegsX86::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading @@ -128,6 +140,10 @@ void RegsX86::SetFromRaw() { RegsX86_64::RegsX86_64() : RegsImpl<uint64_t>(X86_64_REG_LAST, X86_64_REG_SP, Location(LOCATION_SP_OFFSET, -8)) {} uint32_t RegsX86_64::MachineType() { return EM_X86_64; } uint64_t RegsX86_64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading Loading @@ -212,7 +228,7 @@ static Regs* ReadX86_64(void* remote_data) { // This function assumes that reg_data is already aligned to a 64 bit value. // If not this could crash with an unaligned access. Regs* Regs::RemoteGet(pid_t pid, uint32_t* machine_type) { Regs* Regs::RemoteGet(pid_t pid) { // Make the buffer large enough to contain the largest registers type. std::vector<uint64_t> buffer(MAX_USER_REGS_SIZE / sizeof(uint64_t)); struct iovec io; Loading @@ -225,16 +241,12 @@ Regs* Regs::RemoteGet(pid_t pid, uint32_t* machine_type) { switch (io.iov_len) { case sizeof(x86_user_regs): *machine_type = EM_386; return ReadX86(buffer.data()); case sizeof(x86_64_user_regs): *machine_type = EM_X86_64; return ReadX86_64(buffer.data()); case sizeof(arm_user_regs): *machine_type = EM_ARM; return ReadArm(buffer.data()); case sizeof(arm64_user_regs): *machine_type = EM_AARCH64; return ReadArm64(buffer.data()); } return nullptr; Loading Loading @@ -320,7 +332,7 @@ Regs* Regs::CreateFromUcontext(uint32_t machine_type, void* ucontext) { return nullptr; } uint32_t Regs::GetMachineType() { uint32_t Regs::CurrentMachineType() { #if defined(__arm__) return EM_ARM; #elif defined(__aarch64__) Loading libunwindstack/include/unwindstack/Regs.h +12 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ class Regs { : total_regs_(total_regs), sp_reg_(sp_reg), return_loc_(return_loc) {} virtual ~Regs() = default; virtual uint32_t MachineType() = 0; virtual void* RawData() = 0; virtual uint64_t pc() = 0; virtual uint64_t sp() = 0; Loading @@ -64,8 +66,8 @@ class Regs { uint16_t sp_reg() { return sp_reg_; } uint16_t total_regs() { return total_regs_; } static uint32_t GetMachineType(); static Regs* RemoteGet(pid_t pid, uint32_t* machine_type); static uint32_t CurrentMachineType(); static Regs* RemoteGet(pid_t pid); static Regs* CreateFromUcontext(uint32_t machine_type, void* ucontext); static Regs* CreateFromLocal(); Loading Loading @@ -105,6 +107,8 @@ class RegsArm : public RegsImpl<uint32_t> { RegsArm(); virtual ~RegsArm() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -117,6 +121,8 @@ class RegsArm64 : public RegsImpl<uint64_t> { RegsArm64(); virtual ~RegsArm64() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -129,6 +135,8 @@ class RegsX86 : public RegsImpl<uint32_t> { RegsX86(); virtual ~RegsX86() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -143,6 +151,8 @@ class RegsX86_64 : public RegsImpl<uint64_t> { RegsX86_64(); virtual ~RegsX86_64() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading libunwindstack/tests/RegsFake.h +2 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ class RegsFake : public RegsImpl<TypeParam> { : RegsImpl<TypeParam>(total_regs, sp_reg, Regs::Location(Regs::LOCATION_UNKNOWN, 0)) {} virtual ~RegsFake() = default; uint32_t MachineType() override { return 0; } uint64_t GetAdjustedPc(uint64_t, Elf*) override { return 0; } void SetFromRaw() override {} bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; } Loading libunwindstack/tests/RegsTest.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,8 @@ class RegsTestImpl : public RegsImpl<TypeParam> { : RegsImpl<TypeParam>(total_regs, regs_sp, return_loc) {} virtual ~RegsTestImpl() = default; uint32_t MachineType() override { return 0; } uint64_t GetAdjustedPc(uint64_t, Elf*) override { return 0; } void SetFromRaw() override {} bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; } Loading Loading
libbacktrace/UnwindStack.cpp +5 −4 Original line number Diff line number Diff line Loading @@ -160,7 +160,8 @@ bool UnwindStackCurrent::UnwindFromContext(size_t num_ignore_frames, ucontext_t* // one extra function call appearing in the unwind. unwindstack::RegsGetLocal(regs.get()); } else { regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::GetMachineType(), ucontext)); regs.reset( unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentMachineType(), ucontext)); } error_ = BACKTRACE_UNWIND_NO_ERROR; Loading @@ -177,10 +178,10 @@ std::string UnwindStackPtrace::GetFunctionNameRaw(uintptr_t pc, uintptr_t* offse bool UnwindStackPtrace::Unwind(size_t num_ignore_frames, ucontext_t* context) { std::unique_ptr<unwindstack::Regs> regs; if (context == nullptr) { uint32_t machine_type; regs.reset(unwindstack::Regs::RemoteGet(Tid(), &machine_type)); regs.reset(unwindstack::Regs::RemoteGet(Tid())); } else { regs.reset(unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::GetMachineType(), context)); regs.reset( unwindstack::Regs::CreateFromUcontext(unwindstack::Regs::CurrentMachineType(), context)); } error_ = BACKTRACE_UNWIND_NO_ERROR; Loading
libunwindstack/Regs.cpp +18 −6 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ bool RegsImpl<AddressType>::GetReturnAddressFromDefault(Memory* memory, uint64_t RegsArm::RegsArm() : RegsImpl<uint32_t>(ARM_REG_LAST, ARM_REG_SP, Location(LOCATION_REGISTER, ARM_REG_LR)) {} uint32_t RegsArm::MachineType() { return EM_ARM; } uint64_t RegsArm::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading Loading @@ -90,6 +94,10 @@ void RegsArm::SetFromRaw() { RegsArm64::RegsArm64() : RegsImpl<uint64_t>(ARM64_REG_LAST, ARM64_REG_SP, Location(LOCATION_REGISTER, ARM64_REG_LR)) {} uint32_t RegsArm64::MachineType() { return EM_AARCH64; } uint64_t RegsArm64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading @@ -109,6 +117,10 @@ void RegsArm64::SetFromRaw() { RegsX86::RegsX86() : RegsImpl<uint32_t>(X86_REG_LAST, X86_REG_SP, Location(LOCATION_SP_OFFSET, -4)) {} uint32_t RegsX86::MachineType() { return EM_386; } uint64_t RegsX86::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading @@ -128,6 +140,10 @@ void RegsX86::SetFromRaw() { RegsX86_64::RegsX86_64() : RegsImpl<uint64_t>(X86_64_REG_LAST, X86_64_REG_SP, Location(LOCATION_SP_OFFSET, -8)) {} uint32_t RegsX86_64::MachineType() { return EM_X86_64; } uint64_t RegsX86_64::GetAdjustedPc(uint64_t rel_pc, Elf* elf) { if (!elf->valid()) { return rel_pc; Loading Loading @@ -212,7 +228,7 @@ static Regs* ReadX86_64(void* remote_data) { // This function assumes that reg_data is already aligned to a 64 bit value. // If not this could crash with an unaligned access. Regs* Regs::RemoteGet(pid_t pid, uint32_t* machine_type) { Regs* Regs::RemoteGet(pid_t pid) { // Make the buffer large enough to contain the largest registers type. std::vector<uint64_t> buffer(MAX_USER_REGS_SIZE / sizeof(uint64_t)); struct iovec io; Loading @@ -225,16 +241,12 @@ Regs* Regs::RemoteGet(pid_t pid, uint32_t* machine_type) { switch (io.iov_len) { case sizeof(x86_user_regs): *machine_type = EM_386; return ReadX86(buffer.data()); case sizeof(x86_64_user_regs): *machine_type = EM_X86_64; return ReadX86_64(buffer.data()); case sizeof(arm_user_regs): *machine_type = EM_ARM; return ReadArm(buffer.data()); case sizeof(arm64_user_regs): *machine_type = EM_AARCH64; return ReadArm64(buffer.data()); } return nullptr; Loading Loading @@ -320,7 +332,7 @@ Regs* Regs::CreateFromUcontext(uint32_t machine_type, void* ucontext) { return nullptr; } uint32_t Regs::GetMachineType() { uint32_t Regs::CurrentMachineType() { #if defined(__arm__) return EM_ARM; #elif defined(__aarch64__) Loading
libunwindstack/include/unwindstack/Regs.h +12 −2 Original line number Diff line number Diff line Loading @@ -49,6 +49,8 @@ class Regs { : total_regs_(total_regs), sp_reg_(sp_reg), return_loc_(return_loc) {} virtual ~Regs() = default; virtual uint32_t MachineType() = 0; virtual void* RawData() = 0; virtual uint64_t pc() = 0; virtual uint64_t sp() = 0; Loading @@ -64,8 +66,8 @@ class Regs { uint16_t sp_reg() { return sp_reg_; } uint16_t total_regs() { return total_regs_; } static uint32_t GetMachineType(); static Regs* RemoteGet(pid_t pid, uint32_t* machine_type); static uint32_t CurrentMachineType(); static Regs* RemoteGet(pid_t pid); static Regs* CreateFromUcontext(uint32_t machine_type, void* ucontext); static Regs* CreateFromLocal(); Loading Loading @@ -105,6 +107,8 @@ class RegsArm : public RegsImpl<uint32_t> { RegsArm(); virtual ~RegsArm() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -117,6 +121,8 @@ class RegsArm64 : public RegsImpl<uint64_t> { RegsArm64(); virtual ~RegsArm64() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -129,6 +135,8 @@ class RegsX86 : public RegsImpl<uint32_t> { RegsX86(); virtual ~RegsX86() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading @@ -143,6 +151,8 @@ class RegsX86_64 : public RegsImpl<uint64_t> { RegsX86_64(); virtual ~RegsX86_64() = default; virtual uint32_t MachineType() override final; uint64_t GetAdjustedPc(uint64_t rel_pc, Elf* elf) override; void SetFromRaw() override; Loading
libunwindstack/tests/RegsFake.h +2 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,8 @@ class RegsFake : public RegsImpl<TypeParam> { : RegsImpl<TypeParam>(total_regs, sp_reg, Regs::Location(Regs::LOCATION_UNKNOWN, 0)) {} virtual ~RegsFake() = default; uint32_t MachineType() override { return 0; } uint64_t GetAdjustedPc(uint64_t, Elf*) override { return 0; } void SetFromRaw() override {} bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; } Loading
libunwindstack/tests/RegsTest.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,8 @@ class RegsTestImpl : public RegsImpl<TypeParam> { : RegsImpl<TypeParam>(total_regs, regs_sp, return_loc) {} virtual ~RegsTestImpl() = default; uint32_t MachineType() override { return 0; } uint64_t GetAdjustedPc(uint64_t, Elf*) override { return 0; } void SetFromRaw() override {} bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; } Loading