Add support for AVR6 family
This commit is contained in:
parent
f607ec8858
commit
28c9d252b4
|
@ -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
|
||||
|
|
|
@ -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. *}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 =
|
||||
|
|
1070
bfd/elf32-avr.c
1070
bfd/elf32-avr.c
File diff suppressed because it is too large
Load Diff
|
@ -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 *);
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
14
bfd/reloc.c
14
bfd/reloc.c
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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; \
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 */
|
||||
|
|
12
ld/ChangeLog
12
ld/ChangeLog
|
@ -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.*.
|
||||
|
|
|
@ -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)"
|
||||
|
|
|
@ -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)"
|
||||
|
|
|
@ -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" ;;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue