/* as.c - GAS main program.
- Copyright (C) 1987-2019 Free Software Foundation, Inc.
+ Copyright (C) 1987-2022 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
/* 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;
+bool flag_generate_build_notes = DEFAULT_GENERATE_BUILD_NOTES;
#endif
/* Keep the output file. */
const char *em = NULL;
for (i = 1; i < argc; i++)
- if (!strncmp ("--em", argv[i], 4))
+ if (startswith (argv[i], "--em"))
break;
if (i == argc)
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"));
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"));
OPTION_DEBUG_PREFIX_MAP,
OPTION_DEFSYM,
OPTION_LISTING_LHS_WIDTH,
- OPTION_LISTING_LHS_WIDTH2,
+ OPTION_LISTING_LHS_WIDTH2, /* = STD_BASE + 10 */
OPTION_LISTING_RHS_WIDTH,
OPTION_LISTING_CONT_LINES,
OPTION_DEPFILE,
OPTION_GSTABS,
OPTION_GSTABS_PLUS,
- OPTION_GDWARF2,
- OPTION_GDWARF_SECTIONS,
+ OPTION_GDWARF_2,
+ OPTION_GDWARF_3,
+ OPTION_GDWARF_4,
+ OPTION_GDWARF_5,
+ OPTION_GDWARF_SECTIONS, /* = STD_BASE + 20 */
+ OPTION_GDWARF_CIE_VERSION,
OPTION_STRIP_LOCAL_ABSOLUTE,
OPTION_TRADITIONAL_FORMAT,
OPTION_WARN,
OPTION_NOEXECSTACK,
OPTION_SIZE_CHECK,
OPTION_ELF_STT_COMMON,
- OPTION_ELF_BUILD_NOTES,
+ OPTION_ELF_BUILD_NOTES, /* = STD_BASE + 30 */
OPTION_SECTNAME_SUBST,
OPTION_ALTERNATE,
OPTION_AL,
OPTION_WARN_FATAL,
OPTION_COMPRESS_DEBUG,
OPTION_NOCOMPRESS_DEBUG,
- OPTION_NO_PAD_SECTIONS /* = STD_BASE + 40 */
+ OPTION_NO_PAD_SECTIONS,
+ OPTION_MULTIBYTE_HANDLING /* = STD_BASE + 40 */
/* When you add options here, check that they do
not collide with OPTION_MD_BASE. See as.h. */
};
,{"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}
,{"target-help", no_argument, NULL, OPTION_TARGET_HELP}
,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}
,{"warn", no_argument, NULL, OPTION_WARN}
+ ,{"multibyte-handling", required_argument, NULL, OPTION_MULTIBYTE_HANDLING}
};
/* Construct the option lists from the standard list and the target
flag_traditional_format = 1;
break;
+ case OPTION_MULTIBYTE_HANDLING:
+ if (strcmp (optarg, "allow") == 0)
+ multibyte_handling = multibyte_allow;
+ else if (strcmp (optarg, "warn") == 0)
+ multibyte_handling = multibyte_warn;
+ else if (strcmp (optarg, "warn-sym-only") == 0)
+ multibyte_handling = multibyte_warn_syms;
+ else if (strcmp (optarg, "warn_sym_only") == 0)
+ multibyte_handling = multibyte_warn_syms;
+ else
+ as_fatal (_("unexpected argument to --multibyte-input-option: '%s'"), optarg);
+ break;
+
case OPTION_VERSION:
/* This output is intended to follow the GNU standards document. */
printf (_("GNU assembler %s\n"), BFD_VERSION_STRING);
- printf (_("Copyright (C) 2019 Free Software Foundation, Inc.\n"));
+ printf (_("Copyright (C) 2022 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\
&& 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 (startswith (old_argv[optind - 1], "-gdwarf"))
+ as_fatal (_("unknown DWARF option %s\n"), old_argv[optind - 1]);
+ else if (old_argv[optind - 1][1] == 'g' && optarg != NULL)
+ as_fatal (_("unknown option `%s'"), 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;
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;
+ 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':
case OPTION_SIZE_CHECK:
if (strcasecmp (optarg, "error") == 0)
- flag_allow_nonconst_size = FALSE;
+ flag_allow_nonconst_size = false;
else if (strcasecmp (optarg, "warning") == 0)
- flag_allow_nonconst_size = TRUE;
+ flag_allow_nonconst_size = true;
else
as_fatal (_("Invalid --size-check= option: `%s'"), optarg);
break;
case OPTION_ELF_BUILD_NOTES:
if (strcasecmp (optarg, "no") == 0)
- flag_generate_build_notes = FALSE;
+ flag_generate_build_notes = false;
else if (strcasecmp (optarg, "yes") == 0)
- flag_generate_build_notes = TRUE;
+ flag_generate_build_notes = true;
else
as_fatal (_("Invalid --generate-missing-build-notes option: `%s'"),
optarg);
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;
}
}
start_time = get_run_time ();
signal_init ();
-#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
+#ifdef HAVE_LC_MESSAGES
setlocale (LC_MESSAGES, "");
#endif
-#if defined (HAVE_SETLOCALE)
setlocale (LC_CTYPE, "");
-#endif
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
/* 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)
+ && 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))
{
const char *saved_out_file_name = out_file_name;
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
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