This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch,avr] Take #2 PR21472: Upgrade emulation avrxmega3 so it has .rodata in flash instead of in SRAM.


On 09.05.2017 12:54, Nick Clifton wrote:
Hi Georg-Johann,
diff --git a/ld/emulparams/avrxmega3.sh b/ld/emulparams/avrxmega3.sh
index abaa5b3..504c492 100644
--- a/ld/emulparams/avrxmega3.sh
+++ b/ld/emulparams/avrxmega3.sh
@@ -1,6 +1,6 @@
 ARCH=avr:103
 MACHINE=
-SCRIPT_NAME=avr
+SCRIPT_NAME=avr_rodata

I would much prefer it if you did not create a new script, but instead added
parametrisation to the current avr and avrtiny scripts.  (In fact it would be
even better if you could combine avr.sc and avrtiny.sc and just have one script).

The reason for this is that the more scripts you have, the greater the chances
of making an error or missing one out when it comes to future changes.

Ah, now I understand the objection.  It was because I added a new
template script, not because of the new avrxmega3.x etc.

So here is a patch that maker avr.sc more generic and uses
RODATA_PM_OFFSET to achieve is.

Take a look at the elf.sc script.  It is used by lots of different targets, but
it is highly customizable via definitions in the target's specific emulparams
files.

The alternative approach, which I would also consider to be reasonable, is to have
a base avr script that defines all of the things that are consistent between all
three proposed avr linker scripts and to include this script into smaller,
avr-variant scripts that just defines those things that are specific to that variant.
Kind of like how the DWARF.sc script is included into the elf.sc script.

Cheers
  Nick

I didn't unite avr.sc with avrtiny.sc though which is a different story.


ld/
	Upgrade the currently unused emulation avrxmega3 to one which
	supports avrxmega2 devices with flash memory visible in the
	SRAM address range.

	PR21472
	* emulparams/avrxmega3.sh (RODATA_PM_OFFSET): Set to 0x8000.
	* scripttempl/avr.sc
	(__RODATA_PM_OFFSET__) [RODATA_PM_OFFSET]: Use RODATA_PM_OFFSET
	as default if not already defined.
	(.data) [!RODATA_PM_OFFSET]: Don't include .rodata and friends.
	(.rodata) [RODATA_PM_OFFSET]: Put at an offset of
	__RODATA_PM_OFFSET__.

gas/
	PR21472
	* config/tc-avr.c (mcu_types): Add entries for: attiny416,
	attiny417, attiny816, attiny817.


diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 7214c07..79837c8 100644
--- a/gas/config/tc-avr.c
+++ b/gas/config/tc-avr.c
@@ -300,6 +300,10 @@ static struct mcu_type_s mcu_types[] =
   {"atxmega16e5", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
   {"atxmega8e5",  AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
   {"atxmega32x1", AVR_ISA_XMEGA,  bfd_mach_avrxmega2},
+  {"attiny416",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
+  {"attiny417",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
+  {"attiny816",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
+  {"attiny817",   AVR_ISA_XMEGA,  bfd_mach_avrxmega3},
   {"atxmega64a3", AVR_ISA_XMEGA,  bfd_mach_avrxmega4},
   {"atxmega64a3u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
   {"atxmega64a4u",AVR_ISA_XMEGAU, bfd_mach_avrxmega4},
diff --git a/ld/emulparams/avrxmega3.sh b/ld/emulparams/avrxmega3.sh
index abaa5b3..7c5a1e5 100644
--- a/ld/emulparams/avrxmega3.sh
+++ b/ld/emulparams/avrxmega3.sh
@@ -9,4 +9,5 @@ TEMPLATE_NAME=elf32
 TEXT_LENGTH=1024K
 DATA_ORIGIN=0x802000
 DATA_LENGTH=0xffa0
+RODATA_PM_OFFSET=0x8000
 EXTRA_EM_FILE=avrelf
diff --git a/ld/scripttempl/avr.sc b/ld/scripttempl/avr.sc
index b889180..144d32d 100644
--- a/ld/scripttempl/avr.sc
+++ b/ld/scripttempl/avr.sc
@@ -4,6 +4,17 @@
 # are permitted in any medium without royalty provided the copyright
 # notice and this notice are preserved.
 
+# RODATA_PM_OFFSET
+#         If empty, .rodata sections will be part of .data.  This is for
+#         devices where it is not possible to use LD* instructions to read
+#         from flash.
+#
+#         If non-empty, .rodata is not part of .data and the .rodata
+#         objects are assigned addresses at an offest of RODATA_PM_OFFSET.
+#         This is for devices that feature reading from flash by means of
+#         LD* instructions, provided the addresses are offset by
+#         __RODATA_PM_OFFSET__ (which defaults to RODATA_PM_OFFSET).
+
 cat <<EOF
 /* Copyright (C) 2014-2017 Free Software Foundation, Inc.
 
@@ -21,7 +32,15 @@ __FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH_
 __LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
 __SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
 __USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
+EOF
 
+if test -n "$RODATA_PM_OFFSET"; then
+    cat <<EOF
+__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : $RODATA_PM_OFFSET;
+EOF
+fi
+
+cat <<EOF
 MEMORY
 {
   text   (rx)   : ORIGIN = 0, LENGTH = __TEXT_REGION_LENGTH__
@@ -187,15 +206,45 @@ SECTIONS
     KEEP (*(.fini0))
     ${RELOCATING+ _etext = . ; }
   } ${RELOCATING+ > text}
+EOF
+
+# Devices like ATtiny816 allow to read from flash memory by means of LD*
+# instructions provided we add an offset of __RODATA_PM_OFFSET__ to the
+# flash addresses.
+
+if test -n "$RODATA_PM_OFFSET"; then
+    cat <<EOF
+  .rodata ${RELOCATING+ ADDR(.text) + SIZEOF (.text) + __RODATA_PM_OFFSET__ } ${RELOCATING-0} :
+  {
+    *(.rodata)
+    ${RELOCATING+ *(.rodata*)}
+    *(.gnu.linkonce.r*)
+  } ${RELOCATING+AT> text}
+EOF
+fi
 
+cat <<EOF
   .data        ${RELOCATING-0} :
   {
     ${RELOCATING+ PROVIDE (__data_start = .) ; }
     *(.data)
     ${RELOCATING+ *(.data*)}
+    *(.gnu.linkonce.d*)
+EOF
+
+# Classical devices that don't show flash memory in the SRAM address space
+# need .rodata to be part of .data because the compiler will use LD*
+# instructions and LD* cannot access flash.
+
+if test -z "$RODATA_PM_OFFSET"; then
+    cat <<EOF
     *(.rodata)  /* We need to include .rodata here if gcc is used */
     ${RELOCATING+ *(.rodata*)} /* with -fdata-sections.  */
-    *(.gnu.linkonce.d*)
+    *(.gnu.linkonce.r*)
+EOF
+fi
+
+cat <<EOF
     ${RELOCATING+. = ALIGN(2);}
     ${RELOCATING+ _edata = . ; }
     ${RELOCATING+ PROVIDE (__data_end = .) ; }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]