/* Definitions for non-Linux based ARM systems using ELF
   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
   Contributed by Catherine Moore <clm@cygnus.com>

This file is part of GNU CC.

GNU CC 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 2, or (at your option)
any later version.

GNU CC 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 this program; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* Run-time Target Specification.  */
#ifndef TARGET_VERSION
#define TARGET_VERSION	fputs (" (ARM/ELF non-Linux)", stderr);
#endif

/* Default to using APCS-32 and software floating point.  */
#ifndef TARGET_DEFAULT
#define TARGET_DEFAULT	(ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME)
#endif

/* Now we define the strings used to build the spec file.  */
#define STARTFILE_SPEC	"crtbegin%O%s crt0%O%s"

#define ENDFILE_SPEC	"crtend%O%s"

#define USER_LABEL_PREFIX 	""
#define LOCAL_LABEL_PREFIX 	"."

#define TEXT_SECTION "		.text"

#define INVOKE__main

/* Debugging */
#define DWARF_DEBUGGING_INFO
#define DWARF2_DEBUGGING_INFO
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG

/* Support for Constructors and Destrcutors .  */
#define READONLY_DATA_SECTION	rdata_section

/* A list of other sections which the compiler might be "in" at any
   given time.  */
#define SUBTARGET_EXTRA_SECTIONS in_rdata,

/* A list of extra section function definitions.  */
#define SUBTARGET_EXTRA_SECTION_FUNCTIONS	RDATA_SECTION_FUNCTION
  
#define RDATA_SECTION_ASM_OP	"\t.section .rodata"

#define RDATA_SECTION_FUNCTION 					\
void								\
rdata_section ()						\
{								\
  if (in_section != in_rdata)					\
    {								\
      fprintf (asm_out_file, "%s\n", RDATA_SECTION_ASM_OP);	\
      in_section = in_rdata;					\
    }								\
}

#define CTOR_LIST_BEGIN					\
  asm (CTORS_SECTION_ASM_OP);				\
  func_ptr __CTOR_LIST__[1] = { (func_ptr) (-1) }

#define CTOR_LIST_END					\
  asm (CTORS_SECTION_ASM_OP);				\
  func_ptr __CTOR_END__[1] = { (func_ptr) 0 };

#define DTOR_LIST_BEGIN					\
  asm (DTORS_SECTION_ASM_OP);				\
  func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) }

#define DTOR_LIST_END					\
  asm (DTORS_SECTION_ASM_OP);				\
  func_ptr __DTOR_END__[1] = { (func_ptr) 0 };

/* A C statement to output something to the assembler file to switch to section
   NAME for object DECL which is either a FUNCTION_DECL, a VAR_DECL or
   NULL_TREE.  Some target formats do not support arbitrary sections.  Do not
   define this macro in such cases.  */
#define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)		\
  do									\
    {									\
      if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL)			\
        fprintf (STREAM, "\t.section %s,\"ax\",@progbits\n", (NAME));	\
      else if ((DECL) && DECL_READONLY_SECTION (DECL, RELOC))		\
        fprintf (STREAM, "\t.section %s,\"a\"\n", (NAME));		\
      else if (! strncmp (NAME, ".bss", 4))      			\
	fprintf (STREAM, "\t.section %s,\"aw\",@nobits\n", (NAME));	\
      else								\
        fprintf (STREAM, "\t.section %s,\"aw\"\n", (NAME));		\
    }									\
  while (0)

/* The ARM development system defines __main.  */
#define NAME__MAIN "__gccmain"
#define SYMBOL__MAIN __gccmain

/* Return a non-zero value if DECL has a section attribute.  */
#define IN_NAMED_SECTION(DECL)						\
  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL)	\
   && DECL_SECTION_NAME (DECL) != NULL_TREE)

#define MAKE_DECL_ONE_ONLY(DECL) (DECL_WEAK (DECL) = 1)

#define UNIQUE_SECTION_P(DECL) (DECL_ONE_ONLY (DECL))

#define UNIQUE_SECTION(DECL, RELOC)					\
  do									\
    {									\
      int len;								\
      int sec;								\
      const char * name;						\
      char * string;							\
      char * prefix;							\
      static char * prefixes[4][2] =					\
      {									\
	{ ".text.",   ".gnu.linkonce.t." },				\
	{ ".rodata.", ".gnu.linkonce.r." },				\
	{ ".data.",   ".gnu.linkonce.d." },				\
        { ".bss.",    ".gnu.linkonce.b." }				\
      };								\
      									\
      if (TREE_CODE (DECL) == FUNCTION_DECL)				\
	sec = 0;							\
      else if (DECL_READONLY_SECTION (DECL, RELOC))			\
	sec = 1;							\
      else if (DECL_INITIAL (DECL) == NULL_TREE)			\
	sec = 3;							\
      else								\
	sec = 2;							\
      									\
      prefix = prefixes[sec][DECL_ONE_ONLY(DECL)];			\
      name   = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (DECL));		\
      									\
      /* Strip off any encoding in name.  */				\
      STRIP_NAME_ENCODING (name, name);					\
									\
      len    = strlen (name) + strlen (prefix);				\
      string = alloca (len + 1);					\
      									\
      sprintf (string, "%s%s", prefix, name);				\
      									\
      DECL_SECTION_NAME (DECL) = build_string (len, string);		\
    }									\
  while (0)

#undef  ASM_OUTPUT_ALIGNED_BSS
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN)   	\
  do									\
    {									\
      if (IN_NAMED_SECTION (DECL))					\
	named_section (DECL, NULL, 0);					\
      else								\
	bss_section ();							\
      									\
      ASM_GLOBALIZE_LABEL (FILE, NAME);					\
      									\
      ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));	\
									\
      last_assemble_variable_decl = DECL;				\
      ASM_DECLARE_OBJECT_NAME (FILE, NAME, DECL);			\
      ASM_OUTPUT_SKIP (FILE, SIZE ? SIZE : 1);				\
    } 									\
  while (0)

#undef  ASM_OUTPUT_ALIGNED_DECL_LOCAL
#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(FILE, DECL, NAME, SIZE, ALIGN)	\
  do									\
    {									\
      if (IN_NAMED_SECTION (DECL))					\
	named_section (DECL, NULL, 0);					\
      else								\
	bss_section ();							\
									\
      ASM_OUTPUT_ALIGN (FILE, floor_log2 (ALIGN / BITS_PER_UNIT));	\
      ASM_OUTPUT_LABEL (FILE, NAME);					\
      fprintf (FILE, "\t.space\t%d\n", SIZE);				\
    }									\
  while (0)

#ifndef CPP_APCS_PC_DEFAULT_SPEC
#define CPP_APCS_PC_DEFAULT_SPEC	"-D__APCS_32__"
#endif
     
#ifndef SUBTARGET_CPU_DEFAULT
#define SUBTARGET_CPU_DEFAULT 		TARGET_CPU_arm7tdmi
#endif

/* Now get the routine arm-elf definitions.  */
#include "elf.h"
