diff options
Diffstat (limited to 'gas/as.c')
-rw-r--r-- | gas/as.c | 51 |
1 files changed, 46 insertions, 5 deletions
@@ -311,7 +311,8 @@ Options:\n\ fprintf (stream, _("\ generate GNU Build notes if none are present in the input\n")); fprintf (stream, _("\ - --gsframe generate SFrame stack trace information\n")); + --gsframe=[no|yes] whether to generate SFrame stack trace information\n\ + (default: no)\n")); # if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN) fprintf (stream, _("\ --scfi=experimental Synthesize DWARF CFI for hand-written asm\n\ @@ -486,6 +487,7 @@ parse_args (int * pargc, char *** pargv) OPTION_GDWARF_CIE_VERSION, OPTION_GCODEVIEW, OPTION_STRIP_LOCAL_ABSOLUTE, + OPTION_EMIT_LOCAL_ABSOLUTE, OPTION_TRADITIONAL_FORMAT, OPTION_WARN, OPTION_TARGET_HELP, @@ -538,7 +540,7 @@ parse_args (int * pargc, char *** pargv) ,{"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} - ,{"gsframe", no_argument, NULL, OPTION_SFRAME} + ,{"gsframe", optional_argument, NULL, OPTION_SFRAME} # if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN) ,{"scfi", required_argument, NULL, OPTION_SCFI} # endif @@ -590,6 +592,7 @@ parse_args (int * pargc, char *** pargv) ,{"reduce-memory-overheads", no_argument, NULL, OPTION_REDUCE_MEMORY_OVERHEADS} ,{"statistics", no_argument, NULL, OPTION_STATISTICS} ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE} + ,{"emit-local-absolute", no_argument, NULL, OPTION_EMIT_LOCAL_ABSOLUTE} ,{"version", no_argument, NULL, OPTION_VERSION} ,{"verbose", no_argument, NULL, 'v'} ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP} @@ -688,6 +691,10 @@ parse_args (int * pargc, char *** pargv) flag_strip_local_absolute = 1; break; + case OPTION_EMIT_LOCAL_ABSOLUTE: + flag_strip_local_absolute = -1; + break; + case OPTION_TRADITIONAL_FORMAT: flag_traditional_format = 1; break; @@ -785,7 +792,7 @@ This program has absolutely no warranty.\n")); if (*s == '\0') as_fatal (_("bad defsym; format is --defsym name=value")); *s++ = '\0'; - i = bfd_scan_vma (s, (const char **) NULL, 0); + i = bfd_scan_vma (s, NULL, 0); n = XNEW (struct defsym_list); n->next = defsyms; n->name = optarg; @@ -930,7 +937,7 @@ This program has absolutely no warranty.\n")); break; case OPTION_LISTING_LHS_WIDTH2: { - int tmp = atoi (optarg); + unsigned int tmp = atoi (optarg); if (tmp > listing_lhs_width) listing_lhs_width_second = tmp; @@ -1032,7 +1039,17 @@ This program has absolutely no warranty.\n")); break; case OPTION_SFRAME: - flag_gen_sframe = 1; + if (optarg) + { + if (strcasecmp (optarg, "no") == 0) + flag_gen_sframe = 0; + else if (strcasecmp (optarg, "yes") == 0) + flag_gen_sframe = 1; + else + as_fatal (_("Invalid --gsframe option: `%s'"), optarg); + } + else + flag_gen_sframe = 1; break; #endif /* OBJ_ELF */ @@ -1163,6 +1180,26 @@ This program has absolutely no warranty.\n")); #endif } +/* Pre-define a symbol with its name derived from TMPL (wrapping in + GAS(...)), to value VAL. */ + +void +predefine_symbol (const char *tmpl, valueT val) +{ + char *name = xasprintf ("GAS(%s)", tmpl); + symbolS *s; + + /* Also put the symbol in the symbol table, if requested. */ + if (flag_strip_local_absolute < 0) + s = symbol_new (name, absolute_section, &zero_address_frag, val); + else + s = symbol_create (name, absolute_section, &zero_address_frag, val); + S_CLEAR_EXTERNAL (s); + symbol_table_insert (s); + + xfree (name); +} + static void dump_statistics (void) { @@ -1205,6 +1242,10 @@ perform_an_assembly_pass (int argc, char ** argv) subseg_set (text_section, 0); #endif + predefine_symbol ("version", BFD_VERSION); + if (strstr (BFD_VERSION_STRING, "." XSTRING (BFD_VERSION_DATE)) != NULL) + predefine_symbol ("date", BFD_VERSION_DATE); + /* This may add symbol table entries, which requires having an open BFD, and sections already created. */ md_begin (); |