Skip to content

Commit 3ffe24f

Browse files
committed
Work around outdated system header files on Amazon Linux
1 parent 79e9860 commit 3ffe24f

File tree

3 files changed

+45
-1
lines changed

3 files changed

+45
-1
lines changed

lldb/cmake/modules/LLDBConfig.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,4 +345,19 @@ if ((CMAKE_SYSTEM_NAME MATCHES "Android") AND LLVM_BUILD_STATIC AND
345345
add_definitions(-DANDROID_USE_ACCEPT_WORKAROUND)
346346
endif()
347347

348+
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
349+
check_cxx_source_compiles(
350+
"#include <asm/ptrace.h>
351+
struct user_sve_header hdr;
352+
int main(void){return 0;}
353+
"
354+
user_sve_header_available)
355+
if(user_sve_header_available)
356+
set(LLDB_HAVE_USER_SVE_HEADER ON)
357+
message(STATUS "AArch64 SVE support enabled.")
358+
else()
359+
message(STATUS "AArch64 SVE support disabled.")
360+
endif()
361+
endif()
362+
348363
include(LLDBGenerateConfig)

lldb/include/lldb/Host/Config.h.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252

5353
#cmakedefine01 LLDB_EMBED_PYTHON_HOME
5454

55+
#cmakedefine01 LLDB_HAVE_USER_SVE_HEADER
56+
5557
#cmakedefine LLDB_PYTHON_HOME R"(${LLDB_PYTHON_HOME})"
5658

5759
#define LLDB_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}"

lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm64.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,11 @@ NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux(
6262
case llvm::Triple::aarch64: {
6363
// Configure register sets supported by this AArch64 target.
6464
// Read SVE header to check for SVE support.
65+
#if LLDB_HAVE_USER_SVE_HEADER
6566
struct user_sve_header sve_header;
67+
#else
68+
struct {} sve_header;
69+
#endif
6670
struct iovec ioVec;
6771
ioVec.iov_base = &sve_header;
6872
ioVec.iov_len = sizeof(sve_header);
@@ -207,13 +211,21 @@ NativeRegisterContextLinux_arm64::ReadRegister(const RegisterInfo *reg_info,
207211
if (reg == GetRegisterInfo().GetRegNumFPSR()) {
208212
sve_reg_num = reg;
209213
if (m_sve_state == SVEState::Full)
214+
#if LLDB_HAVE_USER_SVE_HEADER
210215
offset = sve::PTraceFPSROffset(sve::vq_from_vl(m_sve_header.vl));
216+
#else
217+
offset = 0;
218+
#endif
211219
else if (m_sve_state == SVEState::FPSIMD)
212220
offset = sve::ptrace_fpsimd_offset + (32 * 16);
213221
} else if (reg == GetRegisterInfo().GetRegNumFPCR()) {
214222
sve_reg_num = reg;
215223
if (m_sve_state == SVEState::Full)
224+
#if LLDB_HAVE_USER_SVE_HEADER
216225
offset = sve::PTraceFPCROffset(sve::vq_from_vl(m_sve_header.vl));
226+
#else
227+
offset = 0;
228+
#endif
217229
else if (m_sve_state == SVEState::FPSIMD)
218230
offset = sve::ptrace_fpsimd_offset + (32 * 16) + 4;
219231
} else {
@@ -341,13 +353,21 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
341353
if (reg == GetRegisterInfo().GetRegNumFPSR()) {
342354
sve_reg_num = reg;
343355
if (m_sve_state == SVEState::Full)
356+
#if LLDB_HAVE_USER_SVE_HEADER
344357
offset = sve::PTraceFPSROffset(sve::vq_from_vl(m_sve_header.vl));
358+
#else
359+
offset = 0;
360+
#endif
345361
else if (m_sve_state == SVEState::FPSIMD)
346362
offset = sve::ptrace_fpsimd_offset + (32 * 16);
347363
} else if (reg == GetRegisterInfo().GetRegNumFPCR()) {
348364
sve_reg_num = reg;
349365
if (m_sve_state == SVEState::Full)
366+
#if LLDB_HAVE_USER_SVE_HEADER
350367
offset = sve::PTraceFPCROffset(sve::vq_from_vl(m_sve_header.vl));
368+
#else
369+
offset = 0;
370+
#endif
351371
else if (m_sve_state == SVEState::FPSIMD)
352372
offset = sve::ptrace_fpsimd_offset + (32 * 16) + 4;
353373
} else {
@@ -375,6 +395,7 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
375395
if (GetRegisterInfo().IsSVERegVG(reg)) {
376396
uint64_t vg_value = reg_value.GetAsUInt64();
377397

398+
#if LLDB_HAVE_USER_SVE_HEADER
378399
if (sve_vl_valid(vg_value * 8)) {
379400
if (m_sve_header_is_valid && vg_value == GetSVERegVG())
380401
return error;
@@ -388,9 +409,11 @@ Status NativeRegisterContextLinux_arm64::WriteRegister(
388409
if (m_sve_header_is_valid && vg_value == GetSVERegVG())
389410
return error;
390411
}
391-
412+
#endif
392413
return Status("SVE vector length update failed.");
414+
#if LLDB_HAVE_USER_SVE_HEADER
393415
}
416+
#endif
394417

395418
// If target supports SVE but currently in FPSIMD mode.
396419
if (m_sve_state == SVEState::FPSIMD) {
@@ -824,18 +847,22 @@ void NativeRegisterContextLinux_arm64::ConfigureRegisterContext() {
824847
if (error.Success()) {
825848
// If SVE is enabled thread can switch between SVEState::FPSIMD and
826849
// SVEState::Full on every stop.
850+
#if LLDB_HAVE_USER_SVE_HEADER
827851
if ((m_sve_header.flags & sve::ptrace_regs_mask) ==
828852
sve::ptrace_regs_fpsimd)
829853
m_sve_state = SVEState::FPSIMD;
830854
else if ((m_sve_header.flags & sve::ptrace_regs_mask) ==
831855
sve::ptrace_regs_sve)
832856
m_sve_state = SVEState::Full;
857+
#endif
833858

834859
// On every stop we configure SVE vector length by calling
835860
// ConfigureVectorLength regardless of current SVEState of this thread.
836861
uint32_t vq = RegisterInfoPOSIX_arm64::eVectorQuadwordAArch64SVE;
862+
#if LLDB_HAVE_USER_SVE_HEADER
837863
if (sve_vl_valid(m_sve_header.vl))
838864
vq = sve::vq_from_vl(m_sve_header.vl);
865+
#endif
839866

840867
GetRegisterInfo().ConfigureVectorLength(vq);
841868
m_sve_ptrace_payload.resize(sve::PTraceSize(vq, sve::ptrace_regs_sve));

0 commit comments

Comments
 (0)