OSDN Git Service

* system.h (SELECT_RTX_SECTION): Poison.
[pf3gnuchains/gcc-fork.git] / gcc / config / v850 / v850.h
index f6882e7..e20e056 100644 (file)
@@ -1,5 +1,6 @@
 /* Definitions of target machine for GNU compiler. NEC V850 series
-   Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
+   Free Software Foundation, Inc.
    Contributed by Jeff Law (law@cygnus.com).
 
 This file is part of GNU CC.
@@ -19,30 +20,39 @@ along with GNU CC; see the file COPYING.  If not, write to
 the Free Software Foundation, 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
-#include "svr4.h"      /* Automatically does #undef CPP_PREDEFINES */
-
-#undef ASM_SPEC
-#define ASM_SPEC "%{mv*:-mv%*}"
-
-#ifndef CPP_SPEC
-#define CPP_SPEC "-D__v850__"
-#endif
+#ifndef GCC_V850_H
+#define GCC_V850_H
 
+/* These are defiend in svr4.h but we want to override them.  */
 #undef ASM_FINAL_SPEC
 #undef LIB_SPEC
 #undef ENDFILE_SPEC
 #undef LINK_SPEC
 #undef STARTFILE_SPEC
+#undef ASM_SPEC
 
-/* Names to predefine in the preprocessor for this target machine.  */
-#define CPP_PREDEFINES "-D__v851__ -D__v850"
 
-/* Print subsidiary information on the compiler version in use.  */
+#define TARGET_CPU_generic     1
 
-#ifndef TARGET_VERSION
-#define TARGET_VERSION fprintf (stderr, " (NEC V850)");
+#ifndef TARGET_CPU_DEFAULT
+#define TARGET_CPU_DEFAULT     TARGET_CPU_generic
 #endif
 
+#define MASK_DEFAULT            MASK_V850
+#define SUBTARGET_ASM_SPEC     "%{!mv*:-mv850}"
+#define SUBTARGET_CPP_SPEC     "%{!mv*:-D__v850__}"
+#define TARGET_VERSION                 fprintf (stderr, " (NEC V850)");
+
+
+#define ASM_SPEC "%{mv*:-mv%*}"
+#define CPP_SPEC               "%{mv850ea:-D__v850ea__} %{mv850e:-D__v850e__} %{mv850:-D__v850__} %(subtarget_cpp_spec)"
+
+#define EXTRA_SPECS \
+ { "subtarget_asm_spec", SUBTARGET_ASM_SPEC }, \
+ { "subtarget_cpp_spec", SUBTARGET_CPP_SPEC } 
+
+/* Names to predefine in the preprocessor for this target machine.  */
+#define CPP_PREDEFINES "-D__v851__ -D__v850"
 
 /* Run-time compilation parameters selecting different hardware subsets.  */
 
@@ -60,13 +70,6 @@ extern int target_flags;
 
 #define MASK_BIG_SWITCH                0x00000100
 
-#ifndef MASK_DEFAULT
-#define MASK_DEFAULT            MASK_V850
-#endif
-
-#define TARGET_V850                    ((target_flags & MASK_CPU) == MASK_V850)
-
-
 /* Macros used in the machine description to test the flags.  */
 
 /* The GHS calling convention support doesn't really work,
@@ -99,6 +102,8 @@ extern int target_flags;
 /* Whether to call out-of-line functions to save registers or not.  */
 #define TARGET_PROLOG_FUNCTION (target_flags & MASK_PROLOG_FUNCTION)
 
+#define TARGET_V850                    ((target_flags & MASK_CPU) == MASK_V850)
+
 /* Whether to emit 2 byte per entry or 4 byte per entry switch tables.  */
 #define TARGET_BIG_SWITCH (target_flags & MASK_BIG_SWITCH)
 
@@ -112,40 +117,31 @@ extern int target_flags;
    An empty string NAME is used to identify the default VALUE.  */
 
 #define TARGET_SWITCHES                                                        \
