OSDN Git Service

* final.c (HAVE_READONLY_DATA_SECTION): New.
[pf3gnuchains/gcc-fork.git] / gcc / config / alpha / unicosmk.h
1 /* Definitions of target machine for GNU compiler, for DEC Alpha on Cray
2    T3E running Unicos/Mk.
3    Copyright (C) 2001, 2002
4    Free Software Foundation, Inc.
5    Contributed by Roman Lechtchinsky (rl@cs.tu-berlin.de)
6
7 This file is part of GNU CC.
8
9 GNU CC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 GNU CC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GNU CC; see the file COPYING.  If not, write to
21 the Free Software Foundation, 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA.  */
23
24 #undef TARGET_ABI_UNICOSMK
25 #define TARGET_ABI_UNICOSMK 1
26
27 /* CAM requires a slash before floating-pointing instruction suffixes.  */
28
29 #undef TARGET_AS_SLASH_BEFORE_SUFFIX
30 #define TARGET_AS_SLASH_BEFORE_SUFFIX 1
31
32 /* The following defines are necessary for the standard headers to work
33    correctly.  */
34
35 #define TARGET_OS_CPP_BUILTINS()                                \
36     do {                                                        \
37         builtin_define ("__unix");                              \
38         builtin_define ("_UNICOS=205");                         \
39         builtin_define ("_CRAY");                               \
40         builtin_define ("_CRAYT3E");                            \
41         builtin_define ("_CRAYMPP");                            \
42         builtin_define ("_CRAYIEEE");                           \
43         builtin_define ("_ADDR64");                             \
44         builtin_define ("_LD64");                               \
45         builtin_define ("__UNICOSMK__");                        \
46         builtin_define ("__INT_MAX__=9223372036854775807");     \
47         builtin_define ("__SHRT_MAX__=2147483647");             \
48     } while (0)
49
50 #define SHORT_TYPE_SIZE 32
51
52 #undef INT_TYPE_SIZE
53 #define INT_TYPE_SIZE 64
54
55 /* This is consistent with the definition Cray CC uses.  */
56 #undef WCHAR_TYPE
57 #define WCHAR_TYPE "int"
58 #undef WCHAR_TYPE_SIZE
59 #define WCHAR_TYPE_SIZE 64
60
61 /*
62 #define SIZE_TYPE "unsigned int"
63 #define PTRDIFF_TYPE "int"
64 */
65
66 /* Alphas are operated in big endian mode on the Cray T3E.  */
67
68 #undef BITS_BIG_ENDIAN
69 #undef BYTES_BIG_ENDIAN
70 #undef WORDS_BIG_ENDIAN
71 #define BITS_BIG_ENDIAN 0
72 #define BYTES_BIG_ENDIAN 1
73 #define WORDS_BIG_ENDIAN 1
74
75
76 /* Every structure's size must be a multiple of this.  */
77
78 #undef STRUCTURE_SIZE_BOUNDARY
79 #define STRUCTURE_SIZE_BOUNDARY 64
80
81 /* No data type wants to be aligned rounder than this.  */
82
83 #undef BIGGEST_ALIGNMENT
84 #define BIGGEST_ALIGNMENT 256
85
86 /* Include the frame pointer in fixed_regs and call_used_regs as it can't be 
87    used as a general-purpose register even in frameless functions.
88    ??? The global_regs hack is needed for now because -O2 sometimes tries to 
89    eliminate $15 increments/decrements in frameless functions.  */
90
91 #undef CONDITIONAL_REGISTER_USAGE
92 #define CONDITIONAL_REGISTER_USAGE      \
93   do {                                  \
94     fixed_regs[15] = 1;                 \
95     call_used_regs[15] = 1;             \
96     global_regs[15] = 1;                \
97   } while(0)
98 \f
99 /* The stack frame grows downward.  */
100
101 #define FRAME_GROWS_DOWNWARD
102
103 /* Define the offset between two registers, one to be eliminated, and the
104    other its replacement, at the start of a routine. This is somewhat
105    complicated on the T3E which is why we use a function.  */
106
107 extern int unicosmk_initial_elimination_offset PARAMS ((int, int));
108
109 #undef INITIAL_ELIMINATION_OFFSET
110 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                    \
111   do {                                                                  \
112     (OFFSET) = unicosmk_initial_elimination_offset ((FROM), (TO));      \
113   } while (0)
114
115
116 /* Define this if stack space is still allocated for a parameter passed
117    in a register. On the T3E, stack space is preallocated for all outgoing
118    arguments, including those passed in registers. To avoid problems, we
119    assume that at least 48 bytes (i.e. enough space for all arguments passed
120    in registers) are allocated.  */
121
122 #define REG_PARM_STACK_SPACE(DECL) 48
123 #define OUTGOING_REG_PARM_STACK_SPACE
124
125 /* If an argument can't be passed in registers even though not all argument
126    registers have been used yet, it is passed on the stack in the space 
127    preallocated for these registers.  */
128
129 #define STACK_PARMS_IN_REG_PARM_AREA
130
131 /* This evaluates to nonzero if we do not know how to pass TYPE solely in
132    registers. This is the case for all arguments that do not fit in two
133    registers.  */
134
135 #define MUST_PASS_IN_STACK(MODE,TYPE)                                   \
136   ((TYPE) != 0                                                          \
137    && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST                      \
138        || (TREE_ADDRESSABLE (TYPE) || ALPHA_ARG_SIZE (MODE, TYPE, 0) > 2)))
139
140 /* Define a data type for recording info about an argument list
141    during the scan of that argument list.  This data type should
142    hold all necessary information about the function itself
143    and about the args processed so far, enough to enable macros
144    such as FUNCTION_ARG to determine where the next arg should go.
145
146    On Unicos/Mk, this is a structure that contains various information for
147    the static subroutine information block (SSIB) and the call information
148    word (CIW).  */
149
150 typedef struct {
151
152   /* The overall number of arguments.  */
153   int num_args;
154
155   /* The overall size of the arguments in words.  */
156   int num_arg_words;
157
158   /* The number of words passed in registers.  */
159   int num_reg_words;
160
161   /* If an argument must be passed in the stack, all subsequent arguments
162      must be passed there, too. This flag indicates whether this is the
163      case.  */
164   int force_stack;
165
166   /* This array indicates whether a word is passed in an integer register or
167      a floating point one.  */
168
169   /* For each of the 6 register arguments, the corresponding flag in this
170      array indicates whether the argument is passed in an integer or a
171      floating point register.  */
172   int reg_args_type[6];
173
174 } unicosmk_arg_info;
175
176 #undef CUMULATIVE_ARGS
177 #define CUMULATIVE_ARGS unicosmk_arg_info
178
179 /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a
180    function whose data type is FNTYPE.  For a library call, FNTYPE is 0.  */
181
182 #undef INIT_CUMULATIVE_ARGS
183 #define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT)       \
184   do { (CUM).num_args = 0;                                      \
185        (CUM).num_arg_words = 0;                                 \
186        (CUM).num_reg_words = 0;                                 \
187        (CUM).force_stack = 0;                                   \
188   } while(0)
189
190 /* Update the data in CUM to advance over an argument of mode MODE and data
191    type TYPE. (TYPE is null for libcalls where that information may not be
192    available.)
193
194    On Unicos/Mk, at most 6 words can be passed in registers. Structures
195    which fit in two words are passed in registers, larger structures are
196    passed on stack.  */
197
198 #undef FUNCTION_ARG_ADVANCE
199 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)            \
200 do {                                                            \
201   int size;                                                     \
202                                                                 \
203   size = ALPHA_ARG_SIZE (MODE, TYPE, NAMED);                    \
204                                                                 \
205   if (size > 2 || MUST_PASS_IN_STACK (MODE, TYPE)               \
206       || (CUM).num_reg_words + size > 6)                        \
207     (CUM).force_stack = 1;                                      \
208                                                                 \
209   if (! (CUM).force_stack)                                      \
210     {                                                           \
211       int i;                                                    \
212       int isfloat;                                              \
213       isfloat = (GET_MODE_CLASS (MODE) == MODE_COMPLEX_FLOAT    \
214               || GET_MODE_CLASS (MODE) == MODE_FLOAT);          \
215       for (i = 0; i < size; i++)                                \
216         {                                                       \
217           (CUM).reg_args_type[(CUM).num_reg_words] = isfloat;   \
218           ++(CUM).num_reg_words;                                \
219         }                                                       \
220     }                                                           \
221   (CUM).num_arg_words += size;                                  \
222   ++(CUM).num_args;                                             \
223 } while(0)
224
225 /* We want the default definition for this.
226    ??? In fact, we should delete the definition from alpha.h as it
227    corresponds to the default definition for little-endian machines.  */
228
229 #undef FUNCTION_ARG_PADDING
230
231 /* An argument is passed either entirely in registers or entirely on stack.  */
232  
233 #undef FUNCTION_ARG_PARTIAL_NREGS
234 /* #define FUNCTION_ARG_PARTIAL_NREGS(CUM,MODE,TYPE,NAMED) 0 */
235
236 /* Perform any needed actions needed for a function that is receiving a
237    variable number of arguments.
238
239    On Unicos/Mk, the standard subroutine __T3E_MISMATCH stores all register
240    arguments on the stack. Unfortunately, it doesn't always store the first
241    one (i.e. the one that arrives in $16 or $f16). This is not a problem
242    with stdargs as we always have at least one named argument there. This is
243    not always the case when varargs.h is used, however. In such cases, we
244    have to store the first argument ourselves. We use the information from
245    the CIW to determine whether the first argument arrives in $16 or $f16.  */
246
247 #undef SETUP_INCOMING_VARARGS
248 #define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL)       \
249 { if ((CUM).num_reg_words < 6)                                          \
250     {                                                                   \
251       if (! (NO_RTL))                                                   \
252         {                                                               \
253           int start;                                                    \
254                                                                         \
255           start = (CUM).num_reg_words;                                  \
256           if (!current_function_varargs || start == 0)                  \
257             ++start;                                                    \
258                                                                         \
259           emit_insn (gen_umk_mismatch_args (GEN_INT (start)));          \
260           if (current_function_varargs && (CUM).num_reg_words == 0)     \
261             {                                                           \
262               rtx tmp;                                                  \
263               rtx int_label, end_label;                                 \
264                                                                         \
265               tmp = gen_reg_rtx (DImode);                               \
266               emit_move_insn (tmp,                                      \
267                               gen_rtx_ZERO_EXTRACT (DImode,             \
268                                                     gen_rtx_REG (DImode, 2),\
269                                                     (GEN_INT (1)),      \
270                                                     (GEN_INT (7))));    \
271               int_label = gen_label_rtx ();                             \
272               end_label = gen_label_rtx ();                             \
273               emit_insn (gen_cmpdi (tmp, GEN_INT (0)));                 \
274               emit_jump_insn (gen_beq (int_label));                     \
275               emit_move_insn (gen_rtx_MEM (DFmode, virtual_incoming_args_rtx),\
276                               gen_rtx_REG (DFmode, 48));                \
277               emit_jump (end_label);                                    \
278               emit_label (int_label);                                   \
279               emit_move_insn (gen_rtx_MEM (DImode, virtual_incoming_args_rtx),\
280                               gen_rtx_REG (DImode, 16));                \
281               emit_label (end_label);                                   \
282             }                                                           \
283           emit_insn (gen_arg_home_umk ());                              \
284         }                                                               \
285                                                                         \
286       PRETEND_SIZE = 0;                                                 \
287     }                                                                   \
288 }
289
290 /* This ensures that $15 increments/decrements in leaf functions won't get
291    eliminated.  */
292
293 #undef EPILOGUE_USES
294 #define EPILOGUE_USES(REGNO)  ((REGNO) == 26 || (REGNO) == 15)
295
296 /* Machine-specific function data.  */
297
298 struct machine_function
299 {
300   /* List of call information words for calls from this function.  */
301   struct rtx_def *first_ciw;
302   struct rtx_def *last_ciw;
303   int ciw_count;
304
305   /* List of deferred case vectors.  */
306   struct rtx_def *addr_list;
307 };
308
309 /* Would have worked, only the stack doesn't seem to be executable
310 #undef TRAMPOLINE_TEMPLATE
311 #define TRAMPOLINE_TEMPLATE(FILE)                       \
312 do { fprintf (FILE, "\tbr $1,0\n");                     \
313      fprintf (FILE, "\tldq $0,12($1)\n");               \
314      fprintf (FILE, "\tldq $1,20($1)\n");               \
315      fprintf (FILE, "\tjmp $31,(r0)\n");                \
316      fprintf (FILE, "\tbis $31,$31,$31\n");             \
317      fprintf (FILE, "\tbis $31,$31,$31\n");             \
318 } while (0) */
319
320 /* We don't support nested functions (yet).  */
321
322 #undef TRAMPOLINE_TEMPLATE
323 #define TRAMPOLINE_TEMPLATE(FILE) abort ()
324 \f
325 /* Specify the machine mode that this machine uses for the index in the
326    tablejump instruction. On Unicos/Mk, we don't support relative case
327    vectors yet, thus the entries should be absolute addresses.  */ 
328
329 #undef CASE_VECTOR_MODE
330 #define CASE_VECTOR_MODE DImode
331
332 #undef CASE_VECTOR_PC_RELATIVE
333
334 /* Define this as 1 if `char' should by default be signed; else as 0.  */
335 /* #define DEFAULT_SIGNED_CHAR 1 */
336
337 /* The Cray assembler is really weird with respect to sections. It has only
338    named sections and you can't reopen a section once it has been closed.
339    This means that we have to generate unique names whenever we want to
340    reenter the text or the data section. The following is a rather bad hack
341    as TEXT_SECTION_ASM_OP and DATA_SECTION_ASM_OP are supposed to be
342    constants.  */
343
344 #undef TEXT_SECTION_ASM_OP
345 #define TEXT_SECTION_ASM_OP unicosmk_text_section ()
346
347 #undef DATA_SECTION_ASM_OP
348 #define DATA_SECTION_ASM_OP unicosmk_data_section ()
349
350 /* There are no read-only sections on Unicos/Mk.  */
351
352 #undef READONLY_DATA_SECTION_ASM_OP
353 #define READONLY_DATA_SECTION data_section
354
355 /* Define extra sections for common data and SSIBs (static subroutine
356    information blocks). The actual section header is output by the callers
357    of these functions.  */
358
359 #undef EXTRA_SECTIONS
360 #undef EXTRA_SECTION_FUNCTIONS
361
362 #define EXTRA_SECTIONS in_common, in_ssib
363 #define EXTRA_SECTION_FUNCTIONS \
364 COMMON_SECTION                  \
365 SSIB_SECTION    
366
367 extern void common_section PARAMS ((void));
368 #define COMMON_SECTION          \
369 void                            \
370 common_section ()               \
371 {                               \
372   in_section = in_common;       \
373 }
374
375 extern void ssib_section PARAMS ((void));
376 #define SSIB_SECTION            \
377 void                            \
378 ssib_section ()                 \
379 {                               \
380   in_section = in_ssib;         \
381 }
382
383 /* This outputs text to go at the start of an assembler file.  */
384
385 #undef ASM_FILE_START
386 #define ASM_FILE_START(FILE)    unicosmk_asm_file_start (FILE)
387
388 /* This outputs text to go at the end of an assembler file.  */
389
390 #undef ASM_FILE_END
391 #define ASM_FILE_END(FILE)      unicosmk_asm_file_end (FILE)
392
393 /* We take care of that in ASM_FILE_START.  */
394
395 #undef ASM_OUTPUT_SOURCE_FILENAME
396
397 /* There is no directive for declaring a label as global. Instead, an 
398    additional colon must be appended when the label is defined.  */
399
400 #undef ASM_GLOBALIZE_LABEL
401 #define ASM_GLOBALIZE_LABEL(FILE,NAME)
402
403 /* This is how to output a label for a jump table.  Arguments are the same as
404    for ASM_OUTPUT_INTERNAL_LABEL, except the insn for the jump table is
405    passed.  */
406
407 #undef ASM_OUTPUT_CASE_LABEL
408 #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLEINSN)        \
409   ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM)
410
411 /* CAM has some restrictions with respect to string literals. It won't
412    accept lines with more that 256 characters which means that we have
413    to split long strings. Moreover, it only accepts escape sequences of
414    the form \nnn in the range 0 to 127. We generate .byte directives for
415    escapes characters greater than 127. And finally, ` must be escaped.  */
416
417 #undef ASM_OUTPUT_ASCII
418 #define ASM_OUTPUT_ASCII(MYFILE, MYSTRING, MYLENGTH) \
419   do {                                                                        \
420     FILE *_hide_asm_out_file = (MYFILE);                                      \
421     const unsigned char *_hide_p = (const unsigned char *) (MYSTRING);        \
422     int _hide_thissize = (MYLENGTH);                                          \
423     int _size_so_far = 0;                                                     \
424     {                                                                         \
425       FILE *asm_out_file = _hide_asm_out_file;                                \
426       const unsigned char *p = _hide_p;                                       \
427       int thissize = _hide_thissize;                                          \
428       int in_ascii = 0;                                                       \
429       int i;                                                                  \
430                                                                               \
431       for (i = 0; i < thissize; i++)                                          \
432         {                                                                     \
433           register int c = p[i];                                              \
434                                                                               \
435           if (c > 127)                                                        \
436             {                                                                 \
437               if (in_ascii)                                                   \
438                 {                                                             \
439                   fprintf (asm_out_file, "\"\n");                             \
440                   in_ascii = 0;                                               \
441                 }                                                             \
442                                                                               \
443               fprintf (asm_out_file, "\t.byte\t%d\n", c);                     \
444             }                                                                 \
445           else                                                                \
446             {                                                                 \
447               if (! in_ascii)                                                 \
448                 {                                                             \
449                   fprintf (asm_out_file, "\t.ascii\t\"");                     \
450                   in_ascii = 1;                                               \
451                   _size_so_far = 0;                                           \
452                 }                                                             \
453               else if (_size_so_far >= 64)                                    \
454                 {                                                             \
455                   fprintf (asm_out_file, "\"\n\t.ascii\t\"");                 \
456                   _size_so_far = 0;                                           \
457                 }                                                             \
458                                                                               \
459               if (c == '\"' || c == '\\' || c == '`')                         \
460                 putc ('\\', asm_out_file);                                    \
461               if (c >= ' ')                                                   \
462                 putc (c, asm_out_file);                                       \
463               else                                                            \
464                 fprintf (asm_out_file, "\\%.3o", c);                          \
465               ++ _size_so_far;                                                \
466             }                                                                 \
467         }                                                                     \
468       if (in_ascii)                                                           \
469         fprintf (asm_out_file, "\"\n");                                       \
470     }                                                                         \
471   } while(0)
472
473 /* This is how to output an element of a case-vector that is absolute.  */
474
475 #undef ASM_OUTPUT_ADDR_VEC_ELT
476 #define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)    \
477   fprintf (FILE, "\t.quad $L%d\n", (VALUE))
478
479 /* This is how to output an element of a case-vector that is relative.
480    (Unicos/Mk does not use such vectors yet).  */
481
482 #undef ASM_OUTPUT_ADDR_DIFF_ELT
483 #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) abort ()
484
485 /* We can't output case vectors in the same section as the function code
486    because CAM doesn't allow data definitions in code sections. Thus, we
487    simply record the case vectors and put them in a separate section after
488    the function.  */
489
490 #define ASM_OUTPUT_ADDR_VEC(LAB,VEC) \
491   unicosmk_defer_case_vector ((LAB),(VEC))
492
493 #define ASM_OUTPUT_ADDR_DIFF_VEC(LAB,VEC) abort ()
494
495 /* This is how to output an assembler line that says to advance the location
496    counter to a multiple of 2**LOG bytes. Annoyingly, CAM always uses zeroes
497    to fill the unused space which does not work in code sections. We have to 
498    be careful not to use the .align directive in code sections.  */
499
500 #undef ASM_OUTPUT_ALIGN
501 #define ASM_OUTPUT_ALIGN(STREAM,LOG) unicosmk_output_align (STREAM, LOG)
502
503 /* This is how to advance the location counter by SIZE bytes.  */
504
505 #undef ASM_OUTPUT_SKIP
506 #define ASM_OUTPUT_SKIP(STREAM,SIZE)                    \
507   fprintf ((STREAM), "\t.byte\t0:%d\n", (SIZE));
508
509 /* This says how to output an assembler line to define a global common
510    symbol. We need the alignment information because it has to be supplied
511    in the section header.  */ 
512
513 #undef ASM_OUTPUT_COMMON
514 #define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN)      \
515   unicosmk_output_common ((FILE), (NAME), (SIZE), (ALIGN))
516
517 /* This says how to output an assembler line to define a local symbol.  */
518
519 #undef ASM_OUTPUT_LOCAL
520 #define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \
521   do { data_section ();                                 \
522        fprintf (FILE, "\t.align\t%d\n", floor_log2 ((ALIGN) / BITS_PER_UNIT));\
523        ASM_OUTPUT_LABEL ((FILE), (NAME));               \
524        fprintf (FILE, "\t.byte 0:%d\n", SIZE);          \
525   } while (0)
526
527 /* CAM does not allow us to declare a symbol as external first and then
528    define it in the same file later. Thus, we keep a list of all external
529    references, remove all symbols defined locally from it and output it at
530    the end of the asm file.  */
531    
532 #define ASM_OUTPUT_EXTERNAL(FILE,DECL,NAME) \
533   unicosmk_add_extern ((NAME))
534
535 #define ASM_OUTPUT_EXTERNAL_LIBCALL(STREAM,SYMREF)      \
536   unicosmk_add_extern (XSTR ((SYMREF), 0))
537
538 /* This is how to declare an object. We don't have to output anything if
539    it is a global variable because those go into unique `common' sections
540    and the section name is globally visible. For local variables, we simply
541    output the label. In any case, we have to record that no extern
542    declaration should be generated for the symbol.  */
543
544 #define ASM_DECLARE_OBJECT_NAME(STREAM,NAME,DECL)       \
545   do { tree name_tree;                                  \
546        name_tree = get_identifier ((NAME));             \
547        TREE_ASM_WRITTEN (name_tree) = 1;                \
548        if (!TREE_PUBLIC (DECL))                         \
549          {                                              \
550            assemble_name (STREAM, NAME);                \
551            fputs (":\n", STREAM);                       \
552          }                                              \
553   } while(0)
554
555 /*
556 #define ASM_OUTPUT_SECTION_NAME(STREAM, DECL, NAME, RELOC)      \
557   unicosmk_output_section_name ((STREAM), (DECL), (NAME), (RELOC))
558 */
559
560 /* Switch into a generic section.  */
561 #define TARGET_ASM_NAMED_SECTION unicosmk_asm_named_section
562
563 #undef ASM_OUTPUT_MAX_SKIP_ALIGN
564 #define ASM_OUTPUT_MAX_SKIP_ALIGN(STREAM,POWER,MAXSKIP)
565 \f
566 #undef NM_FLAGS
567
568 #undef OBJECT_FORMAT_COFF
569
570 /* We cannot generate debugging information on Unicos/Mk.  */
571
572 #undef SDB_DEBUGGING_INFO
573 #undef MIPS_DEBUGGING_INFO
574 #undef DBX_DEBUGGING_INFO
575 #undef DWARF_DEBUGGING_INFO
576 #undef DWARF2_DEBUGGING_INFO
577 #undef DWARF2_UNWIND_INFO
578 #undef INCOMING_RETURN_ADDR_RTX
579
580
581 /* We use the functions provided by the system library for integer
582    division.  */
583
584 #undef UDIVDI3_LIBCALL
585 #undef DIVDI3_LIBCALL
586 #define UDIVDI3_LIBCALL "$uldiv"
587 #define DIVDI3_LIBCALL "$sldiv"
588
589 /* This is necessary to prevent gcc from generating calls to __divsi3.  */
590
591 #define INIT_TARGET_OPTABS                                      \
592   do {                                                          \
593     sdiv_optab->handlers[(int) SImode].libfunc = NULL_RTX;      \
594     udiv_optab->handlers[(int) SImode].libfunc = NULL_RTX;      \
595   } while (0)
596
597 #undef ASM_OUTPUT_SOURCE_LINE
598
599 /* We don't need a start file.  */
600
601 #undef STARTFILE_SPEC
602 #define STARTFILE_SPEC ""
603
604 /* These are the libraries we have to link with.
605    ??? The Craylibs directory should be autoconfed.  */
606 #undef LIB_SPEC
607 #define LIB_SPEC "-L/opt/ctl/craylibs/craylibs -lu -lm -lc -lsma"
608
609 #undef BUILD_VA_LIST_TYPE
610 #undef EXPAND_BUILTIN_VA_START
611 #undef EXPAND_BUILTIN_VA_ARG
612
613 #define EH_FRAME_IN_DATA_SECTION 1