public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: Alexey Lapshin <alexey.lapshin@espressif.com>
To: "binutils@sourceware.org" <binutils@sourceware.org>
Cc: Alexey Gerenkov <alexey.gerenkov@espressif.com>,
	Ivan Grokhotkov <ivan@espressif.com>,
	"jcmvbkbc@gmail.com" <jcmvbkbc@gmail.com>
Subject: [PATCH] xtensa: add dynconfig option for ld/gas
Date: Thu, 20 Jul 2023 14:39:14 +0000	[thread overview]
Message-ID: <efa3944b8dddd45e171baa8c3939e8636ab2d6b8.camel@espressif.com> (raw)

bfd/
        * bfd/xtensa-dynconfig.c: Add xtensa_dynconfig_file variable.

gas/
        * gas/config/tc-xtensa.c: Add dynconfig option.

ld/
        * ld/emultempl/xtensaelf.em: Add dynconfig option.
---
 bfd/xtensa-dynconfig.c    | 57 +++++++++++++++++++++++++++++++++++++--
 gas/config/tc-xtensa.c    | 29 ++++++++++++++++++--
 ld/emultempl/xtensaelf.em | 10 +++++++
 3 files changed, 92 insertions(+), 4 deletions(-)

diff --git a/bfd/xtensa-dynconfig.c b/bfd/xtensa-dynconfig.c
index ebf4098f59c..0140936e98e 100644
--- a/bfd/xtensa-dynconfig.c
+++ b/bfd/xtensa-dynconfig.c
@@ -20,6 +20,7 @@
 #include "sysdep.h"
 #include "bfd.h"
 #include "libbfd.h"
+#include "libiberty.h"
 
 #define XTENSA_CONFIG_DEFINITION
 #include "xtensa-config.h"
@@ -64,6 +65,57 @@ dlerror (void)
 
 #define CONFIG_ENV_NAME "XTENSA_GNU_CONFIG"
 
+/* this variable can be changed with input option for gas/ld  */
+const char *xtensa_dynconfig_file = "";
+
+#ifdef BFD_SUPPORTS_PLUGINS
+
+static char *get_xtensa_dynconfig_file (void)
+{
+  const char *xtensa_dynconfig_env = getenv (CONFIG_ENV_NAME);
+  if (!strlen (xtensa_dynconfig_file))
+    {
+      if (xtensa_dynconfig_env && !strlen (lbasename (xtensa_dynconfig_env)))
+	{
+	  /* XTENSA_GNU_CONFIG has directory path, but dynconfig file is not set */
+	  return NULL;
+	}
+      else if (xtensa_dynconfig_env)
+	{
+	  /* XTENSA_GNU_CONFIG has filepath */
+	  return xstrdup (xtensa_dynconfig_env);
+	}
+      /* dynconfig is not set */
+      return NULL;
+    }
+  if (!xtensa_dynconfig_env)
+    {
+      /* XTENSA_GNU_CONFIG has filepath */
+      return xstrdup (xtensa_dynconfig_file);
+    }
+  if (!strlen (lbasename (xtensa_dynconfig_env)))
+    {
+      /* XTENSA_GNU_CONFIG has directory path and dynconfig file is set */
+      const size_t len = strlen (xtensa_dynconfig_env) +
+                         strlen (xtensa_dynconfig_file) + 1;
+      char *path = ( char *) xmalloc (len);
+      strcpy (path, xtensa_dynconfig_env);
+      strcat (path, xtensa_dynconfig_file);
+      return path;
+    }
+  if (strcmp (lbasename (xtensa_dynconfig_env),
+              lbasename (xtensa_dynconfig_file)))
+    {
+      _bfd_error_handler (_("Both %s and \"-dynconfig=\" specified but pointed different files: \"%s\" \"%s\""),
+			      CONFIG_ENV_NAME, xtensa_dynconfig_env, xtensa_dynconfig_file);
+      abort ();
+    }
+  /* XTENSA_GNU_CONFIG and mdynconfig option point to the same file */
+  return xstrdup (xtensa_dynconfig_env);
+}
+
+#endif /* BFD_SUPPORTS_PLUGINS  */
+
 const void *xtensa_load_config (const char *name ATTRIBUTE_UNUSED,
 				const void *no_plugin_def,
 				const void *no_name_def ATTRIBUTE_UNUSED)
