[binutils-gdb] cskyelf.em branch stub handling

Alan Modra amodra@sourceware.org
Wed Apr 10 04:09:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=53b81c6de19a1f89e3c797631e72d05ba41444dc

commit 53b81c6de19a1f89e3c797631e72d05ba41444dc
Author: Alan Modra <amodra@gmail.com>
Date:   Wed Apr 10 11:58:15 2019 +0930

    cskyelf.em branch stub handling
    
    This fixes the csky-elf ld-elf/pr21884 and ld-unique/pr21529 failures,
    by disabling branch stubs for binary (and other non-csky) output.
    The csky-linux target gets branch stubs off by default because
    presumably there are reasons why branch stubs were disabled, but
    rather than killing the support completely it can be enabled by
    --branch-stub.
    
    	* emultempl/cskyelf.em (csk_elf_before_parse): New function,
    	setting use_branch_stub false for linux.
    	(csky_elf_create_output_section_statements): Do emit this
    	function and all others in the file for linux, plus the branch
    	option control.  Disable branch stubs when non-ELF.

Diff:
---
 ld/ChangeLog            |  8 ++++++++
 ld/emultempl/cskyelf.em | 31 +++++++++++++++----------------
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index 4df91b7..0f36d6c 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,5 +1,13 @@
 2019-04-10  Alan Modra  <amodra@gmail.com>
 
+	* emultempl/cskyelf.em (csk_elf_before_parse): New function,
+	setting use_branch_stub false for linux.
+	(csky_elf_create_output_section_statements): Do emit this
+	function and all others in the file for linux, plus the branch
+	option control.  Disable branch stubs when non-ELF.
+
+2019-04-10  Alan Modra  <amodra@gmail.com>
+
 	* Makefile.am (eskyelf.c, eskyelf_linux.c): Depend on cskyelf.em.
 	(ecskyelf_linux.c): Depend on cskyelf.sh.
 	(eelf32microblazeel.c): Depend on elf32microblaze.sh.
diff --git a/ld/emultempl/cskyelf.em b/ld/emultempl/cskyelf.em
index 690bb49..3651bb2 100644
--- a/ld/emultempl/cskyelf.em
+++ b/ld/emultempl/cskyelf.em
@@ -116,25 +116,32 @@ EOF
 case ${target} in
     csky-*-linux-*)
 fragment <<EOF
-/* This is a convenient point to tell BFD about target specific flags.
-   After the output has been created, but before inputs are read.  */
+
 static void
-csky_elf_create_output_section_statements (void)
+csky_elf_before_parse (void)
 {
   use_branch_stub = FALSE;
+  gld${EMULATION_NAME}_before_parse ();
 }
 EOF
     ;;
-    *)
+esac
+
 fragment <<EOF
+
 /* This is a convenient point to tell BFD about target specific flags.
    After the output has been created, but before inputs are read.  */
 static void
 csky_elf_create_output_section_statements (void)
 {
+  if (!(bfd_get_flavour (link_info.output_bfd) == bfd_target_elf_flavour
+	&& elf_object_id (link_info.output_bfd) == CSKY_ELF_DATA))
+    use_branch_stub = FALSE;
+
   /* If don't use branch stub, just do not emit stub_file.  */
-  if (use_branch_stub == FALSE)
+  if (!use_branch_stub)
     return;
+
   stub_file = lang_add_input_file ("linker stubs",
 				   lang_input_file_is_fake_enum, NULL);
   stub_file->the_bfd = bfd_create ("linker stubs", link_info.output_bfd);
@@ -150,11 +157,7 @@ csky_elf_create_output_section_statements (void)
   stub_file->the_bfd->flags |= BFD_LINKER_CREATED;
   ldlang_add_file (stub_file);
 }
-EOF
-    ;;
-esac
 
-fragment <<EOF
 /* Call-back for elf32_csky_size_stubs.  */
 
 /* Create a new stub section, and arrange for it to be linked
@@ -304,11 +307,6 @@ EOF
 
 # This code gets inserted into the generic elf32.sc linker script
 # and allows us to define our own command line switches.
-case ${target} in
-    csky-*-linux-*)
-    ;;
-
-    *)
 PARSE_AND_LIST_PROLOGUE='
 #define OPTION_BRANCH_STUB		301
 #define OPTION_NO_BRANCH_STUB		302
@@ -347,9 +345,10 @@ PARSE_AND_LIST_ARGS_CASES='
     }
     break;
 '
-    ;;
-esac
 
+case ${target} in
+    csky-*-linux-*) LDEMUL_BEFORE_PARSE=csky_elf_before_parse ;;
+esac
 LDEMUL_AFTER_ALLOCATION=gld${EMULATION_NAME}_after_allocation
 LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS=csky_elf_create_output_section_statements
 LDEMUL_FINISH=gld${EMULATION_NAME}_finish



More information about the Binutils-cvs mailing list