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]

[PATCH] Utilize Blackfin L1 SRAM


Hi,

Blackfin processor has two high speed memories: L1 instruction SRAM and
L1 data SRAM, which work at core clock speed. To improve the
application performance, people may want to put their application in
these two SRAMs. This patch adds three options for this purpose.

--sep-code

It's a target independent option. Usually executable sections are put
into the same segment with other read only sections, like .rodata
section. However, the other read only sections cannot be put into L1
instruction SRAM, since this SRAM cannot be read with load instruction.
With this option, executable sections will be put into seperate
segments, which contains only code. Thus it can go into L1 instruction SRAM.

--code-in-l1 and --data-in-l1

They are Blackfin specific options. ld will set EF_BFIN_CODE_IN_L1 or
EF_BFIN_DATA_IN_L1 flag in the output file's elf header flags
respectively. These flags tells loader to put code or data into L1 SRAMs.


OK to add --sep-code option?




Jie


	bfd/
	* elf.c (_bfd_elf_map_sections_to_segments): Don't put
	executable sections into the same segment with other
	read only sections if --sep-code.
	* elf32-bfin.c (elf32_bfin_code_in_l1): New variable.
	(elf32_bfin_data_in_l1): New variable.
	(elf32_bfin_final_write_processing): New.
	(elf32_bfin_special_sections[]): New.
	(elf_backend_final_write_processing): Define.
	(elf_backend_special_sections): Define.

	binutils/
	* readelf.c (get_machine_flags): Deal with Blackfin specific
	flags.

	include/
	* bfdlink.h (struct bfd_link_info): Add sep_code member
	variable.
	* elf/bfin.h (EF_BFIN_CODE_IN_L1): Define.
	(EF_BFIN_DATA_IN_L1): Define.

	ld/
	* Makefile.am (eelf32bfin.c): Depend on bfin.em.
	(eelf32bfinfd.c): Likewise.
	* Makefile.in: Regenerate.
	* gen-doc.texi: Set Blackfin.
	* ld.texinfo: Document --sep-code and Blackfin specific
	options.
	* ldmain.c (main): Initialize link_info.sep_code.
	* lexsup.c (enum option_values): Add OPTION_SEP_CODE.
	(ld_options[]): Add --sep-code.
	(parse_args): Deal with --sep-code.
	* emulparams/bfin.sh (EXTRA_EM_FILE): Define.
	* emulparams/elf32bfinfd.sh (OTHER_SECTIONS): Define.
	* emultempl/bfin.em: New file.


