1  /* Target macros for arc*-*-linux targets.
       2  
       3     Copyright (C) 2017-2023 Free Software Foundation, Inc.
       4  
       5  This file is part of GCC.
       6  
       7  GCC is free software; you can redistribute it and/or modify
       8  it under the terms of the GNU General Public License as published by
       9  the Free Software Foundation; either version 3, or (at your option)
      10  any later version.
      11  
      12  GCC is distributed in the hope that it will be useful,
      13  but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15  GNU General Public 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  /* Enable DWARF 2 exceptions.  */
      22  #undef DWARF2_UNWIND_INFO
      23  #define DWARF2_UNWIND_INFO 1
      24  
      25  #define TARGET_OS_CPP_BUILTINS()		\
      26    do						\
      27      {						\
      28        GNU_USER_TARGET_OS_CPP_BUILTINS ();	\
      29      }						\
      30    while (0)
      31  
      32  #define GLIBC_DYNAMIC_LINKER					\
      33    "/lib/ld-linux-arc%{mbig-endian:eb}%{mcpu=arc700:700}.so.2"
      34  #define UCLIBC_DYNAMIC_LINKER  "/lib/ld-uClibc.so.0"
      35  
      36  /* Note that the default is to link against dynamic libraries, if they are
      37     available.  Override with -static.  */
      38  #undef LINK_SPEC
      39  #define LINK_SPEC "%{h*} \
      40    %{static:-Bstatic} \
      41    %{shared:-shared} \
      42    %{symbolic:-Bsymbolic} \
      43    %{!static: \
      44      %{rdynamic:-export-dynamic} \
      45      %{!shared:-dynamic-linker " GNU_USER_DYNAMIC_LINKER "}} \
      46    -X \
      47    %{mbig-endian:-EB} %{EB} %{EL} \
      48    %{mcpu=nps400:-marclinux_nps; :-marclinux}"
      49  
      50  #undef STARTFILE_SPEC
      51  #define STARTFILE_SPEC							\
      52    LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, ANDROID_STARTFILE_SPEC)
      53  
      54  #undef ENDFILE_SPEC
      55  #define ENDFILE_SPEC							\
      56    LINUX_OR_ANDROID_LD (GNU_USER_TARGET_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC)
      57  
      58  #undef LIB_SPEC
      59  #define LIB_SPEC  \
      60    "%{pthread:-lpthread} \
      61     %{shared:-lc} \
      62     %{!shared:%{profile:-lc_p}%{!profile:-lc}}"
      63  
      64  #undef TARGET_ASM_FILE_END
      65  #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
      66  
      67  /* No SDATA default for linux.  */
      68  #undef TARGET_SDATA_DEFAULT
      69  #define TARGET_SDATA_DEFAULT 0
      70  
      71  /* We have medium calls.  */
      72  #undef TARGET_MMEDIUM_CALLS_DEFAULT
      73  #define TARGET_MMEDIUM_CALLS_DEFAULT 1
      74  
      75  /* We do not have any MULTILIB_OPTIONS specified, so there are no
      76     MULTILIB_DEFAULTS.  */
      77  #undef  MULTILIB_DEFAULTS
      78  
      79  /* Linux toolchains use r25 as the thread pointer register.  */
      80  #undef TARGET_ARC_TP_REGNO_DEFAULT
      81  #define TARGET_ARC_TP_REGNO_DEFAULT 25
      82  
      83  #undef SUBTARGET_CPP_SPEC
      84  #define SUBTARGET_CPP_SPEC "\
      85     %{pthread:-D_REENTRANT} \
      86  "
      87  
      88  /* Indexed loads are default off.  */
      89  #undef TARGET_INDEXED_LOADS_DEFAULT
      90  #define TARGET_INDEXED_LOADS_DEFAULT 0
      91  
      92  /* Pre/post modify with register displacement are default off.  */
      93  #undef TARGET_AUTO_MODIFY_REG_DEFAULT
      94  #define TARGET_AUTO_MODIFY_REG_DEFAULT 0
      95  
      96  #if DEFAULT_LIBC == LIBC_GLIBC
      97  /* Override linux.h LINK_EH_SPEC definition.
      98     Signalize that because we have fde-glibc, we don't need all C shared libs
      99     linked against -lgcc_s.  */
     100  #undef LINK_EH_SPEC
     101  #define LINK_EH_SPEC "--eh-frame-hdr "
     102  #endif
     103  
     104  #undef SUBTARGET_CPP_SPEC
     105  #define SUBTARGET_CPP_SPEC "\
     106     %{pthread:-D_REENTRANT} \
     107  "
     108  
     109  /* Build attribute: procedure call standard.  */
     110  #undef ATTRIBUTE_PCS
     111  #define ATTRIBUTE_PCS 3
     112  
     113  /* Clear the instruction cache from `beg' to `end'.  This makes an
     114     inline system call to SYS_cacheflush.  */
     115  #undef CLEAR_INSN_CACHE
     116  #define CLEAR_INSN_CACHE(beg, end)					\
     117  {									\
     118    register unsigned long _beg __asm ("r0") = (unsigned long) (beg);	\
     119    register unsigned long _end __asm ("r1") = (unsigned long) (end);	\
     120    register unsigned long _xtr __asm ("r2") = 0;				\
     121    register unsigned long _scno __asm ("r8") = 244;			\
     122    __asm __volatile ("trap_s 0		; sys_cache_sync"		\
     123  		    : "=r" (_beg)					\
     124  		    : "0" (_beg), "r" (_end), "r" (_xtr), "r" (_scno));	\
     125  }
     126  
     127  /* Emit rtl for profiling.  Output assembler code to FILE
     128     to call "_mcount" for profiling a function entry.  */
     129  #define PROFILE_HOOK(LABEL)					\
     130    {								\
     131     rtx fun, rt;							\
     132     rt = get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);	\
     133     fun = gen_rtx_SYMBOL_REF (Pmode, "_mcount");			\
     134     emit_library_call (fun, LCT_NORMAL, VOIDmode, rt, Pmode);	\
     135    }
     136  
     137  /* Enter/Leave ops are default off for linux targets.  */
     138  #undef TARGET_CODE_DENSITY_FRAME_DEFAULT
     139  #define TARGET_CODE_DENSITY_FRAME_DEFAULT 0