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]

[RFC] arc/ld: Linker script extensions to support nps targets


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


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