/* Definitions of target machine of Andes NDS32 cpu for GNU compiler
   Copyright (C) 2012-2021 Free Software Foundation, Inc.
   Contributed by Andes Technology Corporation.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it
   under the terms of the GNU General Public License as published
   by the Free Software Foundation; either version 3, or (at your
   option) any later version.

   GCC is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */


/* ------------------------------------------------------------------------ */

#define TARGET_LINUX_ABI 0

/* In the configure stage we may use options --enable-default-relax,
   --enable-Os-default-ifc and --enable-Os-default-ex9.  They effect
   the default spec of passing --relax, --mifc, and --mex9 to linker.
   We use NDS32_RELAX_SPEC, NDS32_IFC_SPEC, and NDS32_EX9_SPEC
   so that we can customize them conveniently.  */
#define LINK_SPEC \
  " %{G*}" \
  " %{mbig-endian:-EB} %{mlittle-endian:-EL}" \
  " %{shared:-shared}" \
  NDS32_RELAX_SPEC

#define LIB_SPEC \
  " -lc -lgloss"

#define LIBGCC_SPEC \
  " -lgcc"

/* The option -mno-ctor-dtor can disable constructor/destructor feature
   by applying different crt stuff.  In the convention, crt0.o is the
   startup file without constructor/destructor;
   crt1.o, crti.o, crtbegin.o, crtend.o, and crtn.o are the
   startup files with constructor/destructor.
   Note that crt0.o, crt1.o, crti.o, and crtn.o are provided
   by newlib/mculib/glibc/ublic, while crtbegin.o and crtend.o are
   currently provided by GCC for nds32 target.

   For nds32 target so far:
   If -mno-ctor-dtor, we are going to link
   "crt0.o [user objects]".
   If -mctor-dtor, we are going to link
   "crt1.o crtbegin1.o [user objects] crtend1.o".

   Note that the TARGET_DEFAULT_CTOR_DTOR would effect the
   default behavior.  Check gcc/config.gcc for more information.  */
#ifdef TARGET_DEFAULT_CTOR_DTOR
  #define STARTFILE_SPEC \
    " %{!mno-ctor-dtor:crt1.o%s;:crt0.o%s}" \
    " %{!mno-ctor-dtor:crtbegin1.o%s}" \
    " %{mcrt-arg:crtarg.o%s}"
  #define ENDFILE_SPEC \
    " %{!mno-ctor-dtor:crtend1.o%s}"
#else
  #define STARTFILE_SPEC \
    " %{mctor-dtor|coverage:crt1.o%s;:crt0.o%s}" \
    " %{mctor-dtor|coverage:crtbegin1.o%s}" \
    " %{mcrt-arg:crtarg.o%s}"
  #define ENDFILE_SPEC \
    " %{mctor-dtor|coverage:crtend1.o%s}"
#endif

#define STARTFILE_CXX_SPEC \
  " %{!mno-ctor-dtor:crt1.o%s;:crt0.o%s}" \
  " %{!mno-ctor-dtor:crtbegin1.o%s}" \
  " %{mcrt-arg:crtarg.o%s}"
#define ENDFILE_CXX_SPEC \
  " %{!mno-ctor-dtor:crtend1.o%s}"
