This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[RFC] arc/ld: Linker script extensions to support nps targets
- From: Andrew Burgess <andrew dot burgess at embecosm dot com>
- To: binutils at sourceware dot org
- Cc: Claudiu dot Zissulescu at synopsys dot com, Cupertino dot Miranda at synopsys dot com, Andrew Burgess <andrew dot burgess at embecosm dot com>
- Date: Wed, 30 Nov 2016 14:03:38 +0000
- Subject: [RFC] arc/ld: Linker script extensions to support nps targets
- Authentication-results: sourceware.org; auth=none
The patch below adds some new symbols and sections to the arclinux
linker script that are required to support nps targets. The sections
are placed at fixed locations that map to particular types of memory
on the actual devices, and are accessed primarily with the nps
specific cmem ld/st instructions, which assume a know base address.
The new symbols are all provided with PROVIDE, and the new section
only includes content from input files, this means (I believe) that if
non of the input files produce cmem content, or reference the symbols
relating to cmem content, then these linker script changes should make
no impact on the final produced binary.
It's because the change is harmless unless wanted that in this initial
version of the patch I am proposing that the change be made for all
ARC targets.
However, I'm open to suggestions for alternative strategies. The only
idea I have right now is creating an nps specific clone of the
arclinux linker emulation, and having GCC select this when compiling
for nps. I considered this, but initially rejected it as
over-engineering, but again, I'd like to hear what people think.
All feedback or suggestions welcome.
Thanks,
Andrew
---
The arc700 nps variant uses some specific named sections to facilitate
its CMEM based instructions, which operate on memory regions fixed at
specific addresses.
This commit extends the arclinux linker script to include symbols and
sections required to support the nps targets. As the new symbols are
wrapped in PROVIDE, and the new sections don't contain any content
unless there is input content, then these linker script changes should
result in no visible changes for non-nps targets.
ld/ChangeLog:
* scripttempl/arcnps.sc: New file.
* scripttempl/arclinux.sc: Include the new file.
---
ld/ChangeLog | 5 +++
ld/scripttempl/arclinux.sc | 2 ++
ld/scripttempl/arcnps.sc | 85 ++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 92 insertions(+)
create mode 100644 ld/scripttempl/arcnps.sc
diff --git a/ld/scripttempl/arclinux.sc b/ld/scripttempl/arclinux.sc
index 8b11386..cdbcf6a 100644
--- a/ld/scripttempl/arclinux.sc
+++ b/ld/scripttempl/arclinux.sc
@@ -668,6 +668,8 @@ EOF
. $srcdir/scripttempl/DWARF.sc
+. $srcdir/scripttempl/arcnps.sc
+
cat <<EOF
${TINY_DATA_SECTION}
diff --git a/ld/scripttempl/arcnps.sc b/ld/scripttempl/arcnps.sc
new file mode 100644
index 0000000..2ddab10
--- /dev/null
+++ b/ld/scripttempl/arcnps.sc
@@ -0,0 +1,85 @@
+# Copyright (C) 2016 Free Software Foundation, Inc.
+#
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved.
+#
+cat <<EOF
+
+ /* Start of symbols and sections required to support CMEM instructions
+ on NPS targets. These should result in no additional output for
+ non-nps targets. */
+
+ PROVIDE (_cmem_start = ADDR (.cmem) );
+ PROVIDE (_cmem_alter_start = ADDR (.cmem_alter) );
+ PROVIDE (_cmem_shared_start = ADDR (.cmem_shared) );
+ PROVIDE (_cmem_shared_alter_start = ADDR (.cmem_shared_alter) );
+ PROVIDE (_fmt_slot0_start = ADDR (.fmt_slot0) );
+ PROVIDE (_fmt_slot1_start = ADDR (.fmt_slot1) );
+ PROVIDE (_fmt_slot2_start = ADDR (.fmt_slot2) );
+ PROVIDE (_fmt_slot3_start = ADDR (.fmt_slot3) );
+ PROVIDE (_fmt_slot4_start = ADDR (.fmt_slot4) );
+ PROVIDE (_fmt_slot5_start = ADDR (.fmt_slot5) );
+ PROVIDE (_fmt_slot6_start = ADDR (.fmt_slot6) );
+ PROVIDE (_fmt_slot7_start = ADDR (.fmt_slot7) );
+ PROVIDE (_fmt_slot8_start = ADDR (.fmt_slot8) );
+ PROVIDE (_fmt_slot9_start = ADDR (.fmt_slot9) );
+ PROVIDE (_fmt_slot10_start = ADDR (.fmt_slot10) );
+ PROVIDE (_fmt_slot11_start = ADDR (.fmt_slot11) );
+ PROVIDE (_fmt_slot12_start = ADDR (.fmt_slot12) );
+ PROVIDE (_fmt_slot13_start = ADDR (.fmt_slot13) );
+ PROVIDE (_fmt_slot14_start = ADDR (.fmt_slot14) );
+ PROVIDE (_fmt_slot15_start = ADDR (.fmt_slot15) );
+
+ PROVIDE (_cmem_end = ADDR (.cmem) + SIZEOF (.cmem) );
+ PROVIDE (_cmem_alter_end = ADDR (.cmem_alter) + SIZEOF (.cmem_alter) );
+ PROVIDE (_cmem_shared_end = ADDR (.cmem_shared) + SIZEOF (.cmem_shared) );
+ PROVIDE (_cmem_shared_alter_end = ADDR (.cmem_shared_alter) + SIZEOF (.cmem_shared_alter) );
+ PROVIDE (_fmt_slot0_end = ADDR (.fmt_slot0) + SIZEOF (.fmt_slot0) );
+ PROVIDE (_fmt_slot1_end = ADDR (.fmt_slot1) + SIZEOF (.fmt_slot1) );
+ PROVIDE (_fmt_slot2_end = ADDR (.fmt_slot2) + SIZEOF (.fmt_slot2) );
+ PROVIDE (_fmt_slot3_end = ADDR (.fmt_slot3) + SIZEOF (.fmt_slot3) );
+ PROVIDE (_fmt_slot4_end = ADDR (.fmt_slot4) + SIZEOF (.fmt_slot4) );
+ PROVIDE (_fmt_slot5_end = ADDR (.fmt_slot5) + SIZEOF (.fmt_slot5) );
+ PROVIDE (_fmt_slot6_end = ADDR (.fmt_slot6) + SIZEOF (.fmt_slot6) );
+ PROVIDE (_fmt_slot7_end = ADDR (.fmt_slot7) + SIZEOF (.fmt_slot7) );
+ PROVIDE (_fmt_slot8_end = ADDR (.fmt_slot8) + SIZEOF (.fmt_slot8) );
+ PROVIDE (_fmt_slot9_end = ADDR (.fmt_slot9) + SIZEOF (.fmt_slot9) );
+ PROVIDE (_fmt_slot10_end = ADDR (.fmt_slot10) + SIZEOF (.fmt_slot10) );
+ PROVIDE (_fmt_slot11_end = ADDR (.fmt_slot11) + SIZEOF (.fmt_slot11) );
+ PROVIDE (_fmt_slot12_end = ADDR (.fmt_slot12) + SIZEOF (.fmt_slot12) );
+ PROVIDE (_fmt_slot13_end = ADDR (.fmt_slot13) + SIZEOF (.fmt_slot13) );
+ PROVIDE (_fmt_slot14_end = ADDR (.fmt_slot14) + SIZEOF (.fmt_slot14) );
+ PROVIDE (_fmt_slot15_end = ADDR (.fmt_slot15) + SIZEOF (.fmt_slot15) );
+
+ OVERLAY 0x57f00000 :
+ {
+ .cmem { *(.cmem) }
+ .cmem_alter { *(.cmem_alter) }
+ }
+
+ OVERLAY 0x57f08000 :
+ {
+ .cmem_shared { *(.cmem_shared) }
+ .cmem_shared_alter { *(.cmem_shared_alter) }
+ }
+
+ .fmt_slot0 0x58000000 : { *(.fmt_slot0) }
+ .fmt_slot1 0x58800000 : { *(.fmt_slot1) }
+ .fmt_slot2 0x59000000 : { *(.fmt_slot2) }
+ .fmt_slot3 0x59800000 : { *(.fmt_slot3) }
+ .fmt_slot4 0x5a000000 : { *(.fmt_slot4) }
+ .fmt_slot5 0x5a800000 : { *(.fmt_slot5) }
+ .fmt_slot6 0x5b000000 : { *(.fmt_slot6) }
+ .fmt_slot7 0x5b800000 : { *(.fmt_slot7) }
+ .fmt_slot8 0x5c000000 : { *(.fmt_slot8) }
+ .fmt_slot9 0x5c800000 : { *(.fmt_slot9) }
+ .fmt_slot10 0x5d000000 : { *(.fmt_slot10) }
+ .fmt_slot11 0x5d800000 : { *(.fmt_slot11) }
+ .fmt_slot12 0x5e000000 : { *(.fmt_slot12) }
+ .fmt_slot13 0x5e800000 : { *(.fmt_slot13) }
+ .fmt_slot14 0x5f000000 : { *(.fmt_slot14) }
+ .fmt_slot15 0x5f800000 : { *(.fmt_slot15) }
+
+ /* End of nps specific sections and symbols. */
+EOF
--
2.6.4