]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gas/as.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / as.c
index 6e8ec5678556e8b41f52d9f80a7398fa7d2ca80c..caa1c300ae7cf072ad3926f9ac6335a47f06f88c 100644 (file)
--- a/gas/as.c
+++ b/gas/as.c
@@ -1,5 +1,5 @@
 /* as.c - GAS main program.
-   Copyright (C) 1987-2018 Free Software Foundation, Inc.
+   Copyright (C) 1987-2021 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -95,8 +95,20 @@ int debug_memory = 0;
 /* Enable verbose mode.  */
 int verbose = 0;
 
+/* Which version of DWARF CIE to produce.  This default value of -1
+   indicates that this value has not been set yet, a default value is
+   provided in dwarf2_init.  A different value can also be supplied by the
+   command line flag --gdwarf-cie-version, or by a target in
+   MD_AFTER_PARSE_ARGS.  */
+int flag_dwarf_cie_version = -1;
+
+/* The maximum level of DWARF DEBUG information we should manufacture.
+   This defaults to 3 unless overridden by a command line option.  */
+unsigned int dwarf_level = 3;
+
 #if defined OBJ_ELF || defined OBJ_MAYBE_ELF
 int flag_use_elf_stt_common = DEFAULT_GENERATE_ELF_STT_COMMON;
+bfd_boolean flag_generate_build_notes = DEFAULT_GENERATE_BUILD_NOTES;
 #endif
 
 /* Keep the output file.  */
@@ -300,11 +312,27 @@ Options:\n\
   --size-check=[error|warning]\n\
                          ELF .size directive check (default --size-check=error)\n"));
   fprintf (stream, _("\
-  --elf-stt-common=[no|yes]\n\
+  --elf-stt-common=[no|yes] "));
+  if (DEFAULT_GENERATE_ELF_STT_COMMON)
+    fprintf (stream, _("(default: yes)\n"));
+  else
+    fprintf (stream, _("(default: no)\n"));
+  fprintf (stream, _("\
                           generate ELF common symbols with STT_COMMON type\n"));
   fprintf (stream, _("\
   --sectname-subst        enable section name substitution sequences\n"));
+
+  fprintf (stream, _("\
+  --generate-missing-build-notes=[no|yes] "));
+#if DEFAULT_GENERATE_BUILD_NOTES
+  fprintf (stream, _("(default: yes)\n"));
+#else
+  fprintf (stream, _("(default: no)\n"));
 #endif
