diff options
author | Joerg Wunsch <joerg@FreeBSD.org> | 2007-10-27 21:21:50 +0000 |
---|---|---|
committer | Joerg Wunsch <joerg@FreeBSD.org> | 2007-10-27 21:21:50 +0000 |
commit | f43e9d0fe972a17348602db9459e59337aefe08e (patch) | |
tree | bde48ce19080a783db2384d5d783fe95d833c100 /devel/avr-binutils | |
parent | - Update MASTER_SITES (diff) |
Update to binutils-2.18.
Notes
Notes:
svn path=/head/; revision=202169
Diffstat (limited to 'devel/avr-binutils')
-rw-r--r-- | devel/avr-binutils/Makefile | 7 | ||||
-rw-r--r-- | devel/avr-binutils/distinfo | 6 | ||||
-rw-r--r-- | devel/avr-binutils/files/patch-atmega256x | 2323 | ||||
-rw-r--r-- | devel/avr-binutils/files/patch-bug5215 | 52 | ||||
-rw-r--r-- | devel/avr-binutils/files/patch-coff-avr | 340 | ||||
-rw-r--r-- | devel/avr-binutils/files/patch-newdevices | 113 | ||||
-rw-r--r-- | devel/avr-binutils/pkg-descr | 16 | ||||
-rw-r--r-- | devel/avr-binutils/pkg-plist | 5 |
8 files changed, 341 insertions, 2521 deletions
diff --git a/devel/avr-binutils/Makefile b/devel/avr-binutils/Makefile index f29efd5a9496..d3fda9ee6134 100644 --- a/devel/avr-binutils/Makefile +++ b/devel/avr-binutils/Makefile @@ -6,8 +6,7 @@ # PORTNAME= binutils -PORTVERSION= 2.17 -PORTREVISION= 5 +PORTVERSION= 2.18 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_SOURCEWARE} MASTER_SITE_SUBDIR= binutils/releases @@ -16,12 +15,16 @@ PKGNAMEPREFIX= avr- MAINTAINER= joerg@freebsd.org COMMENT= GNU binutils for Atmel AVR 8-bit RISC cross-development +BUILD_DEPENDS= msgfmt:${PORTSDIR}/devel/gettext + WRKSRC= ${WRKDIR}/binutils-${PORTVERSION} USE_BZIP2= yes USE_GMAKE= yes CONFIGURE_ARGS= --target=avr GNU_CONFIGURE= yes +CONFIGURE_ENV+= CFLAGS="${CFLAGS} -I${LOCALBASE}/include" \ + LDFLAGS="-L${LOCALBASE}/lib" .if (${MACHINE_ARCH} == "amd64") MACHINE_ARCH= x86_64 .endif diff --git a/devel/avr-binutils/distinfo b/devel/avr-binutils/distinfo index bade8e3a29f4..11093cafba7e 100644 --- a/devel/avr-binutils/distinfo +++ b/devel/avr-binutils/distinfo @@ -1,3 +1,3 @@ -MD5 (binutils-2.17.tar.bz2) = e26e2e06b6e4bf3acf1dc8688a94c0d1 -SHA256 (binutils-2.17.tar.bz2) = e2c33ce6f23c9a366f109ced295626cb2f8bd6b2f08ff9df6dafb5448505a25e -SIZE (binutils-2.17.tar.bz2) = 13795751 +MD5 (binutils-2.18.tar.bz2) = 9d22ee4dafa3a194457caf4706f9cf01 +SHA256 (binutils-2.18.tar.bz2) = 487a33a452f0edcf1f8bb8fc23dff5c7a82edec3f3f8b65632b6c945e961ee9b +SIZE (binutils-2.18.tar.bz2) = 14962245 diff --git a/devel/avr-binutils/files/patch-atmega256x b/devel/avr-binutils/files/patch-atmega256x deleted file mode 100644 index ddc6e19c82c3..000000000000 --- a/devel/avr-binutils/files/patch-atmega256x +++ /dev/null @@ -1,2323 +0,0 @@ -diff -Nur bfd/archures.c bfd/archures.c ---- bfd/archures.c 2006-03-06 14:42:03.000000000 +0100 -+++ bfd/archures.c 2006-08-28 20:01:10.714097550 +0200 -@@ -334,6 +334,7 @@ - .#define bfd_mach_avr3 3 - .#define bfd_mach_avr4 4 - .#define bfd_mach_avr5 5 -+.#define bfd_mach_avr6 6 - . bfd_arch_bfin, {* ADI Blackfin *} - .#define bfd_mach_bfin 1 - . bfd_arch_cr16c, {* National Semiconductor CompactRISC. *} -diff -Nur bfd/bfd-in2.h bfd/bfd-in2.h ---- bfd/bfd-in2.h 2006-03-26 01:38:42.000000000 +0100 -+++ bfd/bfd-in2.h 2006-08-28 20:01:10.743095447 +0200 -@@ -1931,6 +1931,7 @@ - #define bfd_mach_avr3 3 - #define bfd_mach_avr4 4 - #define bfd_mach_avr5 5 -+#define bfd_mach_avr6 6 - bfd_arch_bfin, /* ADI Blackfin */ - #define bfd_mach_bfin 1 - bfd_arch_cr16c, /* National Semiconductor CompactRISC. */ -@@ -3539,10 +3540,22 @@ - command address) into 8 bit immediate value of LDI insn. */ - BFD_RELOC_AVR_LO8_LDI_PM, - -+/* This is a 16 bit reloc for the AVR that stores 8 bit value -+(command address) into 8 bit immediate value of LDI insn. If the address -+is beyond the 128k boundary, the linker inserts a jump stub for this reloc -+in the lower 128k. */ -+ BFD_RELOC_AVR_LO8_LDI_GS, -+ - /* This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit - of command address) into 8 bit immediate value of LDI insn. */ - BFD_RELOC_AVR_HI8_LDI_PM, - -+/* This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit -+of command address) into 8 bit immediate value of LDI insn. If the address -+is beyond the 128k boundary, the linker inserts a jump stub for this reloc -+below 128k. */ -+ BFD_RELOC_AVR_HI8_LDI_GS, -+ - /* This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit - of command address) into 8 bit immediate value of LDI insn. */ - BFD_RELOC_AVR_HH8_LDI_PM, -diff -Nur bfd/cpu-avr.c bfd/cpu-avr.c ---- bfd/cpu-avr.c 2006-03-03 16:54:23.000000000 +0100 -+++ bfd/cpu-avr.c 2006-08-28 20:01:10.771093417 +0200 -@@ -82,7 +82,10 @@ - N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[4]), - - /* ATmega161, ATmega163, ATmega32, AT94K. */ -- N (22, bfd_mach_avr5, "avr:5", FALSE, NULL) -+ N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[5]), -+ -+ /* ATmega256x. */ -+ N (22, bfd_mach_avr6, "avr:6", FALSE, NULL) - }; - - const bfd_arch_info_type bfd_avr_arch = -diff -Nur bfd/elf32-avr.c bfd/elf32-avr.c ---- bfd/elf32-avr.c 2006-03-03 16:54:23.000000000 +0100 -+++ bfd/elf32-avr.c 2006-08-28 20:18:20.796399347 +0200 -@@ -25,6 +25,92 @@ - #include "libbfd.h" - #include "elf-bfd.h" - #include "elf/avr.h" -+#include "elf32-avr.h" -+ -+/* Enable debugging printout at stdout with this variable. */ -+static bfd_boolean debug_relax = FALSE; -+ -+/* Enable debugging printout at stdout with this variable. */ -+static bfd_boolean debug_stubs = FALSE; -+ -+/* Hash table initialization and handling. Code is taken from the hppa port -+ and adapted to the needs of AVR. */ -+ -+/* We use two hash tables to hold information for linking avr objects. -+ -+ The first is the elf32_avr_link_hash_tablse which is derived from the -+ stanard ELF linker hash table. We use this as a place to attach the other -+ hash table and some static information. -+ -+ The second is the stub hash table which is derived from the base BFD -+ hash table. The stub hash table holds the information on the linker -+ stubs. */ -+ -+struct elf32_avr_stub_hash_entry -+{ -+ /* Base hash table entry structure. */ -+ struct bfd_hash_entry bh_root; -+ -+ /* Offset within stub_sec of the beginning of this stub. */ -+ bfd_vma stub_offset; -+ -+ /* Given the symbol's value and its section we can determine its final -+ value when building the stubs (so the stub knows where to jump). */ -+ bfd_vma target_value; -+ -+ /* This way we could mark stubs to be no longer necessary. */ -+ bfd_boolean is_actually_needed; -+}; -+ -+struct elf32_avr_link_hash_table -+{ -+ /* The main hash table. */ -+ struct elf_link_hash_table etab; -+ -+ /* The stub hash table. */ -+ struct bfd_hash_table bstab; -+ -+ bfd_boolean no_stubs; -+ -+ /* Linker stub bfd. */ -+ bfd *stub_bfd; -+ -+ /* The stub section. */ -+ asection *stub_sec; -+ -+ /* Usually 0, unless we are generating code for a bootloader. Will -+ be initialized by elf32_avr_size_stubs to the vma offset of the -+ output section associated with the stub section. */ -+ bfd_vma vector_base; -+ -+ /* Assorted information used by elf32_avr_size_stubs. */ -+ unsigned int bfd_count; -+ int top_index; -+ asection ** input_list; -+ Elf_Internal_Sym ** all_local_syms; -+ -+ /* Tables for mapping vma beyond the 128k boundary to the address of the -+ corresponding stub. (AMT) -+ "amt_max_entry_cnt" reflects the number of entries that memory is allocated -+ for in the "amt_stub_offsets" and "amt_destination_addr" arrays. -+ "amt_entry_cnt" informs how many of these entries actually contain -+ useful data. */ -+ unsigned int amt_entry_cnt; -+ unsigned int amt_max_entry_cnt; -+ bfd_vma * amt_stub_offsets; -+ bfd_vma * amt_destination_addr; -+}; -+ -+/* Various hash macros and functions. */ -+#define avr_link_hash_table(p) \ -+ ((struct elf32_avr_link_hash_table *) ((p)->hash)) -+ -+#define avr_stub_hash_entry(ent) \ -+ ((struct elf32_avr_stub_hash_entry *)(ent)) -+ -+#define avr_stub_hash_lookup(table, string, create, copy) \ -+ ((struct elf32_avr_stub_hash_entry *) \ -+ bfd_hash_lookup ((table), (string), (create), (copy))) - - static reloc_howto_type elf_avr_howto_table[] = - { -@@ -101,7 +187,8 @@ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - -- /* A 16 bit absolute relocation for command address. */ -+ /* A 16 bit absolute relocation for command address -+ Will be changed when linker stubs are needed. */ - HOWTO (R_AVR_16_PM, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -207,7 +294,7 @@ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ - /* A low 8 bit absolute relocation of 24 bit program memory address. -- For LDI command. */ -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_LO8_LDI_PM, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -221,8 +308,8 @@ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -- /* A high 8 bit absolute relocation of 16 bit program memory address. -- For LDI command. */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_HI8_LDI_PM, /* type */ - 9, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -236,8 +323,8 @@ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -- /* A high 8 bit absolute relocation of 24 bit program memory address. -- For LDI command. */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_HH8_LDI_PM, /* type */ - 17, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -251,8 +338,8 @@ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -- /* A low 8 bit absolute relocation of a negative 24 bit -- program memory address. For LDI command. */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_LO8_LDI_PM_NEG, /* type */ - 1, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -266,8 +353,8 @@ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -- /* A high 8 bit absolute relocation of a negative 16 bit -- program memory address. For LDI command. */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_HI8_LDI_PM_NEG, /* type */ - 9, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -281,8 +368,8 @@ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ - FALSE), /* pcrel_offset */ -- /* A high 8 bit absolute relocation of a negative 24 bit -- program memory address. For LDI command. */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will not be changed when linker stubs are needed. */ - HOWTO (R_AVR_HH8_LDI_PM_NEG, /* type */ - 17, /* rightshift */ - 1, /* size (0 = byte, 1 = short, 2 = long) */ -@@ -382,7 +469,37 @@ - FALSE, /* partial_inplace */ - 0xffff, /* src_mask */ - 0xffff, /* dst_mask */ -- FALSE) /* pcrel_offset */ -+ FALSE), /* pcrel_offset */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will be changed when linker stubs are needed. */ -+ HOWTO (R_AVR_LO8_LDI_GS, /* type */ -+ 1, /* rightshift */ -+ 1, /* size (0 = byte, 1 = short, 2 = long) */ -+ 8, /* bitsize */ -+ FALSE, /* pc_relative */ -+ 0, /* bitpos */ -+ complain_overflow_dont, /* complain_on_overflow */ -+ bfd_elf_generic_reloc, /* special_function */ -+ "R_AVR_LO8_LDI_GS", /* name */ -+ FALSE, /* partial_inplace */ -+ 0xffff, /* src_mask */ -+ 0xffff, /* dst_mask */ -+ FALSE), /* pcrel_offset */ -+ /* A low 8 bit absolute relocation of 24 bit program memory address. -+ For LDI command. Will be changed when linker stubs are needed. */ -+ HOWTO (R_AVR_HI8_LDI_GS, /* type */ -+ 9, /* rightshift */ -+ 1, /* size (0 = byte, 1 = short, 2 = long) */ -+ 8, /* bitsize */ -+ FALSE, /* pc_relative */ -+ 0, /* bitpos */ -+ complain_overflow_dont, /* complain_on_overflow */ -+ bfd_elf_generic_reloc, /* special_function */ -+ "R_AVR_HI8_LDI_GS", /* name */ -+ FALSE, /* partial_inplace */ -+ 0xffff, /* src_mask */ -+ 0xffff, /* dst_mask */ -+ FALSE) /* pcrel_offset */ - }; - - /* Map BFD reloc types to AVR ELF reloc types. */ -@@ -393,7 +510,7 @@ - unsigned int elf_reloc_val; - }; - -- static const struct avr_reloc_map avr_reloc_map[] = -+static const struct avr_reloc_map avr_reloc_map[] = - { - { BFD_RELOC_NONE, R_AVR_NONE }, - { BFD_RELOC_32, R_AVR_32 }, -@@ -410,7 +527,9 @@ - { BFD_RELOC_AVR_HH8_LDI_NEG, R_AVR_HH8_LDI_NEG }, - { BFD_RELOC_AVR_MS8_LDI_NEG, R_AVR_MS8_LDI_NEG }, - { BFD_RELOC_AVR_LO8_LDI_PM, R_AVR_LO8_LDI_PM }, -+ { BFD_RELOC_AVR_LO8_LDI_GS, R_AVR_LO8_LDI_GS }, - { BFD_RELOC_AVR_HI8_LDI_PM, R_AVR_HI8_LDI_PM }, -+ { BFD_RELOC_AVR_HI8_LDI_GS, R_AVR_HI8_LDI_GS }, - { BFD_RELOC_AVR_HH8_LDI_PM, R_AVR_HH8_LDI_PM }, - { BFD_RELOC_AVR_LO8_LDI_PM_NEG, R_AVR_LO8_LDI_PM_NEG }, - { BFD_RELOC_AVR_HI8_LDI_PM_NEG, R_AVR_HI8_LDI_PM_NEG }, -@@ -429,8 +548,101 @@ - that we will never suggest a wrap-around jump during relaxation. - The logic of the source code later on assumes that in - avr_pc_wrap_around one single bit is set. */ -+static bfd_vma avr_pc_wrap_around = 0x10000000; -+ -+/* If this variable holds a value different from zero, the linker relaxation -+ machine will try to optimize call/ret sequences by a single jump -+ instruction. This option could be switched off by a linker switch. */ -+static int avr_replace_call_ret_sequences = 1; -+ -+/* Initialize an entry in the stub hash table. */ -+ -+static struct bfd_hash_entry * -+stub_hash_newfunc (struct bfd_hash_entry *entry, -+ struct bfd_hash_table *table, -+ const char *string) -+{ -+ /* Allocate the structure if it has not already been allocated by a -+ subclass. */ -+ if (entry == NULL) -+ { -+ entry = bfd_hash_allocate (table, -+ sizeof (struct elf32_avr_stub_hash_entry)); -+ if (entry == NULL) -+ return entry; -+ } -+ -+ /* Call the allocation method of the superclass. */ -+ entry = bfd_hash_newfunc (entry, table, string); -+ if (entry != NULL) -+ { -+ struct elf32_avr_stub_hash_entry *hsh; - --unsigned int avr_pc_wrap_around = 0x10000000; -+ /* Initialize the local fields. */ -+ hsh = avr_stub_hash_entry (entry); -+ hsh->stub_offset = 0; -+ hsh->target_value = 0; -+ } -+ -+ return entry; -+} -+ -+/* Create the derived linker hash table. The AVR ELF port uses the derived -+ hash table to keep information specific to the AVR ELF linker (without -+ using static variables). */ -+ -+static struct bfd_link_hash_table * -+elf32_avr_link_hash_table_create (bfd *abfd) -+{ -+ struct elf32_avr_link_hash_table *htab; -+ bfd_size_type amt = sizeof (*htab); -+ -+ htab = bfd_malloc (amt); -+ if (htab == NULL) -+ return NULL; -+ -+ if (!_bfd_elf_link_hash_table_init (&htab->etab, abfd, -+ _bfd_elf_link_hash_newfunc, -+ sizeof (struct elf_link_hash_entry))) -+ { -+ free (htab); -+ return NULL; -+ } -+ -+ /* Init the stub hash table too. */ -+ if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc, -+ sizeof (struct elf32_avr_stub_hash_entry))) -+ return NULL; -+ -+ htab->stub_bfd = NULL; -+ htab->stub_sec = NULL; -+ -+ /* Initialize the address mapping table. */ -+ htab->amt_stub_offsets = NULL; -+ htab->amt_destination_addr = NULL; -+ htab->amt_entry_cnt = 0; -+ htab->amt_max_entry_cnt = 0; -+ -+ return &htab->etab.root; -+} -+ -+/* Free the derived linker hash table. */ -+ -+static void -+elf32_avr_link_hash_table_free (struct bfd_link_hash_table *btab) -+{ -+ struct elf32_avr_link_hash_table *htab -+ = (struct elf32_avr_link_hash_table *) btab; -+ -+ /* Free the address mapping table. */ -+ if (htab->amt_stub_offsets != NULL) -+ free (htab->amt_stub_offsets); -+ if (htab->amt_destination_addr != NULL) -+ free (htab->amt_destination_addr); -+ -+ bfd_hash_table_free (&htab->bstab); -+ _bfd_generic_link_hash_table_free (btab); -+} - - /* Calculates the effective distance of a pc relative jump/call. */ - static int -@@ -564,20 +776,57 @@ - return TRUE; - } - -+static bfd_boolean -+avr_stub_is_required_for_16_bit_reloc (bfd_vma relocation) -+{ -+ return (relocation >= 0x020000); -+} -+ -+/* Returns the address of the corresponding stub if there is one. -+ Returns otherwise an address above 0x020000. This function -+ could also be used, if there is no knowledge on the section where -+ the destination is found. */ -+ -+static bfd_vma -+avr_get_stub_addr (bfd_vma srel, -+ struct elf32_avr_link_hash_table *htab) -+{ -+ unsigned int index; -+ bfd_vma stub_sec_addr = -+ (htab->stub_sec->output_section->vma + -+ htab->stub_sec->output_offset); -+ -+ for (index = 0; index < htab->amt_max_entry_cnt; index ++) -+ if (htab->amt_destination_addr[index] == srel) -+ return htab->amt_stub_offsets[index] + stub_sec_addr; -+ -+ /* Return an address that could not be reached by 16 bit relocs. */ -+ return 0x020000; -+} -+ - /* Perform a single relocation. By default we use the standard BFD - routines, but a few relocs, we have to do them ourselves. */ - - static bfd_reloc_status_type --avr_final_link_relocate (reloc_howto_type * howto, -- bfd * input_bfd, -- asection * input_section, -- bfd_byte * contents, -- Elf_Internal_Rela * rel, -- bfd_vma relocation) -+avr_final_link_relocate (reloc_howto_type * howto, -+ bfd * input_bfd, -+ asection * input_section, -+ bfd_byte * contents, -+ Elf_Internal_Rela * rel, -+ bfd_vma relocation, -+ struct elf32_avr_link_hash_table * htab) - { - bfd_reloc_status_type r = bfd_reloc_ok; - bfd_vma x; - bfd_signed_vma srel; -+ bfd_signed_vma reloc_addr; -+ bfd_boolean use_stubs = FALSE; -+ /* Usually is 0, unless we are generating code for a bootloader. */ -+ bfd_signed_vma base_addr = htab->vector_base; -+ -+ /* Absolute addr of the reloc in the final excecutable. */ -+ reloc_addr = rel->r_offset + input_section->output_section->vma -+ + input_section->output_offset; - - switch (howto->type) - { -@@ -748,9 +997,31 @@ - bfd_put_16 (input_bfd, x, contents); - break; - -+ case R_AVR_LO8_LDI_GS: -+ use_stubs = (!htab->no_stubs); -+ /* Fall through. */ - case R_AVR_LO8_LDI_PM: - contents += rel->r_offset; - srel = (bfd_signed_vma) relocation + rel->r_addend; -+ -+ if (use_stubs -+ && avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ { -+ bfd_vma old_srel = srel; -+ -+ /* We need to use the address of the stub instead. */ -+ srel = avr_get_stub_addr (srel, htab); -+ if (debug_stubs) -+ printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for " -+ "reloc at address 0x%x.\n", -+ (unsigned int) srel, -+ (unsigned int) old_srel, -+ (unsigned int) reloc_addr); -+ -+ if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ return bfd_reloc_outofrange; -+ } -+ - if (srel & 1) - return bfd_reloc_outofrange; - srel = srel >> 1; -@@ -759,9 +1030,31 @@ - bfd_put_16 (input_bfd, x, contents); - break; - -+ case R_AVR_HI8_LDI_GS: -+ use_stubs = (!htab->no_stubs); -+ /* Fall through. */ - case R_AVR_HI8_LDI_PM: - contents += rel->r_offset; - srel = (bfd_signed_vma) relocation + rel->r_addend; -+ -+ if (use_stubs -+ && avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ { -+ bfd_vma old_srel = srel; -+ -+ /* We need to use the address of the stub instead. */ -+ srel = avr_get_stub_addr (srel, htab); -+ if (debug_stubs) -+ printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for " -+ "reloc at address 0x%x.\n", -+ (unsigned int) srel, -+ (unsigned int) old_srel, -+ (unsigned int) reloc_addr); -+ -+ if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ return bfd_reloc_outofrange; -+ } -+ - if (srel & 1) - return bfd_reloc_outofrange; - srel = srel >> 1; -@@ -833,6 +1126,35 @@ - bfd_put_16 (input_bfd, (bfd_vma) srel & 0xffff, contents+2); - break; - -+ case R_AVR_16_PM: -+ use_stubs = (!htab->no_stubs); -+ contents += rel->r_offset; -+ srel = (bfd_signed_vma) relocation + rel->r_addend; -+ -+ if (use_stubs -+ && avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ { -+ bfd_vma old_srel = srel; -+ -+ /* We need to use the address of the stub instead. */ -+ srel = avr_get_stub_addr (srel,htab); -+ if (debug_stubs) -+ printf ("LD: Using jump stub (at 0x%x) with destination 0x%x for " -+ "reloc at address 0x%x.\n", -+ (unsigned int) srel, -+ (unsigned int) old_srel, -+ (unsigned int) reloc_addr); -+ -+ if (avr_stub_is_required_for_16_bit_reloc (srel - base_addr)) -+ return bfd_reloc_outofrange; -+ } -+ -+ if (srel & 1) -+ return bfd_reloc_outofrange; -+ srel = srel >> 1; -+ bfd_put_16 (input_bfd, (bfd_vma) srel &0x00ffff, contents); -+ break; -+ - default: - r = _bfd_final_link_relocate (howto, input_bfd, input_section, - contents, rel->r_offset, -@@ -858,6 +1180,7 @@ - struct elf_link_hash_entry ** sym_hashes; - Elf_Internal_Rela * rel; - Elf_Internal_Rela * relend; -+ struct elf32_avr_link_hash_table * htab = avr_link_hash_table (info); - - if (info->relocatable) - return TRUE; -@@ -909,7 +1232,7 @@ - } - - r = avr_final_link_relocate (howto, input_bfd, input_section, -- contents, rel, relocation); -+ contents, rel, relocation, htab); - - if (r != bfd_reloc_ok) - { -@@ -990,6 +1313,10 @@ - case bfd_mach_avr5: - val = E_AVR_MACH_AVR5; - break; -+ -+ case bfd_mach_avr6: -+ val = E_AVR_MACH_AVR6; -+ break; - } - - elf_elfheader (abfd)->e_machine = EM_AVR; -@@ -1032,6 +1359,10 @@ - case E_AVR_MACH_AVR5: - e_set = bfd_mach_avr5; - break; -+ -+ case E_AVR_MACH_AVR6: -+ e_set = bfd_mach_avr6; -+ break; - } - } - return bfd_default_set_arch_mach (abfd, bfd_arch_avr, -@@ -1039,9 +1370,6 @@ - } - - --/* Enable debugging printout at stdout with a value of 1. */ --#define DEBUG_RELAX 0 -- - /* Delete some bytes from a section while changing the size of an instruction. - The parameter "addr" denotes the section-relative offset pointing just - behind the shrinked instruction. "addr+count" point at the first -@@ -1101,7 +1429,7 @@ - if ((irel->r_offset > addr - && irel->r_offset < toaddr)) - { -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("Relocation at address 0x%x needs to be moved.\n" - "Old section offset: 0x%x, New section offset: 0x%x \n", - (unsigned int) old_reloc_address, -@@ -1148,7 +1476,7 @@ - symval += sym_sec->output_section->vma - + sym_sec->output_offset; - -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("Checking if the relocation's " - "addend needs corrections.\n" - "Address of anchor symbol: 0x%x \n" -@@ -1163,7 +1491,7 @@ - { - irel->r_addend -= count; - -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("Anchor symbol and relocation target bracket " - "shrinked insn address.\n" - "Need for new addend : 0x%x\n", -@@ -1238,7 +1566,7 @@ - contains 4-byte jump instructions whose relative offset must not - be changed. */ - --static bfd_boolean -+static bfd_boolean - elf32_avr_relax_section (bfd *abfd, - asection *sec, - struct bfd_link_info *link_info, -@@ -1251,10 +1579,37 @@ - Elf_Internal_Sym *isymbuf = NULL; - static asection *last_input_section = NULL; - static Elf_Internal_Rela *last_reloc = NULL; -+ struct elf32_avr_link_hash_table *htab; -+ -+ htab = avr_link_hash_table (link_info); - - /* Assume nothing changes. */ - *again = FALSE; - -+ if ((!htab->no_stubs) && (sec == htab->stub_sec)) -+ { -+ /* We are just relaxing the stub section. -+ Let's calculate the size needed again. */ -+ bfd_size_type last_estimated_stub_section_size = htab->stub_sec->size; -+ -+ if (debug_relax) -+ printf ("Relaxing the stub section. Size prior to this pass: %i\n", -+ (int) last_estimated_stub_section_size); -+ -+ elf32_avr_size_stubs (htab->stub_sec->output_section->owner, -+ link_info, FALSE); -+ -+ /* Check if the number of trampolines changed. */ -+ if (last_estimated_stub_section_size != htab->stub_sec->size) -+ *again = TRUE; -+ -+ if (debug_relax) -+ printf ("Size of stub section after this pass: %i\n", -+ (int) htab->stub_sec->size); -+ -+ return TRUE; -+ } -+ - /* We don't have to do anything for a relocatable link, if - this section does not have relocs, or if this is not a - code section. */ -@@ -1421,7 +1776,7 @@ - unsigned char code_msb; - unsigned char code_lsb; - -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("shrinking jump/call instruction at address 0x%x" - " in section %s\n\n", - (int) dot, sec->name); -@@ -1496,8 +1851,9 @@ - + sec->output_offset + irel->r_offset); - - /* Here we look for rcall/ret or call/ret sequences that could be -- safely replaced by rjmp/ret or jmp/ret */ -- if (0xd0 == (code_msb & 0xf0)) -+ safely replaced by rjmp/ret or jmp/ret. */ -+ if (((code_msb & 0xf0) == 0xd0) -+ && avr_replace_call_ret_sequences) - { - /* This insn is a rcall. */ - unsigned char next_insn_msb = 0; -@@ -1517,7 +1873,7 @@ - into a rjmp instruction. */ - code_msb &= 0xef; - bfd_put_8 (abfd, code_msb, contents + irel->r_offset + 1); -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("converted rcall/ret sequence at address 0x%x" - " into rjmp/ret sequence. Section is %s\n\n", - (int) dot, sec->name); -@@ -1526,7 +1882,8 @@ - } - } - else if ((0x94 == (code_msb & 0xfe)) -- && (0x0e == (code_lsb & 0x0e))) -+ && (0x0e == (code_lsb & 0x0e)) -+ && avr_replace_call_ret_sequences) - { - /* This insn is a call. */ - unsigned char next_insn_msb = 0; -@@ -1547,7 +1904,7 @@ - - code_lsb &= 0xfd; - bfd_put_8 (abfd, code_lsb, contents + irel->r_offset); -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("converted call/ret sequence at address 0x%x" - " into jmp/ret sequence. Section is %s\n\n", - (int) dot, sec->name); -@@ -1590,10 +1947,10 @@ - - address_of_ret = dot + insn_size; - -- if (DEBUG_RELAX && (insn_size == 2)) -+ if (debug_relax && (insn_size == 2)) - printf ("found rjmp / ret sequence at address 0x%x\n", - (int) dot); -- if (DEBUG_RELAX && (insn_size == 4)) -+ if (debug_relax && (insn_size == 4)) - printf ("found jmp / ret sequence at address 0x%x\n", - (int) dot); - -@@ -1630,7 +1987,7 @@ - there_is_preceeding_non_skip_insn = 0; - - if (there_is_preceeding_non_skip_insn == 0) -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("preceeding skip insn prevents deletion of" - " ret insn at addr 0x%x in section %s\n", - (int) dot + 2, sec->name); -@@ -1666,7 +2023,7 @@ - && isym->st_shndx == sec_shndx) - { - deleting_ret_is_safe = 0; -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("local label prevents deletion of ret " - "insn at address 0x%x\n", - (int) dot + insn_size); -@@ -1695,7 +2052,7 @@ - && sym_hash->root.u.def.value == section_offset_of_ret_insn) - { - deleting_ret_is_safe = 0; -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("global label prevents deletion of " - "ret insn at address 0x%x\n", - (int) dot + insn_size); -@@ -1772,7 +2129,7 @@ - if (address_of_ret == reloc_target) - { - deleting_ret_is_safe = 0; -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("ret from " - "rjmp/jmp ret sequence at address" - " 0x%x could not be deleted. ret" -@@ -1784,7 +2141,7 @@ - - if (deleting_ret_is_safe) - { -- if (DEBUG_RELAX) -+ if (debug_relax) - printf ("unreachable ret instruction " - "at address 0x%x deleted.\n", - (int) dot + insn_size); -@@ -1952,6 +2309,614 @@ - } - - -+/* Determines the hash entry name for a particular reloc. It consists of -+ the identifier of the symbol section and the added reloc addend and -+ symbol offset relative to the section the symbol is attached to. */ -+ -+static char * -+avr_stub_name (const asection *symbol_section, -+ const bfd_vma symbol_offset, -+ const Elf_Internal_Rela *rela) -+{ -+ char *stub_name; -+ bfd_size_type len; -+ -+ len = 8 + 1 + 8 + 1 + 1; -+ stub_name = bfd_malloc (len); -+ -+ sprintf (stub_name, "%08x+%08x", -+ symbol_section->id & 0xffffffff, -+ (unsigned int) ((rela->r_addend & 0xffffffff) + symbol_offset)); -+ -+ return stub_name; -+} -+ -+ -+/* Add a new stub entry to the stub hash. Not all fields of the new -+ stub entry are initialised. */ -+ -+static struct elf32_avr_stub_hash_entry * -+avr_add_stub (const char *stub_name, -+ struct elf32_avr_link_hash_table *htab) -+{ -+ struct elf32_avr_stub_hash_entry *hsh; -+ -+ /* Enter this entry into the linker stub hash table. */ -+ hsh = avr_stub_hash_lookup (&htab->bstab, stub_name, TRUE, FALSE); -+ -+ if (hsh == NULL) -+ { -+ (*_bfd_error_handler) (_("%B: cannot create stub entry %s"), -+ NULL, stub_name); -+ return NULL; -+ } -+ -+ hsh->stub_offset = 0; -+ return hsh; -+} -+ -+/* We assume that there is already space allocated for the stub section -+ contents and that before building the stubs the section size is -+ initialized to 0. We assume that within the stub hash table entry, -+ the absolute position of the jmp target has been written in the -+ target_value field. We write here the offset of the generated jmp insn -+ relative to the trampoline section start to the stub_offset entry in -+ the stub hash table entry. */ -+ -+static bfd_boolean -+avr_build_one_stub (struct bfd_hash_entry *bh, void *in_arg) -+{ -+ struct elf32_avr_stub_hash_entry *hsh; -+ struct bfd_link_info *info; -+ struct elf32_avr_link_hash_table *htab; -+ bfd *stub_bfd; -+ bfd_byte *loc; -+ bfd_vma target; -+ bfd_vma starget; -+ -+ /* Basic opcode */ -+ bfd_vma jmp_insn = 0x0000940c; -+ -+ /* Massage our args to the form they really have. */ -+ hsh = avr_stub_hash_entry (bh); -+ -+ if (!hsh->is_actually_needed) -+ return TRUE; -+ -+ info = (struct bfd_link_info *) in_arg; -+ -+ htab = avr_link_hash_table (info); -+ -+ target = hsh->target_value; -+ -+ /* Make a note of the offset within the stubs for this entry. */ -+ hsh->stub_offset = htab->stub_sec->size; -+ loc = htab->stub_sec->contents + hsh->stub_offset; -+ -+ stub_bfd = htab->stub_sec->owner; -+ -+ if (debug_stubs) -+ printf ("Building one Stub. Address: 0x%x, Offset: 0x%x\n", -+ (unsigned int) target, -+ (unsigned int) hsh->stub_offset); -+ -+ /* We now have to add the information on the jump target to the bare -+ opcode bits already set in jmp_insn. */ -+ -+ /* Check for the alignment of the address. */ -+ if (target & 1) -+ return FALSE; -+ -+ starget = target >> 1; -+ jmp_insn |= ((starget & 0x10000) | ((starget << 3) & 0x1f00000)) >> 16; -+ bfd_put_16 (stub_bfd, jmp_insn, loc); -+ bfd_put_16 (stub_bfd, (bfd_vma) starget & 0xffff, loc + 2); -+ -+ htab->stub_sec->size += 4; -+ -+ /* Now add the entries in the address mapping table if there is still -+ space left. */ -+ { -+ unsigned int nr; -+ -+ nr = htab->amt_entry_cnt + 1; -+ if (nr <= htab->amt_max_entry_cnt) -+ { -+ htab->amt_entry_cnt = nr; -+ -+ htab->amt_stub_offsets[nr - 1] = hsh->stub_offset; -+ htab->amt_destination_addr[nr - 1] = target; -+ } -+ } -+ -+ return TRUE; -+} -+ -+static bfd_boolean -+avr_mark_stub_not_to_be_necessary (struct bfd_hash_entry *bh, -+ void *in_arg) -+{ -+ struct elf32_avr_stub_hash_entry *hsh; -+ struct elf32_avr_link_hash_table *htab; -+ -+ htab = in_arg; -+ hsh = avr_stub_hash_entry (bh); -+ hsh->is_actually_needed = FALSE; -+ -+ return TRUE; -+} -+ -+static bfd_boolean -+avr_size_one_stub (struct bfd_hash_entry *bh, void *in_arg) -+{ -+ struct elf32_avr_stub_hash_entry *hsh; -+ struct elf32_avr_link_hash_table *htab; -+ int size; -+ -+ /* Massage our args to the form they really have. */ -+ hsh = avr_stub_hash_entry (bh); -+ htab = in_arg; -+ -+ if (hsh->is_actually_needed) -+ size = 4; -+ else -+ size = 0; -+ -+ htab->stub_sec->size += size; -+ return TRUE; -+} -+ -+void -+elf32_avr_setup_params (struct bfd_link_info *info, -+ bfd *avr_stub_bfd, -+ asection *avr_stub_section, -+ bfd_boolean no_stubs, -+ bfd_boolean deb_stubs, -+ bfd_boolean deb_relax, -+ bfd_vma pc_wrap_around, -+ bfd_boolean call_ret_replacement) -+{ -+ struct elf32_avr_link_hash_table *htab = avr_link_hash_table(info); -+ -+ htab->stub_sec = avr_stub_section; -+ htab->stub_bfd = avr_stub_bfd; -+ htab->no_stubs = no_stubs; -+ -+ debug_relax = deb_relax; -+ debug_stubs = deb_stubs; -+ avr_pc_wrap_around = pc_wrap_around; -+ avr_replace_call_ret_sequences = call_ret_replacement; -+} -+ -+ -+/* Set up various things so that we can make a list of input sections -+ for each output section included in the link. Returns -1 on error, -+ 0 when no stubs will be needed, and 1 on success. It also sets -+ information on the stubs bfd and the stub section in the info -+ struct. */ -+ -+int -+elf32_avr_setup_section_lists (bfd *output_bfd, -+ struct bfd_link_info *info) -+{ -+ bfd *input_bfd; -+ unsigned int bfd_count; -+ int top_id, top_index; -+ asection *section; -+ asection **input_list, **list; -+ bfd_size_type amt; -+ struct elf32_avr_link_hash_table *htab = avr_link_hash_table(info); -+ -+ if (htab->no_stubs) -+ return 0; -+ -+ /* Count the number of input BFDs and find the top input section id. */ -+ for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0; -+ input_bfd != NULL; -+ input_bfd = input_bfd->link_next) -+ { -+ bfd_count += 1; -+ for (section = input_bfd->sections; -+ section != NULL; -+ section = section->next) -+ if (top_id < section->id) -+ top_id = section->id; -+ } -+ -+ htab->bfd_count = bfd_count; -+ -+ /* We can't use output_bfd->section_count here to find the top output -+ section index as some sections may have been removed, and -+ strip_excluded_output_sections doesn't renumber the indices. */ -+ for (section = output_bfd->sections, top_index = 0; -+ section != NULL; -+ section = section->next) -+ if (top_index < section->index) -+ top_index = section->index; -+ -+ htab->top_index = top_index; -+ amt = sizeof (asection *) * (top_index + 1); -+ input_list = bfd_malloc (amt); -+ htab->input_list = input_list; -+ if (input_list == NULL) -+ return -1; -+ -+ /* For sections we aren't interested in, mark their entries with a -+ value we can check later. */ -+ list = input_list + top_index; -+ do -+ *list = bfd_abs_section_ptr; -+ while (list-- != input_list); -+ -+ for (section = output_bfd->sections; -+ section != NULL; -+ section = section->next) -+ if ((section->flags & SEC_CODE) != 0) -+ input_list[section->index] = NULL; -+ -+ return 1; -+} -+ -+ -+/* Read in all local syms for all input bfds, and create hash entries -+ for export stubs if we are building a multi-subspace shared lib. -+ Returns -1 on error, 0 otherwise. */ -+ -+static int -+get_local_syms (bfd *input_bfd, struct bfd_link_info *info) -+{ -+ unsigned int bfd_indx; -+ Elf_Internal_Sym *local_syms, **all_local_syms; -+ struct elf32_avr_link_hash_table *htab = avr_link_hash_table (info); -+ -+ /* We want to read in symbol extension records only once. To do this -+ we need to read in the local symbols in parallel and save them for -+ later use; so hold pointers to the local symbols in an array. */ -+ bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; -+ all_local_syms = bfd_zmalloc (amt); -+ htab->all_local_syms = all_local_syms; -+ if (all_local_syms == NULL) -+ return -1; -+ -+ /* Walk over all the input BFDs, swapping in local symbols. -+ If we are creating a shared library, create hash entries for the -+ export stubs. */ -+ for (bfd_indx = 0; -+ input_bfd != NULL; -+ input_bfd = input_bfd->link_next, bfd_indx++) -+ { -+ Elf_Internal_Shdr *symtab_hdr; -+ -+ /* We'll need the symbol table in a second. */ -+ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; -+ if (symtab_hdr->sh_info == 0) -+ continue; -+ -+ /* We need an array of the local symbols attached to the input bfd. */ -+ local_syms = (Elf_Internal_Sym *) symtab_hdr->contents; -+ if (local_syms == NULL) -+ { -+ local_syms = bfd_elf_get_elf_syms (input_bfd, symtab_hdr, -+ symtab_hdr->sh_info, 0, -+ NULL, NULL, NULL); -+ /* Cache them for elf_link_input_bfd. */ -+ symtab_hdr->contents = (unsigned char *) local_syms; -+ } -+ if (local_syms == NULL) -+ return -1; -+ -+ all_local_syms[bfd_indx] = local_syms; -+ } -+ -+ return 0; -+} -+ -+#define ADD_DUMMY_STUBS_FOR_DEBUGGING 0 -+ -+bfd_boolean -+elf32_avr_size_stubs (bfd *output_bfd, -+ struct bfd_link_info *info, -+ bfd_boolean is_prealloc_run) -+{ -+ struct elf32_avr_link_hash_table *htab; -+ int stub_changed = 0; -+ -+ htab = avr_link_hash_table (info); -+ -+ /* At this point we initialize htab->vector_base -+ To the start of the text output section. */ -+ htab->vector_base = htab->stub_sec->output_section->vma; -+ -+ if (get_local_syms (info->input_bfds, info)) -+ { -+ if (htab->all_local_syms) -+ goto error_ret_free_local; -+ return FALSE; -+ } -+ -+ if (ADD_DUMMY_STUBS_FOR_DEBUGGING) -+ { -+ struct elf32_avr_stub_hash_entry *test; -+ -+ test = avr_add_stub ("Hugo",htab); -+ test->target_value = 0x123456; -+ test->stub_offset = 13; -+ -+ test = avr_add_stub ("Hugo2",htab); -+ test->target_value = 0x84210; -+ test->stub_offset = 14; -+ } -+ -+ while (1) -+ { -+ bfd *input_bfd; -+ unsigned int bfd_indx; -+ -+ /* We will have to re-generate the stub hash table each time anything -+ in memory has changed. */ -+ -+ bfd_hash_traverse (&htab->bstab, avr_mark_stub_not_to_be_necessary, htab); -+ for (input_bfd = info->input_bfds, bfd_indx = 0; -+ input_bfd != NULL; -+ input_bfd = input_bfd->link_next, bfd_indx++) -+ { -+ Elf_Internal_Shdr *symtab_hdr; -+ asection *section; -+ Elf_Internal_Sym *local_syms; -+ -+ /* We'll need the symbol table in a second. */ -+ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; -+ if (symtab_hdr->sh_info == 0) -+ continue; -+ -+ local_syms = htab->all_local_syms[bfd_indx]; -+ -+ /* Walk over each section attached to the input bfd. */ -+ for (section = input_bfd->sections; -+ section != NULL; -+ section = section->next) -+ { -+ Elf_Internal_Rela *internal_relocs, *irelaend, *irela; -+ -+ /* If there aren't any relocs, then there's nothing more -+ to do. */ -+ if ((section->flags & SEC_RELOC) == 0 -+ || section->reloc_count == 0) -+ continue; -+ -+ /* If this section is a link-once section that will be -+ discarded, then don't create any stubs. */ -+ if (section->output_section == NULL -+ || section->output_section->owner != output_bfd) -+ continue; -+ -+ /* Get the relocs. */ -+ internal_relocs -+ = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL, -+ info->keep_memory); -+ if (internal_relocs == NULL) -+ goto error_ret_free_local; -+ -+ /* Now examine each relocation. */ -+ irela = internal_relocs; -+ irelaend = irela + section->reloc_count; -+ for (; irela < irelaend; irela++) -+ { -+ unsigned int r_type, r_indx; -+ struct elf32_avr_stub_hash_entry *hsh; -+ asection *sym_sec; -+ bfd_vma sym_value; -+ bfd_vma destination; -+ struct elf_link_hash_entry *hh; -+ char *stub_name; -+ -+ r_type = ELF32_R_TYPE (irela->r_info); -+ r_indx = ELF32_R_SYM (irela->r_info); -+ -+ /* Only look for 16 bit GS relocs. No other reloc will need a -+ stub. */ -+ if (!((r_type == R_AVR_16_PM) -+ || (r_type == R_AVR_LO8_LDI_GS) -+ || (r_type == R_AVR_HI8_LDI_GS))) -+ continue; -+ -+ /* Now determine the call target, its name, value, -+ section. */ -+ sym_sec = NULL; -+ sym_value = 0; -+ destination = 0; -+ hh = NULL; -+ if (r_indx < symtab_hdr->sh_info) -+ { -+ /* It's a local symbol. */ -+ Elf_Internal_Sym *sym; -+ Elf_Internal_Shdr *hdr; -+ -+ sym = local_syms + r_indx; -+ hdr = elf_elfsections (input_bfd)[sym->st_shndx]; -+ sym_sec = hdr->bfd_section; -+ if (ELF_ST_TYPE (sym->st_info) != STT_SECTION) -+ sym_value = sym->st_value; -+ destination = (sym_value + irela->r_addend -+ + sym_sec->output_offset -+ + sym_sec->output_section->vma); -+ } -+ else -+ { -+ /* It's an external symbol. */ -+ int e_indx; -+ -+ e_indx = r_indx - symtab_hdr->sh_info; -+ hh = elf_sym_hashes (input_bfd)[e_indx]; -+ -+ while (hh->root.type == bfd_link_hash_indirect -+ || hh->root.type == bfd_link_hash_warning) -+ hh = (struct elf_link_hash_entry *) -+ (hh->root.u.i.link); -+ -+ if (hh->root.type == bfd_link_hash_defined -+ || hh->root.type == bfd_link_hash_defweak) -+ { -+ sym_sec = hh->root.u.def.section; -+ sym_value = hh->root.u.def.value; -+ if (sym_sec->output_section != NULL) -+ destination = (sym_value + irela->r_addend -+ + sym_sec->output_offset -+ + sym_sec->output_section->vma); -+ } -+ else if (hh->root.type == bfd_link_hash_undefweak) -+ { -+ if (! info->shared) -+ continue; -+ } -+ else if (hh->root.type == bfd_link_hash_undefined) -+ { -+ if (! (info->unresolved_syms_in_objects == RM_IGNORE -+ && (ELF_ST_VISIBILITY (hh->other) -+ == STV_DEFAULT))) -+ continue; -+ } -+ else -+ { -+ bfd_set_error (bfd_error_bad_value); -+ -+ error_ret_free_internal: -+ if (elf_section_data (section)->relocs == NULL) -+ free (internal_relocs); -+ goto error_ret_free_local; -+ } -+ } -+ -+ if (! avr_stub_is_required_for_16_bit_reloc -+ (destination - htab->vector_base)) -+ { -+ if (!is_prealloc_run) -+ /* We are having a reloc that does't need a stub. */ -+ continue; -+ -+ /* We don't right now know if a stub will be needed. -+ Let's rather be on the safe side. */ -+ } -+ -+ /* Get the name of this stub. */ -+ stub_name = avr_stub_name (sym_sec, sym_value, irela); -+ -+ if (!stub_name) -+ goto error_ret_free_internal; -+ -+ -+ hsh = avr_stub_hash_lookup (&htab->bstab, -+ stub_name, -+ FALSE, FALSE); -+ if (hsh != NULL) -+ { -+ /* The proper stub has already been created. Mark it -+ to be used and write the possibly changed destination -+ value. */ -+ hsh->is_actually_needed = TRUE; -+ hsh->target_value = destination; -+ free (stub_name); -+ continue; -+ } -+ -+ hsh = avr_add_stub (stub_name, htab); -+ if (hsh == NULL) -+ { -+ free (stub_name); -+ goto error_ret_free_internal; -+ } -+ -+ hsh->is_actually_needed = TRUE; -+ hsh->target_value = destination; -+ -+ if (debug_stubs) -+ printf ("Adding stub with destination 0x%x to the" -+ " hash table.\n", (unsigned int) destination); -+ if (debug_stubs) -+ printf ("(Pre-Alloc run: %i)\n", is_prealloc_run); -+ -+ stub_changed = TRUE; -+ } -+ -+ /* We're done with the internal relocs, free them. */ -+ if (elf_section_data (section)->relocs == NULL) -+ free (internal_relocs); -+ } -+ } -+ -+ /* Re-Calculate the number of needed stubs. */ -+ htab->stub_sec->size = 0; -+ bfd_hash_traverse (&htab->bstab, avr_size_one_stub, htab); -+ -+ if (!stub_changed) -+ break; -+ -+ stub_changed = FALSE; -+ } -+ -+ free (htab->all_local_syms); -+ return TRUE; -+ -+ error_ret_free_local: -+ free (htab->all_local_syms); -+ return FALSE; -+} -+ -+ -+/* Build all the stubs associated with the current output file. The -+ stubs are kept in a hash table attached to the main linker hash -+ table. We also set up the .plt entries for statically linked PIC -+ functions here. This function is called via hppaelf_finish in the -+ linker. */ -+ -+bfd_boolean -+elf32_avr_build_stubs (struct bfd_link_info *info) -+{ -+ asection *stub_sec; -+ struct bfd_hash_table *table; -+ struct elf32_avr_link_hash_table *htab; -+ bfd_size_type total_size = 0; -+ -+ htab = avr_link_hash_table (info); -+ -+ /* In case that there were several stub sections: */ -+ for (stub_sec = htab->stub_bfd->sections; -+ stub_sec != NULL; -+ stub_sec = stub_sec->next) -+ { -+ bfd_size_type size; -+ -+ /* Allocate memory to hold the linker stubs. */ -+ size = stub_sec->size; -+ total_size += size; -+ -+ stub_sec->contents = bfd_zalloc (htab->stub_bfd, size); -+ if (stub_sec->contents == NULL && size != 0) -+ return FALSE; -+ stub_sec->size = 0; -+ } -+ -+ /* Allocate memory for the adress mapping table. */ -+ htab->amt_entry_cnt = 0; -+ htab->amt_max_entry_cnt = total_size / 4; -+ htab->amt_stub_offsets = bfd_malloc (sizeof (bfd_vma) -+ * htab->amt_max_entry_cnt); -+ htab->amt_destination_addr = bfd_malloc (sizeof (bfd_vma) -+ * htab->amt_max_entry_cnt ); -+ -+ if (debug_stubs) -+ printf ("Allocating %i entries in the AMT\n", htab->amt_max_entry_cnt); -+ -+ /* Build the stubs as directed by the stub hash table. */ -+ table = &htab->bstab; -+ bfd_hash_traverse (table, avr_build_one_stub, info); -+ -+ if (debug_stubs) -+ printf ("Final Stub section Size: %i\n", (int) htab->stub_sec->size); -+ -+ return TRUE; -+} -+ - #define ELF_ARCH bfd_arch_avr - #define ELF_MACHINE_CODE EM_AVR - #define ELF_MACHINE_ALT1 EM_AVR_OLD -@@ -1960,6 +2925,9 @@ - #define TARGET_LITTLE_SYM bfd_elf32_avr_vec - #define TARGET_LITTLE_NAME "elf32-avr" - -+#define bfd_elf32_bfd_link_hash_table_create elf32_avr_link_hash_table_create -+#define bfd_elf32_bfd_link_hash_table_free elf32_avr_link_hash_table_free -+ - #define elf_info_to_howto avr_info_to_howto_rela - #define elf_info_to_howto_rel NULL - #define elf_backend_relocate_section elf32_avr_relocate_section -diff -Nur bfd/elf32-avr.h bfd/elf32-avr.h ---- bfd/elf32-avr.h 1970-01-01 01:00:00.000000000 +0100 -+++ bfd/elf32-avr.h 2006-08-28 20:01:10.805090951 +0200 -@@ -0,0 +1,38 @@ -+/* AVR-specific support for 32-bit ELF. -+ Copyright 2006 Free Software Foundation, Inc. -+ -+ Written by Bjoern Haase <bjoern.m.haase@web.de> -+ -+ This file is part of BFD, the Binary File Descriptor library. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 51 Franklin Street - Fifth Floor, -+ Boston, MA 02110-1301, USA. */ -+ -+ -+/* These four functions will be called from the ld back-end. */ -+ -+extern void -+elf32_avr_setup_params (struct bfd_link_info *, bfd *, asection *, -+ bfd_boolean, bfd_boolean, bfd_boolean, -+ bfd_vma, bfd_boolean); -+ -+extern int -+elf32_avr_setup_section_lists (bfd *, struct bfd_link_info *); -+ -+extern bfd_boolean -+elf32_avr_size_stubs (bfd *, struct bfd_link_info *, bfd_boolean); -+ -+extern bfd_boolean -+elf32_avr_build_stubs (struct bfd_link_info *); -diff -Nur bfd/libbfd.h bfd/libbfd.h ---- bfd/libbfd.h 2006-03-26 01:38:42.000000000 +0100 -+++ bfd/libbfd.h 2006-08-28 20:02:16.912297073 +0200 -@@ -1509,7 +1509,9 @@ - "BFD_RELOC_AVR_HH8_LDI_NEG", - "BFD_RELOC_AVR_MS8_LDI_NEG", - "BFD_RELOC_AVR_LO8_LDI_PM", -+ "BFD_RELOC_AVR_LO8_LDI_GS", - "BFD_RELOC_AVR_HI8_LDI_PM", -+ "BFD_RELOC_AVR_HI8_LDI_GS", - "BFD_RELOC_AVR_HH8_LDI_PM", - "BFD_RELOC_AVR_LO8_LDI_PM_NEG", - "BFD_RELOC_AVR_HI8_LDI_PM_NEG", -diff -Nur bfd/reloc.c bfd/reloc.c ---- bfd/reloc.c 2006-03-26 01:38:42.000000000 +0100 -+++ bfd/reloc.c 2006-08-28 20:02:16.936295332 +0200 -@@ -3666,11 +3666,25 @@ - This is a 16 bit reloc for the AVR that stores 8 bit value (usually - command address) into 8 bit immediate value of LDI insn. - ENUM -+ BFD_RELOC_AVR_LO8_LDI_GS -+ENUMDOC -+ This is a 16 bit reloc for the AVR that stores 8 bit value -+ (command address) into 8 bit immediate value of LDI insn. If the address -+ is beyond the 128k boundary, the linker inserts a jump stub for this reloc -+ in the lower 128k. -+ENUM - BFD_RELOC_AVR_HI8_LDI_PM - ENUMDOC - This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit - of command address) into 8 bit immediate value of LDI insn. - ENUM -+ BFD_RELOC_AVR_HI8_LDI_GS -+ENUMDOC -+ This is a 16 bit reloc for the AVR that stores 8 bit value (high 8 bit -+ of command address) into 8 bit immediate value of LDI insn. If the address -+ is beyond the 128k boundary, the linker inserts a jump stub for this reloc -+ below 128k. -+ENUM - BFD_RELOC_AVR_HH8_LDI_PM - ENUMDOC - This is a 16 bit reloc for the AVR that stores 8 bit value (most high 8 bit -diff -Nur gas/config/tc-avr.c gas/config/tc-avr.c ---- gas/config/tc-avr.c 2006-04-07 17:18:08.000000000 +0200 -+++ gas/config/tc-avr.c 2006-08-28 20:02:16.948294462 +0200 -@@ -63,89 +63,92 @@ - - static struct mcu_type_s mcu_types[] = - { -- {"avr1", AVR_ISA_TINY1, bfd_mach_avr1}, -- {"avr2", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"avr3", AVR_ISA_M103, bfd_mach_avr3}, -- {"avr4", AVR_ISA_M8, bfd_mach_avr4}, -- {"avr5", AVR_ISA_ALL, bfd_mach_avr5}, -- {"at90s1200", AVR_ISA_1200, bfd_mach_avr1}, -- {"attiny10", AVR_ISA_TINY1, bfd_mach_avr1}, /* XXX -> tn11 */ -- {"attiny11", AVR_ISA_TINY1, bfd_mach_avr1}, -- {"attiny12", AVR_ISA_TINY1, bfd_mach_avr1}, -- {"attiny15", AVR_ISA_TINY1, bfd_mach_avr1}, -- {"attiny28", AVR_ISA_TINY1, bfd_mach_avr1}, -- {"at90s2313", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90s2323", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90s2333", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 4433 */ -- {"at90s2343", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"attiny22", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 2343 */ -- {"attiny26", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90s4433", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90s4414", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8515 */ -- {"at90s4434", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8535 */ -- {"at90s8515", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90s8535", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at90c8534", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"at86rf401", AVR_ISA_2xxx, bfd_mach_avr2}, -- {"attiny13", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny2313",AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny261", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny461", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny861", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny24", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny44", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny84", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny25", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny45", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"attiny85", AVR_ISA_TINY2, bfd_mach_avr2}, -- {"atmega603", AVR_ISA_M603, bfd_mach_avr3}, /* XXX -> m103 */ -- {"atmega103", AVR_ISA_M103, bfd_mach_avr3}, -- {"at43usb320",AVR_ISA_M103, bfd_mach_avr3}, -- {"at43usb355",AVR_ISA_M603, bfd_mach_avr3}, -- {"at76c711", AVR_ISA_M603, bfd_mach_avr3}, -- {"atmega48", AVR_ISA_PWMx, bfd_mach_avr4}, -- {"atmega8", AVR_ISA_M8, bfd_mach_avr4}, -- {"atmega83", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8535 */ -- {"atmega85", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8 */ -- {"atmega88", AVR_ISA_PWMx, bfd_mach_avr4}, -- {"atmega8515",AVR_ISA_M8, bfd_mach_avr4}, -- {"atmega8535",AVR_ISA_M8, bfd_mach_avr4}, -- {"at90pwm2", AVR_ISA_PWMx, bfd_mach_avr4}, -- {"at90pwm3", AVR_ISA_PWMx, bfd_mach_avr4}, -- {"atmega16", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega161", AVR_ISA_M161, bfd_mach_avr5}, -- {"atmega162", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega163", AVR_ISA_M161, bfd_mach_avr5}, -- {"atmega164", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega165", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega168", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega169", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega32", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega323", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega324", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega325", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega329", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega3250",AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega3290",AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega406", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega64", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega640", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega644", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega128", AVR_ISA_M128, bfd_mach_avr5}, -- {"atmega1280",AVR_ISA_M128, bfd_mach_avr5}, -- {"atmega1281",AVR_ISA_M128, bfd_mach_avr5}, -- {"atmega645", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega649", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega6450",AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega6490",AVR_ISA_M323, bfd_mach_avr5}, -- {"at90can32" ,AVR_ISA_M323, bfd_mach_avr5}, -- {"at90can64" ,AVR_ISA_M323, bfd_mach_avr5}, -- {"at90can128",AVR_ISA_M128, bfd_mach_avr5}, -+ {"avr1", AVR_ISA_TINY1, bfd_mach_avr1}, -+ {"avr2", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"avr3", AVR_ISA_M103, bfd_mach_avr3}, -+ {"avr4", AVR_ISA_M8, bfd_mach_avr4}, -+ {"avr5", AVR_ISA_ALL, bfd_mach_avr5}, -+ {"avr6", AVR_ISA_ALL, bfd_mach_avr6}, -+ {"at90s1200", AVR_ISA_1200, bfd_mach_avr1}, -+ {"attiny10", AVR_ISA_TINY1, bfd_mach_avr1}, /* XXX -> tn11 */ -+ {"attiny11", AVR_ISA_TINY1, bfd_mach_avr1}, -+ {"attiny12", AVR_ISA_TINY1, bfd_mach_avr1}, -+ {"attiny15", AVR_ISA_TINY1, bfd_mach_avr1}, -+ {"attiny28", AVR_ISA_TINY1, bfd_mach_avr1}, -+ {"at90s2313", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90s2323", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90s2333", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 4433 */ -+ {"at90s2343", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"attiny22", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 2343 */ -+ {"attiny26", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90s4433", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90s4414", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8515 */ -+ {"at90s4434", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8535 */ -+ {"at90s8515", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90s8535", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at90c8534", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"at86rf401", AVR_ISA_2xxx, bfd_mach_avr2}, -+ {"attiny13", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny2313", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny261", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny461", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny861", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny24", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny44", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny84", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny25", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny45", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"attiny85", AVR_ISA_TINY2, bfd_mach_avr2}, -+ {"atmega603", AVR_ISA_M603, bfd_mach_avr3}, /* XXX -> m103 */ -+ {"atmega103", AVR_ISA_M103, bfd_mach_avr3}, -+ {"at43usb320", AVR_ISA_M103, bfd_mach_avr3}, -+ {"at43usb355", AVR_ISA_M603, bfd_mach_avr3}, -+ {"at76c711", AVR_ISA_M603, bfd_mach_avr3}, -+ {"atmega48", AVR_ISA_PWMx, bfd_mach_avr4}, -+ {"atmega8", AVR_ISA_M8, bfd_mach_avr4}, -+ {"atmega83", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8535 */ -+ {"atmega85", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8 */ -+ {"atmega88", AVR_ISA_PWMx, bfd_mach_avr4}, -+ {"atmega8515", AVR_ISA_M8, bfd_mach_avr4}, -+ {"atmega8535", AVR_ISA_M8, bfd_mach_avr4}, -+ {"at90pwm2", AVR_ISA_PWMx, bfd_mach_avr4}, -+ {"at90pwm3", AVR_ISA_PWMx, bfd_mach_avr4}, -+ {"atmega16", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega161", AVR_ISA_M161, bfd_mach_avr5}, -+ {"atmega162", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega163", AVR_ISA_M161, bfd_mach_avr5}, -+ {"atmega164", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega165", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega168", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega169", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega32", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega323", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega324", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega325", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega329", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega3250", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega3290", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega406", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega64", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega640", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega644", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega128", AVR_ISA_M128, bfd_mach_avr5}, -+ {"atmega1280", AVR_ISA_M128, bfd_mach_avr5}, -+ {"atmega1281", AVR_ISA_M128, bfd_mach_avr5}, -+ {"atmega645", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega649", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega6450", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega6490", AVR_ISA_M323, bfd_mach_avr5}, -+ {"at90can32" , AVR_ISA_M323, bfd_mach_avr5}, -+ {"at90can64" , AVR_ISA_M323, bfd_mach_avr5}, -+ {"at90can128", AVR_ISA_M128, bfd_mach_avr5}, - {"at90usb646", AVR_ISA_M323, bfd_mach_avr5}, - {"at90usb647", AVR_ISA_M323, bfd_mach_avr5}, - {"at90usb1286",AVR_ISA_M128, bfd_mach_avr5}, - {"at90usb1287",AVR_ISA_M128, bfd_mach_avr5}, -- {"at94k", AVR_ISA_94K, bfd_mach_avr5}, -+ {"at94k", AVR_ISA_94K, bfd_mach_avr5}, -+ {"atmega2560", AVR_ISA_ALL, bfd_mach_avr6}, -+ {"atmega2561", AVR_ISA_ALL, bfd_mach_avr6}, - {NULL, 0, 0} - }; - -@@ -512,7 +515,7 @@ - if (exp->X_op == O_constant) - { - int x = exp->X_add_number; -- -+ - if (x < -255 || x > 255) - as_warn (_("constant out of 8-bit range: %d"), x); - } -@@ -544,6 +547,8 @@ - char *tmp; - char op[8]; - int mod; -+ int linker_stubs_should_be_generated = 0; -+ - tmp = str; - - str = extract_word (str, op, sizeof (op)); -@@ -551,7 +556,7 @@ - if (op[0]) - { - mod_index m; -- -+ - m.ptr = hash_find (avr_mod_hash, op); - mod = m.index; - -@@ -564,11 +569,14 @@ - - if (*str == '(') - { -+ bfd_reloc_code_real_type reloc_to_return; - int neg_p = 0; - - ++str; - - if (strncmp ("pm(", str, 3) == 0 -+ || strncmp ("gs(",str,3) == 0 -+ || strncmp ("-(gs(",str,5) == 0 - || strncmp ("-(pm(", str, 5) == 0) - { - if (HAVE_PM_P (mod)) -@@ -579,6 +587,9 @@ - else - as_bad (_("illegal expression")); - -+ if (str[0] == 'g' || str[2] == 'g') -+ linker_stubs_should_be_generated = 1; -+ - if (*str == '-') - { - neg_p = 1; -@@ -610,7 +621,24 @@ - } - while (closes--); - -- return neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod); -+ reloc_to_return = -+ neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod); -+ if (linker_stubs_should_be_generated) -+ { -+ switch (reloc_to_return) -+ { -+ case BFD_RELOC_AVR_LO8_LDI_PM: -+ reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS; -+ break; -+ case BFD_RELOC_AVR_HI8_LDI_PM: -+ reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS; -+ break; -+ -+ default: -+ break; /* as_warn (_("expression dangerous with linker stubs")); *//* Bjoern agreed. :) */ -+ } -+ } -+ return reloc_to_return; - } - } - } -@@ -1227,7 +1255,7 @@ - return NULL; - } - -- /* We are dealing with two symbols defined in the same section. -+ /* We are dealing with two symbols defined in the same section. - Let us fix-up them here. */ - value += S_GET_VALUE (fixp->fx_addsy); - value -= S_GET_VALUE (fixp->fx_subsy); -@@ -1310,7 +1338,8 @@ - static int exp_mod_pm = 0; - - /* Parse special CONS expression: pm (expression) -- which is used for addressing to a program memory. -+ or alternatively: gs (expression). -+ These are used for addressing program memory. - Relocation: BFD_RELOC_AVR_16_PM. */ - - void -@@ -1324,10 +1353,13 @@ - - if (nbytes == 2) - { -- char *pm_name = "pm"; -- int len = strlen (pm_name); -+ char *pm_name1 = "pm"; -+ char *pm_name2 = "gs"; -+ int len = strlen (pm_name1); -+ /* len must be the same for both pm identifiers. */ - -- if (strncasecmp (input_line_pointer, pm_name, len) == 0) -+ if (strncasecmp (input_line_pointer, pm_name1, len) == 0 -+ || strncasecmp (input_line_pointer, pm_name2, len) == 0) - { - input_line_pointer = skip_space (input_line_pointer + len); - -diff -Nur gas/config/tc-avr.h gas/config/tc-avr.h ---- gas/config/tc-avr.h 2006-05-17 18:04:30.000000000 +0200 -+++ gas/config/tc-avr.h 2006-08-28 20:02:16.952294172 +0200 -@@ -125,16 +125,21 @@ - We will need them in case that we want to do linker relaxation. - We could in principle keep these fixups in gas when not relaxing. - However, there is no serious performance penilty when making the linker -- make the fixup work. */ --#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ -- if ( (FIXP->fx_r_type == BFD_RELOC_AVR_7_PCREL \ -- || FIXP->fx_r_type == BFD_RELOC_AVR_13_PCREL \ -- || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM \ -- || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM \ -- || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM \ -- || FIXP->fx_r_type == BFD_RELOC_AVR_16_PM) \ -- && (FIXP->fx_addsy)) \ -- { \ -- goto SKIP; \ -+ make the fixup work. Check also that fx_addsy is not NULL, in order to make -+ sure that the fixup refers to some sort of lable. */ -+#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ -+ if ( (FIXP->fx_r_type == BFD_RELOC_AVR_7_PCREL \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_13_PCREL \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_GS \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_GS \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM_NEG \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM_NEG \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM_NEG \ -+ || FIXP->fx_r_type == BFD_RELOC_AVR_16_PM) \ -+ && (FIXP->fx_addsy)) \ -+ { \ -+ goto SKIP; \ - } -- -diff -Nur include/elf/avr.h include/elf/avr.h ---- include/elf/avr.h 2006-03-03 16:25:30.000000000 +0100 -+++ include/elf/avr.h 2006-08-28 20:02:16.998290837 +0200 -@@ -1,5 +1,5 @@ - /* AVR ELF support for BFD. -- Copyright 1999, 2000, 2004 Free Software Foundation, Inc. -+ Copyright 1999, 2000, 2004, 2006 Free Software Foundation, Inc. - Contributed by Denis Chertykov <denisc@overta.ru> - - This file is part of BFD, the Binary File Descriptor library. -@@ -35,6 +35,7 @@ - #define E_AVR_MACH_AVR3 3 - #define E_AVR_MACH_AVR4 4 - #define E_AVR_MACH_AVR5 5 -+#define E_AVR_MACH_AVR6 6 - - /* Relocations. */ - START_RELOC_NUMBERS (elf_avr_reloc_type) -@@ -62,6 +63,8 @@ - RELOC_NUMBER (R_AVR_6_ADIW, 21) - RELOC_NUMBER (R_AVR_MS8_LDI, 22) - RELOC_NUMBER (R_AVR_MS8_LDI_NEG, 23) -+ RELOC_NUMBER (R_AVR_LO8_LDI_GS, 24) -+ RELOC_NUMBER (R_AVR_HI8_LDI_GS, 25) - END_RELOC_NUMBERS (R_AVR_max) - - #endif /* _ELF_AVR_H */ -diff -Nur include/elf/ChangeLog include/elf/ChangeLog ---- include/elf/ChangeLog 2006-03-22 10:28:12.000000000 +0100 -+++ include/elf/ChangeLog 2006-08-28 20:02:17.001290619 +0200 -@@ -1,3 +1,7 @@ -+2006-05-24 Bjoern Haase <bjoern.m.haase@web.de> -+ -+ * avr.h: Add E_AVR_MACH_AVR6, R_AVR_LO8_LDI_GS and R_AVR_HI8_LDI_GS. -+ - 2006-03-22 Richard Sandiford <richard@codesourcery.com> - Daniel Jacobowitz <dan@codesourcery.com> - Phil Edwards <phil@codesourcery.com> -diff -Nur ld/configure.tgt ld/configure.tgt ---- ld/configure.tgt 2006-04-05 14:41:57.000000000 +0200 -+++ ld/configure.tgt 2006-08-28 20:02:17.029288589 +0200 -@@ -81,7 +81,7 @@ - xscale-*-elf) targ_emul=armelf - ;; - avr-*-*) targ_emul=avr2 -- targ_extra_emuls="avr1 avr3 avr4 avr5" -+ targ_extra_emuls="avr1 avr3 avr4 avr5 avr6" - ;; - bfin-*-elf) targ_emul=elf32bfin; targ_extra_emuls="elf32bfinfd" ;; - bfin-*-uclinux*) targ_emul=elf32bfin; targ_extra_emuls="elf32bfinfd" ;; -diff -Nur ld/emulparams/avr1.sh ld/emulparams/avr1.sh ---- ld/emulparams/avr1.sh 2002-05-16 21:51:08.000000000 +0200 -+++ ld/emulparams/avr1.sh 2006-08-28 20:02:17.031288444 +0200 -@@ -4,7 +4,8 @@ - OUTPUT_FORMAT="elf32-avr" - MAXPAGESIZE=1 - EMBEDDED=yes --TEMPLATE_NAME=generic -+TEMPLATE_NAME=elf32 - - TEXT_LENGTH=8K - DATA_LENGTH=0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emulparams/avr2.sh ld/emulparams/avr2.sh ---- ld/emulparams/avr2.sh 2002-05-16 21:51:08.000000000 +0200 -+++ ld/emulparams/avr2.sh 2006-08-28 20:02:17.033288299 +0200 -@@ -4,7 +4,8 @@ - OUTPUT_FORMAT="elf32-avr" - MAXPAGESIZE=1 - EMBEDDED=yes --TEMPLATE_NAME=generic -+TEMPLATE_NAME=elf32 - - TEXT_LENGTH=8K - DATA_LENGTH=0xffa0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emulparams/avr3.sh ld/emulparams/avr3.sh ---- ld/emulparams/avr3.sh 2002-05-16 21:51:08.000000000 +0200 -+++ ld/emulparams/avr3.sh 2006-08-28 20:02:17.036288081 +0200 -@@ -4,7 +4,8 @@ - OUTPUT_FORMAT="elf32-avr" - MAXPAGESIZE=1 - EMBEDDED=yes --TEMPLATE_NAME=generic -+TEMPLATE_NAME=elf32 - - TEXT_LENGTH=128K - DATA_LENGTH=0xffa0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emulparams/avr4.sh ld/emulparams/avr4.sh ---- ld/emulparams/avr4.sh 2002-05-16 21:51:08.000000000 +0200 -+++ ld/emulparams/avr4.sh 2006-08-28 20:02:17.038287936 +0200 -@@ -4,7 +4,8 @@ - OUTPUT_FORMAT="elf32-avr" - MAXPAGESIZE=1 - EMBEDDED=yes --TEMPLATE_NAME=generic -+TEMPLATE_NAME=elf32 - - TEXT_LENGTH=8K - DATA_LENGTH=0xffa0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emulparams/avr5.sh ld/emulparams/avr5.sh ---- ld/emulparams/avr5.sh 2002-05-16 21:51:08.000000000 +0200 -+++ ld/emulparams/avr5.sh 2006-08-28 20:02:17.040287791 +0200 -@@ -4,7 +4,8 @@ - OUTPUT_FORMAT="elf32-avr" - MAXPAGESIZE=1 - EMBEDDED=yes --TEMPLATE_NAME=generic -+TEMPLATE_NAME=elf32 - - TEXT_LENGTH=128K - DATA_LENGTH=0xffa0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emulparams/avr6.sh ld/emulparams/avr6.sh ---- ld/emulparams/avr6.sh 1970-01-01 01:00:00.000000000 +0100 -+++ ld/emulparams/avr6.sh 2006-08-28 20:02:17.043287574 +0200 -@@ -0,0 +1,11 @@ -+ARCH=avr:6 -+MACHINE= -+SCRIPT_NAME=avr -+OUTPUT_FORMAT="elf32-avr" -+MAXPAGESIZE=1 -+EMBEDDED=yes -+TEMPLATE_NAME=elf32 -+ -+TEXT_LENGTH=1024K -+DATA_LENGTH=0xffa0 -+EXTRA_EM_FILE=avrelf -diff -Nur ld/emultempl/avrelf.em ld/emultempl/avrelf.em ---- ld/emultempl/avrelf.em 1970-01-01 01:00:00.000000000 +0100 -+++ ld/emultempl/avrelf.em 2006-08-28 20:02:17.047287284 +0200 -@@ -0,0 +1,267 @@ -+# This shell script emits a C file. -*- C -*- -+# Copyright 2006 -+# Free Software Foundation, Inc. -+# -+# This file is part of GLD, the Gnu Linker. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, -+# MA 02110-1301 USA. -+ -+# This file is sourced from elf32.em, and defines extra avr-elf -+# specific routines. It is used to generate the trampolines for the avr6 -+# family devices where one needs to address the issue that it is not possible -+# to reach the whole program memory by using 16 bit pointers. -+ -+cat >>e${EMULATION_NAME}.c <<EOF -+ -+#include "elf32-avr.h" -+#include "ldctor.h" -+ -+/* The fake file and it's corresponding section meant to hold -+ the linker stubs if needed. */ -+ -+static lang_input_statement_type *stub_file; -+static asection *avr_stub_section; -+ -+/* Variables set by the command-line parameters and transfered -+ to the bfd without use of global shared variables. */ -+ -+static bfd_boolean avr_no_stubs = FALSE; -+static bfd_boolean avr_debug_relax = FALSE; -+static bfd_boolean avr_debug_stubs = FALSE; -+static bfd_boolean avr_replace_call_ret_sequences = TRUE; -+static bfd_vma avr_pc_wrap_around = 0x10000000; -+ -+/* Transfers information to the bfd frontend. */ -+ -+static void -+avr_elf_set_global_bfd_parameters (void) -+{ -+ elf32_avr_setup_params (& link_info, -+ stub_file->the_bfd, -+ avr_stub_section, -+ avr_no_stubs, -+ avr_debug_stubs, -+ avr_debug_relax, -+ avr_pc_wrap_around, -+ avr_replace_call_ret_sequences); -+} -+ -+ -+/* Makes a conservative estimate of the trampoline section size that could -+ be corrected later on. */ -+ -+static void -+avr_elf_${EMULATION_NAME}_before_allocation (void) -+{ -+ int ret; -+ -+ gld${EMULATION_NAME}_before_allocation (); -+ -+ /* We only need stubs for the avr6 family. */ -+ if (strcmp ("${EMULATION_NAME}","avr6")) -+ avr_no_stubs = TRUE; -+ -+ avr_elf_set_global_bfd_parameters (); -+ -+ /* If generating a relocatable output file, then -+ we don't have to generate the trampolines. */ -+ if (link_info.relocatable) -+ avr_no_stubs = TRUE; -+ -+ if (avr_no_stubs) -+ return; -+ -+ ret = elf32_avr_setup_section_lists (output_bfd, &link_info); -+ -+ if (ret < 0) -+ einfo ("%X%P: can not setup the input section list: %E\n"); -+ -+ if (ret <= 0) -+ return; -+ -+ /* Call into the BFD backend to do the real "stub"-work. */ -+ if (! elf32_avr_size_stubs (output_bfd, &link_info, TRUE)) -+ einfo ("%X%P: can not size stub section: %E\n"); -+} -+ -+/* This is called before the input files are opened. We create a new -+ fake input file to hold the stub section and generate the section itself. */ -+ -+static void -+avr_elf_create_output_section_statements (void) -+{ -+ flagword flags; -+ -+ stub_file = lang_add_input_file ("linker stubs", -+ lang_input_file_is_fake_enum, -+ NULL); -+ -+ stub_file->the_bfd = bfd_create ("linker stubs", output_bfd); -+ if (stub_file->the_bfd == NULL -+ || !bfd_set_arch_mach (stub_file->the_bfd, -+ bfd_get_arch (output_bfd), -+ bfd_get_mach (output_bfd))) -+ { -+ einfo ("%X%P: can not create stub BFD %E\n"); -+ return; -+ } -+ -+ /* Now we add the stub section. */ -+ -+ avr_stub_section = bfd_make_section_anyway (stub_file->the_bfd, -+ ".trampolines"); -+ if (avr_stub_section == NULL) -+ goto err_ret; -+ -+ flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE -+ | SEC_HAS_CONTENTS | SEC_RELOC | SEC_IN_MEMORY | SEC_KEEP); -+ if (!bfd_set_section_flags (stub_file->the_bfd, avr_stub_section, flags)) -+ goto err_ret; -+ -+ avr_stub_section->alignment_power = 1; -+ -+ ldlang_add_file (stub_file); -+ -+ return; -+ -+ err_ret: -+ einfo ("%X%P: can not make stub section: %E\n"); -+ return; -+} -+ -+/* Re-calculates the size of the stubs so that we won't waste space. */ -+ -+static void -+avr_elf_finish (void) -+{ -+ if (!avr_no_stubs) -+ { -+ /* Now build the linker stubs. */ -+ if (stub_file->the_bfd->sections != NULL) -+ { -+ /* Call again the trampoline analyzer to initialize the trampoline -+ stubs with the correct symbol addresses. Since there could have -+ been relaxation, the symbol addresses that were found during -+ first call may no longer be correct. */ -+ if (!elf32_avr_size_stubs (output_bfd, &link_info, FALSE)) -+ { -+ einfo ("%X%P: can not size stub section: %E\n"); -+ return; -+ } -+ -+ if (!elf32_avr_build_stubs (&link_info)) -+ einfo ("%X%P: can not build stubs: %E\n"); -+ } -+ } -+ -+ gld${EMULATION_NAME}_finish (); -+} -+ -+ -+EOF -+ -+ -+PARSE_AND_LIST_PROLOGUE=' -+ -+#define OPTION_NO_CALL_RET_REPLACEMENT 301 -+#define OPTION_PMEM_WRAP_AROUND 302 -+#define OPTION_NO_STUBS 303 -+#define OPTION_DEBUG_STUBS 304 -+#define OPTION_DEBUG_RELAX 305 -+' -+ -+PARSE_AND_LIST_LONGOPTS=' -+ { "no-call-ret-replacement", no_argument, -+ NULL, OPTION_NO_CALL_RET_REPLACEMENT}, -+ { "pmem-wrap-around", required_argument, -+ NULL, OPTION_PMEM_WRAP_AROUND}, -+ { "no-stubs", no_argument, -+ NULL, OPTION_NO_STUBS}, -+ { "debug-stubs", no_argument, -+ NULL, OPTION_DEBUG_STUBS}, -+ { "debug-relax", no_argument, -+ NULL, OPTION_DEBUG_RELAX}, -+' -+ -+PARSE_AND_LIST_OPTIONS=' -+ fprintf (file, _(" --pmem-wrap-around=<val> " -+ "Make the linker relaxation machine assume that a\n" -+ " " -+ "program counter wrap-around occures at address\n" -+ " " -+ "<val>. Supported values are 16k, 32k and 64k.\n")); -+ fprintf (file, _(" --no-call-ret-replacement " -+ "The relaxation machine normally will\n" -+ " " -+ "substitute two immediately following call/ret\n" -+ " " -+ "instructions by a single jump instruction.\n" -+ " " -+ "This option disables this optimization.\n")); -+ fprintf (file, _(" --no-stubs " -+ "If the linker detects to attempt to access\n" -+ " " -+ "an instruction beyond 128k by a reloc that\n" -+ " " -+ "is limited to 128k max, it inserts a jump\n" -+ " " -+ "stub. You can de-active this with this switch.\n")); -+ fprintf (file, _(" --debug-stubs Used for debugging avr-ld.\n")); -+ fprintf (file, _(" --debug-relax Used for debugging avr-ld.\n")); -+' -+ -+PARSE_AND_LIST_ARGS_CASES=' -+ -+ case OPTION_PMEM_WRAP_AROUND: -+ { -+ /* This variable is defined in the bfd library. */ -+ if ((!strcmp (optarg,"32k")) || (!strcmp (optarg,"32K"))) -+ avr_pc_wrap_around = 32768; -+ else if ((!strcmp (optarg,"16k")) || (!strcmp (optarg,"16K"))) -+ avr_pc_wrap_around = 16384; -+ else if ((!strcmp (optarg,"64k")) || (!strcmp (optarg,"64K"))) -+ avr_pc_wrap_around = 0x10000; -+ else -+ return FALSE; -+ } -+ break; -+ -+ case OPTION_DEBUG_STUBS: -+ avr_debug_stubs = TRUE; -+ break; -+ -+ case OPTION_DEBUG_RELAX: -+ avr_debug_relax = TRUE; -+ break; -+ -+ case OPTION_NO_STUBS: -+ avr_no_stubs = TRUE; -+ break; -+ -+ case OPTION_NO_CALL_RET_REPLACEMENT: -+ { -+ /* This variable is defined in the bfd library. */ -+ avr_replace_call_ret_sequences = FALSE; -+ } -+ break; -+' -+ -+# -+# Put these extra avr-elf routines in ld_${EMULATION_NAME}_emulation -+# -+LDEMUL_BEFORE_ALLOCATION=avr_elf_${EMULATION_NAME}_before_allocation -+LDEMUL_FINISH=avr_elf_finish -+LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=avr_elf_create_output_section_statements -diff -Nur ld/Makefile.am ld/Makefile.am ---- ld/Makefile.am 2006-06-03 06:45:50.000000000 +0200 -+++ ld/Makefile.am 2006-08-28 20:02:17.055286703 +0200 -@@ -133,6 +133,7 @@ - eavr3.o \ - eavr4.o \ - eavr5.o \ -+ eavr6.o \ - ecoff_i860.o \ - ecoff_sparc.o \ - ecrisaout.o \ -@@ -595,6 +596,10 @@ - $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \ - ${GEN_DEPENDS} - ${GENSCRIPTS} avr5 "$(tdir_avr2)" -+eavr6.c: $(srcdir)/emulparams/avr6.sh \ -+ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \ -+ ${GEN_DEPENDS} -+ ${GENSCRIPTS} avr6 "$(tdir_avr2)" - ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \ - $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i860coff.sc ${GEN_DEPENDS} - ${GENSCRIPTS} coff_i860 "$(tdir_coff_i860)" -diff -Nur ld/Makefile.in ld/Makefile.in ---- ld/Makefile.in 2006-06-03 06:45:50.000000000 +0200 -+++ ld/Makefile.in 2006-08-28 20:02:17.072285471 +0200 -@@ -357,6 +357,7 @@ - eavr3.o \ - eavr4.o \ - eavr5.o \ -+ eavr6.o \ - ecoff_i860.o \ - ecoff_sparc.o \ - ecrisaout.o \ -@@ -1406,6 +1407,10 @@ - $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \ - ${GEN_DEPENDS} - ${GENSCRIPTS} avr5 "$(tdir_avr2)" -+eavr6.c: $(srcdir)/emulparams/avr6.sh \ -+ $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/avr.sc \ -+ ${GEN_DEPENDS} -+ ${GENSCRIPTS} avr6 "$(tdir_avr2)" - ecoff_i860.c: $(srcdir)/emulparams/coff_i860.sh \ - $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/i860coff.sc ${GEN_DEPENDS} - ${GENSCRIPTS} coff_i860 "$(tdir_coff_i860)" -diff -Nur ld/scripttempl/avr.sc ld/scripttempl/avr.sc ---- ld/scripttempl/avr.sc 2006-03-03 16:25:31.000000000 +0100 -+++ ld/scripttempl/avr.sc 2006-08-28 20:02:17.078285036 +0200 -@@ -71,12 +71,32 @@ - .rel.plt ${RELOCATING-0} : { *(.rel.plt) } - .rela.plt ${RELOCATING-0} : { *(.rela.plt) } - -- /* Internal text space or external memory */ -+ /* Internal text space or external memory. */ - .text : - { - *(.vectors) - KEEP(*(.vectors)) - -+ /* For data that needs to reside in the lower 64k of progmem. */ -+ *(.progmem.gcc*) -+ *(.progmem*) -+ ${RELOCATING+. = ALIGN(2);} -+ -+ ${CONSTRUCTING+ __trampolines_start = . ; } -+ /* The jump trampolines for the 16-bit limited relocs will reside here. */ -+ *(.trampolines) -+ *(.trampolines*) -+ ${CONSTRUCTING+ __trampolines_end = . ; } -+ -+ /* For future tablejump instruction arrays for 3 byte pc devices. -+ We don't relax jump/call instructions within these sections. */ -+ *(.jumptables) -+ *(.jumptables*) -+ -+ /* For code that needs to reside in the lower 128k progmem. */ -+ *(.lowtext) -+ *(.lowtext*) -+ - ${CONSTRUCTING+ __ctors_start = . ; } - ${CONSTRUCTING+ *(.ctors) } - ${CONSTRUCTING+ __ctors_end = . ; } -@@ -86,18 +106,8 @@ - KEEP(SORT(*)(.ctors)) - KEEP(SORT(*)(.dtors)) - -- /* For data that needs to reside in the lower 64k of progmem */ -- *(.progmem.gcc*) -- *(.progmem*) -- ${RELOCATING+. = ALIGN(2);} -- -- /* for future tablejump instruction arrays for 3 byte pc devices */ -- *(.jumptables) -- *(.jumptables*) -- /* for code that needs to reside in the lower 128k progmem */ -- *(.lowtext) -- *(.lowtext*) -- -+ /* From this point on, we don't bother about wether the insns are -+ below or above the 16 bits boundary. */ - *(.init0) /* Start here after reset. */ - KEEP (*(.init0)) - *(.init1) diff --git a/devel/avr-binutils/files/patch-bug5215 b/devel/avr-binutils/files/patch-bug5215 new file mode 100644 index 000000000000..81f314d834ba --- /dev/null +++ b/devel/avr-binutils/files/patch-bug5215 @@ -0,0 +1,52 @@ +This is a workaround for + +http://sourceware.org/bugzilla/show_bug.cgi?id=5215 + +--- ld/genscripts.sh.orig Wed Oct 24 09:38:43 2007 ++++ ld/genscripts.sh Wed Oct 24 09:59:03 2007 +@@ -390,21 +390,21 @@ + *" ${EMULATION_NAME} "*) COMPILE_IN=true;; + esac + +-if test -n "${BASH+set}"; then +- source_em() +- { +- local current_script="$em_script" +- em_script=$1 +- . $em_script +- em_script=$current_script +- } +- fragment() +- { +- local lineno=$[${BASH_LINENO[0]} + 1] +- echo >> e${EMULATION_NAME}.c "#line $lineno \"$em_script\"" +- cat >> e${EMULATION_NAME}.c +- } +-else ++#if test -n "${BASH+set}"; then ++# source_em() ++# { ++# local current_script="$em_script" ++# em_script=$1 ++# . $em_script ++# em_script=$current_script ++# } ++# fragment() ++# { ++# local lineno=$[${BASH_LINENO[0]} + 1] ++# echo >> e${EMULATION_NAME}.c "#line $lineno \"$em_script\"" ++# cat >> e${EMULATION_NAME}.c ++# } ++#else + source_em() + { + . $1 +@@ -413,7 +413,7 @@ + { + cat >> e${EMULATION_NAME}.c + } +-fi ++#fi + + # Generate e${EMULATION_NAME}.c. + # Start with an empty file, then the sourced .em script diff --git a/devel/avr-binutils/files/patch-coff-avr b/devel/avr-binutils/files/patch-coff-avr index dc7759f917f1..fdba8c03e55e 100644 --- a/devel/avr-binutils/files/patch-coff-avr +++ b/devel/avr-binutils/files/patch-coff-avr @@ -1,6 +1,7 @@ ---- ./binutils/doc/objcopy.1.orig Fri Jun 23 20:19:49 2006 -+++ ./binutils/doc/objcopy.1 Tue Sep 26 00:25:05 2006 -@@ -190,6 +190,8 @@ +diff -Nur ../binutils-2.18.orig/binutils/doc/objcopy.1 ./binutils/doc/objcopy.1 +--- ../binutils-2.18.orig/binutils/doc/objcopy.1 Tue Oct 23 21:44:42 2007 ++++ ./binutils/doc/objcopy.1 Tue Oct 23 22:18:44 2007 +@@ -193,6 +193,8 @@ [\fB\-\-readonly\-text\fR] [\fB\-\-pure\fR] [\fB\-\-impure\fR] @@ -9,9 +10,9 @@ [\fB\-v\fR|\fB\-\-verbose\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fB\-\-help\fR] [\fB\-\-info\fR] -@@ -745,6 +747,23 @@ - full executable. It does not have to be a file created by the - \&\fB\-\-only\-keep\-debug\fR switch. +@@ -807,6 +809,23 @@ + It can also be a useful way of reducing the size of a \fB\-\-just\-symbols\fR + linker input file. .RE +.IP "\fB\-\-change\-pathname\fR \fIold\fR=\fInew\fR" 4 +.IX Item "--change-pathname old=new" @@ -33,18 +34,20 @@ .IP "\fB\-V\fR" 4 .IX Item "-V" .PD 0 ---- ./binutils/Makefile.am.orig Thu Apr 6 23:49:26 2006 -+++ ./binutils/Makefile.am Tue Sep 26 00:25:05 2006 -@@ -97,14 +97,14 @@ - rdcoff.c rddbg.c readelf.c rename.c \ +diff -Nur ../binutils-2.18.orig/binutils/Makefile.am ./binutils/Makefile.am +--- ../binutils-2.18.orig/binutils/Makefile.am Tue Oct 23 21:44:42 2007 ++++ ./binutils/Makefile.am Tue Oct 23 22:22:40 2007 +@@ -98,7 +98,7 @@ resbin.c rescoff.c resrc.c resres.c \ - size.c srconv.c stabs.c strings.c sysdump.c version.c \ -- windres.c winduni.c wrstabs.c -+ windres.c winduni.c wrcoff.c wrstabs.c + size.c srconv.c stabs.c strings.c sysdump.c \ + unwind-ia64.c version.c \ +- windres.c winduni.c wrstabs.c \ ++ windres.c winduni.c wrcoff.c wrstabs.c \ + windmc.c mclex.c GENERATED_CFILES = \ - arparse.c arlex.c sysroff.c sysinfo.c syslex.c \ - defparse.c deflex.c nlmheader.c rcparse.c rclex.c +@@ -106,7 +106,7 @@ + defparse.c deflex.c nlmheader.c rcparse.c mcparse.c DEBUG_SRCS = rddbg.c debug.c stabs.c ieee.c rdcoff.c -WRITE_DEBUG_SRCS = $(DEBUG_SRCS) wrstabs.c @@ -52,27 +55,29 @@ # Code shared by all the binutils. BULIBS = bucomm.c version.c filemode.c ---- ./binutils/Makefile.in.orig Fri Jun 2 04:21:08 2006 -+++ ./binutils/Makefile.in Tue Sep 26 00:25:05 2006 -@@ -133,7 +133,7 @@ - nm_new_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ - $(am__DEPENDENCIES_3) +diff -Nur ../binutils-2.18.orig/binutils/Makefile.in ./binutils/Makefile.in +--- ../binutils-2.18.orig/binutils/Makefile.in Tue Oct 23 21:44:42 2007 ++++ ./binutils/Makefile.in Tue Oct 23 22:26:52 2007 +@@ -129,7 +129,7 @@ + nm_new_OBJECTS = $(am_nm_new_OBJECTS) + nm_new_LDADD = $(LDADD) am__objects_2 = rddbg.$(OBJEXT) debug.$(OBJEXT) stabs.$(OBJEXT) \ - ieee.$(OBJEXT) rdcoff.$(OBJEXT) + ieee.$(OBJEXT) rdcoff.$(OBJEXT) wrcoff.$(OBJEXT) am__objects_3 = $(am__objects_2) wrstabs.$(OBJEXT) am_objcopy_OBJECTS = objcopy.$(OBJEXT) not-strip.$(OBJEXT) \ rename.$(OBJEXT) $(am__objects_3) $(am__objects_1) -@@ -424,14 +424,14 @@ - rdcoff.c rddbg.c readelf.c rename.c \ +@@ -418,7 +418,7 @@ resbin.c rescoff.c resrc.c resres.c \ - size.c srconv.c stabs.c strings.c sysdump.c version.c \ -- windres.c winduni.c wrstabs.c -+ windres.c winduni.c wrcoff.c wrstabs.c + size.c srconv.c stabs.c strings.c sysdump.c \ + unwind-ia64.c version.c \ +- windres.c winduni.c wrstabs.c \ ++ windres.c winduni.c wrcoff.c wrstabs.c \ + windmc.c mclex.c GENERATED_CFILES = \ - arparse.c arlex.c sysroff.c sysinfo.c syslex.c \ - defparse.c deflex.c nlmheader.c rcparse.c rclex.c +@@ -426,7 +426,7 @@ + defparse.c deflex.c nlmheader.c rcparse.c mcparse.c DEBUG_SRCS = rddbg.c debug.c stabs.c ieee.c rdcoff.c -WRITE_DEBUG_SRCS = $(DEBUG_SRCS) wrstabs.c @@ -80,9 +85,10 @@ # Code shared by all the binutils. BULIBS = bucomm.c version.c filemode.c ---- ./binutils/bucomm.c.orig Mon Mar 13 23:27:22 2006 -+++ ./binutils/bucomm.c Tue Sep 26 00:25:05 2006 -@@ -452,6 +452,32 @@ +diff -Nur ../binutils-2.18.orig/binutils/bucomm.c ./binutils/bucomm.c +--- ../binutils-2.18.orig/binutils/bucomm.c Tue Oct 23 21:44:42 2007 ++++ ./binutils/bucomm.c Tue Oct 23 22:18:44 2007 +@@ -501,6 +501,32 @@ return ret; } @@ -115,9 +121,10 @@ /* Returns the size of the named file. If the file does not exist, or if it is not a real file, then a suitable non-fatal error message is printed and zero is returned. */ ---- ./binutils/bucomm.h.orig Thu Feb 9 12:49:53 2006 -+++ ./binutils/bucomm.h Tue Sep 26 00:25:05 2006 -@@ -205,6 +205,8 @@ +diff -Nur ../binutils-2.18.orig/binutils/bucomm.h ./binutils/bucomm.h +--- ../binutils-2.18.orig/binutils/bucomm.h Tue Oct 23 21:44:42 2007 ++++ ./binutils/bucomm.h Tue Oct 23 22:18:44 2007 +@@ -54,6 +54,8 @@ off_t get_file_size (const char *); @@ -126,8 +133,9 @@ extern char *program_name; /* filemode.c */ ---- ./binutils/budbg.h.orig Sun May 8 16:17:38 2005 -+++ ./binutils/budbg.h Tue Sep 26 00:25:05 2006 +diff -Nur ../binutils-2.18.orig/binutils/budbg.h ./binutils/budbg.h +--- ../binutils-2.18.orig/binutils/budbg.h Tue Oct 23 21:44:42 2007 ++++ ./binutils/budbg.h Tue Oct 23 22:18:44 2007 @@ -51,8 +51,11 @@ extern bfd_boolean write_ieee_debugging_info (bfd *, void *); @@ -141,9 +149,17 @@ + (bfd *abfd, void *, long *symcountp, asymbol ***); #endif ---- ./binutils/debug.c.orig Sun May 8 16:17:38 2005 -+++ ./binutils/debug.c Tue Sep 26 00:25:05 2006 -@@ -553,6 +553,19 @@ +--- binutils/debug.c.orig Mon Aug 6 21:55:10 2007 ++++ binutils/debug.c Tue Oct 23 23:43:19 2007 +@@ -31,6 +31,7 @@ + #include <assert.h> + #include "bfd.h" + #include "libiberty.h" ++#include "bucomm.h" + #include "debug.h" + + /* Global information we keep for debugging. A pointer to this +@@ -552,6 +553,19 @@ struct debug_type *t; }; @@ -163,7 +179,7 @@ /* Local functions. */ static void debug_error (const char *); -@@ -589,6 +602,11 @@ +@@ -588,6 +602,11 @@ (struct debug_handle *, struct debug_type *, struct debug_type *); static bfd_boolean debug_class_type_samep (struct debug_handle *, struct debug_type *, struct debug_type *); @@ -175,7 +191,7 @@ /* Issue an error message. */ -@@ -681,6 +699,8 @@ +@@ -680,6 +699,8 @@ if (name == NULL) name = ""; @@ -184,7 +200,7 @@ nfile = (struct debug_file *) xmalloc (sizeof *nfile); memset (nfile, 0, sizeof *nfile); -@@ -721,6 +741,8 @@ +@@ -720,6 +741,8 @@ if (name == NULL) name = ""; @@ -193,7 +209,7 @@ if (info->current_unit == NULL) { -@@ -3370,4 +3392,70 @@ +@@ -3369,4 +3392,70 @@ } return TRUE; @@ -264,8 +280,9 @@ + /* Not found, pass the original name on. */ + return oname; } ---- ./binutils/debug.h.orig Sun May 8 16:17:38 2005 -+++ ./binutils/debug.h Tue Sep 26 00:25:05 2006 +diff -Nur ../binutils-2.18.orig/binutils/debug.h ./binutils/debug.h +--- ../binutils-2.18.orig/binutils/debug.h Tue Oct 23 21:44:43 2007 ++++ ./binutils/debug.h Tue Oct 23 22:18:44 2007 @@ -440,6 +440,12 @@ extern bfd_boolean debug_start_source (void *, const char *); @@ -279,9 +296,10 @@ /* Record a function definition. This implicitly starts a function block. The debug_type argument is the type of the return value. The bfd_boolean indicates whether the function is globally visible. ---- ./binutils/objcopy.c.orig Tue Feb 28 17:09:01 2006 -+++ ./binutils/objcopy.c Tue Sep 26 00:25:14 2006 -@@ -31,6 +31,7 @@ +diff -Nur ../binutils-2.18.orig/binutils/objcopy.c ./binutils/objcopy.c +--- ../binutils-2.18.orig/binutils/objcopy.c Tue Oct 23 21:44:43 2007 ++++ ./binutils/objcopy.c Tue Oct 23 22:38:29 2007 +@@ -32,6 +32,7 @@ #include "elf-bfd.h" #include <sys/stat.h> #include "libbfd.h" @@ -289,18 +307,18 @@ /* A list of symbols to explicitly strip out, or to keep. A linked list is good enough for a small number from the command line, but -@@ -257,7 +258,9 @@ - OPTION_READONLY_TEXT, - OPTION_WRITABLE_TEXT, +@@ -272,7 +273,9 @@ OPTION_PURE, -- OPTION_IMPURE -+ OPTION_IMPURE, + OPTION_IMPURE, + OPTION_EXTRACT_SYMBOL, +- OPTION_REVERSE_BYTES ++ OPTION_REVERSE_BYTES, + OPTION_CHANGE_PATHNAME, + OPTION_BASENAME }; /* Options to handle if running as "strip". */ -@@ -301,10 +304,12 @@ +@@ -316,10 +319,12 @@ {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS}, {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS}, {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE}, @@ -313,7 +331,7 @@ {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS}, {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA}, {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA}, -@@ -483,6 +488,8 @@ +@@ -504,6 +509,8 @@ --prefix-alloc-sections <prefix>\n\ Add <prefix> to start of every allocatable\n\ section name\n\ @@ -322,16 +340,16 @@ -v --verbose List all object files modified\n\ @<file> Read options from <file>\n\ -V --version Display this program's version number\n\ -@@ -821,6 +828,8 @@ +@@ -911,6 +918,8 @@ + asymbol **from = isyms, **to = osyms; long src_count = 0, dst_count = 0; - int relocatable = (abfd->flags & (HAS_RELOC | EXEC_P | DYNAMIC)) - == HAS_RELOC; + int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0; + bfd_boolean need_for_debugging = convert_debugging + && bfd_get_arch (abfd) == bfd_arch_avr; for (; src_count < symcount; src_count++) { -@@ -916,9 +925,10 @@ +@@ -1010,9 +1019,10 @@ || bfd_is_com_section (bfd_get_section (sym))) keep = strip_symbols != STRIP_UNNEEDED; else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */ @@ -345,7 +363,7 @@ else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym))) /* COMDAT sections store special information in local symbols, so we cannot risk stripping any of them. */ -@@ -2417,6 +2427,10 @@ +@@ -2588,6 +2598,10 @@ return write_ieee_debugging_info (obfd, dhandle); if (bfd_get_flavour (obfd) == bfd_target_coff_flavour @@ -356,7 +374,7 @@ || bfd_get_flavour (obfd) == bfd_target_elf_flavour) { bfd_byte *syms, *strings; -@@ -3096,6 +3110,30 @@ +@@ -3287,6 +3301,30 @@ case OPTION_PREFIX_ALLOC_SECTIONS: prefix_alloc_sections_string = optarg; @@ -387,9 +405,10 @@ break; case OPTION_READONLY_TEXT: ---- ./binutils/rdcoff.c.orig Sun May 8 16:17:39 2005 -+++ ./binutils/rdcoff.c Tue Sep 26 00:25:05 2006 -@@ -80,6 +80,9 @@ +diff -Nur ../binutils-2.18.orig/binutils/rdcoff.c ./binutils/rdcoff.c +--- ../binutils-2.18.orig/binutils/rdcoff.c Tue Oct 23 21:44:43 2007 ++++ ./binutils/rdcoff.c Tue Oct 23 22:18:44 2007 +@@ -82,6 +82,9 @@ struct coff_slots *slots; /* Basic types. */ debug_type basic[T_MAX + 1]; @@ -399,7 +418,7 @@ }; static debug_type *coff_get_slot (struct coff_types *, int); -@@ -99,6 +102,7 @@ +@@ -101,6 +104,7 @@ (bfd *, struct coff_types *, asymbol *, long, struct internal_syment *, void *, debug_type, bfd_boolean); static bfd_boolean external_coff_symbol_p (int sym_class); @@ -407,7 +426,7 @@ /* Return the slot for a type. */ -@@ -269,8 +273,7 @@ +@@ -271,8 +275,7 @@ break; case T_INT: @@ -417,7 +436,7 @@ name = "int"; break; -@@ -285,7 +288,7 @@ +@@ -287,7 +290,7 @@ break; case T_DOUBLE: @@ -426,7 +445,7 @@ name = "double"; break; -@@ -305,7 +308,7 @@ +@@ -307,7 +310,7 @@ break; case T_UINT: @@ -435,7 +454,7 @@ name = "unsigned int"; break; -@@ -563,6 +566,8 @@ +@@ -565,6 +568,8 @@ case C_WEAKEXT: case C_EXT: @@ -444,7 +463,7 @@ if (! debug_record_variable (dhandle, bfd_asymbol_name (sym), type, DEBUG_GLOBAL, bfd_asymbol_value (sym))) return FALSE; -@@ -578,9 +583,9 @@ +@@ -580,9 +585,9 @@ break; case C_REG: @@ -456,7 +475,7 @@ return FALSE; break; -@@ -594,9 +599,9 @@ +@@ -596,9 +601,9 @@ break; case C_REGPARM: @@ -468,7 +487,7 @@ return FALSE; break; -@@ -646,6 +651,28 @@ +@@ -648,6 +653,28 @@ return FALSE; } @@ -497,7 +516,7 @@ /* This is the main routine. It looks through all the symbols and handles them. */ -@@ -672,6 +699,17 @@ +@@ -674,6 +701,17 @@ types.slots = NULL; for (i = 0; i <= T_MAX; i++) types.basic[i] = DEBUG_TYPE_NULL; @@ -515,7 +534,7 @@ next_c_file = -1; fnname = NULL; -@@ -732,7 +770,6 @@ +@@ -734,7 +772,6 @@ switch (syment.n_sclass) { case C_EFCN: @@ -523,7 +542,7 @@ case C_ULABEL: case C_USTATIC: case C_LINE: -@@ -755,6 +792,8 @@ +@@ -757,6 +794,8 @@ /* Fall through. */ case C_WEAKEXT: case C_EXT: @@ -532,9 +551,10 @@ if (ISFCN (syment.n_type)) { fnname = name; ---- ./binutils/wrcoff.c.orig Tue Sep 26 00:25:05 2006 -+++ ./binutils/wrcoff.c Tue Sep 26 00:25:05 2006 -@@ -0,0 +1,3409 @@ +diff -Nur ../binutils-2.18.orig/binutils/wrcoff.c ./binutils/wrcoff.c +--- ../binutils-2.18.orig/binutils/wrcoff.c Thu Jan 1 01:00:00 1970 ++++ ./binutils/wrcoff.c Tue Oct 23 22:18:44 2007 +@@ -0,0 +1,3410 @@ +/* wrcoff.c -- Generate (AVR) COFF debugging information + Copyright 2003 Free Software Foundation, Inc. + @@ -565,6 +585,7 @@ +#include <stdio.h> +#include <assert.h> + ++#include "sysdep.h" +#include "bfd.h" +#include "coff/internal.h" +#include "bucomm.h" @@ -3944,9 +3965,10 @@ + + return TRUE; +} ---- ./bfd/Makefile.am.orig Fri Jun 23 20:17:17 2006 -+++ ./bfd/Makefile.am Tue Sep 26 00:25:05 2006 -@@ -199,6 +199,8 @@ +diff -Nur ../binutils-2.18.orig/bfd/Makefile.am ./bfd/Makefile.am +--- ../binutils-2.18.orig/bfd/Makefile.am Tue Oct 23 21:44:07 2007 ++++ ./bfd/Makefile.am Tue Oct 23 22:41:01 2007 +@@ -208,6 +208,8 @@ coff-apollo.lo \ coff-arm.lo \ coff-aux.lo \ @@ -3955,7 +3977,7 @@ coff-h8300.lo \ coff-h8500.lo \ coff-i386.lo \ -@@ -371,6 +373,8 @@ +@@ -387,6 +389,8 @@ coff-apollo.c \ coff-arm.c \ coff-aux.c \ @@ -3964,22 +3986,25 @@ coff-h8300.c \ coff-h8500.c \ coff-i386.c \ -@@ -934,10 +938,10 @@ +@@ -976,13 +980,13 @@ bfdver.h: $(srcdir)/version.h $(srcdir)/Makefile.in @echo "creating $@" @bfd_version=`echo "$(VERSION)" | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\ - bfd_version_string="\"$(VERSION)\"" ;\ + bfd_version_string="\"$(VERSION) + coff-avr-patch (20050630)\"" ;\ + bfd_soversion="$(VERSION)" ;\ + bfd_version_package="\"$(PKGVERSION)\"" ;\ + report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ if test "x$(RELEASE)" = x ; then \ bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -- bfd_version_string="\"$(VERSION) $${bfd_version_date}\"" ;\ -+ bfd_version_string="\"$(VERSION) $${bfd_version_date} + coff-avr-patch (20050630)\"" ;\ +- bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\ ++ bfd_version_string="\"$(VERSION).$${bfd_version_date} + coff-avr-patch (20050630)\"" ;\ + bfd_soversion="$(VERSION).$${bfd_version_date}" ;\ fi ;\ - sed -e "s/@bfd_version@/$$bfd_version/" -e "s/@bfd_version_string@/$$bfd_version_string/" < $(srcdir)/version.h > $@ - -@@ -1129,6 +1133,12 @@ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m68k.h $(INCDIR)/coff/external.h \ - coff-m68k.c $(INCDIR)/hashtab.h libcoff.h $(INCDIR)/bfdlink.h \ + sed -e "s,@bfd_version@,$$bfd_version," \ +@@ -1186,6 +1190,12 @@ + coff-m68k.c $(INCDIR)/hashtab.h $(INCDIR)/coff/m68k.h \ + $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ coffcode.h coffswap.h +coff-avr.lo: coff-avr.c $(INCDIR)/filenames.h $(INCDIR)/coff/avr.h \ + $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \ @@ -3990,9 +4015,10 @@ coff-h8300.lo: coff-h8300.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/bfdlink.h genlink.h $(INCDIR)/coff/h8300.h \ $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \ ---- ./bfd/Makefile.in.orig Fri Jun 23 20:17:19 2006 -+++ ./bfd/Makefile.in Tue Sep 26 00:25:05 2006 -@@ -436,6 +436,8 @@ +diff -Nur ../binutils-2.18.orig/bfd/Makefile.in ./bfd/Makefile.in +--- ../binutils-2.18.orig/bfd/Makefile.in Tue Oct 23 21:44:07 2007 ++++ ./bfd/Makefile.in Tue Oct 23 22:41:31 2007 +@@ -458,6 +458,8 @@ coff-apollo.lo \ coff-arm.lo \ coff-aux.lo \ @@ -4001,7 +4027,7 @@ coff-h8300.lo \ coff-h8500.lo \ coff-i386.lo \ -@@ -608,6 +610,8 @@ +@@ -637,6 +639,8 @@ coff-apollo.c \ coff-arm.c \ coff-aux.c \ @@ -4010,22 +4036,25 @@ coff-h8300.c \ coff-h8500.c \ coff-i386.c \ -@@ -1500,10 +1504,10 @@ +@@ -1556,13 +1560,13 @@ bfdver.h: $(srcdir)/version.h $(srcdir)/Makefile.in @echo "creating $@" @bfd_version=`echo "$(VERSION)" | sed -e 's/\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\)\.*\([^\.]*\).*/\1.00\2.00\3.00\4.00\5/' -e 's/\([^\.]*\)\..*\(..\)\..*\(..\)\..*\(..\)\..*\(..\)$$/\1\2\3\4\5/'` ;\ - bfd_version_string="\"$(VERSION)\"" ;\ + bfd_version_string="\"$(VERSION) + coff-avr-patch (20050630)\"" ;\ + bfd_soversion="$(VERSION)" ;\ + bfd_version_package="\"$(PKGVERSION)\"" ;\ + report_bugs_to="\"$(REPORT_BUGS_TO)\"" ;\ if test "x$(RELEASE)" = x ; then \ bfd_version_date=`sed -n -e 's/.*DATE //p' < $(srcdir)/version.h` ;\ -- bfd_version_string="\"$(VERSION) $${bfd_version_date}\"" ;\ -+ bfd_version_string="\"$(VERSION) $${bfd_version_date} + coff-avr-patch (20050630)\"" ;\ +- bfd_version_string="\"$(VERSION).$${bfd_version_date}\"" ;\ ++ bfd_version_string="\"$(VERSION).$${bfd_version_date} + coff-avr-patch (20050630)\"" ;\ + bfd_soversion="$(VERSION).$${bfd_version_date}" ;\ fi ;\ - sed -e "s/@bfd_version@/$$bfd_version/" -e "s/@bfd_version_string@/$$bfd_version_string/" < $(srcdir)/version.h > $@ - -@@ -1695,6 +1699,12 @@ - $(INCDIR)/coff/internal.h $(INCDIR)/coff/m68k.h $(INCDIR)/coff/external.h \ - coff-m68k.c $(INCDIR)/hashtab.h libcoff.h $(INCDIR)/bfdlink.h \ + sed -e "s,@bfd_version@,$$bfd_version," \ +@@ -1766,6 +1770,12 @@ + coff-m68k.c $(INCDIR)/hashtab.h $(INCDIR)/coff/m68k.h \ + $(INCDIR)/coff/internal.h libcoff.h $(INCDIR)/bfdlink.h \ coffcode.h coffswap.h +coff-avr.lo: coff-avr.c $(INCDIR)/filenames.h $(INCDIR)/coff/avr.h \ + $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \ @@ -4036,8 +4065,9 @@ coff-h8300.lo: coff-h8300.c $(INCDIR)/filenames.h $(INCDIR)/hashtab.h \ $(INCDIR)/bfdlink.h genlink.h $(INCDIR)/coff/h8300.h \ $(INCDIR)/coff/external.h $(INCDIR)/coff/internal.h \ ---- ./bfd/coff-avr.c.orig Tue Sep 26 00:25:05 2006 -+++ ./bfd/coff-avr.c Tue Sep 26 00:25:05 2006 +diff -Nur ../binutils-2.18.orig/bfd/coff-avr.c ./bfd/coff-avr.c +--- ../binutils-2.18.orig/bfd/coff-avr.c Thu Jan 1 01:00:00 1970 ++++ ./bfd/coff-avr.c Tue Oct 23 22:18:44 2007 @@ -0,0 +1,609 @@ +/* BFD back-end for Atmel AVR COFF files. + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2003 @@ -4648,8 +4678,9 @@ + + COFF_SWAP_TABLE +}; ---- ./bfd/coff-ext-avr.c.orig Tue Sep 26 00:25:05 2006 -+++ ./bfd/coff-ext-avr.c Tue Sep 26 00:25:05 2006 +diff -Nur ../binutils-2.18.orig/bfd/coff-ext-avr.c ./bfd/coff-ext-avr.c +--- ../binutils-2.18.orig/bfd/coff-ext-avr.c Thu Jan 1 01:00:00 1970 ++++ ./bfd/coff-ext-avr.c Tue Oct 23 22:18:44 2007 @@ -0,0 +1,424 @@ +/* BFD back-end for Atmel AVR "extended" COFF files. + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1999, 2000, 2001, 2003 @@ -5075,14 +5106,15 @@ + + COFF_SWAP_TABLE +}; ---- ./bfd/coffcode.h.orig Tue Oct 25 19:40:09 2005 -+++ ./bfd/coffcode.h Tue Sep 26 00:25:05 2006 +diff -Nur ../binutils-2.18.orig/bfd/coffcode.h ./bfd/coffcode.h +--- ../binutils-2.18.orig/bfd/coffcode.h Tue Oct 23 21:44:07 2007 ++++ ./bfd/coffcode.h Tue Oct 23 22:18:44 2007 @@ -1,3 +1,4 @@ + /* Support for the generic parts of most COFF variants, for BFD. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004, 2005 -@@ -1760,6 +1761,17 @@ + 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 +@@ -1769,6 +1770,17 @@ coff->relocbase = 0; coff->local_toc_sym_map = 0; @@ -5100,7 +5132,7 @@ /* make_abs_section(abfd);*/ return TRUE; -@@ -1784,17 +1796,6 @@ +@@ -1793,17 +1805,6 @@ coff->sym_filepos = internal_f->f_symptr; @@ -5118,7 +5150,7 @@ coff->timestamp = internal_f->f_timdat; obj_raw_syment_count (abfd) = -@@ -1915,6 +1916,11 @@ +@@ -1930,6 +1931,11 @@ } break; #endif @@ -5130,7 +5162,7 @@ #ifdef MC68MAGIC case MC68MAGIC: case M68MAGIC: -@@ -2707,6 +2713,13 @@ +@@ -2726,6 +2732,13 @@ return TRUE; #endif @@ -5144,7 +5176,7 @@ #ifdef PPCMAGIC case bfd_arch_powerpc: *magicp = PPCMAGIC; -@@ -3498,6 +3511,11 @@ +@@ -3522,6 +3535,11 @@ section.s_page = coff_get_section_load_page (current); #endif @@ -5156,7 +5188,7 @@ #ifdef COFF_WITH_PE section.s_paddr = 0; #endif -@@ -3840,6 +3858,17 @@ +@@ -3866,6 +3884,17 @@ internal_a.magic = ZMAGIC; #endif @@ -5174,7 +5206,7 @@ #if defined(PPC_PE) #define __A_MAGIC_SET__ internal_a.magic = IMAGE_NT_OPTIONAL_HDR_MAGIC; -@@ -3905,8 +3934,16 @@ +@@ -3933,8 +3962,16 @@ #endif } @@ -5191,7 +5223,7 @@ /* Now should write relocs, strings, syms. */ obj_sym_filepos (abfd) = sym_base; -@@ -4092,22 +4129,29 @@ +@@ -4120,22 +4157,29 @@ char * buff; bfd_size_type amount = bfd_coff_aoutsz (abfd); @@ -5231,7 +5263,7 @@ } #ifdef RS6000COFF_C else -@@ -4388,6 +4432,10 @@ +@@ -4491,6 +4535,10 @@ /* In PE, 0x69 (105) denotes a weak external symbol. */ case C_NT_WEAK: #endif @@ -5242,7 +5274,7 @@ switch (coff_classify_symbol (abfd, &src->u.syment)) { case COFF_SYMBOL_GLOBAL: -@@ -4611,7 +4659,9 @@ +@@ -4714,7 +4762,9 @@ && src->u.syment.n_scnum == 0) break; /* Fall through. */ @@ -5252,9 +5284,10 @@ case C_ULABEL: /* Undefined label. */ case C_USTATIC: /* Undefined static. */ #ifndef COFF_WITH_PE ---- ./bfd/coffgen.c.orig Mon May 23 19:44:52 2005 -+++ ./bfd/coffgen.c Tue Sep 26 00:25:05 2006 -@@ -682,6 +682,20 @@ +diff -Nur ../binutils-2.18.orig/bfd/coffgen.c ./bfd/coffgen.c +--- ../binutils-2.18.orig/bfd/coffgen.c Tue Oct 23 21:44:07 2007 ++++ ./bfd/coffgen.c Tue Oct 23 23:07:23 2007 +@@ -687,6 +687,20 @@ if (last_file != NULL) last_file->n_value = native_index; last_file = &(s->u.syment); @@ -5275,7 +5308,7 @@ } else /* Modify the symbol values according to their section and -@@ -810,6 +824,20 @@ +@@ -815,6 +829,20 @@ { if (name_length <= filnmlen) strncpy (auxent->x_file.x_fname, name, filnmlen); @@ -5296,7 +5329,7 @@ else { auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE; -@@ -1213,7 +1241,11 @@ +@@ -1218,7 +1246,11 @@ if (bfd_bwrite (".file", (bfd_size_type) 6, abfd) != 6) return FALSE; } @@ -5309,7 +5342,7 @@ } else maxlen = bfd_coff_force_symnames_in_strings (abfd) ? 0 : SYMNMLEN; -@@ -1648,14 +1680,27 @@ +@@ -1655,14 +1687,27 @@ { /* Ordinary short filename, put into memory anyway. The Microsoft PE tools sometimes store a filename in @@ -5319,7 +5352,7 @@ if (internal_ptr->u.syment.n_numaux > 1 - && coff_data (abfd)->pe) - internal_ptr->u.syment._n._n_n._n_offset = -- ((long) +- ((bfd_hostptr_t) - copy_name (abfd, - (internal_ptr + 1)->u.auxent.x_file.x_fname, - internal_ptr->u.syment.n_numaux * symesz)); @@ -5336,15 +5369,15 @@ + into the aux records. */ + b = (char *) bfd_alloc (abfd, + internal_ptr->u.syment.n_numaux * FILNMLEN + 1); -+ internal_ptr->u.syment._n._n_n._n_offset = (long) b; ++ internal_ptr->u.syment._n._n_n._n_offset = (bfd_hostptr_t) b; + b[internal_ptr->u.syment.n_numaux * FILNMLEN] = '\0'; + for (i = 0; i < internal_ptr->u.syment.n_numaux; i++, b += FILNMLEN) + memcpy (b, (internal_ptr + i + 1)->u.auxent.x_file.x_fname, FILNMLEN); + } else internal_ptr->u.syment._n._n_n._n_offset = - ((long) -@@ -1761,9 +1806,9 @@ + ((bfd_hostptr_t) +@@ -1768,9 +1813,9 @@ if (new == NULL) return NULL; @@ -5357,9 +5390,10 @@ new->native = bfd_zalloc (abfd, amt); if (!new->native) return NULL; ---- ./bfd/coffswap.h.orig Wed May 4 17:53:05 2005 -+++ ./bfd/coffswap.h Tue Sep 26 00:25:05 2006 -@@ -382,7 +382,11 @@ +diff -Nur ../binutils-2.18.orig/bfd/coffswap.h ./bfd/coffswap.h +--- ../binutils-2.18.orig/bfd/coffswap.h Tue Oct 23 21:44:07 2007 ++++ ./bfd/coffswap.h Tue Oct 23 22:18:44 2007 +@@ -383,7 +383,11 @@ void * ext1, int type, int class, @@ -5372,7 +5406,7 @@ int numaux, void * in1) { -@@ -408,9 +412,13 @@ +@@ -409,9 +413,13 @@ #else if (numaux > 1) { @@ -5386,9 +5420,10 @@ } else memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN); ---- ./bfd/config.bfd.orig Wed Apr 5 14:41:57 2006 -+++ ./bfd/config.bfd Tue Sep 26 00:25:05 2006 -@@ -309,6 +309,7 @@ +diff -Nur ../binutils-2.18.orig/bfd/config.bfd ./bfd/config.bfd +--- ../binutils-2.18.orig/bfd/config.bfd Tue Oct 23 21:44:07 2007 ++++ ./bfd/config.bfd Tue Oct 23 22:18:44 2007 +@@ -327,6 +327,7 @@ avr-*-*) targ_defvec=bfd_elf32_avr_vec @@ -5396,9 +5431,10 @@ ;; bfin-*-*) ---- ./bfd/configure.orig Fri Jun 23 20:17:03 2006 -+++ ./bfd/configure Tue Sep 26 00:25:05 2006 -@@ -13064,6 +13064,8 @@ +diff -Nur ../binutils-2.18.orig/bfd/configure ./bfd/configure +--- ../binutils-2.18.orig/bfd/configure Tue Oct 23 21:44:09 2007 ++++ ./bfd/configure Tue Oct 23 22:18:44 2007 +@@ -19034,6 +19034,8 @@ armpe_little_vec) tb="$tb pe-arm.lo peigen.lo cofflink.lo " ;; armpei_big_vec) tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;; armpei_little_vec) tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;; @@ -5407,9 +5443,10 @@ b_out_vec_big_host) tb="$tb bout.lo aout32.lo" ;; b_out_vec_little_host) tb="$tb bout.lo aout32.lo" ;; bfd_efi_app_ia32_vec) tb="$tb efi-app-ia32.lo peigen.lo cofflink.lo" ;; ---- ./bfd/configure.in.orig Fri Jun 23 20:17:07 2006 -+++ ./bfd/configure.in Tue Sep 26 00:25:05 2006 -@@ -577,6 +577,8 @@ +diff -Nur ../binutils-2.18.orig/bfd/configure.in ./bfd/configure.in +--- ../binutils-2.18.orig/bfd/configure.in Tue Oct 23 21:44:07 2007 ++++ ./bfd/configure.in Tue Oct 23 22:18:44 2007 +@@ -612,6 +612,8 @@ armpe_little_vec) tb="$tb pe-arm.lo peigen.lo cofflink.lo " ;; armpei_big_vec) tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;; armpei_little_vec) tb="$tb pei-arm.lo peigen.lo cofflink.lo " ;; @@ -5418,9 +5455,10 @@ b_out_vec_big_host) tb="$tb bout.lo aout32.lo" ;; b_out_vec_little_host) tb="$tb bout.lo aout32.lo" ;; bfd_efi_app_ia32_vec) tb="$tb efi-app-ia32.lo peigen.lo cofflink.lo" ;; ---- ./bfd/targets.c.orig Wed Apr 5 14:41:57 2006 -+++ ./bfd/targets.c Tue Sep 26 00:25:05 2006 -@@ -548,6 +548,8 @@ +diff -Nur ../binutils-2.18.orig/bfd/targets.c ./bfd/targets.c +--- ../binutils-2.18.orig/bfd/targets.c Tue Oct 23 21:44:09 2007 ++++ ./bfd/targets.c Tue Oct 23 22:18:44 2007 +@@ -558,6 +558,8 @@ extern const bfd_target armpe_little_vec; extern const bfd_target armpei_big_vec; extern const bfd_target armpei_little_vec; @@ -5429,7 +5467,7 @@ extern const bfd_target b_out_vec_big_host; extern const bfd_target b_out_vec_little_host; extern const bfd_target bfd_efi_app_ia32_vec; -@@ -848,6 +850,8 @@ +@@ -876,6 +878,8 @@ &armpe_little_vec, &armpei_big_vec, &armpei_little_vec, @@ -5438,8 +5476,9 @@ &b_out_vec_big_host, &b_out_vec_little_host, &bfd_efi_app_ia32_vec, ---- ./include/coff/avr.h.orig Tue Sep 26 00:25:05 2006 -+++ ./include/coff/avr.h Tue Sep 26 00:25:06 2006 +diff -Nur ../binutils-2.18.orig/include/coff/avr.h ./include/coff/avr.h +--- ../binutils-2.18.orig/include/coff/avr.h Thu Jan 1 01:00:00 1970 ++++ ./include/coff/avr.h Tue Oct 23 22:18:44 2007 @@ -0,0 +1,110 @@ +/* coff information for Atmel AVR. + @@ -5551,9 +5590,10 @@ + +#define RELOC struct external_reloc +#define RELSZ 10 ---- ./include/coff/internal.h.orig Sun Feb 5 12:57:34 2006 -+++ ./include/coff/internal.h Tue Sep 26 00:25:06 2006 -@@ -592,6 +592,8 @@ +diff -Nur ../binutils-2.18.orig/include/coff/internal.h ./include/coff/internal.h +--- ../binutils-2.18.orig/include/coff/internal.h Tue Oct 23 21:44:43 2007 ++++ ./include/coff/internal.h Tue Oct 23 22:18:44 2007 +@@ -630,6 +630,8 @@ }; diff --git a/devel/avr-binutils/files/patch-newdevices b/devel/avr-binutils/files/patch-newdevices index a4daa6dc6de9..117dd9349167 100644 --- a/devel/avr-binutils/files/patch-newdevices +++ b/devel/avr-binutils/files/patch-newdevices @@ -1,54 +1,97 @@ ---- gas/config/tc-avr.c.orig Mon May 14 00:03:05 2007 -+++ gas/config/tc-avr.c Mon May 14 00:04:56 2007 -@@ -111,27 +111,36 @@ +--- gas/config/tc-avr.c~ Mon Aug 6 21:59:55 2007 ++++ gas/config/tc-avr.c Sat Oct 27 16:30:54 2007 +@@ -97,22 +97,28 @@ + {"attiny25", AVR_ISA_TINY2, bfd_mach_avr2}, + {"attiny45", AVR_ISA_TINY2, bfd_mach_avr2}, + {"attiny85", AVR_ISA_TINY2, bfd_mach_avr2}, ++ {"attiny43u", AVR_ISA_TINY2, bfd_mach_avr2}, ++ {"attiny48", AVR_ISA_TINY2, bfd_mach_avr2}, + {"atmega603", AVR_ISA_M603, bfd_mach_avr3}, /* XXX -> m103 */ + {"atmega103", AVR_ISA_M103, bfd_mach_avr3}, + {"at43usb320", AVR_ISA_M103, bfd_mach_avr3}, + {"at43usb355", AVR_ISA_M603, bfd_mach_avr3}, + {"at76c711", AVR_ISA_M603, bfd_mach_avr3}, + {"atmega48", AVR_ISA_PWMx, bfd_mach_avr4}, ++ {"atmega48p", AVR_ISA_PWMx, bfd_mach_avr4}, + {"atmega8", AVR_ISA_M8, bfd_mach_avr4}, + {"atmega83", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8535 */ + {"atmega85", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8 */ {"atmega88", AVR_ISA_PWMx, bfd_mach_avr4}, ++ {"atmega88p", AVR_ISA_PWMx, bfd_mach_avr4}, {"atmega8515", AVR_ISA_M8, bfd_mach_avr4}, {"atmega8535", AVR_ISA_M8, bfd_mach_avr4}, -+ {"atmega8hva", AVR_ISA_PWMx, bfd_mach_avr4}, -+ {"at90pwm1", AVR_ISA_PWMx, bfd_mach_avr4}, + {"atmega8hva", AVR_ISA_PWMx, bfd_mach_avr4}, + {"at90pwm1", AVR_ISA_PWMx, bfd_mach_avr4}, {"at90pwm2", AVR_ISA_PWMx, bfd_mach_avr4}, ++ {"at90pwm2b", AVR_ISA_PWMx, bfd_mach_avr4}, {"at90pwm3", AVR_ISA_PWMx, bfd_mach_avr4}, ++ {"at90pwm3b", AVR_ISA_PWMx, bfd_mach_avr4}, {"atmega16", AVR_ISA_M323, bfd_mach_avr5}, {"atmega161", AVR_ISA_M161, bfd_mach_avr5}, {"atmega162", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega163", AVR_ISA_M161, bfd_mach_avr5}, -- {"atmega164", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega164p", AVR_ISA_M323, bfd_mach_avr5}, +@@ -121,6 +127,7 @@ {"atmega165", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega165p", AVR_ISA_M323, bfd_mach_avr5}, + {"atmega165p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega168", AVR_ISA_M323, bfd_mach_avr5}, ++ {"atmega168p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega169", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega169p", AVR_ISA_M323, bfd_mach_avr5}, + {"atmega169p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega32", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega323", AVR_ISA_M323, bfd_mach_avr5}, -- {"atmega324", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega324p", AVR_ISA_M323, bfd_mach_avr5}, +@@ -128,6 +135,7 @@ + {"atmega324p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega325", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega325p", AVR_ISA_M323, bfd_mach_avr5}, + {"atmega325p", AVR_ISA_M323, bfd_mach_avr5}, ++ {"atmega328p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega329", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega329p", AVR_ISA_M323, bfd_mach_avr5}, + {"atmega329p", AVR_ISA_M323, bfd_mach_avr5}, {"atmega3250", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega3250p",AVR_ISA_M323, bfd_mach_avr5}, - {"atmega3290", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega3290p",AVR_ISA_M323, bfd_mach_avr5}, - {"atmega406", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega64", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega640", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega644", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega644p", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega128", AVR_ISA_M128, bfd_mach_avr5}, - {"atmega1280", AVR_ISA_M128, bfd_mach_avr5}, - {"atmega1281", AVR_ISA_M128, bfd_mach_avr5}, -@@ -139,9 +148,12 @@ - {"atmega649", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega6450", AVR_ISA_M323, bfd_mach_avr5}, - {"atmega6490", AVR_ISA_M323, bfd_mach_avr5}, -+ {"atmega16hva",AVR_ISA_M323, bfd_mach_avr5}, +@@ -150,6 +158,8 @@ {"at90can32" , AVR_ISA_M323, bfd_mach_avr5}, {"at90can64" , AVR_ISA_M323, bfd_mach_avr5}, {"at90can128", AVR_ISA_M128, bfd_mach_avr5}, -+ {"at90usb82", AVR_ISA_M323, bfd_mach_avr5}, -+ {"at90usb162", AVR_ISA_M323, bfd_mach_avr5}, ++ {"at90pwm216", AVR_ISA_M323, bfd_mach_avr5}, ++ {"at90pwm316", AVR_ISA_M323, bfd_mach_avr5}, + {"at90usb82", AVR_ISA_M323, bfd_mach_avr5}, + {"at90usb162", AVR_ISA_M323, bfd_mach_avr5}, {"at90usb646", AVR_ISA_M323, bfd_mach_avr5}, - {"at90usb647", AVR_ISA_M323, bfd_mach_avr5}, - {"at90usb1286",AVR_ISA_M128, bfd_mach_avr5}, +--- gas/doc/c-avr.texi~ Mon Aug 6 22:00:08 2007 ++++ gas/doc/c-avr.texi Sat Oct 27 16:30:52 2007 +@@ -41,24 +41,26 @@ + attiny26, at90s2333, at90s2343, at90s4414, at90s4433, at90s4434, + at90s8515, at90c8534, at90s8535, at86rf401, attiny13, attiny2313, + attiny261, attiny461, attiny861, attiny24, attiny44, attiny84, attiny25, +-attiny45, attiny85). ++attiny45, attiny85, attiny43u, attiny48). + + Instruction set avr3 is for the classic AVR core with up to 128K program + memory space (MCU types: atmega103, atmega603, at43usb320, at43usb355, + at76c711). + +-Instruction set avr4 is for the enhanced AVR core with up to 8K program +-memory space (MCU types: atmega48, atmega8, atmega83, atmega85, atmega88, +-atmega8515, atmega8535, atmega8hva, at90pwm1, at90pwm2, at90pwm3). ++Instruction set avr4 is for the enhanced AVR core with up to 8K ++program memory space (MCU types: atmega48, atmega48p, atmega8, ++atmega83, atmega85, atmega88, atmega88p, atmega8515, atmega8535, ++atmega8hva, at90pwm1, at90pwm2, at90pwm2b, at90pwm3, at90pwm3b). + +-Instruction set avr5 is for the enhanced AVR core with up to 128K program +-memory space (MCU types: atmega16, atmega161, atmega162, atmega163, +-atmega164p, atmega165, atmega165p, atmega168, atmega169, atmega169p, +-atmega32, atmega323, atmega324p, atmega325, atmega325p, atmega329, +-atmega329p, atmega3250, atmega3250p, atmega3290, atmega3290p, atmega406, +-atmega64, atmega640, atmega644, atmega644p, atmega128, atmega1280, +-atmega1281, atmega645, atmega649, atmega6450, atmega6490, atmega16hva, +-at90can32, at90can64, at90can128, at90usb82, at90usb162, at90usb646, ++Instruction set avr5 is for the enhanced AVR core with up to 128K ++program memory space (MCU types: atmega16, atmega161, atmega162, ++atmega163, atmega164p, atmega165, atmega165p, atmega168, atmega168p, ++atmega169, atmega169p, atmega32, atmega323, atmega324p, atmega325, ++atmega325p, atmega328p, atmega329, atmega329p, atmega3250, ++atmega3250p, atmega3290, atmega3290p, atmega406, atmega64, atmega640, ++atmega644, atmega644p, atmega128, atmega1280, atmega1281, atmega645, ++atmega649, atmega6450, atmega6490, atmega16hva, at90can32, at90can64, ++at90can128, at90pwm216, at90pwm316, at90usb82, at90usb162, at90usb646, + at90usb647, at90usb1286, at90usb1287, at94k). + + Instruction set avr6 is for the enhanced AVR core with 256K program diff --git a/devel/avr-binutils/pkg-descr b/devel/avr-binutils/pkg-descr index f28d07b077f8..4f41b6ac4c28 100644 --- a/devel/avr-binutils/pkg-descr +++ b/devel/avr-binutils/pkg-descr @@ -7,13 +7,13 @@ generate AVR (extended) COFF files to be used on Atmel AVR Studio and VMLAB. Note that this patch has known issues, see http://www.sax.de/~joerg/README.coff-avr-patch -In addition to the stock binutils-2.17 distribution, support for the +In addition to the stock binutils-2.18 distribution, support for the following AVR devices has been added by a private patch: - AT90PWM1 - AT90USB82/162 - ATmega164P/324P/644P - ATmega165P/169P - ATmega325P/3250P/329P/3290P - ATmega2560/2561 - ATmega8HVA/16HVA + ATtiny43U + ATtiny48 + AT90PWM2B/PWM3B + AT90PWM216/PWM316 + ATmega48P/88P/168P/328P + +WWW: http://www.sourceware.org/binutils/ diff --git a/devel/avr-binutils/pkg-plist b/devel/avr-binutils/pkg-plist index ae9737d46efa..4650289c1b61 100644 --- a/devel/avr-binutils/pkg-plist +++ b/devel/avr-binutils/pkg-plist @@ -2,6 +2,7 @@ avr/bin/ar avr/bin/as avr/bin/ld avr/bin/nm +avr/bin/objcopy avr/bin/objdump avr/bin/ranlib avr/bin/strip @@ -54,9 +55,11 @@ share/locale/es/LC_MESSAGES/binutils.mo share/locale/es/LC_MESSAGES/gas.mo share/locale/es/LC_MESSAGES/ld.mo share/locale/fi/LC_MESSAGES/binutils.mo +share/locale/fi/LC_MESSAGES/ld.mo share/locale/fr/LC_MESSAGES/binutils.mo share/locale/fr/LC_MESSAGES/gas.mo share/locale/fr/LC_MESSAGES/ld.mo +share/locale/ga/LC_MESSAGES/ld.mo share/locale/ja/LC_MESSAGES/binutils.mo share/locale/ro/LC_MESSAGES/binutils.mo share/locale/ru/LC_MESSAGES/binutils.mo @@ -67,11 +70,13 @@ share/locale/sv/LC_MESSAGES/ld.mo share/locale/tr/LC_MESSAGES/binutils.mo share/locale/tr/LC_MESSAGES/gas.mo share/locale/tr/LC_MESSAGES/ld.mo +share/locale/uk/LC_MESSAGES/binutils.mo share/locale/vi/LC_MESSAGES/binutils.mo share/locale/vi/LC_MESSAGES/ld.mo share/locale/zh_CN/LC_MESSAGES/binutils.mo share/locale/zh_CN/LC_MESSAGES/ld.mo share/locale/zh_TW/LC_MESSAGES/binutils.mo +share/locale/zh_TW/LC_MESSAGES/ld.mo @dirrmtry share/locale/rw/LC_MESSAGES @dirrmtry share/locale/rw @dirrm avr/lib/ldscripts |