X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gas%2Fas.c;h=4c5881abd88c8fd493b8448fa7859810f1d8c197;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=503add992a1adf360182b05d199f1c0018a0fcbb;hpb=efd321f91c31f5f537753f99e282dbc267854fa6;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/as.c b/gas/as.c index 503add992a..4c5881abd8 100644 --- a/gas/as.c +++ b/gas/as.c @@ -1,5 +1,5 @@ /* as.c - GAS main program. - Copyright (C) 1987-2015 Free Software Foundation, Inc. + Copyright (C) 1987-2020 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -31,6 +31,10 @@ #define COMMON +/* Disable code to set FAKE_LABEL_NAME in obj-multi.h, to avoid circular + reference. */ +#define INITIALIZING_EMULS + #include "as.h" #include "subsegs.h" #include "output-file.h" @@ -39,6 +43,7 @@ #include "dwarf2dbg.h" #include "dw2gencfi.h" #include "bfdver.h" +#include "write.h" #ifdef HAVE_ITBL_CPU #include "itbl-ops.h" @@ -46,12 +51,6 @@ #define itbl_init() #endif -#ifdef HAVE_SBRK -#ifdef NEED_DECLARATION_SBRK -extern void *sbrk (); -#endif -#endif - #ifdef USING_CGEN /* Perform any cgen specific initialisation for gas. */ extern void gas_cgen_begin (void); @@ -96,6 +95,21 @@ 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. */ +unsigned int dwarf_level = 0; + +#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. */ static int keep_it = 0; @@ -121,9 +135,6 @@ static struct itbl_file_list *itbl_files; #endif static long start_time; -#ifdef HAVE_SBRK -char *start_sbrk; -#endif static int flag_macro_alternate; @@ -142,7 +153,8 @@ static void select_emulation_mode (int argc, char **argv) { int i; - char *p, *em = 0; + char *p; + const char *em = NULL; for (i = 1; i < argc; i++) if (!strncmp ("--em", argv[i], 4)) @@ -203,10 +215,10 @@ common_emul_init (void) if (this_emulation->fake_label_name == 0) { if (this_emulation->leading_underscore) - this_emulation->fake_label_name = "L0\001"; + this_emulation->fake_label_name = FAKE_LABEL_NAME; else /* What other parameters should we test? */ - this_emulation->fake_label_name = ".L0\001"; + this_emulation->fake_label_name = "." FAKE_LABEL_NAME; } } #endif @@ -224,6 +236,11 @@ print_version_id (void) VERSION, TARGET_ALIAS, BFD_VERSION_STRING); } +#ifdef DEFAULT_FLAG_COMPRESS_DEBUG +enum compressed_debug_section_type flag_compress_debug + = COMPRESS_DEBUG_GABI_ZLIB; +#endif + static void show_usage (FILE * stream) { @@ -245,14 +262,21 @@ Options:\n\ fprintf (stream, _("\ --alternate initially turn on alternate macro syntax\n")); -#ifdef HAVE_ZLIB_H +#ifdef DEFAULT_FLAG_COMPRESS_DEBUG fprintf (stream, _("\ - --compress-debug-sections\n\ - compress DWARF debug sections using zlib\n")); + --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\ + compress DWARF debug sections using zlib [default]\n")); fprintf (stream, _("\ --nocompress-debug-sections\n\ don't compress DWARF debug sections\n")); -#endif /* HAVE_ZLIB_H */ +#else + fprintf (stream, _("\ + --compress-debug-sections[={none|zlib|zlib-gnu|zlib-gabi}]\n\ + compress DWARF debug sections using zlib\n")); + fprintf (stream, _("\ + --nocompress-debug-sections\n\ + don't compress DWARF debug sections [default]\n")); +#endif fprintf (stream, _("\ -D produce assembler debugging messages\n")); fprintf (stream, _("\ @@ -263,7 +287,7 @@ Options:\n\ #ifdef USE_EMULATIONS { int i; - char *def_em; + const char *def_em; fprintf (stream, "\ --em=["); @@ -286,7 +310,28 @@ Options:\n\ fprintf (stream, _("\ --size-check=[error|warning]\n\ ELF .size directive check (default --size-check=error)\n")); + fprintf (stream, _("\ + --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, _("\ @@ -296,7 +341,7 @@ 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, _("\ @@ -320,6 +365,8 @@ Options:\n\ fprintf (stream, _("\ -nocpp ignored\n")); fprintf (stream, _("\ + -no-pad-sections do not pad the end of sections to alignment boundaries\n")); + fprintf (stream, _("\ -o OBJFILE name the object-file output OBJFILE (default a.out)\n")); fprintf (stream, _("\ -R fold data section into text section\n")); @@ -440,8 +487,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, @@ -449,13 +500,17 @@ parse_args (int * pargc, char *** pargv) OPTION_EXECSTACK, OPTION_NOEXECSTACK, OPTION_SIZE_CHECK, + OPTION_ELF_STT_COMMON, + OPTION_ELF_BUILD_NOTES, + OPTION_SECTNAME_SUBST, OPTION_ALTERNATE, OPTION_AL, OPTION_HASH_TABLE_SIZE, OPTION_REDUCE_MEMORY_OVERHEADS, OPTION_WARN_FATAL, OPTION_COMPRESS_DEBUG, - OPTION_NOCOMPRESS_DEBUG + OPTION_NOCOMPRESS_DEBUG, + OPTION_NO_PAD_SECTIONS /* = STD_BASE + 40 */ /* When you add options here, check that they do not collide with OPTION_MD_BASE. See as.h. */ }; @@ -473,7 +528,7 @@ parse_args (int * pargc, char *** pargv) ,{"a", optional_argument, NULL, 'a'} /* Handle -al=. */ ,{"al", optional_argument, NULL, OPTION_AL} - ,{"compress-debug-sections", no_argument, NULL, OPTION_COMPRESS_DEBUG} + ,{"compress-debug-sections", optional_argument, NULL, OPTION_COMPRESS_DEBUG} ,{"nocompress-debug-sections", no_argument, NULL, OPTION_NOCOMPRESS_DEBUG} ,{"debug-prefix-map", required_argument, NULL, OPTION_DEBUG_PREFIX_MAP} ,{"defsym", required_argument, NULL, OPTION_DEFSYM} @@ -483,13 +538,20 @@ parse_args (int * pargc, char *** pargv) ,{"execstack", no_argument, NULL, OPTION_EXECSTACK} ,{"noexecstack", no_argument, NULL, OPTION_NOEXECSTACK} ,{"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} @@ -516,6 +578,7 @@ parse_args (int * pargc, char *** pargv) ,{"MD", required_argument, NULL, OPTION_DEPFILE} ,{"mri", no_argument, NULL, 'M'} ,{"nocpp", no_argument, NULL, OPTION_NOCPP} + ,{"no-pad-sections", no_argument, NULL, OPTION_NO_PAD_SECTIONS} ,{"no-warn", no_argument, NULL, 'W'} ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS} ,{"statistics", no_argument, NULL, OPTION_STATISTICS} @@ -543,7 +606,7 @@ parse_args (int * pargc, char *** pargv) old_argv = *pargv; /* Initialize a new argv that contains no options. */ - new_argv = (char **) xmalloc (sizeof (char *) * (old_argc + 1)); + new_argv = XNEWVEC (char *, old_argc + 1); new_argv[0] = old_argv[0]; new_argc = 1; new_argv[new_argc] = NULL; @@ -595,7 +658,7 @@ parse_args (int * pargc, char *** pargv) case 1: /* File name. */ if (!strcmp (optarg, "-")) - optarg = ""; + optarg = (char *) ""; new_argv[new_argc++] = optarg; new_argv[new_argc] = NULL; break; @@ -611,6 +674,10 @@ parse_args (int * pargc, char *** pargv) case OPTION_NOCPP: break; + case OPTION_NO_PAD_SECTIONS: + do_not_pad_sections_to_alignment = 1; + break; + case OPTION_STATISTICS: flag_print_statistics = 1; break; @@ -626,13 +693,19 @@ 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) 2015 Free Software Foundation, Inc.\n")); + printf (_("Copyright (C) 2020 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\ This program has absolutely no warranty.\n")); +#ifdef TARGET_WITH_CPU + printf (_("This assembler was configured for a target of `%s' " + "and default,\ncpu type `%s'.\n"), + TARGET_ALIAS, TARGET_WITH_CPU); +#else printf (_("This assembler was configured for a target of `%s'.\n"), TARGET_ALIAS); +#endif exit (EXIT_SUCCESS); case OPTION_EMULATION: @@ -657,15 +730,31 @@ This program has absolutely no warranty.\n")); exit (EXIT_SUCCESS); case OPTION_COMPRESS_DEBUG: -#ifdef HAVE_ZLIB_H - flag_compress_debug = 1; + if (optarg) + { +#if defined OBJ_ELF || defined OBJ_MAYBE_ELF + if (strcasecmp (optarg, "none") == 0) + flag_compress_debug = COMPRESS_DEBUG_NONE; + else if (strcasecmp (optarg, "zlib") == 0) + flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB; + else if (strcasecmp (optarg, "zlib-gnu") == 0) + flag_compress_debug = COMPRESS_DEBUG_GNU_ZLIB; + else if (strcasecmp (optarg, "zlib-gabi") == 0) + flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB; + else + as_fatal (_("Invalid --compress-debug-sections option: `%s'"), + optarg); #else - as_warn (_("cannot compress debug sections (zlib not installed)")); -#endif /* HAVE_ZLIB_H */ + as_fatal (_("--compress-debug-sections=%s is unsupported"), + optarg); +#endif + } + else + flag_compress_debug = COMPRESS_DEBUG_GABI_ZLIB; break; case OPTION_NOCOMPRESS_DEBUG: - flag_compress_debug = 0; + flag_compress_debug = COMPRESS_DEBUG_NONE; break; case OPTION_DEBUG_PREFIX_MAP: @@ -684,7 +773,7 @@ This program has absolutely no warranty.\n")); as_fatal (_("bad defsym; format is --defsym name=value")); *s++ = '\0'; i = bfd_scan_vma (s, (const char **) NULL, 0); - n = (struct defsym_list *) xmalloc (sizeof *n); + n = XNEW (struct defsym_list); n->next = defsyms; n->name = optarg; n->value = i; @@ -705,7 +794,7 @@ This program has absolutely no warranty.\n")); break; } - n = xmalloc (sizeof * n); + n = XNEW (struct itbl_file_list); n->next = itbl_files; n->name = optarg; itbl_files = n; @@ -737,7 +826,10 @@ This program has absolutely no warranty.\n")); 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; @@ -749,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; @@ -828,13 +961,39 @@ This program has absolutely no warranty.\n")); case OPTION_SIZE_CHECK: if (strcasecmp (optarg, "error") == 0) - flag_size_check = size_check_error; + flag_allow_nonconst_size = FALSE; else if (strcasecmp (optarg, "warning") == 0) - flag_size_check = size_check_warning; + flag_allow_nonconst_size = TRUE; else as_fatal (_("Invalid --size-check= option: `%s'"), optarg); break; -#endif + + case OPTION_ELF_STT_COMMON: + if (strcasecmp (optarg, "no") == 0) + flag_use_elf_stt_common = 0; + else if (strcasecmp (optarg, "yes") == 0) + flag_use_elf_stt_common = 1; + else + as_fatal (_("Invalid --elf-stt-common= option: `%s'"), + optarg); + break; + + case OPTION_SECTNAME_SUBST: + flag_sectname_subst = 1; + break; + + 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; @@ -973,17 +1132,10 @@ This program has absolutely no warranty.\n")); static void dump_statistics (void) { -#ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); -#endif long run_time = get_run_time () - start_time; fprintf (stderr, _("%s: total time in assembly: %ld.%06ld\n"), myname, run_time / 1000000, run_time % 1000000); -#ifdef HAVE_SBRK - fprintf (stderr, _("%s: data size %ld\n"), - myname, (long) (lim - start_sbrk)); -#endif subsegs_print_statistics (stderr); write_print_statistics (stderr); @@ -1012,16 +1164,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); @@ -1059,13 +1209,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); @@ -1112,13 +1262,12 @@ int main (int argc, char ** argv) { char ** argv_orig = argv; + struct stat sob; int macro_strip_at; start_time = get_run_time (); -#ifdef HAVE_SBRK - start_sbrk = (char *) sbrk (0); -#endif + signal_init (); #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) setlocale (LC_MESSAGES, ""); @@ -1150,7 +1299,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 @@ -1161,6 +1311,46 @@ main (int argc, char ** argv) /* Call parse_args before any of the init/begin functions so that switches like --hash-size can be honored. */ parse_args (&argc, &argv); + + if (argc > 1 && stat (out_file_name, &sob) == 0) + { + int i; + + for (i = 1; i < argc; ++i) + { + struct stat sib; + + /* 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)) + { + 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); + } + } + } + symbol_begin (); frag_init (); subsegs_begin (); @@ -1238,7 +1428,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)); } @@ -1264,15 +1454,10 @@ main (int argc, char ** argv) n_warns = had_warnings (); n_errs = had_errors (); - if (n_warns == 1) - sprintf (warn_msg, _("%d warning"), n_warns); - else - sprintf (warn_msg, _("%d warnings"), n_warns); - if (n_errs == 1) - sprintf (err_msg, _("%d error"), n_errs); - else - sprintf (err_msg, _("%d errors"), n_errs); - + sprintf (warn_msg, + ngettext ("%d warning", "%d warnings", n_warns), n_warns); + sprintf (err_msg, + ngettext ("%d error", "%d errors", n_errs), n_errs); if (flag_fatal_warnings && n_warns != 0) { if (n_errs == 0)