summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog4
-rw-r--r--bfd/elf32-avr.c20
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/config/tc-avr.c18
-rw-r--r--gas/config/tc-avr.h2
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/avr/pc-relative-reloc.d19
-rw-r--r--gas/testsuite/gas/avr/per-function-debugline.s35
-rw-r--r--include/ChangeLog4
-rw-r--r--include/elf/avr.h1
-rw-r--r--ld/testsuite/ChangeLog5
-rw-r--r--ld/testsuite/ld-avr/gc-section-debugline.d70
-rw-r--r--ld/testsuite/ld-avr/per-function-debugline.s84
13 files changed, 270 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 97d3ea3781a..e6d1783580b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,7 @@
+2015-07-08 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
+
+ * elf32-avr.c: Add 32 bit PC relative relocation for AVR target.
+
2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
* elf64-ppc.c (toc_adjusting_stub_needed): Use the symbol value
diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c
index 8651f49c3f2..bd57ab79a0e 100644
--- a/bfd/elf32-avr.c
+++ b/bfd/elf32-avr.c
@@ -641,7 +641,22 @@ static reloc_howto_type elf_avr_howto_table[] =
FALSE, /* partial_inplace */
0xffffff, /* src_mask */
0xffffff, /* dst_mask */
- FALSE) /* pcrel_offset */
+ FALSE), /* pcrel_offset */
+
+ /* A 32 bit PC relative relocation. */
+ HOWTO (R_AVR_32_PCREL, /* type */
+ 0, /* rightshift */
+ 2, /* size (0 = byte, 1 = short, 2 = long) */
+ 32, /* bitsize */
+ TRUE, /* pc_relative */
+ 0, /* bitpos */
+ complain_overflow_bitfield, /* complain_on_overflow */
+ bfd_elf_generic_reloc, /* special_function */
+ "R_AVR_32_PCREL", /* name */
+ FALSE, /* partial_inplace */
+ 0xffffffff, /* src_mask */
+ 0xffffffff, /* dst_mask */
+ TRUE), /* pcrel_offset */
};
/* Map BFD reloc types to AVR ELF reloc types. */
@@ -689,7 +704,8 @@ static const struct avr_reloc_map avr_reloc_map[] =
{ BFD_RELOC_AVR_DIFF32, R_AVR_DIFF32 },
{ BFD_RELOC_AVR_LDS_STS_16, R_AVR_LDS_STS_16},
{ BFD_RELOC_AVR_PORT6, R_AVR_PORT6},
- { BFD_RELOC_AVR_PORT5, R_AVR_PORT5}
+ { BFD_RELOC_AVR_PORT5, R_AVR_PORT5},
+ { BFD_RELOC_32_PCREL, R_AVR_32_PCREL}
};
/* Meant to be filled one day with the wrap around address for the
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f9d4892f948..4439de5532d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2015-07-08 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.
+
2015-07-03 Alan Modra <amodra@gmail.com>
* config/tc-ppc.c (md_show_usage): Add -m821, -m850, -m860.
diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 5c8982c212c..c69a91c9857 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 21471c8bb38..5501ef053f8 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. */
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index a045c852065..aecbef669c3 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-07-08 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.
+
2015-07-03 Alan Modra <alan@squeak.grove.modra.org>
* gas/ppc/titan.d: Correct mfmcsrr0 disassembly.
diff --git a/gas/testsuite/gas/avr/pc-relative-reloc.d b/gas/testsuite/gas/avr/pc-relative-reloc.d
new file mode 100644
index 00000000000..cc22b0bf366
--- /dev/null
+++ b/gas/testsuite/gas/avr/pc-relative-reloc.d
@@ -0,0 +1,19 @@
+#name: 32 bit PC relative reloc
+#as: -mmcu=avr51 -gdwarf-sections -g
+#objdump: -r
+#source: per-function-debugline.s
+#target: avr-*-*
+
+.*: file format elf32-avr
+
+RELOCATION RECORDS FOR \[.text.main\]:
+#...
+
+
+RELOCATION RECORDS FOR \[.debug_line\]:
+OFFSET TYPE VALUE
+00000000 R_AVR_32_PCREL .debug_line_end-0x00000004
+
+
+RELOCATION RECORDS FOR \[.debug_line.text.main\]:
+#...
diff --git a/gas/testsuite/gas/avr/per-function-debugline.s b/gas/testsuite/gas/avr/per-function-debugline.s
new file mode 100644
index 00000000000..4db56e5a447
--- /dev/null
+++ b/gas/testsuite/gas/avr/per-function-debugline.s
@@ -0,0 +1,35 @@
+ .file "per-function-debugline.s"
+__SP_H__ = 0x3e
+__SP_L__ = 0x3d
+__SREG__ = 0x3f
+__RAMPZ__ = 0x3b
+__tmp_reg__ = 0
+__zero_reg__ = 1
+ .comm g,2,1
+ .section .text.main,"ax",@progbits
+.global main
+ .type main, @function
+main:
+ push r28
+ push r29
+ in r28,__SP_L__
+ in r29,__SP_H__
+/* prologue: function */
+/* frame size = 0 */
+/* stack size = 2 */
+.L__stack_usage = 2
+ call foo
+ lds r24,g
+ lds r25,g+1
+ sbiw r24,1
+ sts g+1,r25
+ sts g,r24
+ lds r24,g
+ lds r25,g+1
+/* epilogue start */
+ pop r29
+ pop r28
+ ret
+ .size main, .-main
+ .ident "GCC: (GNU) 6.0.0 20150630 (experimental)"
+.global __do_clear_bss
diff --git a/include/ChangeLog b/include/ChangeLog
index d85a1b0e73c..015e304f7e9 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2015-07-08 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
+
+ * elf/avr.h: Add new 32 bit PC relative relocation.
+
2015-06-26 Matthew Fortune <matthew.fortune@imgtec.com>
* elf/mips.h (DT_MIPS_RLD_MAP_REL): New macro.
diff --git a/include/elf/avr.h b/include/elf/avr.h
index 115296da404..f0ef47927ad 100644
--- a/include/elf/avr.h
+++ b/include/elf/avr.h
@@ -87,6 +87,7 @@ START_RELOC_NUMBERS (elf_avr_reloc_type)
RELOC_NUMBER (R_AVR_LDS_STS_16, 33)
RELOC_NUMBER (R_AVR_PORT6, 34)
RELOC_NUMBER (R_AVR_PORT5, 35)
+ RELOC_NUMBER (R_AVR_32_PCREL, 36)
END_RELOC_NUMBERS (R_AVR_max)
#endif /* _ELF_AVR_H */
diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog
index 1ee6aa1e0a6..9bf1e5b42ba 100644
--- a/ld/testsuite/ChangeLog
+++ b/ld/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-07-08 Pitchumani Sivanupandi <pitchumani.s@atmel.com>
+
+ * ld-avr/gc-section-debugline.d: New test.
+ * ld-avr/per-function-debugline.s: Source for new test.
+
2015-07-05 Richard Sandiford <richard.sandiford@arm.com>
* ld-powerpc/tocopt6-inc.s, ld-powerpc/tocopt6a.s,
diff --git a/ld/testsuite/ld-avr/gc-section-debugline.d b/ld/testsuite/ld-avr/gc-section-debugline.d
new file mode 100644
index 00000000000..e98ff6c0cfa
--- /dev/null
+++ b/ld/testsuite/ld-avr/gc-section-debugline.d
@@ -0,0 +1,70 @@
+#name: dwarf decoded line after gc-sections
+#as: -mmcu=avr51 -gdwarf-sections -g
+#ld: -mavr51 -gc-sections -u main
+#objdump: --dwarf=decodedline
+#source: per-function-debugline.s
+#target: avr-*-*
+
+.*: file format elf32-avr
+
+Decoded dump of debug contents of section .debug_line:
+
+CU: .*:
+File name Line number Starting address
+per-function-debugline.s 39 0
+
+per-function-debugline.s 40 0x2
+
+per-function-debugline.s 41 0x4
+
+per-function-debugline.s 42 0x6
+
+per-function-debugline.s 47 0x8
+
+per-function-debugline.s 48 0xc
+
+per-function-debugline.s 49 0x10
+
+per-function-debugline.s 50 0x12
+
+per-function-debugline.s 51 0x16
+
+per-function-debugline.s 52 0x1a
+
+per-function-debugline.s 54 0x1c
+
+per-function-debugline.s 55 0x1e
+
+per-function-debugline.s 56 0x20
+
+per-function-debugline.s 62 0x22
+
+per-function-debugline.s 63 0x24
+
+per-function-debugline.s 64 0x26
+
+per-function-debugline.s 65 0x28
+
+per-function-debugline.s 70 0x2a
+
+per-function-debugline.s 71 0x2e
+
+per-function-debugline.s 72 0x32
+
+per-function-debugline.s 73 0x36
+
+per-function-debugline.s 74 0x38
+
+per-function-debugline.s 75 0x3c
+
+per-function-debugline.s 76 0x40
+
+per-function-debugline.s 77 0x44
+
+per-function-debugline.s 79 0x48
+
+per-function-debugline.s 80 0x4a
+
+per-function-debugline.s 81 0x4c
+
+
diff --git a/ld/testsuite/ld-avr/per-function-debugline.s b/ld/testsuite/ld-avr/per-function-debugline.s
new file mode 100644
index 00000000000..361cb00a398
--- /dev/null
+++ b/ld/testsuite/ld-avr/per-function-debugline.s
@@ -0,0 +1,84 @@
+ .file "per-function-debugline.s"
+__SP_H__ = 0x3e
+__SP_L__ = 0x3d
+__SREG__ = 0x3f
+__RAMPZ__ = 0x3b
+__tmp_reg__ = 0
+__zero_reg__ = 1
+ .comm g,2,1
+ .section .text.bar,"ax",@progbits
+.global bar
+ .type bar, @function
+bar:
+ push r28
+ push r29
+ rcall .
+ in r28,__SP_L__
+ in r29,__SP_H__
+/* prologue: function */
+/* frame size = 2 */
+/* stack size = 4 */
+.L__stack_usage = 4
+ ldd r24,Y+1
+ ldd r25,Y+2
+ adiw r24,1
+ std Y+2,r25
+ std Y+1,r24
+ nop
+/* epilogue start */
+ pop __tmp_reg__
+ pop __tmp_reg__
+ pop r29
+ pop r28
+ ret
+ .size bar, .-bar
+ .section .text.foo,"ax",@progbits
+.global foo
+ .type foo, @function
+foo:
+ push r28
+ push r29
+ in r28,__SP_L__
+ in r29,__SP_H__
+/* prologue: function */
+/* frame size = 0 */
+/* stack size = 2 */
+.L__stack_usage = 2
+ lds r24,g
+ lds r25,g+1
+ adiw r24,1
+ sts g+1,r25
+ sts g,r24
+ nop
+/* epilogue start */
+ pop r29
+ pop r28
+ ret
+ .size foo, .-foo
+ .section .text.main,"ax",@progbits
+.global main
+ .type main, @function
+main:
+ push r28
+ push r29
+ in r28,__SP_L__
+ in r29,__SP_H__
+/* prologue: function */
+/* frame size = 0 */
+/* stack size = 2 */
+.L__stack_usage = 2
+ call foo
+ lds r24,g
+ lds r25,g+1
+ sbiw r24,1
+ sts g+1,r25
+ sts g,r24
+ lds r24,g
+ lds r25,g+1
+/* epilogue start */
+ pop r29
+ pop r28
+ ret
+ .size main, .-main
+ .ident "GCC: (GNU) 6.0.0 20150630 (experimental)"
+.global __do_clear_bss