home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update27.zoo / gcc-233 / tm-atari.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-12-28  |  15.6 KB  |  524 lines

  1. /* Definitions of target machine for GNU compiler.  atariST/TT version.
  2.    Copyright (C) 1987, 1988 Free Software Foundation, Inc.
  3.  
  4. This file is part of GNU CC.
  5.  
  6. GNU CC is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2, or (at your option)
  9. any later version.
  10.  
  11. GNU CC is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GNU CC; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. /* The following Macros control the compilation
  21.  *
  22.  *    CROSSATARI    defined when making cross compiler for TOS or Minix
  23.  *    MINIX        defined when making cross compiler for MINIX only
  24.  *    atariminix    defined when making compiler for MINIX
  25.  *    atarist        defined when making compiler for TOS
  26.  */
  27.  
  28. #include "m68k.h"
  29.  
  30. #if defined(__GNUC__)
  31. #  if defined(alloca)
  32. #    undef alloca
  33. #  endif
  34. #  define alloca(x) __builtin_alloca(x)
  35. #endif
  36.  
  37. #if defined(sparc)
  38. # if !defined(alloca)
  39. #    include <alloca.h>
  40. # endif
  41. #endif
  42.  
  43. /* See m68k.h.  0 means 68000 with no 68881.  */
  44.  
  45. #define TARGET_DEFAULT 0    /* use this for a regular ST       */
  46. /* #define TARGET_DEFAULT 2    use this for a ST with 68881/82    */
  47. /* #define TARGET_DEFAULT 5    use this for a TT withOUT 68881/82 */
  48. /* #define TARGET_DEFAULT 7    use this for a TT with 68881/82    */
  49. /* #define TARGET_DEFAULT 0407  use this for a Falcon           */
  50. /*          may be vaporware but we are ready for it. yeah!! */
  51.       /* USE this for a 68040, when -m68040 is specified. In this
  52.          mode, the 881/2 instructions not on the 040 are not produced
  53.          see TARGET_68040 in m68k.h
  54.          (also note the difference vs TARGET_68040_ONLY) */
  55.  
  56. /* #define TARGET_DEFAULT 01000 use this for 68040_ONLY, dont know what
  57.                     this is useful for */
  58.  
  59.  
  60. /* These compiler options take an argument.  We ignore -target for now.  */
  61.  
  62. #define WORD_SWITCH_TAKES_ARG(STR)                \
  63.  (!strcmp (STR, "Tdata") || !strcmp (STR, "include")        \
  64.   || !strcmp (STR, "imacros") || !strcmp (STR, "target")    \
  65.   || !strcmp (STR, "assert"))
  66.  
  67. /* -m68040-only requires special flags to assembler  */
  68. /* -m68020 requires special flags to the assembler.  */
  69.  
  70. /* -m68000 (on atari) need this flag to assembler, otherwise pc relative
  71.    code is produced where it should not be (in places where the
  72.    68000 only allows data ALTERABLE addressing modes) (++jrb 03/19/89) */
  73.  
  74. #if (TARGET_DEFAULT & 01000)
  75. /* note atleast gas-1.38 Patchlevel 2 required for mc68040 specific
  76.    support in the assembler.
  77.  */
  78. #define ASM_SPEC \
  79.  "%{m68000:-mc68000}%{mc68000:-mc68000} \
  80.   %{!mc68000:%{!m68000:\
  81.                   %{mc68020:-mc68020}%{m68020:-mc68020} \
  82.                   %{!mc68020:%{!m68020:\
  83.             %{mc68040:-mc68020}%{m68040:-mc68020} \
  84.             %{!mc68040:%{!m68040:-mc68040}} \
  85.                   }} \
  86.               }}"
  87. #else 
  88. /* falcon/TT */
  89. #if (TARGET_DEFAULT & 5) /* note this is true for TARGET_DEFAULT == 0407 too */
  90. /* for the TT etc (020/030) also appropriate for m68040 (falcon)
  91.    ie: -m68040 (and not -m68040-only). Note that the
  92.    assembler does not need any special indication of the 040
  93.    when -m68040, only needs -mc68020. the only time
  94.    the assembler needs -mc68040 is when -m68040-only
  95.  */
  96. #define ASM_SPEC \
  97.  "%{m68000:-mc68000}%{mc68000:-mc68000} \
  98.   %{!mc68000:%{!m68000:\
  99.                   %{m68040-only:-mc68040}%{mc68040-only:-mc68040} \
  100.                   %{!m68040-only:%{!mc68040-only:-mc68020}} \
  101.           }}"
  102. #else
  103. /* for a regular 68k ST */
  104. #define ASM_SPEC \
  105.  "%{m68040-only:-mc68040}%{mc68040-only:-mc68040} \
  106.   %{!m68040-only:%{!mc68040-only:\
  107.                       %{m68020:-mc68020}%{mc68020:-mc68020} \
  108.                       %{!mc68020:%{!m68020:-mc68000}} \
  109.           }}"
  110. #endif /* TT /falcon */
  111. #endif /* m68040-only */
  112.  
  113. /* Register to use for base-relative addressing. The BASE_ADDR_* macros
  114.    are for using GNU cpp's stringification feature. */
  115.  
  116. #define BASE_ADDR_REG    4        /* a4 */
  117. #undef PIC_OFFSET_TABLE_REGNUM
  118. #define PIC_OFFSET_TABLE_REGNUM    (BASE_ADDR_REG+8)    /* GCC register num */
  119. #define BASE_ADDR_STRING(X)    "a" #X
  120. #define BASE_ADDR_NAME(X)    BASE_ADDR_STRING(X)
  121.  
  122. #define CPP_SPEC \
  123.  "%{mshort:-D__MSHORT__} %{mint:-D__MINT__} %{m68881:-D__M68881__}\
  124.  %{mc68881:-D__M68881__} %{m68020:-D__M68020__} %{mc68020:-D__M68020__}\
  125.  %{mbaserel:-D__MBASE__=" BASE_ADDR_NAME(BASE_ADDR_REG) " -D__MBASESTR__=\""\
  126.  BASE_ADDR_NAME(BASE_ADDR_REG) "\"}"
  127.  
  128. /* Names to predefine in the preprocessor for this target machine.  */
  129.  
  130. #if (defined(MINIX) || defined(atariminix))
  131. #  if (TARGET_DEFAULT & 5)
  132. #    if(TARGET_DEFAULT & 2)
  133. #      define CPP_PREDEFINES "-DATARI_ST -Dminix -Dm68k -DATARI_TT -DM68881"
  134. #    else
  135. #      define CPP_PREDEFINES "-DATARI_ST -Dminix -Dm68k -DATARI_TT"
  136. #    endif
  137. #  else
  138. #    if(TARGET_DEFAULT & 2)
  139. #      define CPP_PREDEFINES "-DATARI_ST -Dminix -Dm68k -DM68881"
  140. #    else
  141. #      define CPP_PREDEFINES "-DATARI_ST -Dminix -Dm68k"
  142. #    endif
  143. #  endif
  144. #else
  145. #  if (TARGET_DEFAULT & 5)
  146. #    if(TARGET_DEFAULT & 2)
  147. #      define CPP_PREDEFINES "-Datarist -Dgem -Dm68k -Dataritt -DM68881"
  148. #    else
  149. #      define CPP_PREDEFINES "-Datarist -Dgem -Dm68k -Dataritt"
  150. #    endif
  151. #  else
  152. #    if(TARGET_DEFAULT & 2)
  153. #      define CPP_PREDEFINES "-Datarist -Dgem -Dm68k -DM68881"
  154. #    else
  155. #      define CPP_PREDEFINES "-Datarist -Dgem -Dm68k"
  156. #    endif
  157. #  endif
  158. #endif
  159.  
  160. #define PTRDIFF_TYPE "long int"
  161. #define SIZE_TYPE "long unsigned int"
  162. #undef WCHAR_TYPE
  163. #undef WCHAR_TYPE_SIZE
  164. #define WCHAR_TYPE "int"
  165. #define WCHAR_TYPE_SIZE 32 /* just for building the compiler */
  166.  
  167. /* ',' is now the preferred path seperator, though the code
  168.    will still accept ';' for backwards compatibility. this
  169.    may change!
  170. */
  171. #undef PATH_SEPARATOR
  172. #define PATH_SEPARATOR ','
  173.  
  174. /* default exec dir */
  175. #ifndef STANDARD_EXEC_PREFIX
  176. #  ifdef MINIX
  177. #    define STANDARD_EXEC_PREFIX CROSSDIR "/lib/gcc-"
  178. #  else
  179. #    ifdef atariminix
  180. #      define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-"
  181. #    else
  182. #      define STANDARD_EXEC_PREFIX CROSSDIR "/lib/gcc-"
  183. #    endif
  184. #  endif
  185. #endif
  186.  
  187. #define STANDARD_STARTFILE_PREFIX ""
  188. #define EXECUTABLE_SUFFIX ".ttp"
  189.  
  190. /* Alignment of field after `int : 0' in a structure.  */
  191. /* recent gcc's have this as 16, this is left in for the benfit of */
  192.  /* older gcc */
  193. #undef EMPTY_FIELD_BOUNDARY
  194. #define EMPTY_FIELD_BOUNDARY 16
  195.  
  196. /* Every structure or union's size must be a multiple of 2 bytes.  */
  197.  
  198. #undef STRUCTURE_SIZE_BOUNDARY
  199. #define STRUCTURE_SIZE_BOUNDARY 16
  200.  
  201. #define DBX_DEBUGGING_INFO 1
  202.  
  203. #ifndef HAVE_VPRINTF
  204. #define HAVE_VPRINTF 1
  205. #endif
  206.  
  207. #ifdef abort
  208. #undef abort
  209. #define abort fancy_abort
  210. #endif
  211.  
  212.  
  213. /* the following stolen from tm-sun3.h, they seem to work better */
  214. /* This is how to output an assembler line defining a `double' constant.  */
  215.  
  216. /* fake out isinf for !sun for now */
  217. #ifndef sun
  218. #define isinf(X) (0)
  219. #endif
  220.  
  221. #define double_is_minus_zero(X)    ((X) == -0.0)
  222.  
  223. #undef ASM_OUTPUT_DOUBLE
  224. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)                    \
  225.   (isinf ((VALUE))                            \
  226.    ? fprintf (FILE, "\t.double 0r%s99e999\n", ((VALUE) > 0 ? "" : "-")) \
  227.    : double_is_minus_zero ((VALUE))                    \
  228.    ? fprintf (FILE, "\t.long 0x80000000,0\n")                \
  229.    : fprintf (FILE, "\t.double 0r%.20e\n", (VALUE)))
  230.  
  231. /* This is how to output an assembler line defining a `float' constant.  */
  232.  
  233. #undef ASM_OUTPUT_FLOAT
  234. #define ASM_OUTPUT_FLOAT(FILE,VALUE)                    \
  235.   (isinf ((VALUE))                            \
  236.    ? fprintf (FILE, "\t.single 0r%s99e999\n", ((VALUE) > 0 ? "" : "-")) \
  237.    : double_is_minus_zero ((VALUE))                    \
  238.    ? fprintf (FILE, "\t.long 0x80000000\n")                \
  239.    : fprintf (FILE, "\t.single 0r%.20e\n", (VALUE)))
  240.  
  241. #undef ASM_OUTPUT_FLOAT_OPERAND
  242. #define ASM_OUTPUT_FLOAT_OPERAND(FILE,VALUE)                \
  243.   (isinf ((VALUE))                            \
  244.    ? fprintf (FILE, "#0r%s99e999", ((VALUE) > 0 ? "" : "-"))         \
  245.    : double_is_minus_zero ((VALUE))                    \
  246.    ? fprintf (FILE, "#0r-0.0")                        \
  247.    : fprintf (FILE, "#0r%.9g", (VALUE)))
  248.  
  249. #undef ASM_OUTPUT_DOUBLE_OPERAND
  250. #define ASM_OUTPUT_DOUBLE_OPERAND(FILE,VALUE)                \
  251.   (isinf ((VALUE))                            \
  252.    ? fprintf (FILE, "#0r%s99e999", ((VALUE) > 0 ? "" : "-"))        \
  253.    : double_is_minus_zero ((VALUE))                    \
  254.    ? fprintf (FILE, "#0r-0.0")                        \
  255.    : fprintf (FILE, "#0r%.20g", (VALUE)))
  256.  
  257. /* specs for start file and link specs */
  258.  
  259. #ifndef CROSSATARI
  260.  
  261. #ifdef atariminix
  262. #define STARTFILE_SPEC  \
  263.   "%{pg:/usr/local/lib/gcrtso.o%s}\
  264.    %{!pg:\
  265.          %{p:/usr/local/lib/mcrtso.o%s}\
  266.          %{!p:/usr/local/lib/crtso.o%s}}"
  267. #else /* atarist */
  268. #define STARTFILE_SPEC  \
  269.  "$GNULIB$\\%{mbaserel:b}%{mint:m}%{pg:g}%{p:m}crt0.o%s"
  270. #endif
  271.  
  272. #else    /* CROSSATARI */
  273.  
  274. #ifdef MINIX
  275. #define STARTFILE_SPEC  \
  276.   "%{pg:" CROSSDIR "/lib/gcrtso.o%s}\
  277.    %{!pg:\
  278.          %{p:" CROSSDIR "/lib/mcrtso.o%s}\
  279.          %{!p:" CROSSDIR "/lib/crtso.o%s}}"
  280. #else
  281. #define STARTFILE_SPEC  \
  282.   CROSSDIR "/lib/%{mbaserel:b}%{mint:m}%{pg:g}%{p:m}crt0.o%s"
  283. #endif
  284. #endif /* CROSSATARI */
  285.  
  286. /* NOTE: for ataris we dont need to do anything special for -a or -tcov
  287.    as bb_* routines will automatically be pulled in from the libraries
  288.    as required when they are referenced by the generated code.
  289.  */
  290.  
  291. #ifdef MINIX
  292. #define LIB_SPEC \
  293.   "%{mshort:" CROSSDIR "/lib/libc.a}\
  294.    %{!mshort:" CROSSDIR "/lib/libc32.a}"
  295. #else
  296. #ifdef atariminix
  297. #define LIB_SPEC \
  298.   "%{mshort:/usr/local/lib/libc.a}\
  299.    %{!mshort:/usr/local/lib/libc32.a}"
  300. #else /* atarist cross or native */
  301.  
  302. #ifndef __GPLUSPLUS__
  303. #define LIB_SPEC \
  304.  "%{mint:-l%{mbaserel:b}mint%{gg:g}%{mshort:16}}\
  305.  -l%{mbaserel:b}gnu%{gg:g}%{mshort:16}"
  306. #else /* atariSt g++ */
  307. #define LIB_SPEC \
  308.  "%{mint:-l%{mbaserel:b}mint%{gg:g}%{mshort:16}}\
  309.  -l%{mbaserel:b}g++%{gg:g}%{mshort:16}\
  310.  -l%{mbaserel:b}gnu%{gg:g}%{mshort:16}"
  311. #endif
  312.  
  313. #endif
  314. #endif
  315.  
  316. /* Tell linker to make sharable text executable */
  317.  
  318. #define LINK_SPEC "%{mbaserel:-n}"
  319.  
  320. /* add -mint : meanining
  321.    pre-procees with -D__MINT__
  322.    compile with -mint    (target_flags & 010000) (this flag is
  323.      currently not used by cc1, but maybe later)
  324.    link with mcrt0.o and -lmint -lgnu
  325.    
  326.  */
  327.  
  328. #undef TARGET_SWITCHES
  329. #define TARGET_SWITCHES  \
  330.   { { "68020", 5},                \
  331.     { "c68020", 5},                \
  332.     { "68881", 2},                \
  333.     { "bitfield", 4},                \
  334.     { "68000", -5},                \
  335.     { "c68000", -5},                \
  336.     { "soft-float", -0102},            \
  337.     { "nobitfield", -4},            \
  338.     { "rtd", 8},                \
  339.     { "nortd", -8},                \
  340.     { "short", 040},                \
  341.     { "noshort", -040},                \
  342.     { "fpa", 0100},                \
  343.     { "nofpa", -0100},                \
  344.     { "sky", 0200},                \
  345.     { "nosky", -0200},                \
  346.     { "68040", 0407},                \
  347.     { "68030", -01400},                \
  348.     { "68030", 7},                \
  349.     { "68040-only", 01000},            \
  350.     { "pcrel", 02000},                \
  351.     { "nopcrel", -02000},            \
  352.     { "baserel", 04000},            \
  353.     { "nobaserel", -04000},            \
  354.     { "int", 010000},                \
  355.     { "noint", -010000},            \
  356.     { "", TARGET_DEFAULT}}
  357.  
  358. #ifndef ASM_COMMENT_START
  359. #define ASM_COMMENT_START " | "
  360. #endif
  361.  
  362. /* these two should never be used, #define them here so they are'nt
  363.    in cccp.c
  364. */
  365. #define STANDARD_INCLUDE_DIR    8086_sucks
  366. #define LOCAL_INCLUDE_DIR    80486_sucks
  367.  
  368. /* all the INCLUDE_DEFAULTS */
  369. #ifdef CROSSATARI    /* TOS or MINIX cross compiler */
  370. #ifndef SYSTEM_INCLUDE_DIR
  371. #  define SYSTEM_INCLUDE_DIR        CROSSINC
  372. #endif
  373. #ifndef SYSTEM_GPLUSPLUS_INCLUDE_DIR
  374. #  define SYSTEM_GPLUSPLUS_INCLUDE_DIR    GPLUSPLUS_INCLUDE_DIR
  375. #endif
  376. #endif
  377.  
  378. #ifdef atarist        /* TOS native compiler */
  379. #ifndef SYSTEM_INCLUDE_DIR
  380. #  define SYSTEM_INCLUDE_DIR        "\\gnu\\lib"
  381. #endif
  382. #ifndef SYSTEM_GPLUSPLUS_INCLUDE_DIR
  383. #  define SYSTEM_GPLUSPLUS_INCLUDE_DIR    "\\gnu\\g++-inc"
  384. #endif
  385. #endif
  386.  
  387. #ifdef atariminix    /* MINIX native compiler */
  388. #ifndef SYSTEM_INCLUDE_DIR
  389. #  define SYSTEM_INCLUDE_DIR        "/usr/local/gcc-include"
  390. #endif
  391. #ifndef SYSTEM_GPLUSPLUS_INCLUDE_DIR
  392. #  define SYSTEM_GPLUSPLUS_INCLUDE_DIR    "/usr/local/g++-inc"
  393. #endif
  394. #endif
  395.  
  396. #define INCLUDE_DEFAULTS            \
  397.     {                        \
  398.           { SYSTEM_INCLUDE_DIR, 0 },        \
  399.           { SYSTEM_GPLUSPLUS_INCLUDE_DIR, 1 },  \
  400.           { 0, 0 }                \
  401.     }
  402.  
  403. #ifdef atarist
  404. void atari_output_filename();
  405.  
  406. #define FILE_NAME_NONDIRECTORY(X)        \
  407.     atari_filename_nondirectory(X);
  408. extern char *atari_filename_nondirectory();
  409.  
  410. #define DBX_OUTPUT_MAIN_SOURCE_DIRECTORY(file,cwd) \
  411.     fprintf (file, "%s \"", ASM_STABS_OP);    \
  412.     atari_output_filename (file, cwd);    \
  413.     fprintf( file, "\\\\\",%d,0,0,%s\n", N_SO, <ext_label_name[1])
  414.  
  415. #define DBX_OUTPUT_MAIN_SOURCE_FILENAME(file,name) \
  416.     fprintf (file, "%s \"", ASM_STABS_OP);    \
  417.     atari_output_filename (file, name);    \
  418.     fprintf (file, "\",%d,0,0,%s\n", N_SO, <ext_label_name[1]);    \
  419.     text_section();                \
  420.     ASM_OUTPUT_INTERNAL_LABEL (file, "Ltext", 0)
  421.  
  422. #define DBX_OUTPUT_SOURCE_FILENAME(file,name)    \
  423.     ASM_GENERATE_INTERNAL_LABEL (ltext_label_name, "Ltext", 0);    \
  424.     fprintf (file, "%s \"", ASM_STABS_OP);    \
  425.     atari_output_filename (file, name);    \
  426.     fprintf (file, "\",%d,0,0,%s\n", N_SOL, <ext_label_name[1])
  427.  
  428. #define PATH_SEPARATOR    ','
  429. #define PATH_SEP_STR    ","
  430. #else
  431. #define PATH_SEP_STR    ":"
  432. #endif
  433.  
  434. #define    NO_STAB_H    /* Use gstab.h instead of <stab.h> */
  435.  
  436. /* given that symbolic_operand(X), return TRUE if no special
  437.    base relative relocation is necessary */
  438.  
  439. #define LEGITIMATE_BASEREL_OPERAND_P(X) \
  440.   (flag_pic == 3 && read_only_operand (X))
  441.  
  442. #undef LEGITIMATE_PIC_OPERAND_P
  443. #define LEGITIMATE_PIC_OPERAND_P(X) \
  444.   (! symbolic_operand (X, VOIDmode) || LEGITIMATE_BASEREL_OPERAND_P (X))
  445.  
  446.  
  447. /* Define this macro if references to a symbol must be treated
  448.    differently depending on something about the variable or
  449.    function named by the symbol (such as what section it is in).
  450.  
  451.    The macro definition, if any, is executed immediately after the
  452.    rtl for DECL or other node is created.
  453.    The value of the rtl will be a `mem' whose address is a
  454.    `symbol_ref'.
  455.  
  456.    The usual thing for this macro to do is to a flag in the
  457.    `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
  458.    name string in the `symbol_ref' (if one bit is not enough
  459.    information).
  460.  
  461.    On the Atari we use this to indicate if a symbol is in text or
  462.    data space, as well as to distinguish functions from data. */
  463.  
  464. #define ENCODE_SECTION_INFO(DECL)\
  465. do                                    \
  466.   {                                    \
  467.     if (TREE_CODE (DECL) == FUNCTION_DECL)                \
  468.       {                                    \
  469.         SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0)) = 1;        \
  470.     SYMBOL_REF_USED (XEXP (DECL_RTL (DECL), 0)) = 1;        \
  471.       }                                    \
  472.     else                                \
  473.       {                                    \
  474.     rtx rtl = (TREE_CODE_CLASS (TREE_CODE (DECL)) != 'd'        \
  475.            ? TREE_CST_RTL (DECL) : DECL_RTL (DECL));        \
  476.     if (RTX_UNCHANGING_P (rtl) && !MEM_VOLATILE_P (rtl))        \
  477.       SYMBOL_REF_FLAG (XEXP (rtl, 0)) = 1;                \
  478.       }                                    \
  479.   }                                    \
  480. while (0)
  481.  
  482. #if 0
  483. #undef SELECT_RTX_SECTION
  484. #define SELECT_RTX_SECTION(MODE, X)                    \
  485. {                                    \
  486.   if (!flag_pic || LEGITIMATE_BASEREL_OPERAND_P (X))            \
  487.     readonly_data_section();                        \
  488.   else if (LEGITIMATE_PIC_OPERAND_P (X))                \
  489.     readonly_data_section();                        \
  490.   else                                    \
  491.     data_section();                            \
  492. }
  493. #else
  494. #undef SELECT_RTX_SECTION
  495. #define SELECT_RTX_SECTION(MODE, X) readonly_data_section ();
  496. #endif
  497.  
  498. /* according to varasm.c, RELOC referrs *only* to whether constants (!)
  499.    are addressed by address. This doesn't matter in baserelative code,
  500.    so we allow (inspite of flag_pic) readonly_data_section() in that
  501.    case */
  502.  
  503. #undef SELECT_SECTION
  504. #define SELECT_SECTION(DECL, RELOC)                    \
  505. {                                    \
  506.   if (TREE_CODE (DECL) == STRING_CST)                    \
  507.     {                                    \
  508.       if (! flag_writable_strings)                    \
  509.     readonly_data_section ();                    \
  510.       else                                \
  511.     data_section ();                        \
  512.     }                                    \
  513.   else if (TREE_CODE (DECL) == VAR_DECL)                \
  514.     {                                    \
  515.       if ((flag_pic && flag_pic != 3 && RELOC)                \
  516.       || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL))        \
  517.     data_section ();                        \
  518.       else                                \
  519.     readonly_data_section ();                    \
  520.     }                                    \
  521.   else                                    \
  522.     readonly_data_section ();                        \
  523. }
  524.