+  fprintf (stream, _("\
+                          generate GNU Build notes if none are present in the input\n"));
+#endif /* OBJ_ELF */
+
   fprintf (stream, _("\
   -f                      skip whitespace and comment preprocessing\n"));
   fprintf (stream, _("\
@@ -314,14 +342,10 @@ Options:\n\
   fprintf (stream, _("\
   --gstabs+               generate STABS debug info with GNU extensions\n"));
   fprintf (stream, _("\
-  --gdwarf-2              generate DWARF2 debugging information\n"));
+  --gdwarf-<N>            generate DWARF<N> debugging information. 2 <= <N> <= 5\n"));
   fprintf (stream, _("\
   --gdwarf-sections       generate per-function section names for DWARF line information\n"));
   fprintf (stream, _("\
-  --hash-size=<value>     set the hash table size close to <value>\n"));
-  fprintf (stream, _("\
-  --help                  show this message and exit\n"));
-  fprintf (stream, _("\
   --target-help           show target specific options\n"));
   fprintf (stream, _("\
   -I DIR                  add DIR to search list for .include directives\n"));
@@ -344,10 +368,6 @@ Options:\n\
   fprintf (stream, _("\
   -R                      fold data section into text section\n"));
   fprintf (stream, _("\
-  --reduce-memory-overheads \n\
-                          prefer smaller memory use at the cost of longer\n\
-                          assembly times\n"));
-  fprintf (stream, _("\
   --statistics            print various measured statistics from execution\n"));
   fprintf (stream, _("\
   --strip-local-absolute  strip local absolute symbols\n"));
@@ -460,8 +480,12 @@ parse_args (int * pargc, char *** pargv)
       OPTION_DEPFILE,
       OPTION_GSTABS,
       OPTION_GSTABS_PLUS,
-      OPTION_GDWARF2,
+      OPTION_GDWARF_2,
+      OPTION_GDWARF_3,
+      OPTION_GDWARF_4,
+      OPTION_GDWARF_5,
       OPTION_GDWARF_SECTIONS,
+      OPTION_GDWARF_CIE_VERSION,
       OPTION_STRIP_LOCAL_ABSOLUTE,
       OPTION_TRADITIONAL_FORMAT,
       OPTION_WARN,
@@ -470,6 +494,7 @@ parse_args (int * pargc, char *** pargv)
       OPTION_NOEXECSTACK,
       OPTION_SIZE_CHECK,
       OPTION_ELF_STT_COMMON,
+      OPTION_ELF_BUILD_NOTES,
       OPTION_SECTNAME_SUBST,
       OPTION_ALTERNATE,
       OPTION_AL,
@@ -508,13 +533,18 @@ parse_args (int * pargc, char *** pargv)
     ,{"size-check", required_argument, NULL, OPTION_SIZE_CHECK}
     ,{"elf-stt-common", required_argument, NULL, OPTION_ELF_STT_COMMON}
     ,{"sectname-subst", no_argument, NULL, OPTION_SECTNAME_SUBST}
+    ,{"generate-missing-build-notes", required_argument, NULL, OPTION_ELF_BUILD_NOTES}
 #endif
     ,{"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL}
-    ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF2}
-    /* GCC uses --gdwarf-2 but GAS uses to use --gdwarf2,
+    ,{"gdwarf-2", no_argument, NULL, OPTION_GDWARF_2}
+    ,{"gdwarf-3", no_argument, NULL, OPTION_GDWARF_3}
+    ,{"gdwarf-4", no_argument, NULL, OPTION_GDWARF_4}
+    ,{"gdwarf-5", no_argument, NULL, OPTION_GDWARF_5}
+    /* GCC uses --gdwarf-2 but GAS used to to use --gdwarf2,
        so we keep it here for backwards compatibility.  */
-    ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF2}
+    ,{"gdwarf2", no_argument, NULL, OPTION_GDWARF_2}
     ,{"gdwarf-sections", no_argument, NULL, OPTION_GDWARF_SECTIONS}
+    ,{"gdwarf-cie-version", required_argument, NULL, OPTION_GDWARF_CIE_VERSION}
     ,{"gen-debug", no_argument, NULL, 'g'}
     ,{"gstabs", no_argument, NULL, OPTION_GSTABS}
     ,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
@@ -656,7 +686,7 @@ parse_args (int * pargc, char *** pargv)
        case OPTION_VERSION:
          /* This output is intended to follow the GNU standards document.  */
          printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
-         printf (_("Copyright (C) 2018 Free Software Foundation, Inc.\n"));
+         printf (_("Copyright (C) 2021 Free Software Foundation, Inc.\n"));
          printf (_("\
 This program is free software; you may redistribute it under the terms of\n\
 the GNU General Public License version 3 or later.\n\
@@ -786,10 +816,20 @@ This program has absolutely no warranty.\n"));
              && md_parse_option (optc, optarg))
            continue;
 
+         /* We end up here for any -gsomething-not-already-a-long-option.
+            give some useful feedback on not (yet) supported -gdwarfxxx
+            versions/sections/options.  */
+         if (strncmp (old_argv[optind - 1], "-gdwarf",
+                      strlen ("-gdwarf")) == 0)
+           as_fatal (_("unknown DWARF option %s\n"), old_argv[optind - 1]);
+
          if (md_debug_format_selector)
            debug_type = md_debug_format_selector (& use_gnu_debug_info_extensions);
          else if (IS_ELF)
-           debug_type = DEBUG_DWARF2;
+           {
+             debug_type = DEBUG_DWARF2;
+             dwarf_level = 2;
+           }
          else
            debug_type = DEBUG_STABS;
          break;
