1 /* Definitions of target machine for GNU compiler,
2 for PowerPC machines running Linux.
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4 Free Software Foundation, Inc.
5 Contributed by Michael Meissner (meissner@cygnus.com).
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published
11 by the Free Software Foundation; either version 2, or (at your
12 option) any later version.
14 GCC is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the
21 Free Software Foundation, 59 Temple Place - Suite 330, Boston,
22 MA 02111-1307, USA. */
25 #undef MD_STARTFILE_PREFIX
27 #undef TARGET_OS_CPP_BUILTINS
28 #define TARGET_OS_CPP_BUILTINS() \
31 builtin_define_std ("PPC"); \
32 builtin_define_std ("powerpc"); \
33 builtin_assert ("cpu=powerpc"); \
34 builtin_assert ("machine=powerpc"); \
35 TARGET_OS_SYSV_CPP_BUILTINS (); \
39 #undef CPP_OS_DEFAULT_SPEC
40 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
42 /* The GNU C++ standard library currently requires _GNU_SOURCE being
43 defined on glibc-based systems. This temporary hack accomplishes this,
44 it should go away as soon as libstdc++-v3 has a real fix. */
45 #undef CPLUSPLUS_CPP_SPEC
46 #define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)"
48 #undef LINK_SHLIB_SPEC
49 #define LINK_SHLIB_SPEC "%{shared:-shared} %{!shared: %{static:-static}}"
51 #undef LIB_DEFAULT_SPEC
52 #define LIB_DEFAULT_SPEC "%(lib_linux)"
54 #undef STARTFILE_DEFAULT_SPEC
55 #define STARTFILE_DEFAULT_SPEC "%(startfile_linux)"
57 #undef ENDFILE_DEFAULT_SPEC
58 #define ENDFILE_DEFAULT_SPEC "%(endfile_linux)"
60 #undef LINK_START_DEFAULT_SPEC
61 #define LINK_START_DEFAULT_SPEC "%(link_start_linux)"
63 #undef LINK_OS_DEFAULT_SPEC
64 #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)"
66 #define LINK_GCC_C_SEQUENCE_SPEC \
67 "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}"
69 /* Use --as-needed -lgcc_s for eh support. */
70 #ifdef HAVE_LD_AS_NEEDED
71 #define USE_LD_AS_NEEDED 1
75 #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)");
77 /* Override rs6000.h definition. */
79 #define ASM_APP_ON "#APP\n"
81 /* Override rs6000.h definition. */
83 #define ASM_APP_OFF "#NO_APP\n"
85 /* For backward compatibility, we must continue to use the AIX
86 structure return convention. */
87 #undef DRAFT_V4_STRUCT_RET
88 #define DRAFT_V4_STRUCT_RET 1
90 /* We are 32-bit all the time, so optimize a little. */
92 #define TARGET_64BIT 0
94 /* We don't need to generate entries in .fixup. */
95 #undef RELOCATABLE_NEEDS_FIXUP
97 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
99 #define TARGET_HAS_F_SETLKW
101 /* Do code reading to identify a signal frame, and set the frame
102 state data appropriately. See unwind-dw2.c for the structs. */
107 /* During the 2.5 kernel series the kernel ucontext was changed, but
108 the new layout is compatible with the old one, so we just define
109 and use the old one here for simplicity and compatibility. */
111 struct kernel_old_ucontext
{
112 unsigned long uc_flags
;
113 struct ucontext
*uc_link
;
115 struct sigcontext_struct uc_mcontext
;
119 enum { SIGNAL_FRAMESIZE
= 64 };
122 #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS) \
124 unsigned char *pc_ = (CONTEXT)->ra; \
125 struct sigcontext *sc_; \
129 /* li r0, 0x7777; sc (sigreturn old) */ \
130 /* li r0, 0x0077; sc (sigreturn new) */ \
131 /* li r0, 0x6666; sc (rt_sigreturn old) */ \
132 /* li r0, 0x00AC; sc (rt_sigreturn new) */ \
133 if (*(unsigned int *) (pc_+4) != 0x44000002) \
135 if (*(unsigned int *) (pc_+0) == 0x38007777 \
136 || *(unsigned int *) (pc_+0) == 0x38000077) \
139 char gap[SIGNAL_FRAMESIZE]; \
140 struct sigcontext sigctx; \
141 } *rt_ = (CONTEXT)->cfa; \
142 sc_ = &rt_->sigctx; \
144 else if (*(unsigned int *) (pc_+0) == 0x38006666 \
145 || *(unsigned int *) (pc_+0) == 0x380000AC) \
147 struct rt_sigframe { \
148 char gap[SIGNAL_FRAMESIZE]; \
149 unsigned long _unused[2]; \
150 struct siginfo *pinfo; \
152 struct siginfo info; \
153 struct kernel_old_ucontext uc; \
154 } *rt_ = (CONTEXT)->cfa; \
155 sc_ = &rt_->uc.uc_mcontext; \
160 new_cfa_ = sc_->regs->gpr[STACK_POINTER_REGNUM]; \
161 (FS)->cfa_how = CFA_REG_OFFSET; \
162 (FS)->cfa_reg = STACK_POINTER_REGNUM; \
163 (FS)->cfa_offset = new_cfa_ - (long) (CONTEXT)->cfa; \
165 for (i_ = 0; i_ < 32; i_++) \
166 if (i_ != STACK_POINTER_REGNUM) \
168 (FS)->regs.reg[i_].how = REG_SAVED_OFFSET; \
169 (FS)->regs.reg[i_].loc.offset \
170 = (long)&(sc_->regs->gpr[i_]) - new_cfa_; \
173 (FS)->regs.reg[LINK_REGISTER_REGNUM].how = REG_SAVED_OFFSET; \
174 (FS)->regs.reg[LINK_REGISTER_REGNUM].loc.offset \
175 = (long)&(sc_->regs->link) - new_cfa_; \
177 (FS)->regs.reg[CR0_REGNO].how = REG_SAVED_OFFSET; \
178 (FS)->regs.reg[CR0_REGNO].loc.offset \
179 = (long)&(sc_->regs->nip) - new_cfa_; \
180 (FS)->retaddr_column = CR0_REGNO; \
185 #define OS_MISSING_POWERPC64 1