Add support for AVR6 family

This commit is contained in:
Nick Clifton 2006-05-24 07:36:12 +00:00
parent f607ec8858
commit 28c9d252b4
27 changed files with 1631 additions and 183 deletions

View File

@ -1,3 +1,51 @@
2006-05-24 Bjoern Haase <bjoern.m.haase@web.de>
* archures.c: Add bfd_mach_avr6.
* cpu-avr.c: Likewise.
* reloc.c (BFD_RELOC_AVR_LO8_LDI_GS, BFD_RELOC_AVR_HI8_LDI_GS):
New relocations.
* libbfd.h: Regenerate.
* bfd-in2.h:Regenerate.
* elf32-avr.h: New file. Protoypes for functions accessed from ld.
* elf32-avr.c: Add elf32-avr.h to include list.
(elf32_avr_stub_hash_entry): New function.
(elf32_avr_link_hash_table): New struct.
(avr_link_hash_table): Likewise.
(avr_stub_hash_entry): Likewise.
(avr_stub_hash_lookup): New function.
(stub_hash_newfunc): New function.
(elf32_avr_link_hash_table_create): New function.
(elf32_avr_link_hash_table_free): New function.
(avr_get_stub_addr): New function.
(debug_relax, debug_stubs): Add new global variables controlling
debugging printout to stdout.
(avr_pc_wrap_around): Change the type to bfd_vma.
(avr_replace_call_ret_sequences): Add a new variable controling
linkrelax optimizations.
(avr_stub_is_required_for_16_bit_reloc): New function.
(avr_final_link_relocate):
Add linker hash table to parameter list. Use stub addr. if necessary.
(elf32_avr_relocate_section):
Add linker hashtable to parameter list of avr_final_link_relocate.
(bfd_elf_avr_final_write_processing): Add support for bfd_mach_avr6.
(elf32_avr_object_p): Add support for E_AVR_MACH_AVR6.
(elf32_avr_relax_delete_bytes):
Iterate over all sections of a bfd when adjusting relocs addends.
(elf32_avr_relax_section):
Evaluate avr_replace_call_ret_sequences and recalculate the size of
stub section.
(avr_stub_name): New function.
(avr_get_stub_entry): New function.
(avr_add_stub): New function.
(avr_build_one_stub): New function.
(avr_size_one_stub): New function.
(elf32_avr_setup_params): New function.
(elf32_avr_setup_section_lists): New function.
(get_local_syms): New function.
(elf32_avr_size_stubs): New function.
(bfd_elf32_bfd_link_hash_table_create): New function.
(bfd_elf32_bfd_link_hash_table_free): New function.
2006-05-23 H.J. Lu <hongjiu.lu@intel.com>
PR ld/2655

View File

@ -334,6 +334,7 @@ DESCRIPTION
.#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. *}

View File

@ -1929,6 +1929,7 @@ enum bfd_architecture
#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. */
@ -3547,10 +3548,22 @@ of 32 bit value) into 8 bit immediate value of LDI insn. */
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,

View File

@ -82,7 +82,10 @@ static const bfd_arch_info_type arch_info_struct[] =
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 =

File diff suppressed because it is too large Load Diff

38
bfd/elf32-avr.h Normal file
View File

@ -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 *);

View File

@ -1364,6 +1364,7 @@ elf_slurp_reloc_table_from_section (bfd *abfd,
else
{
asymbol **ps;
ps = symbols + ELF_R_SYM (rela.r_info) - 1;
relent->sym_ptr_ptr = ps;

View File

@ -1519,7 +1519,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@",
"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",

View File

@ -3683,11 +3683,25 @@ ENUM
ENUMDOC
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

View File

@ -1,3 +1,7 @@
2006-05-24 Bjoern Haase <bjoern.m.haase@web.de>
* config/tc-avr.c: Add new cpu targets avr6, avr2560 and avr2561.
2006-05-23 Thiemo Seufer <ths@mips.com>
David Ung <davidu@mips.com>
Nigel Stephens <nigel@mips.com>

View File

@ -63,89 +63,92 @@ struct mcu_type_s
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 @@ avr_offset_expression (expressionS *exp)
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 @@ avr_ldi_expression (expressionS *exp)
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 @@ avr_ldi_expression (expressionS *exp)
if (op[0])
{
mod_index m;
m.ptr = hash_find (avr_mod_hash, op);
mod = m.index;
@ -564,11 +569,14 @@ avr_ldi_expression (expressionS *exp)
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 @@ avr_ldi_expression (expressionS *exp)
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 @@ avr_ldi_expression (expressionS *exp)
}
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:
as_warn (_("expression dangerous with linker stubs"));
}
}
return reloc_to_return;
}
}
}
@ -1227,7 +1255,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
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 @@ md_assemble (char *str)
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 @@ avr_parse_cons_expression (expressionS *exp, int nbytes)
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);

View File

@ -125,16 +125,21 @@ extern long md_pcrel_from_section (struct fix *, segT);
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; \
}

View File

