diff options
author | Denis Chertykov <chertykov@gmail.com> | 2015-07-08 21:35:19 +0300 |
---|---|---|
committer | Denis Chertykov <chertykov@gmail.com> | 2015-07-08 21:41:52 +0300 |
commit | 328e7bfdde7267f5e4b971bc6dca7b82aef77661 (patch) | |
tree | 55de9e4f72b35c5e1bbbec78e50812e47198ae8c /gas/config | |
parent | 7c7f93f6e5ce31223acbe871fe0c7e4daf0d8bbc (diff) | |
download | gdb-328e7bfdde7267f5e4b971bc6dca7b82aef77661.zip gdb-328e7bfdde7267f5e4b971bc6dca7b82aef77661.tar.gz gdb-328e7bfdde7267f5e4b971bc6dca7b82aef77661.tar.bz2 |
Define DIFF_EXPR_OK for avr target to allow PC relative difference relocation.
When generating relocation (tc_gen_reloc) 32 bit relocation fixup
is changed to new 32 bit PC relative relocation if the fixup has pc-relative
flag set.
bfd/ChangeLog
2015-07-06 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* elf32-avr.c: Add 32 bit PC relative relocation for AVR target.
gas/ChangeLog
2015-07-06 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* config/tc-avr.c (tc_gen_reloc): Change 32 bit relocation to
32 bit PC relative and update offset if the fixup is pc-relative.
* config/tc-avr.h (DIFF_EXPR_OK): Define to enable PC relative diff
relocs.
gas/testsuite/ChangeLog
2015-07-06 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* gas/avr/pc-relative-reloc.d: New test for 32 bit pc relative reloc.
* gas/avr/per-function-debugline.s: New test source.
include/ChangeLog
2015-07-06 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* elf/avr.h: Add new 32 bit PC relative relocation.
ld/testsuite/ChangeLog
2015-07-06 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
* ld-avr/gc-section-debugline.d: New test.
* ld-avr/per-function-debugline.s: Source for new test.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-avr.c | 18 | ||||
-rw-r--r-- | gas/config/tc-avr.h | 2 |
2 files changed, 18 insertions, 2 deletions
diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c index 5c8982c..c69a91c 100644 --- a/gas/config/tc-avr.c +++ b/gas/config/tc-avr.c @@ -1618,6 +1618,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp) { arelent *reloc; + bfd_reloc_code_real_type code = fixp->fx_r_type; if (fixp->fx_subsy != NULL) { @@ -1631,7 +1632,21 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; - reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type); + + if ((fixp->fx_r_type == BFD_RELOC_32) && (fixp->fx_pcrel)) + { + if (seg->use_rela_p) + fixp->fx_offset -= md_pcrel_from_section (fixp, seg); + else + fixp->fx_offset = reloc->address; + + code = BFD_RELOC_32_PCREL; + } + + reloc->addend = fixp->fx_offset; + + reloc->howto = bfd_reloc_type_lookup (stdoutput, code); + if (reloc->howto == (reloc_howto_type *) NULL) { as_bad_where (fixp->fx_file, fixp->fx_line, @@ -1644,7 +1659,6 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) reloc->address = fixp->fx_offset; - reloc->addend = fixp->fx_offset; return reloc; } diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h index 21471c8..5501ef0 100644 --- a/gas/config/tc-avr.h +++ b/gas/config/tc-avr.h @@ -45,6 +45,8 @@ nonstandard escape sequences in a string. */ #define ONLY_STANDARD_ESCAPES +#define DIFF_EXPR_OK /* .-foo gets turned into PC relative relocs */ + /* GAS will call this function for any expression that can not be recognized. When the function is called, `input_line_pointer' will point to the start of the expression. */ |