From 93a5c5590fdba18c570136a68d6f6ecbbaf73374 Mon Sep 17 00:00:00 2001 From: Kamil Rytarowski Date: Sun, 7 Feb 2016 13:32:18 +0100 Subject: [PATCH] Fix build on NetBSD: Support different versions of "struct reg" FreeBSD style: ".r_rax" NetBSD x86_64 style: ".regs[_R_RAX]" NetBSD i386 style: "._r_eax" will be defined once the amd64 version will be finished. --- src/pal/src/config.h.in | 1 + src/pal/src/configure.cmake | 2 ++ src/pal/src/include/pal/context.h | 68 +++++++++++++++++++++------------------ 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/pal/src/config.h.in b/src/pal/src/config.h.in index 204c5ff..c61b6f8 100644 --- a/src/pal/src/config.h.in +++ b/src/pal/src/config.h.in @@ -129,6 +129,7 @@ #cmakedefine01 ERROR_FUNC_FOR_GLOB_HAS_FIXED_PARAMS #cmakedefine01 HAS_FTRUNCATE_LENGTH_ISSUE #cmakedefine01 UNWIND_CONTEXT_IS_UCONTEXT_T +#cmakedefine BSD_REGS_STYLE(reg, RR, rr) @BSD_REGS_STYLE@ #cmakedefine FREEBSD_LIBC "@FREEBSD_LIBC@" #define CHECK_TRACE_SPECIFIERS 0 diff --git a/src/pal/src/configure.cmake b/src/pal/src/configure.cmake index beac673..76f2b99 100644 --- a/src/pal/src/configure.cmake +++ b/src/pal/src/configure.cmake @@ -941,6 +941,7 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL FreeBSD) set(PAL_PT_READ_D PT_READ_D) set(PAL_PT_WRITE_D PT_WRITE_D) set(HAS_FTRUNCATE_LENGTH_ISSUE 0) + set(BSD_REGS_STYLE "((reg).r_##rr)") if(EXISTS "/lib/libc.so.7") set(FREEBSD_LIBC "/lib/libc.so.7") @@ -964,6 +965,7 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL NetBSD) set(PAL_PT_READ_D PT_READ_D) set(PAL_PT_WRITE_D PT_WRITE_D) set(HAS_FTRUNCATE_LENGTH_ISSUE 0) + set(BSD_REGS_STYLE "((reg).regs[_REG_##RR])") elseif(CMAKE_SYSTEM_NAME STREQUAL SunOS) if(NOT HAVE_LIBUNWIND_H) diff --git a/src/pal/src/include/pal/context.h b/src/pal/src/include/pal/context.h index 8764969..7a20f8b 100644 --- a/src/pal/src/include/pal/context.h +++ b/src/pal/src/include/pal/context.h @@ -334,43 +334,47 @@ typedef ucontext_t native_context_t; #if HAVE_BSD_REGS_T +#ifndef BSD_REGS_STYLE +#error "struct reg" has unrecognized format +#endif + #ifdef BIT64 -#define BSDREG_Rbx(reg) ((reg).r_rbx) -#define BSDREG_Rcx(reg) ((reg).r_rcx) -#define BSDREG_Rdx(reg) ((reg).r_rdx) -#define BSDREG_Rsi(reg) ((reg).r_rsi) -#define BSDREG_Rdi(reg) ((reg).r_rdi) -#define BSDREG_Rbp(reg) ((reg).r_rbp) -#define BSDREG_Rax(reg) ((reg).r_rax) -#define BSDREG_Rip(reg) ((reg).r_rip) -#define BSDREG_SegCs(reg) ((reg).r_cs) -#define BSDREG_SegSs(reg) ((reg).r_ss) -#define BSDREG_Rsp(reg) ((reg).r_rsp) -#define BSDREG_R8(reg) ((reg).r_r8) -#define BSDREG_R9(reg) ((reg).r_r9) -#define BSDREG_R10(reg) ((reg).r_r10) -#define BSDREG_R11(reg) ((reg).r_r11) -#define BSDREG_R12(reg) ((reg).r_r12) -#define BSDREG_R13(reg) ((reg).r_r13) -#define BSDREG_R14(reg) ((reg).r_r14) -#define BSDREG_R15(reg) ((reg).r_r15) -#define BSDREG_EFlags(reg) ((reg).r_rflags) +#define BSDREG_Rbx(reg) BSD_REGS_STYLE(reg,RBX,rbx) +#define BSDREG_Rcx(reg) BSD_REGS_STYLE(reg,RCX,rcx) +#define BSDREG_Rdx(reg) BSD_REGS_STYLE(reg,RDX,rdx) +#define BSDREG_Rsi(reg) BSD_REGS_STYLE(reg,RSI,rsi) +#define BSDREG_Rdi(reg) BSD_REGS_STYLE(reg,RDI,rdi) +#define BSDREG_Rbp(reg) BSD_REGS_STYLE(reg,RBP,rbp) +#define BSDREG_Rax(reg) BSD_REGS_STYLE(reg,RAX,rax) +#define BSDREG_Rip(reg) BSD_REGS_STYLE(reg,RIP,rip) +#define BSDREG_SegCs(reg) BSD_REGS_STYLE(reg,CS,cs) +#define BSDREG_SegSs(reg) BSD_REGS_STYLE(reg,SS,ss) +#define BSDREG_Rsp(reg) BSD_REGS_STYLE(reg,RSP,rsp) +#define BSDREG_R8(reg) BSD_REGS_STYLE(reg,R8,r8) +#define BSDREG_R9(reg) BSD_REGS_STYLE(reg,R9,r9) +#define BSDREG_R10(reg) BSD_REGS_STYLE(reg,R10,r10) +#define BSDREG_R11(reg) BSD_REGS_STYLE(reg,R11,r11) +#define BSDREG_R12(reg) BSD_REGS_STYLE(reg,R12,r12) +#define BSDREG_R13(reg) BSD_REGS_STYLE(reg,R13,r13) +#define BSDREG_R14(reg) BSD_REGS_STYLE(reg,R14,r14) +#define BSDREG_R15(reg) BSD_REGS_STYLE(reg,R15,r15) +#define BSDREG_EFlags(reg) BSD_REGS_STYLE(reg,RFLAGS,rflags) #else // BIT64 -#define BSDREG_Ebx(reg) ((reg).r_ebx) -#define BSDREG_Ecx(reg) ((reg).r_ecx) -#define BSDREG_Edx(reg) ((reg).r_edx) -#define BSDREG_Esi(reg) ((reg).r_esi) -#define BSDREG_Edi(reg) ((reg).r_edi) -#define BSDREG_Ebp(reg) ((reg).r_ebp) -#define BSDREG_Eax(reg) ((reg).r_eax) -#define BSDREG_Eip(reg) ((reg).r_eip) -#define BSDREG_SegCs(reg) ((reg).r_cs) -#define BSDREG_EFlags(reg) ((reg).r_eflags) -#define BSDREG_Esp(reg) ((reg).r_esp) -#define BSDREG_SegSs(reg) ((reg).r_ss) +#define BSDREG_Ebx(reg) BSD_REGS_STYLE(reg,EBX,ebx) +#define BSDREG_Ecx(reg) BSD_REGS_STYLE(reg,ECX,ecx) +#define BSDREG_Edx(reg) BSD_REGS_STYLE(reg,EDX,edx) +#define BSDREG_Esi(reg) BSD_REGS_STYLE(reg,ESI,esi) +#define BSDREG_Edi(reg) BSD_REGS_STYLE(reg,EDI,edi) +#define BSDREG_Ebp(reg) BSD_REGS_STYLE(reg,EDP,ebp) +#define BSDREG_Eax(reg) BSD_REGS_STYLE(reg,EAX,eax) +#define BSDREG_Eip(reg) BSD_REGS_STYLE(reg,EIP,eip) +#define BSDREG_SegCs(reg) BSD_REGS_STYLE(reg,CS,cs) +#define BSDREG_EFlags(reg) BSD_REGS_STYLE(reg,EFLAGS,eflags) +#define BSDREG_Esp(reg) BSD_REGS_STYLE(reg,ESP,esp) +#define BSDREG_SegSs(reg) BSD_REGS_STYLE(reg,SS,ss) #endif // BIT64 -- 2.7.4