@ -1,6 +1,6 @@
\input texinfo @c -*-Texinfo-*-
@c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
@c 2001, 2002, 2003, 2004, 2005
@c 2001, 2002, 2003, 2004, 2005, 2006
@c Free Software Foundation, Inc.
@c UPDATE!! On future updates--
@c (1) check for new machine-dep cmdline options in
@ -100,7 +100,7 @@ END-INFO-DIR-ENTRY
This file documents the GNU Assembler "@value{AS}".
@c man begin COPYRIGHT
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1
@ -153,7 +153,7 @@ done.
@end tex
@vskip 0pt plus 1filll
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002 Free Software Foundation, Inc.
Copyright @copyright{} 1991, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002, 2006 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.1
@ -191,7 +191,7 @@ section entitled ``GNU Free Documentation License''.
* Reporting Bugs:: Reporting Bugs
* Acknowledgements:: Who Did What
* GNU Free Documentation License:: GNU Free Documentation License
* AS Index:: AS Index
* AS Index:: AS Index
@end menu
@end ifnottex
@ -5971,7 +5971,7 @@ For ELF targets, the @code{.type} directive is used like this:
This sets the type of symbol @var{name} to be either a
function symbol or an object symbol. There are five different syntaxes
supported for the @var{type description} field, in order to provide
compatibility with various other assemblers.
compatibility with various other assemblers.
Because some of the characters used in these syntaxes (such as @samp{@@} and
@samp{#}) are comment characters for some architectures, some of the syntaxes

View File

@ -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>

View File

@ -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 @@ START_RELOC_NUMBERS (elf_avr_reloc_type)
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 */

View File

@ -1,3 +1,15 @@
2006-05-24 Bjoern Haase <bjoern.m.haase@web.de>
* configure.tgt: Add avr6 to emulation list.
* Makefile.am: Add eavr6.o and corresponding rule.
* Makefile.in: Regenerate.
* emulparams/avr6.sh: New file.
* emulparams/avrX.sh (TEMPLATE_NAME): Use elf32 instead of generic
for target option support.
(EXTRA_EM_FILE): Add reference to new em template file avrelf.
* scripttempl/avr.sc: Add ".trampolines" section.
* emultempl/avrelf.em: Add new file for target specific options.
2006-05-22 Nick Clifton <nickc@redhat.com>
* scripttempl/elf32crx.sc (.rdata): Add .rodata.*.

View File

@ -133,6 +133,7 @@ ALL_EMULATIONS = \
eavr3.o \
eavr4.o \
eavr5.o \
eavr6.o \
ecoff_i860.o \
ecoff_sparc.o \
ecrisaout.o \
@ -595,6 +596,10 @@ eavr5.c: $(srcdir)/emulparams/avr5.sh \
$(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)"

View File

@ -357,6 +357,7 @@ ALL_EMULATIONS = \
eavr3.o \
eavr4.o \
eavr5.o \
eavr6.o \
ecoff_i860.o \
ecoff_sparc.o \
ecrisaout.o \
@ -878,13 +879,10 @@ dist-info: $(INFO_DEPS)
$(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \
esac; \
if test -f $$base; then d=.; else d=$(srcdir); fi; \
base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \
for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \
if test -f $$file; then \
relfile=`expr "$$file" : "$$d/\(.*\)"`; \
test -f $(distdir)/$$relfile || \
cp -p $$file $(distdir)/$$relfile; \
else :; fi; \
for file in $$d/$$base*; do \
relfile=`expr "$$file" : "$$d/\(.*\)"`; \
test -f $(distdir)/$$relfile || \
cp -p $$file $(distdir)/$$relfile; \
done; \
done
@ -1409,6 +1407,10 @@ eavr5.c: $(srcdir)/emulparams/avr5.sh \
$(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)"

View File

@ -81,7 +81,7 @@ xscale-*-coff) targ_emul=armcoff ;;
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" ;;

View File

@ -4,7 +4,8 @@ SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=generic
TEMPLATE_NAME=elf32
TEXT_LENGTH=8K
DATA_LENGTH=0
EXTRA_EM_FILE=avrelf

View File

@ -4,7 +4,8 @@ SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=generic
TEMPLATE_NAME=elf32
TEXT_LENGTH=8K
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf

View File

@ -4,7 +4,8 @@ SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=generic
TEMPLATE_NAME=elf32
TEXT_LENGTH=128K
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf

View File

@ -4,7 +4,8 @@ SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=generic
TEMPLATE_NAME=elf32
TEXT_LENGTH=8K
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf

View File

@ -4,7 +4,8 @@ SCRIPT_NAME=avr
OUTPUT_FORMAT="elf32-avr"
MAXPAGESIZE=1
EMBEDDED=yes
TEMPLATE_NAME=generic
TEMPLATE_NAME=elf32
TEXT_LENGTH=128K
DATA_LENGTH=0xffa0
EXTRA_EM_FILE=avrelf

11
ld/emulparams/avr6.sh Normal file
View File

@ -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

267
ld/emultempl/avrelf.em Normal file
View File

@ -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

View File

@ -71,12 +71,32 @@ SECTIONS
.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 @@ SECTIONS
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)