Index: bfd/elf.c
===================================================================
RCS file: /cvs/src/src/bfd/elf.c,v
retrieving revision 1.451
diff -u -p -r1.451 elf.c
--- bfd/elf.c	10 Jul 2008 01:32:22 -0000	1.451
+++ bfd/elf.c	11 Jul 2008 08:12:48 -0000
@@ -3605,6 +3605,7 @@ _bfd_elf_map_sections_to_segments (bfd *
       asection **hdrpp;
       bfd_boolean phdr_in_segment = TRUE;
       bfd_boolean writable;
+      bfd_boolean executable;
       int tls_count = 0;
       asection *first_tls = NULL;
       asection *dynsec, *eh_frame_hdr;
@@ -3676,6 +3677,7 @@ _bfd_elf_map_sections_to_segments (bfd *
       phdr_index = 0;
       maxpagesize = bed->maxpagesize;
       writable = FALSE;
+      executable = FALSE;
       dynsec = bfd_get_section_by_name (abfd, ".dynamic");
       if (dynsec != NULL
 	  && (dynsec->flags & SEC_LOAD) == 0)
@@ -3757,6 +3759,14 @@ _bfd_elf_map_sections_to_segments (bfd *
 		 ends precisely on a page boundary.  */
 	      new_segment = TRUE;
 	    }
+	  else if (info->sep_code
+		   && ((! executable && (hdr->flags & SEC_CODE) != 0)
+		       || (executable && (hdr->flags & SEC_CODE) == 0)))
+	    {
+	      /* We don't want to put a executable section in a non-executable
+		 segment.  */
+	      new_segment = TRUE;
+	    }
 	  else
 	    {
 	      /* Otherwise, we can use the same segment.  */
@@ -3771,6 +3781,8 @@ _bfd_elf_map_sections_to_segments (bfd *
 	    {
 	      if ((hdr->flags & SEC_READONLY) == 0)
 		writable = TRUE;
+	      if ((hdr->flags & SEC_CODE) != 0)
+		executable = TRUE;
 	      last_hdr = hdr;
 	      /* .tbss sections effectively have zero size.  */
 	      if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD))
@@ -3796,6 +3808,11 @@ _bfd_elf_map_sections_to_segments (bfd *
 	  else
 	    writable = FALSE;
 
+	  if ((hdr->flags & SEC_CODE) != 0)
+	    executable = TRUE;
+	  else
+	    executable = FALSE;
+
 	  last_hdr = hdr;
 	  /* .tbss sections effectively have zero size.  */
 	  if ((hdr->flags & (SEC_THREAD_LOCAL | SEC_LOAD)) != SEC_THREAD_LOCAL)
Index: bfd/elf32-bfin.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-bfin.c,v
retrieving revision 1.30
diff -u -p -r1.30 elf32-bfin.c
--- bfd/elf32-bfin.c	26 Mar 2008 13:04:23 -0000	1.30
+++ bfd/elf32-bfin.c	11 Jul 2008 08:12:53 -0000
@@ -1119,6 +1119,22 @@ bfin_reloc_type_lookup (bfd * abfd ATTRI
   return (reloc_howto_type *) NULL;
 }
 
+/* Set by ld emulation if --code-in-l1.  */
+bfd_boolean elf32_bfin_code_in_l1 = 0;
+
+/* Set by ld emulation if --data-in-l1.  */
+bfd_boolean elf32_bfin_data_in_l1 = 0;
+
+static void
+elf32_bfin_final_write_processing (bfd *abfd,
+				   bfd_boolean linker ATTRIBUTE_UNUSED)
+{
+  if (elf32_bfin_code_in_l1)
+    elf_elfheader (abfd)->e_flags |= EF_BFIN_CODE_IN_L1;
+  if (elf32_bfin_data_in_l1)
+    elf_elfheader (abfd)->e_flags |= EF_BFIN_DATA_IN_L1;
+}
+
 /* Return TRUE if the name is a local label.
    bfin local labels begin with L$.  */
 static bfd_boolean
@@ -5572,6 +5588,14 @@ error_return:
     free (internal_relocs);
   return FALSE;
 }
+
+struct bfd_elf_special_section const elf32_bfin_special_sections[] =
+{
+  { ".l1.text",		8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_EXECINSTR },
+  { ".l1.data",		8, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
+  { NULL,		0,  0, 0,            0 }
+};
+
 
 #define TARGET_LITTLE_SYM		bfd_elf32_bfin_vec
 #define TARGET_LITTLE_NAME		"elf32-bfin"
@@ -5618,8 +5642,11 @@ error_return:
                                         elf32_bfin_set_private_flags
 #define bfd_elf32_bfd_print_private_bfd_data \
                                         elf32_bfin_print_private_bfd_data
+#define elf_backend_final_write_processing \
+					elf32_bfin_final_write_processing
 #define elf_backend_reloc_type_class    elf32_bfin_reloc_type_class
 #define elf_backend_can_gc_sections 1
+#define elf_backend_special_sections	elf32_bfin_special_sections
 #define elf_backend_can_refcount 1
 #define elf_backend_want_got_plt 0
 #define elf_backend_plt_readonly 1
Index: binutils/readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.412
diff -u -p -r1.412 readelf.c
--- binutils/readelf.c	10 Jul 2008 01:32:23 -0000	1.412
+++ binutils/readelf.c	11 Jul 2008 08:13:10 -0000
@@ -2140,6 +2140,21 @@ get_machine_flags (unsigned e_flags, uns
 	  decode_ARM_machine_flags (e_flags, buf);
 	  break;
 
+	case EM_BLACKFIN:
+	  if (e_flags & EF_BFIN_PIC)
+	    strcat (buf, ", PIC");
+
+	  if (e_flags & EF_BFIN_FDPIC)
+	    strcat (buf, ", FDPIC");
+
+	  if (e_flags & EF_BFIN_CODE_IN_L1)
+	    strcat (buf, ", code in L1");
+
+	  if (e_flags & EF_BFIN_DATA_IN_L1)
+	    strcat (buf, ", data in L1");
+
+	  break;
+
 	case EM_CYGNUS_FRV:
 	  switch (e_flags & EF_FRV_CPU_MASK)
 	    {
Index: include/bfdlink.h
===================================================================
RCS file: /cvs/src/src/include/bfdlink.h,v
retrieving revision 1.72
diff -u -p -r1.72 bfdlink.h
--- include/bfdlink.h	6 Jun 2008 06:01:53 -0000	1.72
+++ include/bfdlink.h	11 Jul 2008 08:13:19 -0000
@@ -346,6 +346,9 @@ struct bfd_link_info
   /* Non-NULL if .note.gnu.build-id section should be created.  */
   char *emit_note_gnu_build_id;
 
+  /* TRUE if putting code into separate segment.  */
+  unsigned int sep_code: 1;
+
   /* What to do with unresolved symbols in an object file.
      When producing executables the default is GENERATE_ERROR.
      When producing shared libraries the default is IGNORE.  The
Index: include/elf/bfin.h
===================================================================
RCS file: /cvs/src/src/include/elf/bfin.h,v
retrieving revision 1.2
diff -u -p -r1.2 bfin.h
--- include/elf/bfin.h	25 Mar 2006 18:21:47 -0000	1.2
+++ include/elf/bfin.h	11 Jul 2008 08:13:19 -0000
@@ -88,5 +88,8 @@ END_RELOC_NUMBERS (R_max)
 #define EF_BFIN_PIC		0x00000001	/* -fpic */
 #define EF_BFIN_FDPIC		0x00000002      /* -mfdpic */
 
+#define EF_BFIN_CODE_IN_L1	0x00000010	/* --code-in-l1 */
+#define EF_BFIN_DATA_IN_L1	0x00000020	/* --data-in-l1 */
+
 #define	EF_BFIN_PIC_FLAGS	(EF_BFIN_PIC | EF_BFIN_FDPIC)
 #endif /* _ELF_BFIN_H */
Index: ld/Makefile.am
===================================================================
RCS file: /cvs/src/src/ld/Makefile.am,v
retrieving revision 1.246
diff -u -p -r1.246 Makefile.am
--- ld/Makefile.am	25 Mar 2008 04:54:03 -0000	1.246
+++ ld/Makefile.am	11 Jul 2008 08:13:21 -0000
@@ -653,11 +653,11 @@ edelta68.c: $(srcdir)/emulparams/delta68
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/delta68.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} delta68 "$(tdir_delta68)"
 eelf32bfin.c: $(srcdir)/emulparams/bfin.sh \
-  $(ELF_DEPS) \
+  $(ELF_DEPS) $(srcdir)/emultempl/bfin.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfin "$(tdir_elf32bfin)" bfin
 eelf32bfinfd.c: $(srcdir)/emulparams/elf32bfinfd.sh $(srcdir)/emulparams/bfin.sh \
-  $(ELF_DEPS) \
+  $(ELF_DEPS) $(srcdir)/emultempl/bfin.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfinfd "$(tdir_elf32bfinfd)" elf32bfinfd
 eelf32_dlx.c: $(srcdir)/emulparams/elf32_dlx.sh \
Index: ld/Makefile.in
===================================================================
RCS file: /cvs/src/src/ld/Makefile.in,v
retrieving revision 1.266
diff -u -p -r1.266 Makefile.in
--- ld/Makefile.in	14 May 2008 06:45:42 -0000	1.266
+++ ld/Makefile.in	11 Jul 2008 08:13:24 -0000
@@ -1482,11 +1482,11 @@ edelta68.c: $(srcdir)/emulparams/delta68
   $(srcdir)/emultempl/generic.em $(srcdir)/scripttempl/delta68.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} delta68 "$(tdir_delta68)"
 eelf32bfin.c: $(srcdir)/emulparams/bfin.sh \
-  $(ELF_DEPS) \
+  $(ELF_DEPS) $(srcdir)/emultempl/bfin.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfin "$(tdir_elf32bfin)" bfin
 eelf32bfinfd.c: $(srcdir)/emulparams/elf32bfinfd.sh $(srcdir)/emulparams/bfin.sh \
-  $(ELF_DEPS) \
+  $(ELF_DEPS) $(srcdir)/emultempl/bfin.em \
   $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
 	${GENSCRIPTS} elf32bfinfd "$(tdir_elf32bfinfd)" elf32bfinfd
 eelf32_dlx.c: $(srcdir)/emulparams/elf32_dlx.sh \
Index: ld/gen-doc.texi
===================================================================
RCS file: /cvs/src/src/ld/gen-doc.texi,v
retrieving revision 1.10
diff -u -p -r1.10 gen-doc.texi
--- ld/gen-doc.texi	21 May 2008 12:01:35 -0000	1.10
+++ ld/gen-doc.texi	11 Jul 2008 08:13:24 -0000
@@ -4,6 +4,7 @@
 
 @c 2. Specific target machines
 @set ARM
+@set Blackfin
 @set H8300
 @set HPPA
 @set I960
Index: ld/ld.texinfo
===================================================================
RCS file: /cvs/src/src/ld/ld.texinfo,v
retrieving revision 1.218
diff -u -p -r1.218 ld.texinfo
--- ld/ld.texinfo	6 Jul 2008 13:38:36 -0000	1.218
+++ ld/ld.texinfo	11 Jul 2008 08:13:40 -0000
@@ -21,6 +21,7 @@
 @set UsesEnvVars
 @set GENERIC
 @set ARM
+@set Blackfin
 @set H8300
 @set HPPA
 @set I960
@@ -140,6 +141,9 @@ section entitled ``GNU Free Documentatio
 @ifset ARM
 * ARM::				ld and the ARM family
 @end ifset
+@ifset Blackfin
+* Blackfin::			ld and the Blackfin family
+@end ifset
 @ifset HPPA
 * HPPA ELF32::                  ld and HPPA 32-bit ELF
 @end ifset
@@ -825,6 +829,11 @@ For compatibility with other ELF linkers
 followed by a directory name, rather than a file name, it is treated as
 the @option{-rpath} option.
 
+@kindex --sep-code
+@cindex input files, displaying
+@itemx --sep-code
+Put code in a seperate segment, not along with other read only data.
+
 @kindex -s
 @kindex --strip-all
 @cindex strip all symbols
@@ -5362,6 +5371,9 @@ functionality are not listed.
 @ifset ARM
 * ARM::				@command{ld} and the ARM family
 @end ifset
+@ifset Blackfin
+* Blackfin::			@command{ld} and the Blackfin family
+@end ifset
 @ifset HPPA
 * HPPA ELF32::                  @command{ld} and HPPA 32-bit ELF
 @end ifset
@@ -5752,6 +5764,30 @@ otherwise.
 @end ifclear
 @end ifset
 
+@ifset Blackfin
+@ifclear GENERIC
+@raisesections
+@end ifclear
+
+@node Blackfin
+@section @command{ld} and the Blackfin family
+
+@cindex Put code in L1 instruction SRAM
+@kindex --code-in-l1
+The @samp{--code-in-l1} option adds a specific flag in the ELF header.
+This flag tells loader to put the code segments into Blackfin
+L1 instruction SRAM.
+
+@cindex Put code in L1 data SRAM
+@kindex --data-in-l1
+The @samp{--data-in-l1} option adds a specific flag in the ELF header.
+This flag tells loader to put the data segments into Blackfin L1 data SRAM.
+
+@ifclear GENERIC
+@lowersections
+@end ifclear
+@end ifset
+
 @ifset HPPA
 @ifclear GENERIC
 @raisesections
Index: ld/ldmain.c
===================================================================
RCS file: /cvs/src/src/ld/ldmain.c,v
retrieving revision 1.129
diff -u -p -r1.129 ldmain.c
--- ld/ldmain.c	7 Jun 2008 11:35:46 -0000	1.129
+++ ld/ldmain.c	11 Jul 2008 08:13:42 -0000
@@ -277,6 +277,7 @@ main (int argc, char **argv)
   link_info.pei386_auto_import = -1;
   link_info.spare_dynamic_tags = 5;
   link_info.path_separator = ':';
+  link_info.sep_code = FALSE;
 
   ldfile_add_arch ("");
   emulation = get_emulation (argc, argv);
Index: ld/lexsup.c
===================================================================
RCS file: /cvs/src/src/ld/lexsup.c,v
retrieving revision 1.105
diff -u -p -r1.105 lexsup.c
--- ld/lexsup.c	4 Jun 2008 09:45:05 -0000	1.105
+++ ld/lexsup.c	11 Jul 2008 08:13:42 -0000
@@ -92,6 +92,7 @@ enum option_values
   OPTION_RETAIN_SYMBOLS_FILE,
   OPTION_RPATH,
   OPTION_RPATH_LINK,
+  OPTION_SEP_CODE,
   OPTION_SHARED,
   OPTION_SONAME,
   OPTION_SORT_COMMON,
@@ -477,6 +478,8 @@ static const struct ld_option ld_options
     '\0', NULL, N_("Create a position independent executable"), ONE_DASH },
   { {"pic-executable", no_argument, NULL, OPTION_PIE},
     '\0', NULL, NULL, TWO_DASHES },
+  { {"sep-code", no_argument, NULL, OPTION_SEP_CODE},
+    '\0', NULL, N_("Put code into separate segment"), TWO_DASHES },
   { {"sort-common", optional_argument, NULL, OPTION_SORT_COMMON},
     '\0', N_("[=ascending|descending]"), 
     N_("Sort common symbols by alignment [in specified order]"), 
@@ -1143,6 +1146,9 @@ parse_args (unsigned argc, char **argv)
 	  else
 	    einfo (_("%P%F: -pie not supported\n"));
 	  break;
+	case OPTION_SEP_CODE:
+	  link_info.sep_code = TRUE;
+	  break;
 	case 'h':		/* Used on Solaris.  */
 	case OPTION_SONAME:
 	  command_line.soname = optarg;
Index: ld/emulparams/bfin.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/bfin.sh,v
retrieving revision 1.6
diff -u -p -r1.6 bfin.sh
--- ld/emulparams/bfin.sh	9 Aug 2007 11:02:24 -0000	1.6
+++ ld/emulparams/bfin.sh	11 Jul 2008 08:13:42 -0000
@@ -10,3 +10,4 @@ TEMPLATE_NAME=elf32
 GENERATE_SHLIB_SCRIPT=yes
 EMBEDDED=yes
 USER_LABEL_PREFIX=_
+EXTRA_EM_FILE=bfin
Index: ld/emulparams/elf32bfinfd.sh
===================================================================
RCS file: /cvs/src/src/ld/emulparams/elf32bfinfd.sh,v
retrieving revision 1.2
diff -u -p -r1.2 elf32bfinfd.sh
--- ld/emulparams/elf32bfinfd.sh	30 May 2006 16:45:32 -0000	1.2
+++ ld/emulparams/elf32bfinfd.sh	11 Jul 2008 08:13:46 -0000
@@ -14,3 +14,24 @@ OTHER_READONLY_SECTIONS="
     ${RELOCATING+__ROFIXUP_END__ = .;}
   }
 "
+# 0xff700000, 0xff800000, 0xff900000 and 0xffa00000 are also used in
+# Dynamic linker and linux kernel. They need to be keep synchronized.
+OTHER_SECTIONS="
+  .l1.data 0xff700000	:
+  {
+    *(.l1.data)
+  }
+  .l1.data.A 0xff800000	:
+  {
+    *(.l1.data.A)
+  }
+  .l1.data.B 0xff900000	:
+  {
+    *(.l1.data.B)
+  }
+  .l1.text  0xffa00000	:
+  {
+    *(.l1.text)
+  }
+"
+EXTRA_EM_FILE=bfin
Index: ld/emultempl/bfin.em
===================================================================
RCS file: ld/emultempl/bfin.em
diff -N ld/emultempl/bfin.em
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ ld/emultempl/bfin.em	11 Jul 2008 08:13:46 -0000
@@ -0,0 +1,64 @@
+# This shell script emits a C file. -*- C -*-
+#   Copyright 2006 Free Software Foundation, Inc.
+#
+# This file is part of GLD, the Gnu Linker.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+#
+
+# This file is sourced from elf32.em, and defines extra bfin-elf
+# specific routines.
+#
+cat >>e${EMULATION_NAME}.c <<EOF
+
+#include "elf-bfd.h"
+
+/* Whether to put code in Blackfin L1 SRAM.  */
+extern bfd_boolean elf32_bfin_code_in_l1;
+
+/* Whether to put (writable) data in Blackfin L1 SRAM.  */
+extern bfd_boolean elf32_bfin_data_in_l1;
+
+EOF
+
+
+# Define some shell vars to insert bits of code into the standard elf
+# parse_args and list_options functions.
+#
+PARSE_AND_LIST_PROLOGUE='
+#define OPTION_CODE_IN_L1		300
+#define OPTION_DATA_IN_L1		301
+'
+
+PARSE_AND_LIST_LONGOPTS='
+  { "code-in-l1", no_argument, NULL, OPTION_CODE_IN_L1 },
+  { "data-in-l1", no_argument, NULL, OPTION_DATA_IN_L1 },
+'
+
+PARSE_AND_LIST_OPTIONS='
+  fprintf (file, _("\
+  --code-in-l1          Put code in l1.\n\
+  --data-in-l1          Put data in l1.\n"
+		   ));
+'
+
+PARSE_AND_LIST_ARGS_CASES='
+    case OPTION_CODE_IN_L1:
+      elf32_bfin_code_in_l1 = TRUE;
+      break;
+    case OPTION_DATA_IN_L1:
+      elf32_bfin_data_in_l1 = TRUE;
+      break;
+'

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