#ifndef _LINUX_H
#define _LINUX_H
#ifdef DEFAULT_TARGET_64BIT
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (Linux for zSeries)");
#else
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (Linux for S/390)");
#endif
#undef SIZE_TYPE
#define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "long unsigned int")
#undef PTRDIFF_TYPE
#define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
#undef WCHAR_TYPE
#define WCHAR_TYPE "int"
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
#define TARGET_OS_CPP_BUILTINS() \
do \
{ \
builtin_define_std ("linux"); \
builtin_define_std ("unix"); \
builtin_assert ("system=linux"); \
builtin_assert ("system=unix"); \
builtin_define ("__ELF__"); \
builtin_define ("__gnu_linux__"); \
if (flag_pic) \
{ \
builtin_define ("__PIC__"); \
builtin_define ("__pic__"); \
} \
} \
while (0)
#ifdef DEFAULT_TARGET_64BIT
#undef ASM_SPEC
#define ASM_SPEC "%{m31:-m31 -Aesa}"
#else
#undef ASM_SPEC
#define ASM_SPEC "%{m64:-m64 -Aesame}"
#endif
#ifdef DEFAULT_TARGET_64BIT
#define MULTILIB_DEFAULTS { "m64" }
#else
#define MULTILIB_DEFAULTS { "m31" }
#endif
#define LINK_ARCH31_SPEC \
"-m elf_s390 \
%{shared:-shared} \
%{!shared: \
%{static:-static} \
%{!static: \
%{rdynamic:-export-dynamic} \
%{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}"
#define LINK_ARCH64_SPEC \
"-m elf64_s390 \
%{shared:-shared} \
%{!shared: \
%{static:-static} \
%{!static: \
%{rdynamic:-export-dynamic} \
%{!dynamic-linker:-dynamic-linker /lib/ld64.so.1}}}"
#ifdef DEFAULT_TARGET_64BIT
#undef LINK_SPEC
#define LINK_SPEC "%{m31:%(link_arch31)} %{!m31:%(link_arch64)}"
#else
#undef LINK_SPEC
#define LINK_SPEC "%{m64:%(link_arch64)} %{!m64:%(link_arch31)}"
#endif
#define EXTRA_SPECS \
{ "link_arch31", LINK_ARCH31_SPEC }, \
{ "link_arch64", LINK_ARCH64_SPEC }, \
#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
do { \
unsigned char *pc_ = (CONTEXT)->ra; \
long new_cfa_; \
int i_; \
\
typedef struct \
{ \
unsigned long psw_mask; \
unsigned long psw_addr; \
unsigned long gprs[16]; \
unsigned int acrs[16]; \
unsigned int fpc; \
unsigned int __pad; \
double fprs[16]; \
} __attribute__ ((__aligned__ (8))) sigregs_; \
\
sigregs_ *regs_; \
\
\
if (pc_[0] != 0x0a || (pc_[1] != 119 && pc_[1] != 173)) \
break; \
\
\
if ((CONTEXT)->ra == (CONTEXT)->cfa) \
{ \
struct ucontext_ \
{ \
unsigned long uc_flags; \
struct ucontext_ *uc_link; \
unsigned long uc_stack[3]; \
sigregs_ uc_mcontext; \
} *uc_ = (CONTEXT)->cfa + 8 + 128; \
\
regs_ = &uc_->uc_mcontext; \
} \
\
\
else \
{ \
regs_ = *(sigregs_ **)((CONTEXT)->cfa + 8); \
} \
\
new_cfa_ = regs_->gprs[15] + 16*sizeof(long) + 32; \
(FS)->cfa_how = CFA_REG_OFFSET; \
(FS)->cfa_reg = 15; \
(FS)->cfa_offset = \
new_cfa_ - (long) (CONTEXT)->cfa + 16*sizeof(long) + 32; \
\
for (i_ = 0; i_ < 16; i_++) \
{ \
(FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
(FS)->regs.reg[i_].loc.offset = \
(long)®s_->gprs[i_] - new_cfa_; \
} \
for (i_ = 0; i_ < 16; i_++) \
{ \
(FS)->regs.reg[16+i_].how = REG_SAVED_OFFSET; \
(FS)->regs.reg[16+i_].loc.offset = \
(long)®s_->fprs[i_] - new_cfa_; \
} \
\
\
(FS)->regs.reg[32].how = REG_SAVED_OFFSET; \
(FS)->regs.reg[32].loc.offset = (long)®s_->psw_addr - new_cfa_; \
(FS)->retaddr_column = 32; \
\
goto SUCCESS; \
} while (0)
#endif