-  {{ "ghs",                     MASK_GHS, "Support Green Hills ABI" }, \
+  {{ "ghs",                     MASK_GHS, N_("Support Green Hills ABI") }, \
    { "no-ghs",                 -MASK_GHS, "" },                        \
    { "long-calls",              MASK_LONG_CALLS,                       \
-                                       "Prohibit PC relative function calls" },\
+                                       N_("Prohibit PC relative function calls") },\
    { "no-long-calls",          -MASK_LONG_CALLS, "" },                 \
    { "ep",                      MASK_EP,                               \
-                                "Reuse r30 on a per function basis" },  \
+                                N_("Reuse r30 on a per function basis") }, \
    { "no-ep",                  -MASK_EP, "" },                         \
    { "prolog-function",                 MASK_PROLOG_FUNCTION,                  \
-                                       "Use stubs for function prologues" },   \
+                                       N_("Use stubs for function prologues") }, \
    { "no-prolog-function",     -MASK_PROLOG_FUNCTION, "" },            \
    { "space",                   MASK_EP | MASK_PROLOG_FUNCTION,        \
-                                       "Same as: -mep -mprolog-function" },    \
-   { "debug",                   MASK_DEBUG, "Enable backend debugging" }, \
+                                       N_("Same as: -mep -mprolog-function") }, \
+   { "debug",                   MASK_DEBUG, N_("Enable backend debugging") }, \
    { "v850",                    MASK_V850,                             \
-                                "Compile for the v850 processor" },    \
+                                N_("Compile for the v850 processor") },        \
    { "v850",                    -(MASK_V850 ^ MASK_CPU), "" },         \
    { "big-switch",              MASK_BIG_SWITCH,                       \
-                                       "Use 4 byte entries in switch tables" },\
-   EXTRA_SWITCHES                                                      \
-   { "",                        TARGET_DEFAULT, ""}}
-
-#ifndef EXTRA_SWITCHES
-#define EXTRA_SWITCHES
-#endif
-
-#ifndef TARGET_DEFAULT
-#define TARGET_DEFAULT                 MASK_DEFAULT
-#endif
+                                       N_("Use 4 byte entries in switch tables") },\
+   { "",                        MASK_DEFAULT, ""}}
 
 /* Information about the various small memory areas.  */
 struct small_memory_info {
-  char *name;
-  char *value;
+  const char *name;
+  const char *value;
   long max;
   long physical_max;
 };
@@ -162,34 +158,16 @@ enum small_memory_type {
 
 extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 
-/* This macro is similar to `TARGET_SWITCHES' but defines names of
-   command options that have values.  Its definition is an
-   initializer with a subgrouping for each command option.
-
-   Each subgrouping contains a string constant, that defines the
-   fixed part of the option name, and the address of a variable.  The
-   variable, type `char *', is set to the variable part of the given
-   option if the fixed part matches.  The actual option name is made
-   by appending `-m' to the specified name.
-
-   Here is an example which defines `-mshort-data-NUMBER'.  If the
-   given option is `-mshort-data-512', the variable `m88k_short_data'
-   will be set to the string `"512"'.
-
-          extern char *m88k_short_data;
-          #define TARGET_OPTIONS \
-           { { "short-data-", &m88k_short_data } } */
-
 #define TARGET_OPTIONS                                                 \
 {                                                                      \
   { "tda=",    &small_memory[ (int)SMALL_MEMORY_TDA ].value,           \
-      "Set the max size of data eligible for the TDA area"  },         \
+      N_("Set the max size of data eligible for the TDA area")  },     \
   { "tda-",    &small_memory[ (int)SMALL_MEMORY_TDA ].value, "" },     \
   { "sda=",    &small_memory[ (int)SMALL_MEMORY_SDA ].value,           \
-      "Set the max size of data eligible for the SDA area"  },         \
+      N_("Set the max size of data eligible for the SDA area")  },     \
   { "sda-",    &small_memory[ (int)SMALL_MEMORY_SDA ].value, "" },     \
   { "zda=",    &small_memory[ (int)SMALL_MEMORY_ZDA ].value,           \
-      "Set the max size of data eligible for the ZDA area"  },         \
+      N_("Set the max size of data eligible for the ZDA area")  },     \
   { "zda-",    &small_memory[ (int)SMALL_MEMORY_ZDA ].value, "" },     \
 }
 
@@ -250,22 +228,9 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
    This is not true on the NEC V850.  */
 #define WORDS_BIG_ENDIAN 0
 
-/* Number of bits in an addressable storage unit */
-#define BITS_PER_UNIT 8
-
-/* Width in bits of a "word", which is the contents of a machine register.
-   Note that this is not necessarily the width of data type `int';
-   if using 16-bit ints on a 68000, this would still be 32.
-   But on a machine with 16-bit registers, this would be 16.  */
-#define BITS_PER_WORD          32
-
 /* Width of a word, in units (bytes).  */
 #define UNITS_PER_WORD         4
 