@@ -801,14 +841,55 @@ This program has absolutely no warranty.\n"));
          debug_type = DEBUG_STABS;
          break;
 
-       case OPTION_GDWARF2:
+       case OPTION_GDWARF_2:
+         debug_type = DEBUG_DWARF2;
+         dwarf_level = 2;
+         break;
+
+       case OPTION_GDWARF_3:
+         debug_type = DEBUG_DWARF2;
+         dwarf_level = 3;
+         break;
+
+       case OPTION_GDWARF_4:
+         debug_type = DEBUG_DWARF2;
+         dwarf_level = 4;
+         break;
+
+       case OPTION_GDWARF_5:
          debug_type = DEBUG_DWARF2;
+         dwarf_level = 5;
          break;
 
        case OPTION_GDWARF_SECTIONS:
          flag_dwarf_sections = TRUE;
          break;
 
+        case OPTION_GDWARF_CIE_VERSION:
+         flag_dwarf_cie_version = atoi (optarg);
+          /* The available CIE versions are 1 (DWARF 2), 3 (DWARF 3), and 4
+             (DWARF 4 and 5).  */
+         if (flag_dwarf_cie_version < 1
+              || flag_dwarf_cie_version == 2
+              || flag_dwarf_cie_version > 4)
+            as_fatal (_("Invalid --gdwarf-cie-version `%s'"), optarg);
+         switch (flag_dwarf_cie_version)
+           {
+           case 1:
+             if (dwarf_level < 2)
+               dwarf_level = 2;
+             break;
+           case 3:
+             if (dwarf_level < 3)
+               dwarf_level = 3;
+             break;
+           default:
+             if (dwarf_level < 4)
+               dwarf_level = 4;
+             break;
+           }
+         break;
+
        case 'J':
          flag_signed_overflow_ok = 1;
          break;
@@ -900,7 +981,19 @@ This program has absolutely no warranty.\n"));
        case OPTION_SECTNAME_SUBST:
          flag_sectname_subst = 1;
          break;
-#endif
+
+       case OPTION_ELF_BUILD_NOTES:
+         if (strcasecmp (optarg, "no") == 0)
+           flag_generate_build_notes = FALSE;
+         else if (strcasecmp (optarg, "yes") == 0)
+           flag_generate_build_notes = TRUE;
+         else
+           as_fatal (_("Invalid --generate-missing-build-notes option: `%s'"),
+                     optarg);
+         break;
+
+#endif /* OBJ_ELF */
+
        case 'Z':
          flag_always_generate_output = 1;
          break;
@@ -1006,22 +1099,10 @@ This program has absolutely no warranty.\n"));
          break;
 
        case OPTION_REDUCE_MEMORY_OVERHEADS:
-         /* The only change we make at the moment is to reduce
-            the size of the hash tables that we use.  */
-         set_gas_hash_table_size (4051);
          break;
 
        case OPTION_HASH_TABLE_SIZE:
-         {
-           unsigned long new_size;
-
-            new_size = strtoul (optarg, NULL, 0);
-            if (new_size)
-              set_gas_hash_table_size (new_size);
-            else
-              as_fatal (_("--hash-size needs a numeric argument"));
-           break;
-         }
+         break;
        }
     }
 
