From patchwork Mon Dec 9 09:20:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 102650 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 61947385841C for ; Mon, 9 Dec 2024 09:24:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 61947385841C Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256 header.s=google header.b=XFzrE5qS X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id EA2AB3858CDB for ; Mon, 9 Dec 2024 09:20:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EA2AB3858CDB Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=suse.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org EA2AB3858CDB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::42d ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733736062; cv=none; b=J6qkFjmS1Dc15VMiKyQKYouZXLDYIDgYwfb2AjlaiNvMlxVfUbdafS75fn3fZcjXEfbCi3rwQ6ttu0HzdlFIVkg7nmHaBwToJFyA0p7AL2pKaY5rlDwjDBFdKL5rEuYGeocnzF69kmcdWdwxxJQBmAjBrTi2OLjfy7AmNAOiL3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733736062; c=relaxed/simple; bh=7Z07DeK2zAePkAFfrsCCFYpDyQRd3nAER0wiBPPbV5I=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=qTTxH0+nuA3zpVM+6yFquYV7V2H4Gw/0UP8n9z67lk9kBWSXUm8bO2lh+OnTkYGC+XtkqBYs+NZYwk2aZL7Mvjh1wjspVEJohDjW9HkMDro5toaDJ7mn9nu4sk9moWJjyW/uHsEdiAEHTsTuqg2QnaZ9u//4Pnm4b9lDFWTV6W4= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EA2AB3858CDB Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-385d7b4da2bso3403002f8f.1 for ; Mon, 09 Dec 2024 01:20:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1733736055; x=1734340855; darn=sourceware.org; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:to:from:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=2hkSBRblSgAh2bCNuNeBGzy4jBiVEFtLJuB93iEau3Y=; b=XFzrE5qS3HzyztyJtfubt3XjDJg4zjckSSbxR7v5tgWZhZ2lb3PvWxw0rY513fOY2N whC3FL+APtqWwRWY3GNjOfLeD4vzMzNNS2kE6o83eAuagV3bBels+fRQKdAWCGZe77ks uvG9RaU7SwFnL2QTOQ62zLwYtj3eqjBtG7d5IIugMyh6hHOZSTeC2KzXA7iwfzEH+lvu en8mipll9etWDLz3AYiF+ytQEVkuSROCc9QrOuLUTrYPBq302hF01hrmqX3l9UdTboBB 2HiEPgZMf4YmgIyWCPnYN/EMVr1tTz/GmL+QvGPa02RHEGcblkfCDZFdF0eLk3iolFPJ B9jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733736055; x=1734340855; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:to:from:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2hkSBRblSgAh2bCNuNeBGzy4jBiVEFtLJuB93iEau3Y=; b=rOCmwr3fv9eKiyjN1MceE3SGEt4A+F22k2UBj8ciWe8SeB46ROBoyzYp4RmqeS3dpR hzU7BM+EVdYuM2ej69qxK0LfIhBY+xlj74rD3nT9hhZv1nlxddUjg3HbiBWnhV2/fixW AOx0mBsnIHhxuUzcA4OoIPbcPY/tWoNtWNIeLi2UliwUtEzz+fTxvfv8gbGOpYCd770e jEMQWuG72ho/Ke83sZuDuGQBfd/yDKoOFHsIrRHc/DlwCL0CQg4IILCqW1UZNQqn+TOA 124a8rXZSh0ZEW1a6w/EkJu7HapUhw3iqbCKLNQ7Y6bNlySI4nhebeySdyF+zXOOkquX 0gJw== X-Gm-Message-State: AOJu0Yz4GlmbhdQAjnxvKpr8X8Y3oOiqKJkHvj9xnrA2jGhew80KHjnV QVyezLz6a1UQix+pt7m9EfofuxPWs0eNTQ8yZsFPiysu/2l7Ot2Y6hCkE8MM5Bg+xjNYnAzI5r8 = X-Gm-Gg: ASbGnct628vBuO51wuG0kQQhmfEhMJ/qCBJOZNSHvvYp2nGaplvwfhpN866Zv/XjYB+ fdqmLaPsFkONN266/CqDsU6wPTmnz5GY2NembWQBwbcFzEMlRjhdVo+wwfdINS4VpAcH+RKm1R2 Kjp6SD3k/d6JhAEKXXtG5bWZiHereKMfusabR/rAvmBQLtKF/2o95R0tlFSzO0d9nFRrF1PjWQq y/maIa9HcGTw/UnrkkbQUsgFn2OwPdYEsTOdClgOwteAk19X83rCd8Bsd8RESReG5ObrdzOw52z defmbiYzpHQy8HAXfGV8+jNOk3daCW5/ISs= X-Google-Smtp-Source: AGHT+IFskVnp7pbBkBOpS7FvevaXJZfKOqwdFvI/1dKj5eykIzEENPIkKrs9xfizHZeMwjScWUgPXA== X-Received: by 2002:a05:6000:402b:b0:385:e877:c037 with SMTP id ffacd0b85a97d-3862b3ce0c3mr7138154f8f.42.1733736055300; Mon, 09 Dec 2024 01:20:55 -0800 (PST) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-725ea44c362sm1957229b3a.102.2024.12.09.01.20.53 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 09 Dec 2024 01:20:54 -0800 (PST) Message-ID: <85359ef4-5c18-40c8-afbb-edc163813c59@suse.com> Date: Mon, 9 Dec 2024 10:20:55 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH RFC 2/3] gas: add a means to programmatically determine the assembler version From: Jan Beulich To: Binutils References: Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: X-Spam-Status: No, score=-3022.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org It has been more than once that I would have wanted to have a way to know the gas version in assembly sources, perhaps for use with .if. Add such a pre-defined symbol, yet key exposure to -v being used at least twice (three times to also emit the symbols to the symbol table). Together with attempting to use non-symbol characters as separators (thus requiring quotation), this is to keep the risk of collisions with users' symbols as low as possible. To compensate for the effect the first -v has, also introduce --silent (to override that meaning of -v). Seeing that the "verbose" variable presently has no consumers, re-use it for the purposes here. Limit its visibility though, just to be on the safe side (e.g. with out-of-tree changes). If access is needed from elsewhere, an accessor function may want introducing instead. Similarly permit determining whether the assembler is a released version. The exact value probably isn't of much use, it's more the defined-ness that one might care about. Yet the symbol needs to have some value anyway. While fiddling with documentation, split -v from -version/--version. They aren't the same; -v long form is --verbose, which so far wasn't mentioned at all. --- Subsequently we may want to consider whether target-specific code should introduce further such symbols to indicate e.g. new ISA extensions they support (e.g. __x86_apx__ or just __apx__ on x86, with underscores again replaced as is done here). The string literal near the top of predefine_symbol() effectively becomes part of the gas specification: It may not easily have characters re-ordered (let alone dropped) for example, and even adding characters at the end may pose compatibility issues. The version2 test would certainly be nice to run for non-ELF as well, yet I can't seem to be able to thinks of a way to sensibly arrange for that (checking for the absence of any _other_ symbols). The ECOFF/XCOFF special casing of the 3rd test feels bogus. I wonder if this doesn't need to be XFAIL instead. At the example of XCOFF: ppc_saw_abs isn't set for local symbols, yet ppc_adjust_symtab() doesn't distinguish local and non-local ones. --- a/gas/as.c +++ b/gas/as.c @@ -95,7 +95,7 @@ int chunksize = 0; int debug_memory = 0; /* Enable verbose mode. */ -int verbose = 0; +static 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 @@ -461,6 +461,9 @@ parse_args (int * pargc, char *** pargv) OPTION_NOCPP, OPTION_STATISTICS, OPTION_VERSION, + OPTION_VERBOSE2, + OPTION_VERBOSE3, + OPTION_SILENT, OPTION_DUMPCONFIG, OPTION_EMULATION, OPTION_DEBUG_PREFIX_MAP, @@ -577,10 +580,13 @@ parse_args (int * pargc, char *** pargv) ,{"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} + ,{"silent", no_argument, NULL, OPTION_SILENT} ,{"statistics", no_argument, NULL, OPTION_STATISTICS} ,{"strip-local-absolute", no_argument, NULL, OPTION_STRIP_LOCAL_ABSOLUTE} ,{"version", no_argument, NULL, OPTION_VERSION} ,{"verbose", no_argument, NULL, 'v'} + ,{"vv", no_argument, NULL, OPTION_VERBOSE2} + ,{"vvv", no_argument, NULL, OPTION_VERBOSE3} ,{"target-help", no_argument, NULL, OPTION_TARGET_HELP} ,{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT} ,{"warn", no_argument, NULL, OPTION_WARN} @@ -631,7 +637,9 @@ parse_args (int * pargc, char *** pargv) if (optc == 'v') { case 'v': - verbose = 1; + if (verbose < 0) + verbose = -verbose; + ++verbose; break; } else if (is_a_char (optc)) @@ -718,6 +726,23 @@ This program has absolutely no warranty. #endif exit (EXIT_SUCCESS); + case OPTION_VERBOSE2: + if (verbose < 0) + verbose = -verbose; + verbose += 2; + break; + + case OPTION_VERBOSE3: + if (verbose < 0) + verbose = -verbose; + verbose += 3; + break; + + case OPTION_SILENT: + if (verbose > 0) + verbose = -verbose; + break; + case OPTION_EMULATION: #ifdef USE_EMULATIONS if (strcmp (optarg, this_emulation->name)) @@ -1153,6 +1178,50 @@ This program has absolutely no warranty. #endif } +/* Depending on command line options, optionally pre-define a symbol with its + name derived from TMPL (by replacing underscores if possible), to value + VAL. */ + +void +predefine_symbol (const char *tmpl, valueT val) +{ + static const char separators[] = ".@$?%&#"; + static char sep; + char name[64 /* Arbitrary, yet ought to fit all needs. */]; + symbolS *s; + + if (abs (verbose) <= 1) + return; + + /* To limit the risk of name collisions, try to find a non-symbol char to + use as separator. */ + if (sep == '\0') + for (const char *p = separators; *p != '\0'; ++p) + if (!is_name_beginner (*p) && !is_part_of_name (*p)) + { + sep = *p; + break; + } + + if (sep == '\0') + sep = '_'; + + for (char *p = name; ; ++p, ++tmpl) + { + *p = *tmpl != '_' ? *tmpl : sep; + if (*tmpl == '\0') + break; + } + + /* Also put the symbol in the symbol table in yet more "verbose" mode. */ + if (abs (verbose) > 2) + 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); +} + static void dump_statistics (void) { @@ -1221,6 +1290,10 @@ perform_an_assembly_pass (int argc, char subseg_set (text_section, 0); #endif + predefine_symbol ("__gas_version__", BFD_VERSION); + if (strstr (BFD_VERSION_STRING, "." XSTRING (BFD_VERSION_DATE)) != NULL) + predefine_symbol ("__gas_date__", BFD_VERSION_DATE); + /* This may add symbol table entries, which requires having an open BFD, and sections already created. */ md_begin (); --- a/gas/as.h +++ b/gas/as.h @@ -410,9 +410,6 @@ extern unsigned int dwarf_level; /* Maximum level of macro nesting. */ extern int max_macro_nest; -/* Verbosity level. */ -extern int verbose; - struct obstack; /* Obstack chunk size. Keep large for efficient space use, make small to @@ -510,6 +507,7 @@ void as_report_context (void); const char * as_where (unsigned int *); const char * as_where_top (unsigned int *); const char * as_where_physical (unsigned int *); +void predefine_symbol (const char *, valueT); void bump_line_counters (void); void do_scrub_begin (int); void input_scrub_begin (void); --- a/gas/doc/as.texi +++ b/gas/doc/as.texi @@ -257,9 +257,11 @@ gcc(1), ld(1), and the Info entries for [@b{-o} @var{objfile}] [@b{-R}] [@b{--scfi=experimental}] [@b{--sectname-subst}] + [@b{--silent}] [@b{--size-check=[error|warning]}] [@b{--statistics}] - [@b{-v}] [@b{-version}] [@b{--version}] + [@b{-v}] [@b{--verbose}] + [@b{-version}] [@b{--version}] [@b{-W}] [@b{--no-warn}] [@b{--warn}] [@b{--fatal-warnings}] [@b{-w}] [@b{-x}] [@b{-Z}] [@b{@@@var{FILE}}] @@ -961,6 +963,11 @@ Honor substitution sequences in section @xref{Section Name Substitutions,,@code{.section @var{name}}}. @end ifclear +@item --silent +Since @option{-v}, when used multiple times, has dual purpose, this option +suppresses the emission of the version ID message from any earlier @option{-v}. +Later uses of @option{-v} will further override this. + @item --size-check=error @itemx --size-check=warning Issue an error or warning for invalid ELF .size directive. @@ -974,10 +981,15 @@ assembly. Remove local absolute symbols from the outgoing symbol table. @item -v -@itemx -version -Print the @command{as} version. +@itemx --verbose +Print the @command{as} version. When used more than once, it also controls the +insertion of certain pre-defined symbols in the symbol table: When used twice, +those symbols become available for use in source code, without inserting them +into the symbol table. When used three times, such symbols are also inserted +in the symbol table. (@pxref{Predefined Symbols}) @item --version +@itemx -version Print the @command{as} version and exit. @item -W @@ -3896,6 +3908,7 @@ the same order they were declared. This * Symbol Names:: Symbol Names * Dot:: The Special Dot Symbol * Symbol Attributes:: Symbol Attributes +* Predefined Symbols:: Predefined Symbols @end menu @node Labels @@ -4237,6 +4250,30 @@ Language Reference Manual} (HP 92432-900 @code{EXPORT} assembler directive documentation. @end ifset +@node Predefined Symbols +@section Predefined Symbols + +If enabled, certain pre-defined symbols will be made available for use, and +possibly also inserted in the symbol table. Below @code{_} is used as a word +separator. The actual separator used is target specific, and will typically +be a character not usable in plain symbol names. Access to these symbols will +therefore normally require quotation. + +Independent of the specific target, the following symbols can be made +available: +@itemize @bullet + +@item __gas_version__ +The version of the assembler, expressed as @samp{major} @code{*} 100000000 +@code{+} @samp{minor} @code{*} 1000000 @code{+} @samp{rev} @code{*} 10000. + +@item __gas_date__ +The date of the assembler sources (which may not be the date the assembler was +built). This is added only for non-release versions of gas. The specific +value probably better isn't checked for, just its defined-ness. + +@end itemize + @node Expressions @chapter Expressions --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -566,3 +566,39 @@ run_dump_test "multibyte1" run_dump_test "multibyte2" run_list_test "multibyte3" "--multibyte-handling=warn" run_list_test "multibyte3" "-f --multibyte-handling=warn" + +# ONLY_STANDARD_ESCAPES targets can't deal with the macro-argument-like +# expansion used in the test. +# EVAX has an extra line printed by objdump when there are no relocations, +# and doesn't appear to enter absolute symbols into the symbol table. +# HPPA has too many flavors, quite a few of which won't properly handle +# the tests. +# IA-64 doesn't like the # that the test probes for, as that's a suffix +# operator there. +# The TI C54x backend segfaults apparently because of the use of $, after +# having claimed over 90k times that it would have stopped substitution +# symbol recursion. +switch -glob $target_triplet { + alpha-*-*vms* { } + avr-*-* { } + *c54x*-*-* { } + cris*-*-* { } + hppa*-*-* { } + ia64-*-* { } + msp430*-*-* { } + z80-*-* { } + default { + run_dump_test "version" + # Non-ELF symbol tables may include section symbols. + # RL78 includes a special absolute symbol. + if { [is_elf_format] && ![istarget "rl78*-*-*"] } { + run_dump_test "version2" + } + # ECOFF/XCOFF don't look to (reliably) emit local absolute symbols. + if { ![is_xcoff_format] + && ![istarget "alpha-*-linux*ecoff*"] + && ![istarget "alpha-*-osf*"] } { + run_dump_test "version3" + } + } +} --- /dev/null +++ b/gas/testsuite/gas/all/version.d @@ -0,0 +1,9 @@ +#as: -vv -silent +#as: -v -v -silent +#objdump: -rsj .data +#name: pre-defined version symbol + +.*: +file format .* + +Contents of section .data: + 0+ [0-9a-f]*[1-9a-f][0-9a-f]* .* --- /dev/null +++ b/gas/testsuite/gas/all/version.s @@ -0,0 +1,6 @@ + .data + .irpc sep, ".@$?%&#_" + .ifdef "\sep\sep\()gas\sep\()version\sep\sep" + .dc.l "\sep\sep\()gas\sep\()version\sep\sep" + .endif + .endr --- /dev/null +++ b/gas/testsuite/gas/all/version2.d @@ -0,0 +1,5 @@ +#as: -vv -silent +#as: -v -v -silent +#nm: --quiet +#name: pre-defined version symbol (empty symbol table) +#source: version.s --- /dev/null +++ b/gas/testsuite/gas/all/version3.d @@ -0,0 +1,9 @@ +#as: -vvv -silent +#as: -v -v -v -silent +#nm: -f bsd +#name: pre-defined version symbol (non-empty symbol table) +#source: version.s + +#... +.* a ..gas.version.. +#pass