fix(cmake): rework ucontext_t introspection (#954)

This commit is contained in:
Sergiu Deitsch 2023-10-09 21:35:51 +02:00 committed by GitHub
parent aebdfd6051
commit b58718f37c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 39 deletions

View File

@ -214,50 +214,61 @@ if (WITH_TLS)
endif (WITH_TLS) endif (WITH_TLS)
set (_PC_FIELDS set (_PC_FIELDS
"gregs[REG_PC]" "uc_mcontext.gregs[REG_PC]" # Solaris x86 (32 + 64 bit)
"gregs[REG_EIP]" "uc_mcontext.gregs[REG_EIP]" # Linux (i386)
"gregs[REG_RIP]" "uc_mcontext.gregs[REG_RIP]" # Linux (x86_64)
"sc_ip" "uc_mcontext.sc_ip" # Linux (ia64)
"uc_regs->gregs[PT_NIP]" "uc_mcontext.pc" # Linux (mips)
"gregs[R15]" "uc_mcontext.uc_regs->gregs[PT_NIP]" # Linux (ppc)
"arm_pc" "uc_mcontext.gregs[R15]" # Linux (arm old [untested])
"mc_eip" "uc_mcontext.arm_pc" # Linux (arm arch 5)
"mc_rip" "uc_mcontext.gp_regs[PT_NIP]" # Suse SLES 11 (ppc64)
"__gregs[REG_EIP]" "uc_mcontext.mc_eip" # FreeBSD (i386)
"__gregs[REG_RIP]" "uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested])
"ss.eip" "uc_mcontext.__gregs[_REG_EIP]" # NetBSD (i386)
"__ss.__eip" "uc_mcontext.__gregs[_REG_RIP]" # NetBSD (x86_64)
"ss.rip" "uc_mcontext->ss.eip" # OS X (i386, <=10.4)
"__ss.__rip" "uc_mcontext->__ss.__eip" # OS X (i386, >=10.5)
"ss.srr0" "uc_mcontext->ss.rip" # OS X (x86_64)
"__ss.__srr0" "uc_mcontext->__ss.__rip" # OS X (>=10.5 [untested])
"uc_mcontext->ss.srr0" # OS X (ppc, ppc64 [untested])
"uc_mcontext->__ss.__srr0" # OS X (>=10.5 [untested])
) )
set (_PC_HEADERS ucontext.h signal.h) if (HAVE_UCONTEXT_H AND NOT DEFINED PC_FROM_UCONTEXT)
cmake_push_check_state (RESET)
if (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT) set (CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
foreach (_PC_FIELD ${_PC_FIELDS}) set (_PC_HEADERS ucontext.h signal.h)
foreach (_PC_HEADER ${_PC_HEADERS})
set (_TMP
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/uctfield.cpp)
file (WRITE ${_TMP} "
#define _GNU_SOURCE 1
#include <${_PC_HEADER}>
int main(void)
{
ucontext_t u;
return u.${_PC_FIELD} == 0;
}
")
try_compile (HAVE_PC_FROM_UCONTEXT ${CMAKE_CURRENT_BINARY_DIR} ${_TMP}
COMPILE_DEFINITIONS _GNU_SOURCE=1)
if (HAVE_PC_FROM_UCONTEXT) foreach (_PC_FIELD IN LISTS _PC_FIELDS)
set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE) foreach (_PC_HEADER IN LISTS _PC_HEADERS)
endif (HAVE_PC_FROM_UCONTEXT) # Replace non-alphanumeric characters by underscores since the name will be
# used as preprocessor definition.
string (REGEX REPLACE "[^a-zA-Z0-9]" "_" HAVE_UCONTEXT_FIELD_NAME
"HAVE_PC_FROM_UCONTEXT_${_PC_FIELD}")
# Strip trailing underscores for readability
string (REGEX REPLACE "_+$" "" HAVE_UCONTEXT_FIELD_NAME
"${HAVE_UCONTEXT_FIELD_NAME}")
check_struct_has_member (ucontext_t ${_PC_FIELD} ${_PC_HEADER}
${HAVE_UCONTEXT_FIELD_NAME} LANGUAGE CXX)
if (${HAVE_UCONTEXT_FIELD_NAME})
set (PC_FROM_UCONTEXT ${_PC_FIELD} CACHE STRING
"<${_PC_HEADER}> ucontext_t PC member")
mark_as_advanced (PC_FROM_UCONTEXT)
break ()
endif (${HAVE_UCONTEXT_FIELD_NAME})
endforeach (_PC_HEADER) endforeach (_PC_HEADER)
if (${HAVE_UCONTEXT_FIELD_NAME})
break ()
endif (${HAVE_UCONTEXT_FIELD_NAME})
endforeach (_PC_FIELD) endforeach (_PC_FIELD)
endif (HAVE_UCONTEXT_H AND NOT PC_FROM_UCONTEXT)
cmake_pop_check_state ()
endif (HAVE_UCONTEXT_H AND NOT DEFINED PC_FROM_UCONTEXT)
set (GOOGLE_NAMESPACE google) set (GOOGLE_NAMESPACE google)
set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {") set (_START_GOOGLE_NAMESPACE_ "namespace ${GOOGLE_NAMESPACE} {")

View File

@ -138,7 +138,7 @@
#cmakedefine LT_OBJDIR #cmakedefine LT_OBJDIR
/* How to access the PC from a struct ucontext */ /* How to access the PC from a struct ucontext */
#cmakedefine PC_FROM_UCONTEXT #cmakedefine PC_FROM_UCONTEXT ${PC_FROM_UCONTEXT}
/* define if we should print file offsets in traces instead of symbolizing. */ /* define if we should print file offsets in traces instead of symbolizing. */
#cmakedefine PRINT_UNSYMBOLIZED_STACK_TRACES #cmakedefine PRINT_UNSYMBOLIZED_STACK_TRACES