gas .include and .incbin
authorAlan Modra <amodra@gmail.com>
Sun, 12 Mar 2023 02:57:38 +0000 (13:27 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 14 Mar 2023 01:44:32 +0000 (12:14 +1030)
This fixes a bug in .include and .incbin where given an absolute path
the -I dirs would be searched for the path.

* read.c (include_dir_count, include_dir_maxlen): Make them size_t.
(search_and_open): New function.
(s_incbin, s_include): Use search_and_open.
(init_include_dir): New function.
(add_include_dir): Don't set initial "." dir here.
* read.h (include_dir_count, include_dir_maxlen): Update.
(init_include_dir, search_and_open): Declare.
* as.c (gas_early_init): Call init_include_dir.
* config/tc-rx.c (rx_include): Avoid warning by using size_t.
* config/tc-tic54x.c (tic54x_set_default_include): Simplify and
use notes for include path.
(tic54x_mlib): Use search_and_open.

gas/as.c
gas/config/tc-rx.c
gas/config/tc-tic54x.c
gas/read.c
gas/read.h

index a18438c25423a2fb37f1081008582d9adbcbb6e4..593eaec7f1493616034091fbfef233c55096161f 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1308,6 +1308,8 @@ gas_early_init (int *argcp, char ***argvp)
 
   expandargv (argcp, argvp);
 
+  init_include_dir ();
+
 #ifdef HOST_SPECIAL_INIT
   HOST_SPECIAL_INIT (*argcp, *argvp);
 #endif
index 36b7f0bf9c63c2ed1e5d726c51159ac8d47b45e4..c011ec11b4b094d24c08a693abc33941cc6b78ea 100644 (file)
@@ -380,9 +380,7 @@ rx_include (int ignore)
 
       if (try == NULL)
        {
-         int i;
-
-         for (i = 0; i < include_dir_count; i++)
+         for (size_t i = 0; i < include_dir_count; i++)
            {
              sprintf (path, "%s/%s", include_dirs[i], f);
              if ((try = fopen (path, FOPEN_RT)) != NULL)
index f687dfe5abb65f85e91d1066dac54169f2f9be5e..4dc1dbf28d72a355e6cd1f8b931ee025b1a0f20b 100644 (file)
@@ -1909,35 +1909,22 @@ tic54x_clink (int ignored ATTRIBUTE_UNUSED)
 }
 
 /* Change the default include directory to be the current source file's
-   directory, instead of the current working directory.  If DOT is non-zero,
-   set to "." instead.  */
+   directory.  */
 
 static void
 tic54x_set_default_include (void)
 {
-  char *dir, *tmp = NULL;
-  const char *curfile;
   unsigned lineno;
-
-  curfile = as_where (&lineno);
-  dir = xstrdup (curfile);
-  tmp = strrchr (dir, '/');
+  const char *curfile = as_where (&lineno);
+  const char *tmp = strrchr (curfile, '/');
   if (tmp != NULL)
     {
-      int len;
-
-      *tmp = '\0';
-      len = strlen (dir);
-      if (include_dir_count == 0)
-       {
-         include_dirs = XNEWVEC (const char *, 1);
-         include_dir_count = 1;
-       }
-      include_dirs[0] = dir;
+      size_t len = tmp - curfile;
       if (len > include_dir_maxlen)
        include_dir_maxlen = len;
+      include_dirs[0] = notes_memdup (curfile, len, len + 1);
     }
-  else if (include_dirs != NULL)
+  else
     include_dirs[0] = ".";
 }
 
@@ -2325,7 +2312,7 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED)
 {
   char *filename;
   char *path;
-  int len, i;
+  int len;
   bfd *abfd, *mbfd;
 
   ILLEGAL_WITHIN_STRUCT ();
@@ -2353,31 +2340,11 @@ tic54x_mlib (int ignore ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 
   tic54x_set_default_include ();
-  path = XNEWVEC (char, (unsigned long) len + include_dir_maxlen + 5);
-
-  for (i = 0; i < include_dir_count; i++)
-    {
-      FILE *try;
-
-      strcpy (path, include_dirs[i]);
-      strcat (path, "/");
-      strcat (path, filename);
-      if ((try = fopen (path, "r")) != NULL)
-       {
-         fclose (try);
-         break;
-       }
-    }
-
-  if (i >= include_dir_count)
-    {
-      free (path);
-      path = filename;
-    }
+  path = notes_alloc (len + include_dir_maxlen + 2);
+  FILE *try = search_and_open (filename, path);
+  if (try)
+    fclose (try);
 
-  /* FIXME: if path is found, malloc'd storage is not freed.  Of course, this
-     happens all over the place, and since the assembler doesn't usually keep
-     running for a very long time, it really doesn't matter.  */
   register_dependency (path);
 
   /* Expand all archive entries to temporary files and include them.  */
index cff44623541ee4663f0d4087a4948913a3cc727e..08312ff6d2ff9e2f263d506aaf8b95ef80b34b09 100644 (file)
@@ -40,6 +40,7 @@
 #include "dw2gencfi.h"
 #include "codeview.h"
 #include "wchar.h"
+#include "filenames.h"
 
 #include <limits.h>
 
@@ -173,10 +174,10 @@ int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
 const char **include_dirs;
 
 /* How many are in the table.  */
-int include_dir_count;
+size_t include_dir_count;
 
 /* Length of longest in table.  */
-int include_dir_maxlen = 1;
+size_t include_dir_maxlen;
 
 #ifndef WORKING_DOT_WORD
 struct broken_word *broken_words;
@@ -5746,6 +5747,30 @@ equals (char *sym_name, int reassign)
     }
 }
 
+/* Open FILENAME, first trying the unadorned file name, then if that
+   fails and the file name is not an absolute path, attempt to open
+   the file in current -I include paths.  PATH is a preallocated
+   buffer which will be set to the file opened, or FILENAME if no file
+   is found.  */
+
+FILE *
+search_and_open (const char *filename, char *path)
+{
+  FILE *f = fopen (filename, FOPEN_RB);
+  if (f == NULL && !IS_ABSOLUTE_PATH (filename))
+    {
+      for (size_t i = 0; i < include_dir_count; i++)
+       {
+         sprintf (path, "%s/%s", include_dirs[i], filename);
+         f = fopen (path, FOPEN_RB);
+         if (f != NULL)
+           return f;
+       }
+    }
+  strcpy (path, filename);
+  return f;
+}
+
 /* .incbin -- include a file verbatim at the current location.  */
 
 void
@@ -5797,30 +5822,12 @@ s_incbin (int x ATTRIBUTE_UNUSED)
 
   demand_empty_rest_of_line ();
 
-  /* Try opening absolute path first, then try include dirs.  */
-  binfile = fopen (filename, FOPEN_RB);
-  if (binfile == NULL)
-    {
-      int i;
-
-      path = XNEWVEC (char, (unsigned long) len + include_dir_maxlen + 5);
-
-      for (i = 0; i < include_dir_count; i++)
-       {
-         sprintf (path, "%s/%s", include_dirs[i], filename);
-
-         binfile = fopen (path, FOPEN_RB);
-         if (binfile != NULL)
-           break;
-       }
+  path = XNEWVEC (char, len + include_dir_maxlen + 2);
+  binfile = search_and_open (filename, path);
 
-      if (binfile == NULL)
-       as_bad (_("file not found: %s"), filename);
-    }
+  if (binfile == NULL)
+    as_bad (_("file not found: %s"), filename);
   else
-    path = xstrdup (filename);
-
-  if (binfile)
     {
       long   file_len;
       struct stat filestat;
@@ -5914,48 +5921,33 @@ s_include (int arg ATTRIBUTE_UNUSED)
     }
 
   demand_empty_rest_of_line ();
-  path = notes_alloc ((size_t) i + include_dir_maxlen + 5);
 
-  for (i = 0; i < include_dir_count; i++)
-    {
-      strcpy (path, include_dirs[i]);
-      strcat (path, "/");
-      strcat (path, filename);
-      if (0 != (try_file = fopen (path, FOPEN_RT)))
-       {
-         fclose (try_file);
-         goto gotit;
-       }
-    }
+  path = notes_alloc (i + include_dir_maxlen + 2);
+  try_file = search_and_open (filename, path);
+  if (try_file)
+    fclose (try_file);
 
-  notes_free (path);
-  path = filename;
- gotit:
   register_dependency (path);
   input_scrub_insert_file (path);
 }
 
 void
