Brian Silverman | 20350ac | 2021-11-17 18:19:55 -0800 | [diff] [blame] | 1 | include(CheckCSourceCompiles) |
| 2 | include(CheckIncludeFile) |
| 3 | |
| 4 | macro(pc_from_ucontext variable) |
| 5 | set(HAVE_${variable} OFF) |
| 6 | check_include_file("ucontext.h" HAVE_UCONTEXT_H) |
| 7 | if(EXISTS /etc/redhat-release) |
| 8 | set(redhat7_release_pattern "Red Hat Linux release 7") |
| 9 | file(STRINGS /etc/redhat-release redhat_release_match |
| 10 | LIMIT_COUNT 1 |
| 11 | REGEX ${redhat7_release_pattern}) |
| 12 | if(redhat_release_match MATCHES ${redhat7_release_pattern}) |
| 13 | set(HAVE_SYS_UCONTEXT_H OFF) |
| 14 | else() |
| 15 | check_include_file("sys/ucontext.h" HAVE_SYS_UCONTEXT_H) |
| 16 | endif() |
| 17 | else() |
| 18 | check_include_file("sys/ucontext.h" HAVE_SYS_UCONTEXT_H) |
| 19 | endif() |
| 20 | check_include_file("cygwin/signal.h" HAVE_CYGWIN_SIGNAL_H) |
| 21 | |
| 22 | set(pc_fields |
| 23 | "uc_mcontext.gregs[REG_PC]" # Solaris x86 (32 + 64 bit) |
| 24 | "uc_mcontext.gregs[REG_EIP]" # Linux (i386) |
| 25 | "uc_mcontext.gregs[REG_RIP]" # Linux (x86_64) |
| 26 | "uc_mcontext.sc_ip" # Linux (ia64) |
| 27 | "uc_mcontext.pc" # Linux (mips) |
| 28 | "uc_mcontext.uc_regs->gregs[PT_NIP]" # Linux (ppc) |
| 29 | "uc_mcontext.psw.addr" # Linux (s390) |
| 30 | "uc_mcontext.gregs[R15]" # Linux (arm old [untested]) |
| 31 | "uc_mcontext.arm_pc" # Linux (arm arch 5) |
| 32 | "uc_mcontext.cr0_hi" # Linux (e2k) |
| 33 | "uc_mcontext.gp_regs[PT_NIP]" # Suse SLES 11 (ppc64) |
| 34 | "uc_mcontext.mc_eip" # FreeBSD (i386) |
| 35 | "uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested]) |
| 36 | "uc_mcontext.__gregs[_REG_EIP]" # NetBSD (i386) |
| 37 | "uc_mcontext.__gregs[_REG_RIP]" # NetBSD (x86_64) |
| 38 | "uc_mcontext->ss.eip" # OS X (i386, <=10.4) |
| 39 | "uc_mcontext->__ss.__eip" # OS X (i386, >=10.5) |
| 40 | "uc_mcontext->ss.rip" # OS X (x86_64) |
| 41 | "uc_mcontext->__ss.__rip" # OS X (>=10.5 [untested]) |
| 42 | "uc_mcontext->ss.srr0" # OS X (ppc, ppc64 [untested]) |
| 43 | "uc_mcontext->__ss.__srr0") # OS X (>=10.5 [untested]) |
| 44 | |
| 45 | set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE=1) |
| 46 | if(HAVE_CYGWIN_SIGNAL_H) |
| 47 | set(_inc "cygwin/signal.h") |
| 48 | elseif(HAVE_SYS_UCONTEXT_H) |
| 49 | set(_inc "sys/ucontext.h") |
| 50 | elseif(HAVE_UCONTEXT_H) |
| 51 | set(_inc "ucontext.h") |
| 52 | endif() |
| 53 | foreach(pc_field IN LISTS pc_fields) |
| 54 | string(MAKE_C_IDENTIFIER ${pc_field} pc_field_id) |
| 55 | check_c_source_compiles( |
| 56 | "#include <${_inc}>\nint main() { ucontext_t u; return u.${pc_field} == 0; }" |
| 57 | HAVE_${pc_field_id}) |
| 58 | if(HAVE_${pc_field_id}) |
| 59 | set(HAVE_${variable} ON) |
| 60 | set(${variable} ${pc_field}) |
| 61 | break() |
| 62 | endif() |
| 63 | endforeach() |
| 64 | endmacro() |