@@ -1071,16 +1152,14 @@ close_output_file (void)
 static size_t
 macro_expr (const char *emsg, size_t idx, sb *in, offsetT *val)
 {
-  char *hold;
   expressionS ex;
 
   sb_terminate (in);
 
-  hold = input_line_pointer;
-  input_line_pointer = in->ptr + idx;
+  temp_ilp (in->ptr + idx);
   expression_and_evaluate (&ex);
   idx = input_line_pointer - in->ptr;
-  input_line_pointer = hold;
+  restore_ilp ();
 
   if (ex.X_op != O_constant)
     as_bad ("%s", emsg);
@@ -1118,13 +1197,13 @@ perform_an_assembly_pass (int argc, char ** argv)
   /* @@ FIXME -- we're setting the RELOC flag so that sections are assumed
      to have relocs, otherwise we don't find out in time.  */
   applicable = bfd_applicable_section_flags (stdoutput);
-  bfd_set_section_flags (stdoutput, text_section,
+  bfd_set_section_flags (text_section,
                         applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
                                       | SEC_CODE | SEC_READONLY));
-  bfd_set_section_flags (stdoutput, data_section,
+  bfd_set_section_flags (data_section,
                         applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
                                       | SEC_DATA));
-  bfd_set_section_flags (stdoutput, bss_section, applicable & SEC_ALLOC);
+  bfd_set_section_flags (bss_section, applicable & SEC_ALLOC);
   seg_info (bss_section)->bss = 1;
 #endif
   subseg_new (BFD_ABS_SECTION_NAME, 0);
@@ -1208,7 +1287,8 @@ main (int argc, char ** argv)
   out_file_name = OBJ_DEFAULT_OUTPUT_FILE_NAME;
 
   hex_init ();
-  bfd_init ();
+  if (bfd_init () != BFD_INIT_MAGIC)
+    as_fatal (_("libbfd ABI mismatch"));
   bfd_set_error_program_name (myname);
 
 #ifdef USE_EMULATIONS
@@ -1228,14 +1308,33 @@ main (int argc, char ** argv)
        {
          struct stat sib;
 
-         if (stat (argv[i], &sib) == 0)
+         /* Check that the input file and output file are different.  */
+         if (stat (argv[i], &sib) == 0
+             && sib.st_ino == sob.st_ino
+             /* POSIX emulating systems may support stat() but if the
+                underlying file system does not support a file serial number
+                of some kind then they will return 0 for the inode.  So
+                two files with an inode of 0 may not actually be the same.
+                On real POSIX systems no ordinary file will ever have an
+                inode of 0.  */
+             && sib.st_ino != 0
+             /* Different files may have the same inode number if they
+                reside on different devices, so check the st_dev field as
+                well.  */
+             && sib.st_dev == sob.st_dev
+             /* PR 25572: Only check regular files.  Devices, sockets and so
+                on might actually work as both input and output.  Plus there
+                is a use case for using /dev/null as both input and output
+                when checking for command line option support in a script:
+                  as --foo /dev/null -o /dev/null; if $? then ...  */
+             && S_ISREG (sib.st_mode))
            {
-             if (sib.st_ino == sob.st_ino)
-               {
-                 /* Don't let as_fatal remove the output file!  */
-                 out_file_name = NULL;
-                 as_fatal (_("The input and output files must be distinct"));
-               }
+             const char *saved_out_file_name = out_file_name;
+
+             /* Don't let as_fatal remove the output file!  */
+             out_file_name = NULL;
+             as_fatal (_("The input '%s' and output '%s' files are the same"),
+                       argv[i], saved_out_file_name);
            }
        }
     }
@@ -1276,7 +1375,7 @@ main (int argc, char ** argv)
   dwarf2_init ();
 
   local_symbol_make (".gasversion.", absolute_section,
-                    BFD_VERSION / 10000UL, &predefined_address_frag);
+                    &predefined_address_frag, BFD_VERSION / 10000UL);
 
   /* Now that we have fully initialized, and have created the output
      file, define any symbols requested by --defsym command line
@@ -1286,8 +1385,8 @@ main (int argc, char ** argv)
       symbolS *sym;
       struct defsym_list *next;
 
-      sym = symbol_new (defsyms->name, absolute_section, defsyms->value,
-                       &zero_address_frag);
+      sym = symbol_new (defsyms->name, absolute_section,
+                       &zero_address_frag, defsyms->value);
       /* Make symbols defined on the command line volatile, so that they
         can be redefined inside a source file.  This makes this assembler's
         behaviour compatible with earlier versions, but it may not be
@@ -1317,7 +1416,7 @@ main (int argc, char ** argv)
       segT gnustack;
 
       gnustack = subseg_new (".note.GNU-stack", 0);
-      bfd_set_section_flags (stdoutput, gnustack,
+      bfd_set_section_flags (gnustack,
                             SEC_READONLY | (flag_execstack ? SEC_CODE : 0));
 
     }