1 /* Definitions for non-Linux based ARM systems using ELF
2    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3    Contributed by Catherine Moore <clm@cygnus.com>
4 
5    This file is part of GCC.
6 
7    GCC is free software; you can redistribute it and/or modify it
8    under the terms of the GNU General Public License as published
9    by the Free Software Foundation; either version 3, or (at your
10    option) any later version.
11 
12    GCC is distributed in the hope that it will be useful, but WITHOUT
13    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
15    License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with GCC; see the file COPYING3.  If not see
19    <http://www.gnu.org/licenses/>.  */
20 
21 /* elfos.h should have already been included.  Now just override
22    any conflicting definitions and add any extras.  */
23 
24 /* Run-time Target Specification.  */
25 
26 /* Default to using software floating point.  */
27 #ifndef TARGET_DEFAULT
28 #define TARGET_DEFAULT	(0)
29 #endif
30 
31 /* Now we define the strings used to build the spec file.  */
32 #define UNKNOWN_ELF_STARTFILE_SPEC	" crti%O%s crtbegin%O%s crt0%O%s"
33 
34 #undef  STARTFILE_SPEC
35 #define STARTFILE_SPEC	\
36   "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} "	\
37   UNKNOWN_ELF_STARTFILE_SPEC
38 
39 #define UNKNOWN_ELF_ENDFILE_SPEC	"crtend%O%s crtn%O%s"
40 
41 #undef  ENDFILE_SPEC
42 #define ENDFILE_SPEC	UNKNOWN_ELF_ENDFILE_SPEC
43 
44 /* The __USES_INITFINI__ define is tested in newlib/libc/sys/arm/crt0.S
45    to see if it needs to invoked _init() and _fini().  */
46 #undef  SUBTARGET_CPP_SPEC
47 #define SUBTARGET_CPP_SPEC  "-D__USES_INITFINI__"
48 
49 #undef  PREFERRED_DEBUGGING_TYPE
50 #define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
51 
52 /* Return a nonzero value if DECL has a section attribute.  */
53 #define IN_NAMED_SECTION_P(DECL)					\
54   ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL)	\
55    && DECL_SECTION_NAME (DECL) != NULL)
56 
57 #undef  ASM_OUTPUT_ALIGNED_BSS
58 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)   	\
59   do									\
60     {									\
61       if (IN_NAMED_SECTION_P (DECL))					\
62 	switch_to_section (get_named_section (DECL, NULL, 0));		\
63       else								\
64 	switch_to_section (bss_section);				\
65       									\
66       ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));	\
67 									\
68       last_assemble_variable_decl = DECL;				\
69       ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL);			\
70       ASM_OUTPUT_SKIP (FILE, SIZE ? (int)(SIZE) : 1);			\
71     } 									\
72   while (0)
73 
74 #undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
75 #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	\
76   do									\
77     {									\
78       if ((DECL) != NULL && IN_NAMED_SECTION_P (DECL))			\
79 	switch_to_section (get_named_section (DECL, NULL, 0));		\
80       else								\
81 	switch_to_section (bss_section);				\
82 									\
83       ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));	\
84       ASM_OUTPUT_LABEL (FILE, NAME);					\
85       fprintf (FILE, "\t.space\t%d\n", SIZE ? (int) SIZE : 1);		\
86       fprintf (FILE, "\t.size\t%s, %d\n",				\
87 	       NAME, SIZE ? (int) SIZE : 1);				\
88     }									\
89   while (0)
90 
91 /* The libgcc udivmod functions may throw exceptions.  If newlib is
92    configured to support long longs in I/O, then printf will depend on
93    udivmoddi4, which will depend on the exception unwind routines,
94    which will depend on abort, which is defined in libc.  */
95 #undef LINK_GCC_C_SEQUENCE_SPEC
96 #define LINK_GCC_C_SEQUENCE_SPEC "--start-group %G %L --end-group"
97