X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gas%2Fas.c;h=0262a6fec9875ef38da6f4fb851d2a61d247e8c4;hb=7e6ba6a2a56e6195da36329bdeb1654e20aad198;hp=c7bdf0cd8896c721f22439c46f0e0adfd2b9c5ff;hpb=af60449c260235478f9b1f9db39a587fe4c75290;p=binutils-gdb.git diff --git a/gas/as.c b/gas/as.c index c7bdf0cd889..0262a6fec98 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1,5 +1,5 @@ /* 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. @@ -95,9 +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; +bool flag_generate_build_notes = DEFAULT_GENERATE_BUILD_NOTES; #endif /* Keep the output file. */ @@ -147,7 +158,7 @@ select_emulation_mode (int argc, char **argv) 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) @@ -331,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- generate DWARF debugging information. 2 <= <= 5\n")); fprintf (stream, _("\ --gdwarf-sections generate per-function section names for DWARF line information\n")); fprintf (stream, _("\ - --hash-size= set the hash table size close to \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")); @@ -361,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")); @@ -471,14 +474,18 @@ parse_args (int * pargc, char *** pargv) 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, @@ -487,7 +494,7 @@ parse_args (int * pargc, char *** pargv) 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, @@ -496,7 +503,8 @@ parse_args (int * pargc, char *** pargv) 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. */ }; @@ -529,11 +537,15 @@ parse_args (int * pargc, char *** pargv) ,{"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} @@ -570,6 +582,7 @@ parse_args (int * pargc, char *** pargv) ,{"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 @@ -672,10 +685,23 @@ parse_args (int * pargc, char *** pargv) 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\ @@ -805,10 +831,21 @@ 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 (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; @@ -820,12 +857,53 @@ 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; + 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': @@ -899,9 +977,9 @@ This program has absolutely no warranty.\n")); 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; @@ -922,9 +1000,9 @@ This program has absolutely no warranty.\n")); 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); @@ -1037,22 +1115,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; } } @@ -1147,13 +1213,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); @@ -1207,12 +1273,10 @@ main (int argc, char ** argv) 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); @@ -1271,7 +1335,13 @@ main (int argc, char ** argv) /* 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; @@ -1319,7 +1389,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 @@ -1329,8 +1399,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 @@ -1360,7 +1430,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)); }