-/* Width in bits of a pointer.
-   See also the macro `Pmode' defined below.  */
-#define POINTER_SIZE           32
-
 /* Define this macro if it is advisable to hold scalars in registers
    in a wider mode than that declared by the program.  In such cases,
    the value is constrained to be within the bounds of the declared
@@ -307,15 +272,6 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
 
    On the NEC V850, loads do sign extension, so make this default. */
 #define DEFAULT_SIGNED_CHAR 1
-
-/* Define results of standard character escape sequences.  */
-#define TARGET_BELL 007
-#define TARGET_BS 010
-#define TARGET_TAB 011
-#define TARGET_NEWLINE 012
-#define TARGET_VT 013
-#define TARGET_FF 014
-#define TARGET_CR 015
 \f
 /* Standard register usage.  */
 
@@ -391,7 +347,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max];
    If HARD_REGNO_MODE_OK could produce different values for MODE1 and MODE2,
    for any hard reg, then this must be 0 for correct output.  */
 #define MODES_TIEABLE_P(MODE1, MODE2) \
-  (MODE1 == MODE2 || GET_MODE_SIZE (MODE1) <= 4 && GET_MODE_SIZE (MODE2) <= 4)
+  (MODE1 == MODE2 || (GET_MODE_SIZE (MODE1) <= 4 && GET_MODE_SIZE (MODE2) <= 4))
 
 \f
 /* Define the classes of registers for register constraints in the
@@ -430,10 +386,11 @@ enum reg_class
    This is an initializer for a vector of HARD_REG_SET
    of length N_REG_CLASSES.  */
 
-#define REG_CLASS_CONTENTS                     \
-{  0x00000000,         /* No regs      */      \
-   0xffffffff,         /* GENERAL_REGS */      \
-   0xffffffff,         /* ALL_REGS     */      \
+#define REG_CLASS_CONTENTS             \
+{                                      \
+  { 0x00000000 }, /* NO_REGS      */   \
+  { 0xffffffff }, /* GENERAL_REGS */           \
+  { 0xffffffff }, /* ALL_REGS  */      \
 }
 
 /* The same information, inverted:
@@ -670,7 +627,7 @@ enum reg_class
 #define PROMOTE_PROTOTYPES 1
 
 /* Keep the stack pointer constant throughout the function.  */
-#define ACCUMULATE_OUTGOING_ARGS
+#define ACCUMULATE_OUTGOING_ARGS 1
 
 /* Value is the number of bytes of arguments automatically
    popped when returning from a subroutine call.
@@ -681,6 +638,7 @@ enum reg_class
 
 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
 
+#define RETURN_ADDR_RTX(COUNT, FP) v850_return_addr (COUNT)
 \f
 /* Define a data type for recording info about an argument list
    during the scan of that argument list.  This data type should
@@ -739,6 +697,10 @@ extern int current_function_anonymous_args;
 #define SETUP_INCOMING_VARARGS(CUM, MODE, TYPE, PAS, SECOND) \
   current_function_anonymous_args = (!TARGET_GHS ? 1 : 0);
 
+/* Implement `va_arg'.  */
+#define EXPAND_BUILTIN_VA_ARG(valist, type) \
+  v850_va_arg (valist, type)
+
 #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED)         \
   ((TYPE) && int_size_in_bytes (TYPE) > 8)
  
@@ -755,13 +717,13 @@ extern int current_function_anonymous_args;
    otherwise, FUNC is 0.   */
    
 #define FUNCTION_VALUE(VALTYPE, FUNC) \
-  gen_rtx (REG, TYPE_MODE (VALTYPE), 10)
+  gen_rtx_REG (TYPE_MODE (VALTYPE), 10)
 
 /* Define how to find the value returned by a library function
    assuming the value has mode MODE.  */
 
 #define LIBCALL_VALUE(MODE) \
-  gen_rtx (REG, MODE, 10)
+  gen_rtx_REG (MODE, 10)
 
 /* 1 if N is a possible register number for a function value.  */
 
@@ -793,7 +755,7 @@ extern int current_function_anonymous_args;
 #define TRAMPOLINE_TEMPLATE(FILE)                      \
   do {                                                 \
     fprintf (FILE, "\tjarl .+4,r12\n");                        \
-    fprintf (FILE, "\tld.w 12[r12],r5\n");             \
+    fprintf (FILE, "\tld.w 12[r12],r20\n");            \
     fprintf (FILE, "\tld.w 16[r12],r12\n");            \
     fprintf (FILE, "\tjmp [r12]\n");                   \
     fprintf (FILE, "\tnop\n");                         \
@@ -811,9 +773,9 @@ extern int current_function_anonymous_args;
 
 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                      \
 {                                                                      \
-  emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 16)),  \
+  emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 16)),   \
                 (CXT));                                                \
