OSDN Git Service

* config/avr/avr.c (avr_function_value): Add new 'outgoing' argument.
[pf3gnuchains/gcc-fork.git] / gcc / config / avr / avr.h
1 /* Definitions of target machine for GNU compiler,
2    for ATMEL AVR at90s8515, ATmega103/103L, ATmega603/603L microcontrollers.
3    Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 
4    2008 Free Software Foundation, Inc.
5    Contributed by Denis Chertykov (denisc@overta.ru)
6
7 This file is part of GCC.
8
9 GCC 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 3, or (at your option)
12 any later version.
13
14 GCC 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 GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 /* Names to predefine in the preprocessor for this target machine.  */
24
25 struct base_arch_s {
26   /* Assembler only.  */
27   int asm_only;
28
29   /* Core have 'MUL*' instructions.  */
30   int have_mul;
31
32   /* Core have 'CALL' and 'JMP' instructions.  */
33   int have_jmp_call;
34
35   /* Core have 'MOVW' and 'LPM Rx,Z' instructions.  */
36   int have_movw_lpmx;
37
38   /* Core have 'ELPM' instructions.  */
39   int have_elpm;
40
41   /* Core have 'ELPM Rx,Z' instructions.  */
42   int have_elpmx;
43
44   /* Core have 'EICALL' and 'EIJMP' instructions.  */
45   int have_eijmp_eicall;
46
47   /* Reserved. */
48   int reserved;
49   
50   const char *const macro;
51 };
52
53 extern const struct base_arch_s *avr_current_arch;
54
55 #define TARGET_CPU_CPP_BUILTINS()               \
56   do                                            \
57     {                                           \
58       builtin_define_std ("AVR");               \
59       if (avr_current_arch->macro)              \
60         builtin_define (avr_current_arch->macro);       \
61       if (avr_extra_arch_macro)                 \
62         builtin_define (avr_extra_arch_macro);  \
63       if (avr_current_arch->have_elpm)          \
64         builtin_define ("__AVR_HAVE_RAMPZ__");  \
65       if (avr_current_arch->have_elpm)          \
66         builtin_define ("__AVR_HAVE_ELPM__");   \
67       if (avr_current_arch->have_elpmx)         \
68         builtin_define ("__AVR_HAVE_ELPMX__");  \
69       if (avr_current_arch->have_movw_lpmx)     \
70         {                                       \
71           builtin_define ("__AVR_HAVE_MOVW__"); \
72           builtin_define ("__AVR_HAVE_LPMX__"); \
73         }                                       \
74       if (avr_current_arch->asm_only)           \
75         builtin_define ("__AVR_ASM_ONLY__");    \
76       if (avr_current_arch->have_mul)           \
77         {                                       \
78           builtin_define ("__AVR_ENHANCED__");  \
79           builtin_define ("__AVR_HAVE_MUL__");  \
80         }                                       \
81       if (avr_current_arch->have_jmp_call)      \
82         {                                       \
83           builtin_define ("__AVR_MEGA__");      \
84           builtin_define ("__AVR_HAVE_JMP_CALL__");     \
85         }                                       \
86       if (avr_current_arch->have_eijmp_eicall)  \
87         {                                       \
88           builtin_define ("__AVR_HAVE_EIJMP_EICALL__"); \
89           builtin_define ("__AVR_3_BYTE_PC__"); \
90         }                                       \
91       else                                      \
92         {                                       \
93           builtin_define ("__AVR_2_BYTE_PC__"); \
94         }                                       \
95       if (TARGET_NO_INTERRUPTS)                 \
96         builtin_define ("__NO_INTERRUPTS__");   \
97     }                                           \
98   while (0)
99
100 extern const char *avr_extra_arch_macro;
101
102 #if !defined(IN_LIBGCC2) && !defined(IN_TARGET_LIBS)
103 extern GTY(()) section *progmem_section;
104 #endif
105
106 #define AVR_HAVE_JMP_CALL (avr_current_arch->have_jmp_call && !TARGET_SHORT_CALLS)
107 #define AVR_HAVE_MUL (avr_current_arch->have_mul)
108 #define AVR_HAVE_MOVW (avr_current_arch->have_movw_lpmx)
109 #define AVR_HAVE_LPMX (avr_current_arch->have_movw_lpmx)
110 #define AVR_HAVE_RAMPZ (avr_current_arch->have_elpm)
111 #define AVR_HAVE_EIJMP_EICALL (avr_current_arch->have_eijmp_eicall)
112
113 #define AVR_2_BYTE_PC (!AVR_HAVE_EIJMP_EICALL)
114 #define AVR_3_BYTE_PC (AVR_HAVE_EIJMP_EICALL)
115
116 #define TARGET_VERSION fprintf (stderr, " (GNU assembler syntax)");
117
118 #define OVERRIDE_OPTIONS avr_override_options ()
119
120 #define CAN_DEBUG_WITHOUT_FP
121
122 #define BITS_BIG_ENDIAN 0
123 #define BYTES_BIG_ENDIAN 0
124 #define WORDS_BIG_ENDIAN 0
125
126 #ifdef IN_LIBGCC2
127 /* This is to get correct SI and DI modes in libgcc2.c (32 and 64 bits).  */
128 #define UNITS_PER_WORD 4
129 #else
130 /* Width of a word, in units (bytes).  */
131 #define UNITS_PER_WORD 1
132 #endif
133
134 #define POINTER_SIZE 16
135
136
137 /* Maximum sized of reasonable data type
138    DImode or Dfmode ...  */
139 #define MAX_FIXED_MODE_SIZE 32
140
141 #define PARM_BOUNDARY 8
142
143 #define FUNCTION_BOUNDARY 8
144
145 #define EMPTY_FIELD_BOUNDARY 8
146
147 /* No data type wants to be aligned rounder than this.  */
148 #define BIGGEST_ALIGNMENT 8
149
150 #define MAX_OFILE_ALIGNMENT (32768 * 8)
151
152 #define TARGET_VTABLE_ENTRY_ALIGN 8
153
154 #define STRICT_ALIGNMENT 0
155
156 #define INT_TYPE_SIZE (TARGET_INT8 ? 8 : 16)
157 #define SHORT_TYPE_SIZE (INT_TYPE_SIZE == 8 ? INT_TYPE_SIZE : 16)
158 #define LONG_TYPE_SIZE (INT_TYPE_SIZE == 8 ? 16 : 32)
159 #define LONG_LONG_TYPE_SIZE (INT_TYPE_SIZE == 8 ? 32 : 64)
160 #define FLOAT_TYPE_SIZE 32
161 #define DOUBLE_TYPE_SIZE 32
162 #define LONG_DOUBLE_TYPE_SIZE 32
163
164 #define DEFAULT_SIGNED_CHAR 1
165
166 #define SIZE_TYPE (INT_TYPE_SIZE == 8 ? "long unsigned int" : "unsigned int")
167 #define PTRDIFF_TYPE (INT_TYPE_SIZE == 8 ? "long int" :"int")
168
169 #define WCHAR_TYPE_SIZE 16
170
171 #define FIRST_PSEUDO_REGISTER 36
172
173 #define FIXED_REGISTERS {\
174   1,1,/* r0 r1 */\
175   0,0,/* r2 r3 */\
176   0,0,/* r4 r5 */\
177   0,0,/* r6 r7 */\
178   0,0,/* r8 r9 */\
179   0,0,/* r10 r11 */\
180   0,0,/* r12 r13 */\
181   0,0,/* r14 r15 */\
182   0,0,/* r16 r17 */\
183   0,0,/* r18 r19 */\
184   0,0,/* r20 r21 */\
185   0,0,/* r22 r23 */\
186   0,0,/* r24 r25 */\
187   0,0,/* r26 r27 */\
188   0,0,/* r28 r29 */\
189   0,0,/* r30 r31 */\
190   1,1,/*  STACK */\
191   1,1 /* arg pointer */  }
192
193 #define CALL_USED_REGISTERS {                   \
194   1,1,/* r0 r1 */                               \
195     0,0,/* r2 r3 */                             \
196     0,0,/* r4 r5 */                             \
197     0,0,/* r6 r7 */                             \
198     0,0,/* r8 r9 */                             \
199     0,0,/* r10 r11 */                           \
200     0,0,/* r12 r13 */                           \
201     0,0,/* r14 r15 */                           \
202     0,0,/* r16 r17 */                           \
203     1,1,/* r18 r19 */                           \
204     1,1,/* r20 r21 */                           \
205     1,1,/* r22 r23 */                           \
206     1,1,/* r24 r25 */                           \
207     1,1,/* r26 r27 */                           \
208     0,0,/* r28 r29 */                           \
209     1,1,/* r30 r31 */                           \
210     1,1,/*  STACK */                            \
211     1,1 /* arg pointer */  }
212
213 #define REG_ALLOC_ORDER {                       \
214     24,25,                                      \
215     18,19,                                      \
216     20,21,                                      \
217     22,23,                                      \
218     30,31,                                      \
219     26,27,                                      \
220     28,29,                                      \
221     17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,    \
222     0,1,                                        \
223     32,33,34,35                                 \
224     }
225
226 #define ORDER_REGS_FOR_LOCAL_ALLOC order_regs_for_local_alloc ()
227
228
229 #define HARD_REGNO_NREGS(REGNO, MODE) ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
230
231 #define HARD_REGNO_MODE_OK(REGNO, MODE) avr_hard_regno_mode_ok(REGNO, MODE)
232
233 #define MODES_TIEABLE_P(MODE1, MODE2) 1
234
235 enum reg_class {
236   NO_REGS,
237   R0_REG,                       /* r0 */
238   POINTER_X_REGS,               /* r26 - r27 */
239   POINTER_Y_REGS,               /* r28 - r29 */
240   POINTER_Z_REGS,               /* r30 - r31 */
241   STACK_REG,                    /* STACK */
242   BASE_POINTER_REGS,            /* r28 - r31 */
243   POINTER_REGS,                 /* r26 - r31 */
244   ADDW_REGS,                    /* r24 - r31 */
245   SIMPLE_LD_REGS,               /* r16 - r23 */
246   LD_REGS,                      /* r16 - r31 */
247   NO_LD_REGS,                   /* r0 - r15 */
248   GENERAL_REGS,                 /* r0 - r31 */
249   ALL_REGS, LIM_REG_CLASSES
250 };
251
252
253 #define N_REG_CLASSES (int)LIM_REG_CLASSES
254
255 #define REG_CLASS_NAMES {                                       \
256                  "NO_REGS",                                     \
257                    "R0_REG",    /* r0 */                        \
258                    "POINTER_X_REGS", /* r26 - r27 */            \
259                    "POINTER_Y_REGS", /* r28 - r29 */            \
260                    "POINTER_Z_REGS", /* r30 - r31 */            \
261                    "STACK_REG", /* STACK */                     \
262                    "BASE_POINTER_REGS", /* r28 - r31 */         \
263                    "POINTER_REGS", /* r26 - r31 */              \
264                    "ADDW_REGS", /* r24 - r31 */                 \
265                    "SIMPLE_LD_REGS", /* r16 - r23 */            \
266                    "LD_REGS",   /* r16 - r31 */                 \
267                    "NO_LD_REGS", /* r0 - r15 */                 \
268                    "GENERAL_REGS", /* r0 - r31 */               \
269                    "ALL_REGS" }
270
271 #define REG_CLASS_CONTENTS {                                            \
272   {0x00000000,0x00000000},      /* NO_REGS */                           \
273   {0x00000001,0x00000000},      /* R0_REG */                            \
274   {3 << REG_X,0x00000000},      /* POINTER_X_REGS, r26 - r27 */         \
275   {3 << REG_Y,0x00000000},      /* POINTER_Y_REGS, r28 - r29 */         \
276   {3 << REG_Z,0x00000000},      /* POINTER_Z_REGS, r30 - r31 */         \
277   {0x00000000,0x00000003},      /* STACK_REG, STACK */                  \
278   {(3 << REG_Y) | (3 << REG_Z),                                         \
279      0x00000000},               /* BASE_POINTER_REGS, r28 - r31 */      \
280   {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z),                          \
281      0x00000000},               /* POINTER_REGS, r26 - r31 */           \
282   {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W),           \
283      0x00000000},               /* ADDW_REGS, r24 - r31 */              \
284   {0x00ff0000,0x00000000},      /* SIMPLE_LD_REGS r16 - r23 */          \
285   {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16),    \
286      0x00000000},       /* LD_REGS, r16 - r31 */                        \
287   {0x0000ffff,0x00000000},      /* NO_LD_REGS  r0 - r15 */              \
288   {0xffffffff,0x00000000},      /* GENERAL_REGS, r0 - r31 */            \
289   {0xffffffff,0x00000003}       /* ALL_REGS */                          \
290 }
291
292 #define REGNO_REG_CLASS(R) avr_regno_reg_class(R)
293
294 #define BASE_REG_CLASS (reload_completed ? BASE_POINTER_REGS : POINTER_REGS)
295
296 #define INDEX_REG_CLASS NO_REGS
297
298 #define REGNO_OK_FOR_BASE_P(r) (((r) < FIRST_PSEUDO_REGISTER            \
299                                  && ((r) == REG_X                       \
300                                      || (r) == REG_Y                    \
301                                      || (r) == REG_Z                    \
302                                      || (r) == ARG_POINTER_REGNUM))     \
303                                 || (reg_renumber                        \
304                                     && (reg_renumber[r] == REG_X        \
305                                         || reg_renumber[r] == REG_Y     \
306                                         || reg_renumber[r] == REG_Z     \
307                                         || (reg_renumber[r]             \
308                                             == ARG_POINTER_REGNUM))))
309
310 #define REGNO_OK_FOR_INDEX_P(NUM) 0
311
312 #define PREFERRED_RELOAD_CLASS(X, CLASS) preferred_reload_class(X,CLASS)
313
314 #define SMALL_REGISTER_CLASSES 1
315
316 #define CLASS_LIKELY_SPILLED_P(c) class_likely_spilled_p(c)
317
318 #define CLASS_MAX_NREGS(CLASS, MODE)   class_max_nregs (CLASS, MODE)
319
320 #define STACK_PUSH_CODE POST_DEC
321
322 #define STACK_GROWS_DOWNWARD
323
324 #define STARTING_FRAME_OFFSET 1
325
326 #define STACK_POINTER_OFFSET 1
327
328 #define FIRST_PARM_OFFSET(FUNDECL) 0
329
330 #define STACK_BOUNDARY 8
331
332 #define STACK_POINTER_REGNUM 32
333
334 #define FRAME_POINTER_REGNUM REG_Y
335
336 #define ARG_POINTER_REGNUM 34
337
338 #define STATIC_CHAIN_REGNUM 2
339
340 #define FRAME_POINTER_REQUIRED frame_pointer_required_p()
341
342 /* Offset from the frame pointer register value to the top of the stack.  */
343 #define FRAME_POINTER_CFA_OFFSET(FNDECL) 0
344
345 #define ELIMINABLE_REGS {                                       \
346       {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},               \
347         {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}            \
348        ,{FRAME_POINTER_REGNUM+1,STACK_POINTER_REGNUM+1}}
349
350 #define CAN_ELIMINATE(FROM, TO) (((FROM) == ARG_POINTER_REGNUM             \
351                                   && (TO) == FRAME_POINTER_REGNUM)         \
352                                  || (((FROM) == FRAME_POINTER_REGNUM       \
353                                       || (FROM) == FRAME_POINTER_REGNUM+1) \
354                                      && ! FRAME_POINTER_REQUIRED           \
355                                      ))
356
357 #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)                    \
358      OFFSET = initial_elimination_offset (FROM, TO)
359
360 #define RETURN_ADDR_RTX(count, x) \
361   gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (tem, 1)))
362
363 /* Don't use Push rounding. expr.c: emit_single_push_insn is broken 
364    for POST_DEC targets (PR27386).  */
365 /*#define PUSH_ROUNDING(NPUSHED) (NPUSHED)*/
366
367 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
368
369 #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) (function_arg (&(CUM), MODE, TYPE, NAMED))
370
371 typedef struct avr_args {
372   int nregs;                    /* # registers available for passing */
373   int regno;                    /* next available register number */
374 } CUMULATIVE_ARGS;
375
376 #define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \
377   init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL)
378
379 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)    \
380   (function_arg_advance (&CUM, MODE, TYPE, NAMED))
381
382 #define FUNCTION_ARG_REGNO_P(r) function_arg_regno_p(r)
383
384 extern int avr_reg_order[];
385
386 #define RET_REGISTER avr_ret_register ()
387
388 #define LIBCALL_VALUE(MODE)  avr_libcall_value (MODE)
389
390 #define FUNCTION_VALUE_REGNO_P(N) ((int) (N) == RET_REGISTER)
391
392 #define DEFAULT_PCC_STRUCT_RETURN 0
393
394 #define EPILOGUE_USES(REGNO) avr_epilogue_uses(REGNO)
395
396 #define HAVE_POST_INCREMENT 1
397 #define HAVE_PRE_DECREMENT 1
398
399 #define CONSTANT_ADDRESS_P(X) CONSTANT_P (X)
400
401 #define MAX_REGS_PER_ADDRESS 1
402
403 #ifdef REG_OK_STRICT
404 #  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR) \
405 {                                                       \
406   if (legitimate_address_p (mode, operand, 1))          \
407     goto ADDR;                                          \
408 }
409 #  else
410 #  define GO_IF_LEGITIMATE_ADDRESS(mode, operand, ADDR) \
411 {                                                       \
412   if (legitimate_address_p (mode, operand, 0))          \
413     goto ADDR;                                          \
414 }
415 #endif
416
417 #define REG_OK_FOR_BASE_NOSTRICT_P(X) \
418   (REGNO (X) >= FIRST_PSEUDO_REGISTER || REG_OK_FOR_BASE_STRICT_P(X))
419
420 #define REG_OK_FOR_BASE_STRICT_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
421
422 #ifdef REG_OK_STRICT
423 #  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_STRICT_P (X)
424 #else
425 #  define REG_OK_FOR_BASE_P(X) REG_OK_FOR_BASE_NOSTRICT_P (X)
426 #endif
427
428 #define REG_OK_FOR_INDEX_P(X) 0
429
430 #define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN)                          \
431 {                                                                       \
432   (X) = legitimize_address (X, OLDX, MODE);                             \
433   if (memory_address_p (MODE, X))                                       \
434     goto WIN;                                                           \
435 }
436
437 #define XEXP_(X,Y) (X)
438
439 /* LEGITIMIZE_RELOAD_ADDRESS will allow register R26/27 to be used, where it
440    is no worse than normal base pointers R28/29 and R30/31. For example:
441    If base offset is greater than 63 bytes or for R++ or --R addressing.  */
442    
443 #define LEGITIMIZE_RELOAD_ADDRESS(X, MODE, OPNUM, TYPE, IND_LEVELS, WIN)    \
444 do {                                                                        \
445   if (1&&(GET_CODE (X) == POST_INC || GET_CODE (X) == PRE_DEC))     \
446     {                                                                       \
447       push_reload (XEXP (X,0), XEXP (X,0), &XEXP (X,0), &XEXP (X,0),        \
448                    POINTER_REGS, GET_MODE (X),GET_MODE (X) , 0, 0,          \
449                    OPNUM, RELOAD_OTHER);                                    \
450       goto WIN;                                                             \
451     }                                                                       \
452   if (GET_CODE (X) == PLUS                                                  \
453       && REG_P (XEXP (X, 0))                                                \
454       && reg_equiv_constant[REGNO (XEXP (X, 0))] == 0                       \
455       && GET_CODE (XEXP (X, 1)) == CONST_INT                                \
456       && INTVAL (XEXP (X, 1)) >= 1)                                         \
457     {                                                                       \
458       int fit = INTVAL (XEXP (X, 1)) <= (64 - GET_MODE_SIZE (MODE));        \
459       if (fit)                                                              \
460         {                                                                   \
461           if (reg_equiv_address[REGNO (XEXP (X, 0))] != 0)                  \
462             {                                                               \
463               int regno = REGNO (XEXP (X, 0));                              \
464               rtx mem = make_memloc (X, regno);                             \
465               push_reload (XEXP (mem,0), NULL, &XEXP (mem,0), NULL,         \
466                            POINTER_REGS, Pmode, VOIDmode, 0, 0,             \
467                            1, ADDR_TYPE (TYPE));                            \
468               push_reload (mem, NULL_RTX, &XEXP (X, 0), NULL,               \
469                            BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0, \
470                            OPNUM, TYPE);                                    \
471               goto WIN;                                                     \
472             }                                                               \
473           push_reload (XEXP (X, 0), NULL_RTX, &XEXP (X, 0), NULL,           \
474                        BASE_POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,     \
475                        OPNUM, TYPE);                                        \
476           goto WIN;                                                         \
477         }                                                                   \
478       else if (! (frame_pointer_needed && XEXP (X,0) == frame_pointer_rtx)) \
479         {                                                                   \
480           push_reload (X, NULL_RTX, &X, NULL,                               \
481                        POINTER_REGS, GET_MODE (X), VOIDmode, 0, 0,          \
482                        OPNUM, TYPE);                                        \
483           goto WIN;                                                         \
484         }                                                                   \
485     }                                                                       \
486 } while(0)
487
488 #define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR,LABEL)
489
490 #define LEGITIMATE_CONSTANT_P(X) 1
491
492 #define REGISTER_MOVE_COST(MODE, FROM, TO) ((FROM) == STACK_REG ? 6 \
493                                             : (TO) == STACK_REG ? 12 \
494                                             : 2)
495
496 #define MEMORY_MOVE_COST(MODE,CLASS,IN) ((MODE)==QImode ? 2 :   \
497                                          (MODE)==HImode ? 4 :   \
498                                          (MODE)==SImode ? 8 :   \
499                                          (MODE)==SFmode ? 8 : 16)
500
501 #define BRANCH_COST 0
502
503 #define SLOW_BYTE_ACCESS 0
504
505 #define NO_FUNCTION_CSE
506
507 #define TEXT_SECTION_ASM_OP "\t.text"
508
509 #define DATA_SECTION_ASM_OP "\t.data"
510
511 #define BSS_SECTION_ASM_OP "\t.section .bss"
512
513 /* Define the pseudo-ops used to switch to the .ctors and .dtors sections.
514    There are no shared libraries on this target, and these sections are
515    placed in the read-only program memory, so they are not writable.  */
516
517 #undef CTORS_SECTION_ASM_OP
518 #define CTORS_SECTION_ASM_OP "\t.section .ctors,\"a\",@progbits"
519
520 #undef DTORS_SECTION_ASM_OP
521 #define DTORS_SECTION_ASM_OP "\t.section .dtors,\"a\",@progbits"
522
523 #define TARGET_ASM_CONSTRUCTOR avr_asm_out_ctor
524
525 #define TARGET_ASM_DESTRUCTOR avr_asm_out_dtor
526
527 #define SUPPORTS_INIT_PRIORITY 0
528
529 #define JUMP_TABLES_IN_TEXT_SECTION 0
530
531 #define ASM_COMMENT_START " ; "
532
533 #define ASM_APP_ON "/* #APP */\n"
534
535 #define ASM_APP_OFF "/* #NOAPP */\n"
536
537 /* Switch into a generic section.  */
538 #define TARGET_ASM_NAMED_SECTION default_elf_asm_named_section
539 #define TARGET_ASM_INIT_SECTIONS avr_asm_init_sections
540
541 #define ASM_OUTPUT_ASCII(FILE, P, SIZE)  gas_output_ascii (FILE,P,SIZE)
542
543 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == '\n' || ((C) == '$'))
544
545 #define ASM_OUTPUT_COMMON(STREAM, NAME, SIZE, ROUNDED)                     \
546 do {                                                                       \
547      fputs ("\t.comm ", (STREAM));                                         \
548      assemble_name ((STREAM), (NAME));                                     \
549      fprintf ((STREAM), ",%lu,1\n", (unsigned long)(SIZE));                \
550 } while (0)
551
552 #define ASM_OUTPUT_BSS(FILE, DECL, NAME, SIZE, ROUNDED)                 \
553   asm_output_bss ((FILE), (DECL), (NAME), (SIZE), (ROUNDED))
554
555 #define ASM_OUTPUT_LOCAL(STREAM, NAME, SIZE, ROUNDED)                   \
556 do {                                                                    \
557      fputs ("\t.lcomm ", (STREAM));                                     \
558      assemble_name ((STREAM), (NAME));                                  \
559      fprintf ((STREAM), ",%d\n", (int)(SIZE));                          \
560 } while (0)
561
562 #undef TYPE_ASM_OP
563 #undef SIZE_ASM_OP
564 #undef WEAK_ASM_OP
565 #define TYPE_ASM_OP     "\t.type\t"
566 #define SIZE_ASM_OP     "\t.size\t"
567 #define WEAK_ASM_OP     "\t.weak\t"
568 /* Define the strings used for the special svr4 .type and .size directives.
569    These strings generally do not vary from one system running svr4 to
570    another, but if a given system (e.g. m88k running svr) needs to use
571    different pseudo-op names for these, they may be overridden in the
572    file which includes this one.  */
573
574
575 #undef TYPE_OPERAND_FMT
576 #define TYPE_OPERAND_FMT        "@%s"
577 /* The following macro defines the format used to output the second
578    operand of the .type assembler directive.  Different svr4 assemblers
579    expect various different forms for this operand.  The one given here
580    is just a default.  You may need to override it in your machine-
581    specific tm.h file (depending upon the particulars of your assembler).  */
582
583 #define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL)             \
584 do {                                                            \
585      ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function");        \
586      ASM_OUTPUT_LABEL (FILE, NAME);                             \
587 } while (0)
588
589 #define ASM_DECLARE_FUNCTION_SIZE(FILE, FNAME, DECL)                    \
590   do {                                                                  \
591     if (!flag_inhibit_size_directive)                                   \
592       ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME);                           \
593   } while (0)
594
595 #define ASM_DECLARE_OBJECT_NAME(FILE, NAME, DECL)                       \
596 do {                                                                    \
597   ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object");                     \
598   size_directive_output = 0;                                            \
599   if (!flag_inhibit_size_directive && DECL_SIZE (DECL))                 \
600     {                                                                   \
601       size_directive_output = 1;                                        \
602       ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME,                            \
603                                  int_size_in_bytes (TREE_TYPE (DECL))); \
604     }                                                                   \
605   ASM_OUTPUT_LABEL(FILE, NAME);                                         \
606 } while (0)
607
608 #undef ASM_FINISH_DECLARE_OBJECT
609 #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP_LEVEL, AT_END)         \
610 do {                                                                     \
611      const char *name = XSTR (XEXP (DECL_RTL (DECL), 0), 0);             \
612      HOST_WIDE_INT size;                                                 \
613      if (!flag_inhibit_size_directive && DECL_SIZE (DECL)                \
614          && ! AT_END && TOP_LEVEL                                        \
615          && DECL_INITIAL (DECL) == error_mark_node                       \
616          && !size_directive_output)                                      \
617        {                                                                 \
618          size_directive_output = 1;                                      \
619          size = int_size_in_bytes (TREE_TYPE (DECL));                    \
620          ASM_OUTPUT_SIZE_DIRECTIVE (FILE, name, size);                   \
621        }                                                                 \
622    } while (0)
623
624
625 #define ESCAPES \
626 "\1\1\1\1\1\1\1\1btn\1fr\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
627 \0\0\"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
628 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\\\0\0\0\
629 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\
630 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
631 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
632 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\
633 \1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1"
634 /* A table of bytes codes used by the ASM_OUTPUT_ASCII and
635    ASM_OUTPUT_LIMITED_STRING macros.  Each byte in the table
636    corresponds to a particular byte value [0..255].  For any
637    given byte value, if the value in the corresponding table
638    position is zero, the given character can be output directly.
639    If the table value is 1, the byte must be output as a \ooo
640    octal escape.  If the tables value is anything else, then the
641    byte value should be output as a \ followed by the value
642    in the table.  Note that we can use standard UN*X escape
643    sequences for many control characters, but we don't use
644    \a to represent BEL because some svr4 assemblers (e.g. on
645    the i386) don't know about that.  Also, we don't use \v
646    since some versions of gas, such as 2.2 did not accept it.  */
647
648 #define STRING_LIMIT    ((unsigned) 64)
649 #define STRING_ASM_OP   "\t.string\t"
650 /* Some svr4 assemblers have a limit on the number of characters which
651    can appear in the operand of a .string directive.  If your assembler
652    has such a limitation, you should define STRING_LIMIT to reflect that
653    limit.  Note that at least some svr4 assemblers have a limit on the
654    actual number of bytes in the double-quoted string, and that they
655    count each character in an escape sequence as one byte.  Thus, an
656    escape sequence like \377 would count as four bytes.
657
658    If your target assembler doesn't support the .string directive, you
659    should define this to zero.  */
660
661 /* Globalizing directive for a label.  */
662 #define GLOBAL_ASM_OP ".global\t"
663
664 #define SET_ASM_OP      "\t.set\t"
665
666 #define ASM_WEAKEN_LABEL(FILE, NAME)    \
667   do                                    \
668     {                                   \
669       fputs ("\t.weak\t", (FILE));      \
670       assemble_name ((FILE), (NAME));   \
671       fputc ('\n', (FILE));             \
672     }                                   \
673   while (0)
674
675 #define SUPPORTS_WEAK 1
676
677 #define ASM_GENERATE_INTERNAL_LABEL(STRING, PREFIX, NUM)        \
678 sprintf (STRING, "*.%s%lu", PREFIX, (unsigned long)(NUM))
679
680 #define HAS_INIT_SECTION 1
681
682 #define REGISTER_NAMES {                                \
683   "r0","r1","r2","r3","r4","r5","r6","r7",              \
684     "r8","r9","r10","r11","r12","r13","r14","r15",      \
685     "r16","r17","r18","r19","r20","r21","r22","r23",    \
686     "r24","r25","r26","r27","r28","r29","r30","r31",    \
687     "__SP_L__","__SP_H__","argL","argH"}
688
689 #define FINAL_PRESCAN_INSN(insn, operand, nop) final_prescan_insn (insn, operand,nop)
690
691 #define PRINT_OPERAND(STREAM, X, CODE) print_operand (STREAM, X, CODE)
692
693 #define PRINT_OPERAND_PUNCT_VALID_P(CODE) ((CODE) == '~' || (CODE) == '!')
694
695 #define PRINT_OPERAND_ADDRESS(STREAM, X) print_operand_address(STREAM, X)
696
697 #define USER_LABEL_PREFIX ""
698
699 #define ASSEMBLER_DIALECT AVR_HAVE_MOVW
700
701 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)      \
702 {                                               \
703   gcc_assert (REGNO < 32);                      \
704   fprintf (STREAM, "\tpush\tr%d", REGNO);       \
705 }
706
707 #define ASM_OUTPUT_REG_POP(STREAM, REGNO)       \
708 {                                               \
709   gcc_assert (REGNO < 32);                      \
710   fprintf (STREAM, "\tpop\tr%d", REGNO);        \
711 }
712
713 #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM, VALUE)          \
714   avr_output_addr_vec_elt(STREAM, VALUE)
715
716 #define ASM_OUTPUT_CASE_LABEL(STREAM, PREFIX, NUM, TABLE) \
717   (switch_to_section (progmem_section), \
718    (*targetm.asm_out.internal_label) (STREAM, PREFIX, NUM))
719
720 #define ASM_OUTPUT_SKIP(STREAM, N)              \
721 fprintf (STREAM, "\t.skip %lu,0\n", (unsigned long)(N))
722
723 #define ASM_OUTPUT_ALIGN(STREAM, POWER)                 \
724   do {                                                  \
725       if ((POWER) > 1)                                  \
726           fprintf (STREAM, "\t.p2align\t%d\n", POWER);  \
727   } while (0)
728
729 #define CASE_VECTOR_MODE HImode
730
731 extern int avr_case_values_threshold;
732
733 #define CASE_VALUES_THRESHOLD avr_case_values_threshold
734
735 #undef WORD_REGISTER_OPERATIONS
736
737 #define MOVE_MAX 4
738
739 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
740
741 #define Pmode HImode
742
743 #define FUNCTION_MODE HImode
744
745 #define DOLLARS_IN_IDENTIFIERS 0
746
747 #define NO_DOLLAR_IN_LABEL 1
748
749 #define TRAMPOLINE_TEMPLATE(FILE) \
750   internal_error ("trampolines not supported")
751
752 #define TRAMPOLINE_SIZE 4
753
754 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                             \
755 {                                                                             \
756   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 2)), CXT);    \
757   emit_move_insn (gen_rtx_MEM (HImode, plus_constant ((TRAMP), 6)), FNADDR); \
758 }
759 /* Store in cc_status the expressions
760    that the condition codes will describe
761    after execution of an instruction whose pattern is EXP.
762    Do not alter them if the instruction would not alter the cc's.  */
763
764 #define NOTICE_UPDATE_CC(EXP, INSN) notice_update_cc(EXP, INSN)
765
766 /* The add insns don't set overflow in a usable way.  */
767 #define CC_OVERFLOW_UNUSABLE 01000
768 /* The mov,and,or,xor insns don't set carry.  That's ok though as the
769    Z bit is all we need when doing unsigned comparisons on the result of
770    these insns (since they're always with 0).  However, conditions.h has
771    CC_NO_OVERFLOW defined for this purpose.  Rename it to something more
772    understandable.  */
773 #define CC_NO_CARRY CC_NO_OVERFLOW
774
775
776 /* Output assembler code to FILE to increment profiler label # LABELNO
777    for profiling a function entry.  */
778
779 #define FUNCTION_PROFILER(FILE, LABELNO)  \
780   fprintf (FILE, "/* profiler %d */", (LABELNO))
781
782 #define ADJUST_INSN_LENGTH(INSN, LENGTH) (LENGTH =\
783                                           adjust_insn_length (INSN, LENGTH))
784
785 #define CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
786
787 #define CC1_SPEC "%{profile:-p}"
788
789 #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \
790     %{!fenforce-eh-specs:-fno-enforce-eh-specs} \
791     %{!fexceptions:-fno-exceptions}"
792 /* A C string constant that tells the GCC driver program options to
793    pass to `cc1plus'.  */
794
795 #define ASM_SPEC "%{mmcu=avr25:-mmcu=avr2;mmcu=avr35:-mmcu=avr3;mmcu=avr31:-mmcu=avr3;mmcu=avr51:-mmcu=avr5;\
796 mmcu=*:-mmcu=%*}"
797
798 #define LINK_SPEC "\
799 %{mrelax:--relax\
800          %{mpmem-wrap-around:%{mmcu=at90usb8*:--pmem-wrap-around=8k}\
801                              %{mmcu=atmega16*:--pmem-wrap-around=16k}\
802                              %{mmcu=atmega32*|\
803                                mmcu=at90can32*:--pmem-wrap-around=32k}\
804                              %{mmcu=atmega64*|\
805                                mmcu=at90can64*|\
806                                mmcu=at90usb64*:--pmem-wrap-around=64k}}}\
807 %{!mmcu*: -m avr2}\
808 %{mmcu=at90s1200|\
809   mmcu=attiny11|\
810   mmcu=attiny12|\
811   mmcu=attiny15|\
812   mmcu=attiny28: -m avr1}\
813 %{mmcu=attiny22|\
814   mmcu=attiny26|\
815   mmcu=at90s2*|\
816   mmcu=at90s4*|\
817   mmcu=at90s8*|\
818   mmcu=at90c8*|\
819   mmcu=at86rf401|\
820   mmcu=attiny13*|\
821   mmcu=attiny2313|\
822   mmcu=attiny24|\
823   mmcu=attiny25|\
824   mmcu=attiny261|\
825   mmcu=attiny4*|\
826   mmcu=attiny8*: -m avr2}\
827 %{mmcu=atmega103|\
828   mmcu=at43*|\
829   mmcu=at76*|\
830   mmcu=at90usb82|\
831   mmcu=at90usb162|\
832   mmcu=attiny167: -m avr3}\
833 %{mmcu=atmega8*|\
834   mmcu=atmega48*|\
835   mmcu=at90pwm1|\
836   mmcu=at90pwm2|\
837   mmcu=at90pwm2b|\
838   mmcu=at90pwm3|\
839   mmcu=at90pwm3b: -m avr4}\
840 %{mmcu=atmega16*|\
841   mmcu=atmega32*|\
842   mmcu=atmega406|\
843   mmcu=atmega64*|\
844   mmcu=atmega128*|\
845   mmcu=at90can*|\
846   mmcu=at90pwm216|\
847   mmcu=at90pwm316|\
848   mmcu=at90usb64*|\
849   mmcu=at90usb128*|\
850   mmcu=at94k: -m avr5}\
851 %{mmcu=atmega256*:-m avr6}\
852 %{mmcu=atmega324*|\
853   mmcu=atmega325*|\
854   mmcu=atmega328p|\
855   mmcu=atmega329*|\
856   mmcu=atmega406|\
857   mmcu=atmega48*|\
858   mmcu=atmega88*|\
859   mmcu=atmega64|\
860   mmcu=atmega644*|\
861   mmcu=atmega645*|\
862   mmcu=atmega649*|\
863   mmcu=atmega128|\
864   mmcu=atmega1284p|\
865   mmcu=atmega162|\
866   mmcu=atmega164*|\
867   mmcu=atmega165*|\
868   mmcu=atmega168*|\
869   mmcu=atmega169*|\
870   mmcu=atmega8hva|\
871   mmcu=atmega16hva|\
872   mmcu=attiny48|\
873   mmcu=attiny88|\
874   mmcu=attiny167|\
875   mmcu=at90can*|\
876   mmcu=at90pwm*|\
877   mmcu=atmega32c1|\
878   mmcu=atmega32m1|\
879   mmcu=atmega32u4|\
880   mmcu=at90usb*: -Tdata 0x800100}\
881 %{mmcu=atmega640|\
882   mmcu=atmega1280|\
883   mmcu=atmega1281|\
884   mmcu=atmega256*: -Tdata 0x800200} "
885
886 #define LIB_SPEC \
887   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lc }}}}}"
888
889 #define LIBSTDCXX "-lgcc"
890 /* No libstdc++ for now.  Empty string doesn't work.  */
891
892 #define LIBGCC_SPEC \
893   "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}"
894
895 #define STARTFILE_SPEC "%(crt_binutils)"
896
897 #define ENDFILE_SPEC ""
898
899 #define CRT_BINUTILS_SPECS "\
900 %{mmcu=at90s1200|mmcu=avr1:crts1200.o%s} \
901 %{mmcu=attiny11:crttn11.o%s} \
902 %{mmcu=attiny12:crttn12.o%s} \
903 %{mmcu=attiny15:crttn15.o%s} \
904 %{mmcu=attiny28:crttn28.o%s} \
905 %{!mmcu*|mmcu=at90s8515|mmcu=avr2:crts8515.o%s} \
906 %{mmcu=at90s2313:crts2313.o%s} \
907 %{mmcu=at90s2323:crts2323.o%s} \
908 %{mmcu=at90s2333:crts2333.o%s} \
909 %{mmcu=at90s2343:crts2343.o%s} \
910 %{mmcu=attiny22:crttn22.o%s} \
911 %{mmcu=attiny26:crttn26.o%s} \
912 %{mmcu=at90s4433:crts4433.o%s} \
913 %{mmcu=at90s4414:crts4414.o%s} \
914 %{mmcu=at90s4434:crts4434.o%s} \
915 %{mmcu=at90c8534:crtc8534.o%s} \
916 %{mmcu=at90s8535:crts8535.o%s} \
917 %{mmcu=at86rf401:crt86401.o%s} \
918 %{mmcu=attiny13:crttn13.o%s} \
919 %{mmcu=attiny13a:crttn13a.o%s} \
920 %{mmcu=attiny2313|mmcu=avr25:crttn2313.o%s} \
921 %{mmcu=attiny24:crttn24.o%s} \
922 %{mmcu=attiny44:crttn44.o%s} \
923 %{mmcu=attiny84:crttn84.o%s} \
924 %{mmcu=attiny25:crttn25.o%s} \
925 %{mmcu=attiny45:crttn45.o%s} \
926 %{mmcu=attiny85:crttn85.o%s} \
927 %{mmcu=attiny261:crttn261.o%s} \
928 %{mmcu=attiny461:crttn461.o%s} \
929 %{mmcu=attiny861:crttn861.o%s} \
930 %{mmcu=attiny43u:crttn43u.o%s} \
931 %{mmcu=attiny48:crttn48.o%s} \
932 %{mmcu=attiny88:crttn88.o%s} \
933 %{mmcu=attiny167:crttn167.o%s} \
934 %{mmcu=at43usb320|mmcu=avr3:crt43320.o%s} \
935 %{mmcu=at43usb355:crt43355.o%s} \
936 %{mmcu=at76c711:crt76711.o%s} \
937 %{mmcu=atmega103|mmcu=avr31:crtm103.o%s} \
938 %{mmcu=at90usb162|mmcu=avr35:crtusb162.o%s} \
939 %{mmcu=at90usb82:crtusb82.o%s} \
940 %{mmcu=atmega8|mmcu=avr4:crtm8.o%s} \
941 %{mmcu=atmega48:crtm48.o%s} \
942 %{mmcu=atmega48p:crtm48p.o%s} \
943 %{mmcu=atmega88:crtm88.o%s} \
944 %{mmcu=atmega88p:crtm88p.o%s} \
945 %{mmcu=atmega8515:crtm8515.o%s} \
946 %{mmcu=atmega8535:crtm8535.o%s} \
947 %{mmcu=at90pwm1:crt90pwm1.o%s} \
948 %{mmcu=at90pwm2:crt90pwm2.o%s} \
949 %{mmcu=at90pwm2b:crt90pwm2b.o%s} \
950 %{mmcu=at90pwm3:crt90pwm3.o%s} \
951 %{mmcu=at90pwm3b:crt90pwm3b.o%s} \
952 %{mmcu=atmega16:crtm16.o%s} \
953 %{mmcu=atmega161|mmcu=avr5:crtm161.o%s} \
954 %{mmcu=atmega162:crtm162.o%s} \
955 %{mmcu=atmega163:crtm163.o%s} \
956 %{mmcu=atmega164p:crtm164p.o%s} \
957 %{mmcu=atmega165:crtm165.o%s} \
958 %{mmcu=atmega165p:crtm165p.o%s} \
959 %{mmcu=atmega168:crtm168.o%s} \
960 %{mmcu=atmega168p:crtm168p.o%s} \
961 %{mmcu=atmega169:crtm169.o%s} \
962 %{mmcu=atmega169p:crtm169p.o%s} \
963 %{mmcu=atmega32:crtm32.o%s} \
964 %{mmcu=atmega323:crtm323.o%s} \
965 %{mmcu=atmega324p:crtm324p.o%s} \
966 %{mmcu=atmega325:crtm325.o%s} \
967 %{mmcu=atmega325p:crtm325p.o%s} \
968 %{mmcu=atmega3250:crtm3250.o%s} \
969 %{mmcu=atmega3250p:crtm3250p.o%s} \
970 %{mmcu=atmega328p:crtm328p.o%s} \
971 %{mmcu=atmega329:crtm329.o%s} \
972 %{mmcu=atmega329p:crtm329p.o%s} \
973 %{mmcu=atmega3290:crtm3290.o%s} \
974 %{mmcu=atmega3290p:crtm3290p.o%s} \
975 %{mmcu=atmega406:crtm406.o%s} \
976 %{mmcu=atmega64:crtm64.o%s} \
977 %{mmcu=atmega640:crtm640.o%s} \
978 %{mmcu=atmega644:crtm644.o%s} \
979 %{mmcu=atmega644p:crtm644p.o%s} \
980 %{mmcu=atmega645:crtm645.o%s} \
981 %{mmcu=atmega6450:crtm6450.o%s} \
982 %{mmcu=atmega649:crtm649.o%s} \
983 %{mmcu=atmega6490:crtm6490.o%s} \
984 %{mmcu=atmega8hva:crtm8hva.o%s} \
985 %{mmcu=atmega16hva:crtm16hva.o%s} \
986 %{mmcu=at90can32:crtcan32.o%s} \
987 %{mmcu=at90can64:crtcan64.o%s} \
988 %{mmcu=at90pwm216:crt90pwm216.o%s} \
989 %{mmcu=at90pwm316:crt90pwm316.o%s} \
990 %{mmcu=atmega32c1:crtm32c1.o%s} \
991 %{mmcu=atmega32m1:crtm32m1.o%s} \
992 %{mmcu=atmega32u4:crtm32u4.o%s} \
993 %{mmcu=at90usb646:crtusb646.o%s} \
994 %{mmcu=at90usb647:crtusb647.o%s} \
995 %{mmcu=at94k:crtat94k.o%s} \
996 %{mmcu=atmega128|mmcu=avr51:crtm128.o%s} \
997 %{mmcu=atmega1280:crtm1280.o%s} \
998 %{mmcu=atmega1281:crtm1281.o%s} \
999 %{mmcu=atmega1284p:crtm1284p.o%s} \
1000 %{mmcu=atmega2560:crtm2560.o%s} \
1001 %{mmcu=atmega2561:crtm2561.o%s} \
1002 %{mmcu=at90can128:crtcan128.o%s} \
1003 %{mmcu=at90usb1286:crtusb1286.o%s} \
1004 %{mmcu=at90usb1287:crtusb1287.o%s}"
1005
1006 #define EXTRA_SPECS {"crt_binutils", CRT_BINUTILS_SPECS},
1007
1008 /* This is the default without any -mmcu=* option (AT90S*).  */
1009 #define MULTILIB_DEFAULTS { "mmcu=avr2" }
1010
1011 /* This is undefined macro for collect2 disabling */
1012 #define LINKER_NAME "ld"
1013
1014 #define TEST_HARD_REG_CLASS(CLASS, REGNO) \
1015   TEST_HARD_REG_BIT (reg_class_contents[ (int) (CLASS)], REGNO)
1016
1017 /* Note that the other files fail to use these
1018    in some of the places where they should.  */
1019
1020 #if defined(__STDC__) || defined(ALMOST_STDC)
1021 #define AS2(a,b,c) #a " " #b "," #c
1022 #define AS2C(b,c) " " #b "," #c
1023 #define AS3(a,b,c,d) #a " " #b "," #c "," #d
1024 #define AS1(a,b) #a " " #b
1025 #else
1026 #define AS1(a,b) "a     b"
1027 #define AS2(a,b,c) "a   b,c"
1028 #define AS2C(b,c) " b,c"
1029 #define AS3(a,b,c,d) "a b,c,d"
1030 #endif
1031 #define OUT_AS1(a,b) output_asm_insn (AS1(a,b), operands)
1032 #define OUT_AS2(a,b,c) output_asm_insn (AS2(a,b,c), operands)
1033 #define CR_TAB "\n\t"
1034
1035 #define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
1036
1037 #define DWARF2_DEBUGGING_INFO 1
1038
1039 #define DWARF2_ADDR_SIZE 4
1040
1041 #define OBJECT_FORMAT_ELF
1042
1043 #define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \
1044   avr_hard_regno_rename_ok (OLD_REG, NEW_REG)
1045
1046 /* A C structure for machine-specific, per-function data.
1047    This is added to the cfun structure.  */
1048 struct machine_function GTY(())
1049 {
1050   /* 'true' - if the current function is a leaf function.  */
1051   int is_leaf;
1052
1053   /* 'true' - if current function is a naked function.  */
1054   int is_naked;
1055
1056   /* 'true' - if current function is an interrupt function 
1057      as specified by the "interrupt" attribute.  */
1058   int is_interrupt;
1059
1060   /* 'true' - if current function is a signal function 
1061      as specified by the "signal" attribute.  */
1062   int is_signal;
1063   
1064   /* 'true' - if current function is a 'task' function 
1065      as specified by the "OS_task" attribute.  */
1066   int is_OS_task;
1067
1068   /* 'true' - if current function is a 'main' function 
1069      as specified by the "OS_main" attribute.  */
1070   int is_OS_main;
1071 };