blob: d2311240fd74dc634f99bf336a50c5d3288328b4 [file] [log] [blame]
Brian Silverman20350ac2021-11-17 18:19:55 -08001include(CheckCSourceCompiles)
2include(CheckIncludeFile)
3
4macro(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()
64endmacro()