Change regcache list to be an hash map
[deliverable/binutils-gdb.git] / ld / ldfile.c
index 5bb08f7b2e46f1072efc92de6b5a1c7bb109f6c1..9f0398a41e6453fc0ad2900217df342baf932f5c 100644 (file)
@@ -21,6 +21,7 @@
 #include "sysdep.h"
 #include "bfd.h"
 #include "bfdlink.h"
+#include "ctf-api.h"
 #include "safe-ctype.h"
 #include "ld.h"
 #include "ldmisc.h"
@@ -186,7 +187,7 @@ ldfile_try_open_bfd (const char *attempt,
                  extern FILE *yyin;
 
                  /* Try to interpret the file as a linker script.  */
-                 ldfile_open_script_file (attempt);
+                 ldfile_open_command_file (attempt);
 
                  ldfile_assumed_script = TRUE;
                  parser_input = input_selected;
@@ -585,44 +586,56 @@ ldfile_find_command_file (const char *name,
   return result;
 }
 
+enum script_open_style {
+  script_nonT,
+  script_T,
+  script_defaultT
+};
+
+struct script_name_list
+{
+  struct script_name_list *next;
+  enum script_open_style open_how;
+  char name[1];
+};
+
 /* Open command file NAME.  */
 
 static void
-ldfile_open_command_file_1 (const char *name,
-                           bfd_boolean default_only,
-                           bfd_boolean is_script)
+ldfile_open_command_file_1 (const char *name, enum script_open_style open_how)
 {
   FILE *ldlex_input_stack;
   bfd_boolean sysrooted;
+  static struct script_name_list *processed_scripts = NULL;
+  struct script_name_list *script;
+  size_t len;
 
-  if (is_script)
+  /* PR 24576: Catch the case where the user has accidentally included
+     the same linker script twice.  */
+  for (script = processed_scripts; script != NULL; script = script->next)
     {
-      static struct name_list *processed_scripts = NULL;
-      struct name_list *script;
-
-      /* PR 24576: Catch the case where the user has accidentally included
-        the same linker script twice.  */
-      for (script = processed_scripts; script != NULL; script = script->next)
+      if ((open_how != script_nonT || script->open_how != script_nonT)
+         && strcmp (name, script->name) == 0)
        {
-         if (strcmp (name, script->name) == 0)
-           {
-             einfo (_("%F%P: error: linker script file '%s' appears multiple times\n"),
-                    name);
-             return;
-           }
+         einfo (_("%F%P: error: linker script file '%s'"
+                  " appears multiple times\n"), name);
+         return;
        }
-
-      /* FIXME: This memory is never freed, but that should not really matter.
-        It will be released when the linker exits, and it is unlikely to ever
-        be more than a few tens of bytes.  */
-      script = xmalloc (sizeof (name_list));
-      script->name = strdup (name);
-      script->next = processed_scripts;
-      processed_scripts = script;
     }
 
-  ldlex_input_stack = ldfile_find_command_file (name, default_only, &sysrooted);
-
+  /* FIXME: This memory is never freed, but that should not really matter.
+     It will be released when the linker exits, and it is unlikely to ever
+     be more than a few tens of bytes.  */
+  len = strlen (name);
+  script = xmalloc (sizeof (*script) + len);
+  script->next = processed_scripts;
+  script->open_how = open_how;
+  memcpy (script->name, name, len + 1);
+  processed_scripts = script;
+
+  ldlex_input_stack = ldfile_find_command_file (name,
+                                               open_how == script_defaultT,
+                                               &sysrooted);
   if (ldlex_input_stack == NULL)
     {
       bfd_set_error (bfd_error_system_call);
@@ -643,13 +656,13 @@ ldfile_open_command_file_1 (const char *name,
 void
 ldfile_open_command_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, FALSE, FALSE);
+  ldfile_open_command_file_1 (name, script_nonT);
 }
 
 void
 ldfile_open_script_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, FALSE, TRUE);
+  ldfile_open_command_file_1 (name, script_T);
 }
 
 /* Open command file NAME at the default script location.  */
@@ -657,7 +670,7 @@ ldfile_open_script_file (const char *name)
 void
 ldfile_open_default_command_file (const char *name)
 {
-  ldfile_open_command_file_1 (name, TRUE, TRUE);
+  ldfile_open_command_file_1 (name, script_defaultT);
 }
 
 void
This page took 0.02608 seconds and 4 git commands to generate.