diff options
Diffstat (limited to 'gcc/config/avr/avr.h')
-rw-r--r-- | gcc/config/avr/avr.h | 70 |
1 files changed, 34 insertions, 36 deletions
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 78434ec5e0d..7cb351adf8f 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -1,6 +1,6 @@ /* Definitions of target machine for GNU compiler, for ATMEL AVR at90s8515, ATmega103/103L, ATmega603/603L microcontrollers. - Copyright (C) 1998-2014 Free Software Foundation, Inc. + Copyright (C) 1998-2015 Free Software Foundation, Inc. Contributed by Denis Chertykov (chertykov@gmail.com) This file is part of GCC. @@ -63,6 +63,7 @@ enum #define AVR_HAVE_JMP_CALL (avr_current_arch->have_jmp_call) #define AVR_HAVE_MUL (avr_current_arch->have_mul) #define AVR_HAVE_MOVW (avr_current_arch->have_movw_lpmx) +#define AVR_HAVE_LPM (!AVR_TINY) #define AVR_HAVE_LPMX (avr_current_arch->have_movw_lpmx) #define AVR_HAVE_ELPM (avr_current_arch->have_elpm) #define AVR_HAVE_ELPMX (avr_current_arch->have_elpmx) @@ -75,6 +76,7 @@ enum /* Handling of 8-bit SP versus 16-bit SP is as follows: +FIXME: DRIVER_SELF_SPECS has changed. -msp8 is used internally to select the right multilib for targets with 8-bit SP. -msp8 is set automatically by DRIVER_SELF_SPECS for devices with 8-bit SP or by multilib generation machinery. If a frame pointer is @@ -89,8 +91,8 @@ enum there is always __AVR_SP8__ == __AVR_HAVE_8BIT_SP__. */ #define AVR_HAVE_8BIT_SP \ - ((avr_current_device->dev_attribute & AVR_SHORT_SP) || \ - TARGET_TINY_STACK || avr_sp8) + ((avr_current_device->dev_attribute & AVR_SHORT_SP) \ + || TARGET_TINY_STACK || avr_sp8) #define AVR_HAVE_SPH (!avr_sp8) @@ -98,6 +100,7 @@ enum #define AVR_3_BYTE_PC (AVR_HAVE_EIJMP_EICALL) #define AVR_XMEGA (avr_current_arch->xmega_p) +#define AVR_TINY (avr_current_arch->tiny_p) #define BITS_BIG_ENDIAN 0 #define BYTES_BIG_ENDIAN 0 @@ -251,18 +254,18 @@ enum reg_class { #define REG_CLASS_CONTENTS { \ {0x00000000,0x00000000}, /* NO_REGS */ \ {0x00000001,0x00000000}, /* R0_REG */ \ - {3 << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ - {3 << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ - {3 << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ + {3u << REG_X,0x00000000}, /* POINTER_X_REGS, r26 - r27 */ \ + {3u << REG_Y,0x00000000}, /* POINTER_Y_REGS, r28 - r29 */ \ + {3u << REG_Z,0x00000000}, /* POINTER_Z_REGS, r30 - r31 */ \ {0x00000000,0x00000003}, /* STACK_REG, STACK */ \ - {(3 << REG_Y) | (3 << REG_Z), \ + {(3u << REG_Y) | (3u << REG_Z), \ 0x00000000}, /* BASE_POINTER_REGS, r28 - r31 */ \ - {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z), \ + {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z), \ 0x00000000}, /* POINTER_REGS, r26 - r31 */ \ - {(3 << REG_X) | (3 << REG_Y) | (3 << REG_Z) | (3 << REG_W), \ + {(3u << REG_X) | (3u << REG_Y) | (3u << REG_Z) | (3u << REG_W), \ 0x00000000}, /* ADDW_REGS, r24 - r31 */ \ {0x00ff0000,0x00000000}, /* SIMPLE_LD_REGS r16 - r23 */ \ - {(3 << REG_X)|(3 << REG_Y)|(3 << REG_Z)|(3 << REG_W)|(0xff << 16), \ + {(3u << REG_X)|(3u << REG_Y)|(3u << REG_Z)|(3u << REG_W)|(0xffu << 16),\ 0x00000000}, /* LD_REGS, r16 - r31 */ \ {0x0000ffff,0x00000000}, /* NO_LD_REGS r0 - r15 */ \ {0xffffffff,0x00000000}, /* GENERAL_REGS, r0 - r31 */ \ @@ -304,13 +307,13 @@ enum reg_class { #define ARG_POINTER_REGNUM 34 -#define STATIC_CHAIN_REGNUM 2 +#define STATIC_CHAIN_REGNUM ((AVR_TINY) ? 18 :2) #define ELIMINABLE_REGS { \ - {ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ - {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \ - {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM} \ - ,{FRAME_POINTER_REGNUM+1,STACK_POINTER_REGNUM+1}} + { ARG_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ + { ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM }, \ + { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM }, \ + { FRAME_POINTER_REGNUM + 1, STACK_POINTER_REGNUM + 1 } } #define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ OFFSET = avr_initial_elimination_offset (FROM, TO) @@ -403,7 +406,8 @@ typedef struct avr_args avr_asm_output_aligned_decl_common (STREAM, DECL, NAME, SIZE, ALIGN, false) #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \ - asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN) + avr_asm_asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN, \ + asm_output_aligned_bss) #define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGN) \ avr_asm_output_aligned_decl_common (STREAM, DECL, NAME, SIZE, ALIGN, true) @@ -488,31 +492,20 @@ typedef struct avr_args #define ADJUST_INSN_LENGTH(INSN, LENGTH) \ (LENGTH = avr_adjust_insn_length (INSN, LENGTH)) -extern const char *avr_device_to_as (int argc, const char **argv); -extern const char *avr_device_to_ld (int argc, const char **argv); -extern const char *avr_device_to_data_start (int argc, const char **argv); -extern const char *avr_device_to_startfiles (int argc, const char **argv); -extern const char *avr_device_to_devicelib (int argc, const char **argv); -extern const char *avr_device_to_sp8 (int argc, const char **argv); - -#define EXTRA_SPEC_FUNCTIONS \ - { "device_to_as", avr_device_to_as }, \ - { "device_to_ld", avr_device_to_ld }, \ - { "device_to_data_start", avr_device_to_data_start }, \ - { "device_to_startfile", avr_device_to_startfiles }, \ - { "device_to_devicelib", avr_device_to_devicelib }, \ - { "device_to_sp8", avr_device_to_sp8 }, - -#define DRIVER_SELF_SPECS " %:device_to_sp8(%{mmcu=*:%*}) " +#define DRIVER_SELF_SPECS " %{mmcu=*:-specs=device-specs/specs-%*%s %<mmcu=*} " #define CPP_SPEC "" +/* We want cc1plus used as a preprocessor to pick up the cpp spec from the + per-device spec files */ +#define CPLUSPLUS_CPP_SPEC "%(cpp)" + #define CC1_SPEC "" #define CC1PLUS_SPEC "%{!frtti:-fno-rtti} \ %{!fenforce-eh-specs:-fno-enforce-eh-specs} \ %{!fexceptions:-fno-exceptions}" -#define ASM_SPEC "%:device_to_as(%{mmcu=*:%*}) " +#define ASM_SPEC "%{march=*:-mmcu=%*}%{mrelax: --mlink-relax}" #define LINK_SPEC "\ %{mrelax:--relax\ @@ -523,8 +516,7 @@ extern const char *avr_device_to_sp8 (int argc, const char **argv); %{mmcu=atmega64*|\ mmcu=at90can64*|\ mmcu=at90usb64*:--pmem-wrap-around=64k}}}\ -%:device_to_ld(%{mmcu=*:%*})\ -%:device_to_data_start(%{mmcu=*:%*})\ +%{march=*:-m%*}\ %{shared:%eshared is not supported}" #define LIB_SPEC \ @@ -536,7 +528,8 @@ extern const char *avr_device_to_sp8 (int argc, const char **argv); #define LIBGCC_SPEC \ "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}" -#define STARTFILE_SPEC "%:device_to_startfile(%{mmcu=*:%*})" +/* The actual definition will come from the device-specific spec file. */ +#define STARTFILE_SPEC "" #define ENDFILE_SPEC "" @@ -605,3 +598,8 @@ extern int avr_accumulate_outgoing_args (void); #define ACCUMULATE_OUTGOING_ARGS avr_accumulate_outgoing_args() #define INIT_EXPANDERS avr_init_expanders() + +/* Flags used for io and address attributes. */ +#define SYMBOL_FLAG_IO_LOW (SYMBOL_FLAG_MACH_DEP << 4) +#define SYMBOL_FLAG_IO (SYMBOL_FLAG_MACH_DEP << 5) +#define SYMBOL_FLAG_ADDRESS (SYMBOL_FLAG_MACH_DEP << 6) |