@@ -75,12 +127,13 @@ const void *xtensa_load_config (const char *name ATTRIBUTE_UNUSED,
 
   if (!init)
     {
-      const char *path = getenv (CONFIG_ENV_NAME);
+      char *path = get_xtensa_dynconfig_file();
 
       init = 1;
       if (!path)
 	return no_plugin_def;
       handle = dlopen (path, RTLD_LAZY);
+      free (path);
       if (!handle)
 	{
 	  _bfd_error_handler (_("%s is defined but could not be loaded: %s"),
@@ -107,7 +160,7 @@ const void *xtensa_load_config (const char *name ATTRIBUTE_UNUSED,
 #else
   if (!init)
     {
-      const char *path = getenv (CONFIG_ENV_NAME);
+      const char *path = strcmp(xtensa_dynconfig_file, "") ? xtensa_dynconfig_file : getenv (CONFIG_ENV_NAME);
 
       init = 1;
       if (path)
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
index 550c8256e3f..d9ba8bc8690 100644
--- a/gas/config/tc-xtensa.c
+++ b/gas/config/tc-xtensa.c
@@ -733,6 +733,8 @@ enum
 
   option_abi_windowed,
   option_abi_call0,
+
+  option_dynconfig,
 };
 
 const char *md_shortopts = "";
@@ -817,6 +819,7 @@ struct option md_longopts[] =
   { "abi-windowed", no_argument, NULL, option_abi_windowed },
   { "abi-call0", no_argument, NULL, option_abi_call0 },
 
+  { "dynconfig=", required_argument, NULL, option_dynconfig },
   { NULL, no_argument, NULL, 0 }
 };
 
@@ -1053,6 +1056,12 @@ md_parse_option (int c, const char *arg)
       elf32xtensa_abi = XTHAL_ABI_CALL0;
       return 1;
 
+    case option_dynconfig:
+      {
+	    /* Applied in xtensa_init()  */
+	    return 1;
+      }
+
     default:
       return 0;
     }
@@ -1087,7 +1096,9 @@ Xtensa options:\n\
   --[no-]separate-prop-tables\n\
                           [Do not] place Xtensa property records into\n\
                           individual property sections for each section.\n\
-                          Default is to generate single property section.\n", stream);
+                          Default is to generate single property section.\n\
+  --dynconfig=<file>\n\
+                          Use xtensa dynconfig options\n", stream);
 }
 
 \f
@@ -5268,8 +5279,22 @@ xg_init_global_config (void)
 }
 
 void
-xtensa_init (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
+xtensa_init (int argc, char **argv)
 {
+  /* This function is called before AS arguments parsed.
+   * So, dynconfig file must be set first.
+   */
+  int i;
+  const char * const dynconfig_opt = "--dynconfig=";
+  for (i = 1; i < argc; i++)
+    {
+      if (!strncmp (dynconfig_opt, argv[i], strlen(dynconfig_opt)))
+	    {
+	      extern const char* xtensa_dynconfig_file;
+	      xtensa_dynconfig_file = &argv[i][strlen(dynconfig_opt)];
+	      break;
+	    }
+    }
   xg_init_global_config ();
 }
 
diff --git a/ld/emultempl/xtensaelf.em b/ld/emultempl/xtensaelf.em
index 4cb9bda8f92..615bde5655b 100644
--- a/ld/emultempl/xtensaelf.em
+++ b/ld/emultempl/xtensaelf.em
@@ -1930,6 +1930,7 @@ PARSE_AND_LIST_PROLOGUE='
 #define OPTION_NO_LITERAL_MOVEMENT	(OPTION_LITERAL_MOVEMENT + 1)
 #define OPTION_ABI_WINDOWED		(OPTION_NO_LITERAL_MOVEMENT + 1)
 #define OPTION_ABI_CALL0		(OPTION_ABI_WINDOWED + 1)
+#define OPTION_DYNCONFIG		(OPTION_ABI_CALL0 + 1)
 extern int elf32xtensa_size_opt;
 extern int elf32xtensa_no_literal_movement;
 extern int elf32xtensa_abi;
@@ -1941,6 +1942,7 @@ PARSE_AND_LIST_LONGOPTS='
   { "no-literal-movement", no_argument, NULL, OPTION_NO_LITERAL_MOVEMENT},
   { "abi-windowed", no_argument, NULL, OPTION_ABI_WINDOWED},
   { "abi-call0", no_argument, NULL, OPTION_ABI_CALL0},
+  { "dynconfig=", required_argument, NULL, OPTION_DYNCONFIG},
 '
 
 PARSE_AND_LIST_OPTIONS='
@@ -1951,6 +1953,8 @@ PARSE_AND_LIST_OPTIONS='
   --abi-windowed              Choose windowed ABI for the output object\n"));
   fprintf (file, _("\
   --abi-call0                 Choose call0 ABI for the output object\n"));
+  fprintf (file, _("\
+  --dynconfig=FILE            Choose xtensa dynconfig file\n"));
 '
 
 PARSE_AND_LIST_ARGS_CASES='
@@ -1969,6 +1973,12 @@ PARSE_AND_LIST_ARGS_CASES='
     case OPTION_ABI_CALL0:
       elf32xtensa_abi = XTHAL_ABI_CALL0;
       break;
+    case OPTION_DYNCONFIG:
+      {
+	extern const char* xtensa_dynconfig_file;
+	xtensa_dynconfig_file = optarg;
+	break;
+      }
 '
 
 # Replace some of the standard ELF functions with our own versions.
-- 
2.34.1


             reply	other threads:[~2023-07-20 14:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-20 14:39 Alexey Lapshin [this message]
2023-07-20 14:40 ` Alexey Lapshin
2024-04-01 13:01   ` [PATCH v2] " Alexey Lapshin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=efa3944b8dddd45e171baa8c3939e8636ab2d6b8.camel@espressif.com \
    --to=alexey.lapshin@espressif.com \
    --cc=alexey.gerenkov@espressif.com \
    --cc=binutils@sourceware.org \
    --cc=ivan@espressif.com \
    --cc=jcmvbkbc@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).