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