-  emit_move_insn (gen_rtx (MEM, SImode, plus_constant ((TRAMP), 20)),  \
+  emit_move_insn (gen_rtx_MEM (SImode, plus_constant ((TRAMP), 20)),   \
                 (FNADDR));                                             \
 }
 
@@ -886,7 +848,7 @@ extern int current_function_anonymous_args;
    register class that does not include r0 on the output.  */
 
 #define EXTRA_CONSTRAINT(OP, C)                                                \
- ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP))                 \
+ ((C) == 'Q'   ? ep_memory_operand (OP, GET_MODE (OP), 0)                      \
   : (C) == 'R' ? special_symbolref_operand (OP, VOIDmode)              \
   : (C) == 'S' ? (GET_CODE (OP) == SYMBOL_REF && ! ZDA_NAME_P (XSTR (OP, 0))) \
   : (C) == 'T' ? 0                                                     \
@@ -917,7 +879,8 @@ extern int current_function_anonymous_args;
 do {                                                                   \
   if (RTX_OK_FOR_BASE_P (X)) goto ADDR;                                        \
   if (CONSTANT_ADDRESS_P (X)                                           \
-      && (MODE == QImode || INTVAL (X) % 2 == 0))                      \
+      && (MODE == QImode || INTVAL (X) % 2 == 0)                       \
+      && (GET_MODE_SIZE (MODE) <= 4 || INTVAL (X) % 4 == 0))           \
     goto ADDR;                                                         \
   if (GET_CODE (X) == LO_SUM                                           \
       && GET_CODE (XEXP (X, 0)) == REG                                 \
@@ -980,7 +943,7 @@ do {                                                                        \
 /* Tell final.c how to eliminate redundant test instructions.  */
 
 /* Here we define machine-dependent flags and fields in cc_status
-   (see `conditions.h').  No extra ones are needed for the vax.  */
+   (see `conditions.h').  No extra ones are needed for the VAX.  */
 
 /* Store in cc_status the expressions
    that the condition codes will describe
@@ -1037,9 +1000,6 @@ do {                                                                      \
    than accessing full words.  */
 #define SLOW_BYTE_ACCESS 1
 
-/* Define this if zero-extension is slow (more than one real instruction).  */
-#define SLOW_ZERO_EXTEND 
-
 /* According expr.c, a value of around 6 should minimize code size, and
    for the V850 series, that's our primary concern.  */
 #define MOVE_RATIO 6
@@ -1061,8 +1021,8 @@ typedef enum
    `in_text' and `in_data'.  You need not define this macro on a
    system with no other sections (that GCC needs to use).  */
 #undef EXTRA_SECTIONS
-#define EXTRA_SECTIONS in_tdata, in_sdata, in_zdata, in_const, in_ctors, \
-in_dtors, in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
+#define EXTRA_SECTIONS in_tdata, in_sdata, in_zdata, \
+ in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
 
 /* One or more functions to be defined in `varasm.c'.  These
    functions should do jobs analogous to those of `text_section' and
@@ -1072,10 +1032,6 @@ in_dtors, in_rozdata, in_rosdata, in_sbss, in_zbss, in_zcommon, in_scommon
 
 /* This could be done a lot more cleanly using ANSI C ... */
 #define EXTRA_SECTION_FUNCTIONS                                                \
-CONST_SECTION_FUNCTION                                                 \
-CTORS_SECTION_FUNCTION                                                 \
-DTORS_SECTION_FUNCTION                                                 \
-                                                                       \
 void                                                                   \
 sdata_section ()                                                       \
 {                                                                      \
@@ -1157,84 +1113,9 @@ zbss_section ()                                                          \
 #define ROSDATA_SECTION_ASM_OP "\t.section .rosdata,\"a\""
 #define ROZDATA_SECTION_ASM_OP "\t.section .rozdata,\"a\""
 
-#define SCOMMON_ASM_OP                ".scomm"
-#define ZCOMMON_ASM_OP                ".zcomm"
-#define TCOMMON_ASM_OP                ".tcomm"
-
-/* A C statement or statements to switch to the appropriate section
-   for output of EXP.  You can assume that EXP is either a `VAR_DECL'
-   node or a constant of some sort.  RELOC indicates whether the
-   initial value of EXP requires link-time relocations.  Select the
-   section by calling `text_section' or one of the alternatives for
-   other sections.
-
-   Do not define this macro if you put all read-only variables and
-   constants in the read-only data section (usually the text section).  */
-#undef  SELECT_SECTION
-#define SELECT_SECTION(EXP, RELOC)                                     \
-do {                                                                   \
-  if (TREE_CODE (EXP) == VAR_DECL)                                     \
-    {                                                                  \
-      int is_const;                                                    \
-      if (!TREE_READONLY (EXP)                                         \
-         || TREE_SIDE_EFFECTS (EXP)                                    \
-         || !DECL_INITIAL (EXP)                                        \
-         || (DECL_INITIAL (EXP) != error_mark_node                     \
-             && !TREE_CONSTANT (DECL_INITIAL (EXP))))                  \
-        is_const = FALSE;                                              \
-      else                                                             \
-        is_const = TRUE;                                               \
-                                                                       \
-      switch (v850_get_data_area (EXP))                                        \
-        {                                                              \
-        case DATA_AREA_ZDA:                                            \
-         if (is_const)                                                 \
-           rozdata_section ();                                         \
-         else                                                          \
-           zdata_section ();                                           \
-         break;                                                        \
-                                                                       \
-        case DATA_AREA_TDA:                                            \
-         tdata_section ();                                             \
-         break;                                                        \
-                                                                       \
-        case DATA_AREA_SDA:                                            \
-         if (is_const)                                                 \
-           rosdata_section ();                                         \
-         else                                                          \
-           sdata_section ();                                           \
-         break;                                                        \
-                                                                       \
-        default:                                                       \
-          if (is_const)                                                        \
-           const_section ();                                           \
-         else                                                          \
-           data_section ();                                            \
-         break;                                                        \
-        }                                                              \
-    }                                                                  \
-  else if (TREE_CODE (EXP) == STRING_CST)                              \
-    {                                                                  \
-      if (! flag_writable_strings)                                     \
-       const_section ();                                               \
-      else                                                             \
-       data_section ();                                                \
-    }                                                                  \
-                                                                       \
-  else                                                                 \
-    const_section ();                                                  \
-                                                                       \
-} while (0)
-
-/* A C statement or statements to switch to the appropriate section
-   for output of RTX in mode MODE.  You can assume that RTX is some
-   kind of constant in RTL.  The argument MODE is redundant except in
-   the case of a `const_int' rtx.  Select the section by calling
-   `text_section' or one of the alternatives for other sections.
-
-   Do not define this macro if you put all constants in the read-only
-   data section.  */
-/* #define SELECT_RTX_SECTION(MODE, RTX) */
+#define SCOMMON_ASM_OP                "\t.scomm\t"
+#define ZCOMMON_ASM_OP                "\t.zcomm\t"
+#define TCOMMON_ASM_OP                "\t.tcomm\t"
 
 /* Output at beginning/end of assembler file.  */
 #undef ASM_FILE_START
@@ -1252,51 +1133,20 @@ do {                                                                    \
 
 #define ASM_APP_OFF "#NO_APP\n"
 
-/* This is how to output an assembler line defining a `double' constant.
-   It is .double or .float, depending.  */
+#undef  USER_LABEL_PREFIX
+#define USER_LABEL_PREFIX "_"
 
-#define ASM_OUTPUT_DOUBLE(FILE, VALUE)                 \
-do { char dstr[30];                                    \
-     REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
-     fprintf (FILE, "\t.double %s\n", dstr);           \
-   } while (0)
+/* When assemble_integer is used to emit the offsets for a switch
+   table it can encounter (TRUNCATE:HI (MINUS:SI (LABEL_REF:SI) (LABEL_REF:SI))).
+   output_addr_const will normally barf at this, but it is OK to omit
+   the truncate and just emit the difference of the two labels.  The
+   .hword directive will automatically handle the truncation for us.  */
 
-
-/* This is how to output an assembler line defining a `float' constant.  */
-#define ASM_OUTPUT_FLOAT(FILE, VALUE)                  \
-do { char dstr[30];                                    \
-     REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", dstr);   \
-     fprintf (FILE, "\t.float %s\n", dstr);            \
-   } while (0)
-
-/* This is how to output an assembler line defining an `int' constant.  */
-
-#define ASM_OUTPUT_INT(FILE, VALUE)            \
-( fprintf (FILE, "\t.long "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
-
-/* Likewise for `char' and `short' constants.  */
-
-#define ASM_OUTPUT_SHORT(FILE, VALUE)          \
-( fprintf (FILE, "\t.hword "),                 \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
-
-#define ASM_OUTPUT_CHAR(FILE, VALUE)           \
-( fprintf (FILE, "\t.byte "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
-
-/* This is how to output an assembler line for a numeric constant byte.  */
-#define ASM_OUTPUT_BYTE(FILE, VALUE)  \
-  fprintf (FILE, "\t.byte 0x%x\n", (VALUE))
-
-/* Define the parentheses used to group arithmetic operations
-   in assembler code.  */
-
-#define ASM_OPEN_PAREN "("
-#define ASM_CLOSE_PAREN ")"
+#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL)         \
+  if (GET_CODE (x) == TRUNCATE)                                \
+    output_addr_const (FILE, XEXP (X, 0));             \
+  else                                                 \
+    goto FAIL;
 
 /* This says how to output the assembler to define a global
    uninitialized but not common symbol.  */
@@ -1331,19 +1181,26 @@ do { char dstr[30];                                     \
 /* This is how to output a command to make the user-level label named NAME
    defined for reference from other files.  */
 
-#define ASM_GLOBALIZE_LABEL(FILE, NAME)        \
-  do { fputs ("\t.global ", FILE); assemble_name (FILE, NAME); fputs ("\n", FILE);} while (0)
+#define ASM_GLOBALIZE_LABEL(FILE, NAME)                \
+  do                                           \
+    {                                          \
+      fputs ("\t.global ", FILE);              \
+      assemble_name (FILE, NAME);              \
+      fputs ("\n", FILE);                      \
+    }                                          \
+  while (0)
 
 /* This is how to output a reference to a user-level label named NAME.
    `assemble_name' uses this.  */
 
 #undef ASM_OUTPUT_LABELREF
-#define ASM_OUTPUT_LABELREF(FILE, NAME)                  \
+#define ASM_OUTPUT_LABELREF(FILE, NAME)           \
   do {                                            \
-  char* real_name;                                \
+  const char* real_name;                          \
   STRIP_NAME_ENCODING (real_name, (NAME));        \
-  fprintf (FILE, "_%s", real_name);               \
-  } while (0)           
+  asm_fprintf (FILE, "%U%s", real_name);          \
+  } while (0)
+
 
 /* Store in OUTPUT a string (made with alloca) containing
    an assembler-name for a local static variable named NAME.
@@ -1411,7 +1268,7 @@ do { char dstr[30];                                       \
           (TARGET_BIG_SWITCH ? ".long" : ".short"),                    \
           VALUE, REL)
 
-#define ASM_OUTPUT_ALIGN(FILE,LOG)     \
+#define ASM_OUTPUT_ALIGN(FILE, LOG)    \
   if ((LOG) != 0)                      \
     fprintf (FILE, "\t.align %d\n", (LOG))
 
@@ -1422,12 +1279,6 @@ do { char dstr[30];                                      \
 #undef PREFERRED_DEBUGGING_TYPE
 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
 
-#define DBX_REGISTER_NUMBER(REGNO) REGNO
-
-/* Define to use software floating point emulator for REAL_ARITHMETIC and
-   decimal <-> binary conversion. */
-#define REAL_ARITHMETIC
-
 /* Specify the machine mode that this machine uses
    for the index in the tablejump instruction.  */
 #define CASE_VECTOR_MODE (TARGET_BIG_SWITCH ? SImode : HImode)
@@ -1457,16 +1308,10 @@ do { char dstr[30];                                     \
 /* Byte and short loads sign extend the value to a word.  */
 #define LOAD_EXTEND_OP(MODE) SIGN_EXTEND
 
-/* Specify the tree operation to be used to convert reals to integers.  */
-#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
-
 /* This flag, if defined, says the same insns that convert to a signed fixnum
    also convert validly to an unsigned one.  */
 #define FIXUNS_TRUNC_LIKE_FIX_TRUNC
 
-/* This is the kind of divide that is easiest to do in the general case.  */
-#define EASY_DIV_EXPR TRUNC_DIV_EXPR
-
 /* Max number of bytes we can move from memory to memory
    in one reasonably fast instruction.  */
 #define MOVE_MAX       4
@@ -1492,38 +1337,17 @@ do { char dstr[30];                                     \
    so give the MEM rtx a byte's mode.  */
 #define FUNCTION_MODE QImode
 
-/* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS
-   is a valid machine specific attribute for DECL.
-   The attributes in ATTRIBUTES have previously been assigned to DECL.  */
-#define VALID_MACHINE_DECL_ATTRIBUTE(DECL, ATTRIBUTES, IDENTIFIER, ARGS) \
-  v850_valid_machine_decl_attribute (DECL, IDENTIFIER, ARGS)
-
-/* A C statement that assigns default attributes to a newly created DECL.  */
-#define SET_DEFAULT_DECL_ATTRIBUTES(decl, attr) \
-     v850_set_default_decl_attr (decl)
-
 /* Tell compiler we want to support GHS pragmas */
-#define HANDLE_PRAGMA(get, unget, name) v850_handle_pragma (get, unget, name)
-
-enum v850_pragma_state
-{
-  V850_PS_START,
-  V850_PS_SHOULD_BE_DONE,
-  V850_PS_BAD,
-  V850_PS_MAYBE_SECTION_NAME,
-  V850_PS_EXPECTING_EQUALS,
-  V850_PS_EXPECTING_SECTION_ALIAS,
-  V850_PS_MAYBE_COMMA
-};
-
-enum v850_pragma_type
-{
-  V850_PT_UNKNOWN,
-  V850_PT_INTERRUPT,
-  V850_PT_SECTION,
-  V850_PT_START_SECTION,
-  V850_PT_END_SECTION
-};
+#define REGISTER_TARGET_PRAGMAS(PFILE) do {                              \
+  cpp_register_pragma (PFILE, "ghs", "interrupt", ghs_pragma_interrupt);  \
+  cpp_register_pragma (PFILE, "ghs", "section",   ghs_pragma_section);    \
+  cpp_register_pragma (PFILE, "ghs", "starttda",  ghs_pragma_starttda);   \
+  cpp_register_pragma (PFILE, "ghs", "startsda",  ghs_pragma_startsda);   \
+  cpp_register_pragma (PFILE, "ghs", "startzda",  ghs_pragma_startzda);   \
+  cpp_register_pragma (PFILE, "ghs", "endtda",    ghs_pragma_endtda);    \
+  cpp_register_pragma (PFILE, "ghs", "endsda",    ghs_pragma_endsda);    \
+  cpp_register_pragma (PFILE, "ghs", "endzda",    ghs_pragma_endzda);    \
+} while (0)
 
 /* enum GHS_SECTION_KIND is an enumeration of the kinds of sections that
    can appear in the "ghs section" pragma.  These names are used to index
@@ -1560,6 +1384,24 @@ enum GHS_section_kind
   COUNT_OF_GHS_SECTION_KINDS  /* must be last */
 };
 
+/* The following code is for handling pragmas supported by the
+   v850 compiler produced by Green Hills Software.  This is at
+   the specific request of a customer.  */
+
+typedef struct data_area_stack_element
+{
+  struct data_area_stack_element * prev;
+  v850_data_area                   data_area; /* Current default data area.  */
+} data_area_stack_element;
+
+/* Track the current data area set by the
+   data area pragma (which can be nested).  */
+extern data_area_stack_element * data_area_stack;
+
+/* Names of the various data areas used on the v850.  */
+extern union tree_node * GHS_default_section_names [(int) COUNT_OF_GHS_SECTION_KINDS];
+extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_KINDS];
+
 /* The assembler op to start the file.  */
 
 #define FILE_ASM_OP "\t.file\n"
@@ -1572,12 +1414,14 @@ enum GHS_section_kind
 
 #define EP_REGNUM 30   /* ep register number */
 
-#define ENCODE_SECTION_INFO(DECL)                                      \
-do {                                                                   \
-  if ((TREE_STATIC (DECL) || DECL_EXTERNAL (DECL))                     \
-      && TREE_CODE (DECL) == VAR_DECL)                                 \
-    v850_encode_data_area (DECL);                                      \
-} while (0)
+#define ENCODE_SECTION_INFO(DECL, FIRST)                       \
+  do                                                           \
+    {                                                          \
+      if ((FIRST) && TREE_CODE (DECL) == VAR_DECL              \
+          && (TREE_STATIC (DECL) || DECL_EXTERNAL (DECL)))     \
+       v850_encode_data_area (DECL);                           \
+    }                                                          \
+  while (0)
 
 #define ZDA_NAME_FLAG_CHAR '@'
 #define TDA_NAME_FLAG_CHAR '%'
@@ -1588,11 +1432,11 @@ do {                                                                    \
 #define SDA_NAME_P(NAME) (*(NAME) == SDA_NAME_FLAG_CHAR)
 
 #define ENCODED_NAME_P(SYMBOL_NAME)    \
-  (ZDA_NAME_P (SYMBOL_NAME)            \
+  (   ZDA_NAME_P (SYMBOL_NAME)         \
    || TDA_NAME_P (SYMBOL_NAME)         \
    || SDA_NAME_P (SYMBOL_NAME))
 
-#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
+#define STRIP_NAME_ENCODING(VAR, SYMBOL_NAME) \
      (VAR) = (SYMBOL_NAME) + (ENCODED_NAME_P (SYMBOL_NAME) || *(SYMBOL_NAME) == '*')
 
 /* Define this if you have defined special-purpose predicates in the
@@ -1603,7 +1447,6 @@ do {                                                                      \
    matched by the predicate.  The list should have a trailing comma.  */
 
 #define PREDICATE_CODES                                                        \
-{ "ep_memory_operand",         { MEM }},                               \
 { "reg_or_0_operand",          { REG, SUBREG, CONST_INT, CONST_DOUBLE }}, \
 { "reg_or_int5_operand",       { REG, SUBREG, CONST_INT }},            \
 { "call_address_operand",      { REG, SYMBOL_REF }},                   \
@@ -1616,53 +1459,5 @@ do {                                                                     \
 { "pattern_is_ok_for_epilogue",        { PARALLEL }},                          \
 { "register_is_ok_for_epilogue",{ REG }},                              \
 { "not_power_of_two_operand",  { CONST_INT }},
-
-  /* Note, due to dependency and search path conflicts, prototypes
-     involving the FILE, rtx or tree types cannot be included here.
-     They are included at the start of v850.c  */
   
-extern void   asm_file_start                ();
-extern void   print_operand                 ();
-extern void   print_operand_address         ();
-extern int    function_arg_partial_nregs    ();
-extern int    const_costs                   ();
-extern char * output_move_double            ();
-extern char * output_move_single            ();
-extern int    ep_memory_operand             ();
-extern int    reg_or_0_operand              ();
-extern int    reg_or_int5_operand           ();
-extern int    call_address_operand          ();
-extern int    movsi_source_operand          ();
-extern int    power_of_two_operand          ();
-extern int    not_power_of_two_operand      ();
-extern int    special_symbolref_operand     ();
-extern void   v850_reorg                    ();
-extern void   notice_update_cc              ();
-extern int    v850_valid_machine_decl_attribute ();
-extern int    v850_interrupt_function_p     ();
-extern int    pattern_is_ok_for_prologue    ();
-extern int    pattern_is_ok_for_epilogue    ();
-extern int    register_is_ok_for_epilogue   ();
-extern char * construct_save_jarl           ();
-extern char * construct_restore_jr          ();
-
-extern void   override_options              PROTO ((void));
-extern int    compute_register_save_size    PROTO ((long *));
-extern int    compute_frame_size            PROTO ((int, long *));
-extern void   expand_prologue               PROTO ((void));
-extern void   expand_epilogue               PROTO ((void));
-
-extern void   v850_output_aligned_bss       ();
-extern void   v850_output_common            ();
-extern void   v850_output_local             ();
-extern void   sdata_section                 PROTO ((void));
-extern void   rosdata_section               PROTO ((void));
-extern void   sbss_section                  PROTO ((void));
-extern void   tdata_section                 PROTO ((void));
-extern void   zdata_section                 PROTO ((void));
-extern void   rozdata_section               PROTO ((void));
-extern void   zbss_section                  PROTO ((void));
-extern int    v850_handle_pragma            PROTO ((int (*)(void), void (*)(int), char *));
-extern void   v850_encode_data_area         ();
-extern void   v850_set_default_decl_attr    ();
-extern v850_data_area v850_get_data_area    ();
+#endif /* ! GCC_V850_H */