1  /* Definitions for non-Linux based ARM systems using ELF
       2     Copyright (C) 1998-2023 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:%{!shared: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 %{!nolibc:%L} --end-group"