public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* cskyelf.em branch stub handling
@ 2019-04-10  4:08 Alan Modra
  0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2019-04-10  4:08 UTC (permalink / raw)
  To: binutils; +Cc: Lifang Xia, Yunhai Shang

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 now 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 --git a/ld/emultempl/cskyelf.em b/ld/emultempl/cskyelf.em
index 690bb49222..3651bb244d 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

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-04-10  4:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-10  4:08 cskyelf.em branch stub handling Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).