From ce7c828e085563f29451ec5fac9626c76ebf70ee Mon Sep 17 00:00:00 2001 From: Igor Kudrin Date: Fri, 30 Aug 2024 15:00:35 +0700 Subject: [PATCH] [lldb][AArch64] Do not crash if NT_ARM_TLS is missing (#106478) [D156118](https://reviews.llvm.org/D156118) states that this note is always present, but it is better to check it explicitly, as otherwise `lldb` may crash when trying to read registers. --- .../Utility/RegisterInfoPOSIX_arm64.cpp | 8 +++-- .../elf-core/aarch64-no-NT_ARM_TLS.yaml | 32 +++++++++++++++++++ .../test/Shell/Process/elf-core/lit.local.cfg | 1 + 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 lldb/test/Shell/Process/elf-core/aarch64-no-NT_ARM_TLS.yaml create mode 100644 lldb/test/Shell/Process/elf-core/lit.local.cfg diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp index 054b7d9b2ec575..9f5872e5de7e9f 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_arm64.cpp @@ -254,9 +254,11 @@ RegisterInfoPOSIX_arm64::RegisterInfoPOSIX_arm64( if (m_opt_regsets.AllSet(eRegsetMaskMTE)) AddRegSetMTE(); - // The TLS set always contains tpidr but only has tpidr2 when SME is - // present. - AddRegSetTLS(m_opt_regsets.AllSet(eRegsetMaskSSVE)); + if (m_opt_regsets.AllSet(eRegsetMaskTLS)) { + // The TLS set always contains tpidr but only has tpidr2 when SME is + // present. + AddRegSetTLS(m_opt_regsets.AllSet(eRegsetMaskSSVE)); + } if (m_opt_regsets.AnySet(eRegsetMaskSSVE)) AddRegSetSME(m_opt_regsets.AnySet(eRegsetMaskZT)); diff --git a/lldb/test/Shell/Process/elf-core/aarch64-no-NT_ARM_TLS.yaml b/lldb/test/Shell/Process/elf-core/aarch64-no-NT_ARM_TLS.yaml new file mode 100644 index 00000000000000..3d02eb95f38a1a --- /dev/null +++ b/lldb/test/Shell/Process/elf-core/aarch64-no-NT_ARM_TLS.yaml @@ -0,0 +1,32 @@ +## Check that lldb does not crash if a core file does not contain an NT_ARM_TLS +## note while there are notes for other dynamic register sets. + +# RUN: yaml2obj %s -o %t +# RUN: %lldb -c %t -o "re r -a" | FileCheck %s + +# CHECK: Pointer Authentication Registers: +# CHECK-NEXT: data_mask = +# CHECK-NEXT: code_mask = +# CHECK-NOT: Thread Local Storage Registers: + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_CORE + Machine: EM_AARCH64 +ProgramHeaders: + - Type: PT_NOTE + FirstSec: .note + LastSec: .note +Sections: + - Name: .note + Type: SHT_NOTE + Notes: + - Name: CORE + Desc: 0b00000000000000000000000b00000000000000000000000000000000000000389300001b930000389300001b930000000000000000000000000000000000000000000000000000e02e0000000000000000000000000000119100000000000000000000000000005ee100000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400162e2ffff00005801400000000000200162e2ffff0000240140000000000000000000000000000100000000000000 + Type: NT_PRSTATUS + - Name: LINUX + Desc: 0000000000007f000000000000007f00 + Type: NT_ARM_PAC_MASK +... diff --git a/lldb/test/Shell/Process/elf-core/lit.local.cfg b/lldb/test/Shell/Process/elf-core/lit.local.cfg new file mode 100644 index 00000000000000..8169b9f95e118c --- /dev/null +++ b/lldb/test/Shell/Process/elf-core/lit.local.cfg @@ -0,0 +1 @@ +config.suffixes = ['.yaml']