xref: /openbsd-src/gnu/gcc/gcc/config/sh/netbsd-elf.h (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* Definitions for SH running NetBSD using ELF
2*404b540aSrobert    Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3*404b540aSrobert    Contributed by Wasabi Systems, Inc.
4*404b540aSrobert 
5*404b540aSrobert This file is part of GCC.
6*404b540aSrobert 
7*404b540aSrobert GCC is free software; you can redistribute it and/or modify
8*404b540aSrobert it under the terms of the GNU General Public License as published by
9*404b540aSrobert the Free Software Foundation; either version 2, or (at your option)
10*404b540aSrobert any later version.
11*404b540aSrobert 
12*404b540aSrobert GCC is distributed in the hope that it will be useful,
13*404b540aSrobert but WITHOUT ANY WARRANTY; without even the implied warranty of
14*404b540aSrobert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*404b540aSrobert GNU General Public License for more details.
16*404b540aSrobert 
17*404b540aSrobert You should have received a copy of the GNU General Public License
18*404b540aSrobert along with this program; see the file COPYING.  If not, write to
19*404b540aSrobert the Free Software Foundation, 51 Franklin Street, Fifth Floor,
20*404b540aSrobert Boston, MA 02110-1301, USA.  */
21*404b540aSrobert 
22*404b540aSrobert /* Run-time Target Specification.  */
23*404b540aSrobert #if TARGET_ENDIAN_DEFAULT == MASK_LITTLE_ENDIAN
24*404b540aSrobert #define TARGET_VERSION_ENDIAN "le"
25*404b540aSrobert #else
26*404b540aSrobert #define TARGET_VERSION_ENDIAN ""
27*404b540aSrobert #endif
28*404b540aSrobert 
29*404b540aSrobert #if TARGET_CPU_DEFAULT & MASK_SH5
30*404b540aSrobert #if TARGET_CPU_DEFAULT & MASK_SH_E
31*404b540aSrobert #define TARGET_VERSION_CPU "sh5"
32*404b540aSrobert #else
33*404b540aSrobert #define TARGET_VERSION_CPU "sh64"
34*404b540aSrobert #endif /* MASK_SH_E */
35*404b540aSrobert #else
36*404b540aSrobert #define TARGET_VERSION_CPU "sh"
37*404b540aSrobert #endif /* MASK_SH5 */
38*404b540aSrobert 
39*404b540aSrobert #undef TARGET_VERSION
40*404b540aSrobert #define TARGET_VERSION	fprintf (stderr, " (NetBSD/%s%s ELF)",		\
41*404b540aSrobert                                  TARGET_VERSION_CPU, TARGET_VERSION_ENDIAN)
42*404b540aSrobert 
43*404b540aSrobert 
44*404b540aSrobert /* Extra specs needed for NetBSD SuperH ELF targets.  */
45*404b540aSrobert 
46*404b540aSrobert #undef SUBTARGET_EXTRA_SPECS
47*404b540aSrobert #define SUBTARGET_EXTRA_SPECS						\
48*404b540aSrobert   { "netbsd_entry_point", NETBSD_ENTRY_POINT },
49*404b540aSrobert 
50*404b540aSrobert 
51*404b540aSrobert #define TARGET_OS_CPP_BUILTINS()					\
52*404b540aSrobert   do									\
53*404b540aSrobert     {									\
54*404b540aSrobert       NETBSD_OS_CPP_BUILTINS_ELF();					\
55*404b540aSrobert       builtin_define ("__NO_LEADING_UNDERSCORES__");			\
56*404b540aSrobert     }									\
57*404b540aSrobert   while (0)
58*404b540aSrobert 
59*404b540aSrobert /* Provide a LINK_SPEC appropriate for a NetBSD/sh ELF target.
60*404b540aSrobert    We use the SH_LINK_SPEC from sh/sh.h, and define the appropriate
61*404b540aSrobert    SUBTARGET_LINK_SPEC that pulls in what we need from a generic
62*404b540aSrobert    NetBSD ELF LINK_SPEC.  */
63*404b540aSrobert 
64*404b540aSrobert /* LINK_EMUL_PREFIX from sh/elf.h */
65*404b540aSrobert 
66*404b540aSrobert #undef SUBTARGET_LINK_EMUL_SUFFIX
67*404b540aSrobert #define SUBTARGET_LINK_EMUL_SUFFIX "_nbsd"
68*404b540aSrobert 
69*404b540aSrobert #undef SUBTARGET_LINK_SPEC
70*404b540aSrobert #define SUBTARGET_LINK_SPEC NETBSD_LINK_SPEC_ELF
71*404b540aSrobert 
72*404b540aSrobert #undef LINK_SPEC
73*404b540aSrobert #define LINK_SPEC SH_LINK_SPEC
74*404b540aSrobert 
75*404b540aSrobert #define NETBSD_ENTRY_POINT "__start"
76*404b540aSrobert 
77*404b540aSrobert /* Provide a CPP_SPEC appropriate for NetBSD.  */
78*404b540aSrobert #undef SUBTARGET_CPP_SPEC
79*404b540aSrobert #define SUBTARGET_CPP_SPEC NETBSD_CPP_SPEC
80*404b540aSrobert 
81*404b540aSrobert #undef TARGET_DEFAULT
82*404b540aSrobert #define TARGET_DEFAULT \
83*404b540aSrobert   (TARGET_CPU_DEFAULT | MASK_USERMODE | TARGET_ENDIAN_DEFAULT)
84*404b540aSrobert 
85*404b540aSrobert /* Define because we use the label and we do not need them.  */
86*404b540aSrobert #define NO_PROFILE_COUNTERS 1
87*404b540aSrobert 
88*404b540aSrobert #undef FUNCTION_PROFILER
89*404b540aSrobert #define FUNCTION_PROFILER(STREAM,LABELNO)				\
90*404b540aSrobert do									\
91*404b540aSrobert   {									\
92*404b540aSrobert     if (TARGET_SHMEDIA32 || TARGET_SHMEDIA64)				\
93*404b540aSrobert       {									\
94*404b540aSrobert 	/* FIXME */							\
95*404b540aSrobert 	sorry ("unimplemented-shmedia profiling");			\
96*404b540aSrobert       }									\
97*404b540aSrobert     else								\
98*404b540aSrobert       {									\
99*404b540aSrobert         fprintf((STREAM), "\tmov.l\t%sLP%d,r1\n",			\
100*404b540aSrobert                 LOCAL_LABEL_PREFIX, (LABELNO));				\
101*404b540aSrobert         fprintf((STREAM), "\tmova\t%sLP%dr,r0\n",			\
102*404b540aSrobert                 LOCAL_LABEL_PREFIX, (LABELNO));				\
103*404b540aSrobert         fprintf((STREAM), "\tjmp\t@r1\n");				\
104*404b540aSrobert         fprintf((STREAM), "\tnop\n");					\
105*404b540aSrobert         fprintf((STREAM), "\t.align\t2\n");				\
106*404b540aSrobert         fprintf((STREAM), "%sLP%d:\t.long\t__mcount\n",			\
107*404b540aSrobert                 LOCAL_LABEL_PREFIX, (LABELNO));				\
108*404b540aSrobert         fprintf((STREAM), "%sLP%dr:\n", LOCAL_LABEL_PREFIX, (LABELNO));	\
109*404b540aSrobert       }									\
110*404b540aSrobert   }									\
111*404b540aSrobert while (0)
112*404b540aSrobert 
113*404b540aSrobert /* Since libgcc is compiled with -fpic for this target, we can't use
114*404b540aSrobert    __sdivsi3_1 as the division strategy for -O0 and -Os.  */
115*404b540aSrobert #undef SH_DIV_STRATEGY_DEFAULT
116*404b540aSrobert #define SH_DIV_STRATEGY_DEFAULT SH_DIV_CALL2
117*404b540aSrobert #undef SH_DIV_STR_FOR_SIZE
118*404b540aSrobert #define SH_DIV_STR_FOR_SIZE "call2"
119