linux.h revision 117395
1179337Syongari/* Definitions of target machine for GNU compiler, 2179337Syongari for PowerPC machines running Linux. 3179337Syongari Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 4179337Syongari Free Software Foundation, Inc. 5179337Syongari Contributed by Michael Meissner (meissner@cygnus.com). 6179337Syongari 7179337SyongariThis file is part of GNU CC. 8179337Syongari 9179337SyongariGNU CC is free software; you can redistribute it and/or modify 10179337Syongariit under the terms of the GNU General Public License as published by 11179337Syongarithe Free Software Foundation; either version 2, or (at your option) 12179337Syongariany later version. 13179337Syongari 14179337SyongariGNU CC is distributed in the hope that it will be useful, 15179337Syongaribut WITHOUT ANY WARRANTY; without even the implied warranty of 16179337SyongariMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17179337SyongariGNU General Public License for more details. 18179337Syongari 19179337SyongariYou should have received a copy of the GNU General Public License 20179337Syongarialong with GNU CC; see the file COPYING. If not, write to 21179337Syongarithe Free Software Foundation, 59 Temple Place - Suite 330, 22179337SyongariBoston, MA 02111-1307, USA. */ 23179337Syongari 24179337Syongari#undef MD_EXEC_PREFIX 25179337Syongari#undef MD_STARTFILE_PREFIX 26179337Syongari 27179337Syongari#undef TARGET_OS_CPP_BUILTINS 28179337Syongari#define TARGET_OS_CPP_BUILTINS() \ 29179337Syongari do \ 30179337Syongari { \ 31179337Syongari builtin_define_std ("PPC"); \ 32179337Syongari builtin_define ("__ELF__"); \ 33179337Syongari builtin_define_std ("powerpc"); \ 34179337Syongari builtin_assert ("cpu=powerpc"); \ 35179337Syongari builtin_assert ("machine=powerpc"); \ 36179337Syongari } \ 37179337Syongari while (0) 38179337Syongari 39179337Syongari#undef CPP_OS_DEFAULT_SPEC 40179337Syongari#define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" 41179337Syongari 42182888Syongari/* The GNU C++ standard library currently requires _GNU_SOURCE being 43182888Syongari defined on glibc-based systems. This temporary hack accomplishes this, 44179337Syongari it should go away as soon as libstdc++-v3 has a real fix. */ 45179337Syongari#undef CPLUSPLUS_CPP_SPEC 46179337Syongari#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" 47179337Syongari 48179337Syongari#undef LINK_SHLIB_SPEC 49182888Syongari#define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}" 50179337Syongari 51183814Syongari#undef LIB_DEFAULT_SPEC 52183814Syongari#define LIB_DEFAULT_SPEC "%(lib_linux)" 53179337Syongari 54179337Syongari#undef STARTFILE_DEFAULT_SPEC 55179337Syongari#define STARTFILE_DEFAULT_SPEC "%(startfile_linux)" 56179337Syongari 57179337Syongari#undef ENDFILE_DEFAULT_SPEC 58179337Syongari#define ENDFILE_DEFAULT_SPEC "%(endfile_linux)" 59179337Syongari 60179337Syongari#undef LINK_START_DEFAULT_SPEC 61179337Syongari#define LINK_START_DEFAULT_SPEC "%(link_start_linux)" 62179337Syongari 63179337Syongari#undef LINK_OS_DEFAULT_SPEC 64179337Syongari#define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" 65179337Syongari 66179337Syongari#undef TARGET_VERSION 67179337Syongari#define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); 68179337Syongari 69179337Syongari/* Override rs6000.h definition. */ 70179337Syongari#undef ASM_APP_ON 71179337Syongari#define ASM_APP_ON "#APP\n" 72179337Syongari 73179337Syongari/* Override rs6000.h definition. */ 74179337Syongari#undef ASM_APP_OFF 75179337Syongari#define ASM_APP_OFF "#NO_APP\n" 76179337Syongari 77179337Syongari/* For backward compatibility, we must continue to use the AIX 78179337Syongari structure return convention. */ 79179337Syongari#undef DRAFT_V4_STRUCT_RET 80179337Syongari#define DRAFT_V4_STRUCT_RET 1 81179337Syongari 82179337Syongari/* Do code reading to identify a signal frame, and set the frame 83179337Syongari state data appropriately. See unwind-dw2.c for the structs. */ 84179337Syongari 85179337Syongari#ifdef IN_LIBGCC2 86179337Syongari#include <signal.h> 87179337Syongari 88179337Syongari/* During the 2.5 kernel series the kernel ucontext was changed, but 89179337Syongari the new layout is compatible with the old one, so we just define 90179337Syongari and use the old one here for simplicity and compatibility. */ 91179337Syongari 92179337Syongaristruct kernel_old_ucontext { 93179337Syongari unsigned long uc_flags; 94179337Syongari struct ucontext *uc_link; 95179337Syongari stack_t uc_stack; 96179337Syongari struct sigcontext_struct uc_mcontext; 97179337Syongari sigset_t uc_sigmask; 98179337Syongari}; 99179337Syongari 100179337Syongarienum { SIGNAL_FRAMESIZE = 64 }; 101179337Syongari#endif 102179337Syongari 103179337Syongari#define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \ 104179337Syongari do { \ 105179337Syongari unsigned char *pc_ = (CONTEXT)->ra; \ 106179337Syongari struct sigcontext *sc_; \ 107179337Syongari long new_cfa_; \ 108179337Syongari int i_; \ 109179337Syongari \ 110179337Syongari /* li r0, 0x7777; sc (sigreturn old) */ \ 111179337Syongari /* li r0, 0x0077; sc (sigreturn new) */ \ 112179337Syongari /* li r0, 0x6666; sc (rt_sigreturn old) */ \ 113179337Syongari /* li r0, 0x00AC; sc (rt_sigreturn new) */ \ 114179337Syongari if (*(unsigned int *) (pc_+4) != 0x44000002) \ 115179337Syongari break; \ 116179337Syongari if (*(unsigned int *) (pc_+0) == 0x38007777 \ 117179337Syongari || *(unsigned int *) (pc_+0) == 0x38000077) \ 118179337Syongari { \ 119179337Syongari struct sigframe { \ 120179337Syongari char gap[SIGNAL_FRAMESIZE]; \ 121179337Syongari struct sigcontext sigctx; \ 122179337Syongari } *rt_ = (CONTEXT)->cfa; \ 123179337Syongari sc_ = &rt_->sigctx; \ 124179337Syongari } \ 125179337Syongari else if (*(unsigned int *) (pc_+0) == 0x38006666 \ 126179337Syongari || *(unsigned int *) (pc_+0) == 0x380000AC) \ 127179337Syongari { \ 128179337Syongari struct rt_sigframe { \ 129179337Syongari char gap[SIGNAL_FRAMESIZE]; \ 130179337Syongari unsigned long _unused[2]; \ 131179337Syongari struct siginfo *pinfo; \ 132179337Syongari void *puc; \ 133179337Syongari struct siginfo info; \ 134179337Syongari struct kernel_old_ucontext uc; \ 135179337Syongari } *rt_ = (CONTEXT)->cfa; \ 136179337Syongari sc_ = &rt_->uc.uc_mcontext; \ 137179337Syongari } \ 138179337Syongari else \ 139179337Syongari break; \ 140179337Syongari \ 141179337Syongari new_cfa_ = sc_->regs->gpr[STACK_POINTER_REGNUM]; \ 142179337Syongari (FS)->cfa_how = CFA_REG_OFFSET; \ 143179337Syongari (FS)->cfa_reg = STACK_POINTER_REGNUM; \ 144179337Syongari (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \ 145179337Syongari \ 146179337Syongari for (i_ = 0; i_ < 32; i_++) \ 147179337Syongari if (i_ != STACK_POINTER_REGNUM) \ 148179337Syongari { \ 149179337Syongari (FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \ 150179337Syongari (FS)->regs.reg[i_].loc.offset \ 151179337Syongari = (long)&(sc_->regs->gpr[i_]) - new_cfa_; \ 152179337Syongari } \ 153179337Syongari \ 154179337Syongari (FS)->regs.reg[LINK_REGISTER_REGNUM].how = REG_SAVED_OFFSET; \ 155179337Syongari (FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset \ 156179337Syongari = (long)&(sc_->regs->link) - new_cfa_; \ 157179337Syongari \ 158179337Syongari (FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET; \ 159179337Syongari (FS)->regs.reg[CR0_REGNO].loc.offset \ 160179337Syongari = (long)&(sc_->regs->nip) - new_cfa_; \ 161179337Syongari (FS)->retaddr_column = CR0_REGNO; \ 162179337Syongari goto SUCCESS; \ 163179337Syongari } while (0) 164179337Syongari 165179337Syongari