-add_include_dir (char *path)
+init_include_dir (void)
 {
-  int i;
-
-  if (include_dir_count == 0)
-    {
-      include_dirs = XNEWVEC (const char *, 2);
-      include_dirs[0] = ".";   /* Current dir.  */
-      include_dir_count = 2;
-    }
-  else
-    {
-      include_dir_count++;
-      include_dirs = XRESIZEVEC (const char *, include_dirs,
-                                include_dir_count);
-    }
+  include_dirs = XNEWVEC (const char *, 1);
+  include_dirs[0] = ".";       /* Current dir.  */
+  include_dir_count = 1;
+  include_dir_maxlen = 1;
+}
 
+void
+add_include_dir (char *path)
+{
+  include_dir_count++;
+  include_dirs = XRESIZEVEC (const char *, include_dirs, include_dir_count);
   include_dirs[include_dir_count - 1] = path;  /* New one.  */
 
-  i = strlen (path);
+  size_t i = strlen (path);
   if (i > include_dir_maxlen)
     include_dir_maxlen = i;
 }
index 406b026d76ffb88eec853db2e45473328eb13898..42efce9e79dde011ae089ce61ac5713fce7a92af 100644 (file)
@@ -79,8 +79,8 @@ extern const char line_separator_chars[];
 
 /* Table of -I directories.  */
 extern const char **include_dirs;
-extern int include_dir_count;
-extern int include_dir_maxlen;
+extern size_t include_dir_count;
+extern size_t include_dir_maxlen;
 
 /* The offset in the absolute section.  */
 extern addressT abs_section_offset;
@@ -124,7 +124,9 @@ extern unsigned int next_char_of_string (void);
 extern void s_mri_sect (char *);
 extern char *mri_comment_field (char *);
 extern void mri_comment_end (char *, int);
-extern void add_include_dir (char *path);
+extern void init_include_dir (void);
+extern void add_include_dir (char *);
+extern FILE *search_and_open (const char *, char *);
 extern void cons (int nbytes);
 extern void demand_empty_rest_of_line (void);
 extern void emit_expr (expressionS *exp, unsigned int nbytes);