From patchwork Mon Dec 9 09:22:15 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 102651 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 A0B7B3858D34 for ; Mon, 9 Dec 2024 09:26:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A0B7B3858D34 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=FJn9MFAU X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-wr1-x431.google.com (mail-wr1-x431.google.com [IPv6:2a00:1450:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id C7769385829B for ; Mon, 9 Dec 2024 09:22:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C7769385829B 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 C7769385829B Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::431 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733736137; cv=none; b=hNUNFgodYaA8AOsP9bEcz3mzYP3WrOlQ/aFo5zXhZOLr0kmJIAhQ2OAGMQaMEqx1XUy78lfYhNuiRD5x+MwG7JuxC1f0puImKb+IbUAQQKi98aC5veOf0tHRRGza1OIUTmORQHKYY0M7reGFq+K+GFfxnN1tpnG31PlE8gwp/lI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733736137; c=relaxed/simple; bh=KT8aV6sNrrX3vdZfVzZTqFWQJiX4cX5gHYbNmPLnnIs=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=wxOgQGS2HJnNyP+Q3KRihwDVCnNZzeLz4/UeoxRycAwKPkWEQGrHgcneHZnjTiPvnoEjxLGVNwcrJfzB0WhEI50WVnnvyp0lJ2Lfbj7EW+xSGyI2EjLu7V5r8yg3xOSLGwtATgYj8svigY8W74+RU04shO4W+prITl20Q7xIAls= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C7769385829B Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-3862ca8e0bbso2094238f8f.0 for ; Mon, 09 Dec 2024 01:22:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1733736135; x=1734340935; 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=ZLaoY1KF4UTe1tqPFcMqvBtXj7Pk0TKEvEA/OmZg0IU=; b=FJn9MFAUxC0iX+VvuIx1lLHub7iHaAtX9SK9RNJ2YbzpazUDyqf3aYcuuB4uDTM50P A3bC97bbmeAawUqJxfYDSolEx/m96FlPMxLrrWX/SLF0cMHIqQnmrp16DW5tMLFVDhnm SbF1p41W15CHIURjIGKgT8xnr8wAPL68vAiVEoJeoCPI8TPvI6P1d7r/TqJ1WXZ6RZDs TxSLEM61jVFIlyACE+5wIX2VDqwWUt3BOaeV7q+rIDGezsdu8ophW1WYGZrK5cgt4ZQC XtsjVzCR6q7bjKwKy5g3AkbpYPqs4ttWCNi+5ntTv+6ZMedPkihQMI7pvY2tvYGxCa+K SPlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733736135; x=1734340935; 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=ZLaoY1KF4UTe1tqPFcMqvBtXj7Pk0TKEvEA/OmZg0IU=; b=e3r+x4rd9ALfj9C0GO3H8t7oOnAaeOCkAriTnQSeiz+to/1uLzRk6XEwPj1L1tAUHr 8kYdyH2oIHe1tzaV44SBBqOOWZNvWiiHVprvbbUikdGeFUkSxwPcPW9IlSFgPyVW+kM/ aJSVlgDGg+SLoRqAR4JoDz44eQdJz3nowJt2kjU6m3WkGbs1MRjXb4/kLpL92wYRahla TRuq1vFEVpiP4hKbS6d6HlD6eOCv1OeZ83YOJzczKHEULofjYGwOfg4TG5NO+xgtrsT5 MihZs21QE39vgqqdVp+I24A+7ICvP9nJMpyDVC85NtekovbrvqPDwB7hiMaBpCsZJyBN 3EOA== X-Gm-Message-State: AOJu0Yz/U6sycEX84KV6U6BCHR7vgU2t9cw1tdkMxtdrLDPppKO4/1pr 0hNDMx43hbJHvAybQziw1EWfPOLUFOyg79NS04XQSs4kGPDHKatt8qMQw7prAcnGF5GS8m3ncpA = X-Gm-Gg: ASbGncunfnKmk7KKVrwFMC4zeo/R06Qzt5jENgOfxePklloiVmws/q/0dHVEWdhXR2O 46Twu2bO8jWmR5YFFJkPoL23qK2hpr28A4+ffmCGb10MSFcKxYEIjVul937bVYMtDwOa6gQlbpy WZ6pcX10pioejsWJlANI4r6I0NGq+ZT6YQzxfEAY2SkgA6ABfvvx32t0TqYms+E2uVIt5fWgcUJ iZuRHT0haPLYDkoWffN9bh92ZT5sRLay9klqZ7M4GpNEL0qAsP2u1q4kudPcgsw+Aenvzb8kb7y 9pNmZdzZVEXD8OymOI87BPtAE0x8SYp9Zgw= X-Google-Smtp-Source: AGHT+IGSnQbw61AF88BU1k5KamHVDwjClz8TVOfe/W4wG7SjkugYxZpsSgBH9mt4+E/3fBEgBN6s9A== X-Received: by 2002:a05:6000:1fa9:b0:385:fc00:f5e1 with SMTP id ffacd0b85a97d-3862b33e036mr8013098f8f.9.1733736135548; Mon, 09 Dec 2024 01:22:15 -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 d9443c01a7336-2163543fbb2sm27894045ad.205.2024.12.09.01.22.13 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 09 Dec 2024 01:22:15 -0800 (PST) Message-ID: Date: Mon, 9 Dec 2024 10:22:15 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH RFC 3/3] gas: introduce .errif and .warnif 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 Rather than having people resort to indirect means to issue a certain kind of diagnostic conditionally upon an expression which can (or should) only be evaluated when all sections were sized and all symbols has their final values established, provide directives to directly achieve this. --- Should we save the (textual) expression, to quote it when emitting the diagnostic? NOTE: Depends on "aarch64: re-work PR gas/27217 fix again" (latched_dot_expression()), unless that would be re-worked such that deferred_expression() would need using here. --- a/gas/NEWS +++ b/gas/NEWS @@ -1,5 +1,8 @@ -*- text -*- +* Add .errif and .warnif directives, permitting user-controlled diagnostics + with conditionals that are evaluated only at the end of assembly. + * Add support for the x86 Intel MSR_IMM instructions. * Add support for the x86 Zhaoxin GMI instructions. --- a/gas/doc/as.texi +++ b/gas/doc/as.texi @@ -4577,6 +4577,7 @@ Some machine configurations provide addi * Equiv:: @code{.equiv @var{symbol}, @var{expression}} * Eqv:: @code{.eqv @var{symbol}, @var{expression}} * Err:: @code{.err} +* Errif:: @code{.errif @var{expression}} * Error:: @code{.error @var{string}} * Exitm:: @code{.exitm} * Extern:: @code{.extern} @@ -4709,6 +4710,7 @@ Some machine configurations provide addi * VTableInherit:: @code{.vtable_inherit @var{child}, @var{parent}} @end ifset +* Warnif:: @code{.warnif @var{expression}} * Warning:: @code{.warning @var{string}} * Weak:: @code{.weak @var{names}} * Weakref:: @code{.weakref @var{alias}, @var{symbol}} @@ -5529,6 +5531,13 @@ If @command{@value{AS}} assembles a @cod message and, unless the @option{-Z} option was used, it will not generate an object file. This can be used to signal an error in conditionally compiled code. +@node Errif +@section @code{.errif "@var{expression}"} +@cindex errif directive + +Record @var{expression} for evaluation at the end of assembly. Raise an error +if the expression evaluates to non-zero. + @node Error @section @code{.error "@var{string}"} @cindex error directive @@ -7714,6 +7723,13 @@ parent whose addend is the value of the parent name of @code{0} is treated as referring to the @code{*ABS*} section. @end ifset +@node Warnif +@section @code{.warnif "@var{expression}"} +@cindex errif directive + +Record @var{expression} for evaluation at the end of assembly. Raise a +warning if the expression evaluates to non-zero. + @node Warning @section @code{.warning "@var{string}"} @cindex warning directive --- a/gas/read.c +++ b/gas/read.c @@ -257,6 +257,7 @@ static void do_s_func (int end_p, const static void s_align (int, int); static void s_altmacro (int); static void s_bad_end (int); +static void s_errwarn_if (int); static void s_reloc (int); static int hex_float (int, char *); static segT get_known_segmented_expression (expressionS * expP); @@ -415,6 +416,7 @@ static const pseudo_typeS potable[] = { {"equiv", s_set, 1}, {"eqv", s_set, -1}, {"err", s_err, 0}, + {"errif", s_errwarn_if, 1}, {"error", s_errwarn, 1}, {"exitm", s_mexit, 0}, /* extend */ @@ -529,6 +531,7 @@ static const pseudo_typeS potable[] = { {"xdef", s_globl, 0}, {"xref", s_ignore, 0}, {"xstabs", s_xstab, 's'}, + {"warnif", s_errwarn_if, 0}, {"warning", s_errwarn, 0}, {"weakref", s_weakref, 0}, {"word", cons, 2}, @@ -2236,6 +2239,62 @@ s_errwarn (int err) demand_empty_rest_of_line (); } +/* Handle the .errif and .warnif pseudo-ops. */ + +static struct deferred_diag { + struct deferred_diag *next; + const char *file; + unsigned int lineno; + bool err; + expressionS exp; +} *deferred_diags, *last_deferred_diag; + +static void +s_errwarn_if (int err) +{ + struct deferred_diag *diag = XNEW (struct deferred_diag); + int errcnt = had_errors (); + + latched_dot_expression (&diag->exp); + if (errcnt != had_errors ()) + { + ignore_rest_of_line (); + return; + } + + diag->err = err; + diag->file = as_where (&diag->lineno); + diag->next = NULL; + if ( deferred_diags == NULL ) + deferred_diags = diag; + else + last_deferred_diag->next = diag; + last_deferred_diag = diag; + + demand_empty_rest_of_line (); +} + +void +evaluate_deferred_diags (void) +{ + struct deferred_diag *diag; + + for (diag = deferred_diags; diag != NULL; diag = diag->next) + { + if (!resolve_expression (&diag->exp) || diag->exp.X_op != O_constant) + as_warn_where (diag->file, diag->lineno, + _("expression does not evaluate to a constant")); + else if (diag->exp.X_add_number == 0) + continue; + else if (diag->err) + as_bad_where (diag->file, diag->lineno, + _(".errif expression evaluates to true")); + else + as_warn_where (diag->file, diag->lineno, + _(".warnif expression evaluates to true")); + } +} + /* Handle the MRI fail pseudo-op. */ void --- a/gas/read.h +++ b/gas/read.h @@ -162,6 +162,7 @@ extern symbolS *s_comm_internal (int, sy extern symbolS *s_lcomm_internal (int, symbolS *, addressT); extern void temp_ilp (char *); extern void restore_ilp (void); +extern void evaluate_deferred_diags (void); extern void s_file_string (char *); extern void s_abort (int) ATTRIBUTE_NORETURN; --- a/gas/write.c +++ b/gas/write.c @@ -2329,6 +2329,8 @@ write_object_file (void) resolve_local_symbol_values (); resolve_reloc_expr_symbols (); + evaluate_deferred_diags (); + #ifdef OBJ_ELF if (IS_ELF) maybe_generate_build_notes (); --- /dev/null +++ b/gas/testsuite/gas/all/cond-diag.l @@ -0,0 +1,6 @@ +# This should match the output of gas cond-diag.s. +.*: Assembler messages: +.*:1: Error: non-constant .* +.*:6: Error: backward ref .* +.*:7: Warning: \.warning .* +.*:4: Warning: \.warnif .* --- /dev/null +++ b/gas/testsuite/gas/all/cond-diag.s @@ -0,0 +1,12 @@ + .if end - start > 16 + .warning + .endif + .warnif end - start < 16 + .errif end - start >= 16 + .warnif 1b + .warning + + .data +start: + .uleb128 end - start +end: --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -488,6 +488,19 @@ switch -glob $target_triplet { } } +# This test uses a local label, which some targets don't support. +# MeP can't deal with forward ref labels in .uleb128. +switch -glob $target_triplet { + *c54x*-*-* { } + hppa*-*-* { } + ia64-*-*vms* { } + mep-*-* { } + sh-*-pe* { } + default { + run_list_test "cond-diag" + } +} + gas_test_error "weakref2.s" "" "e: would close weakref loop: e => a => b => c => d => e" gas_test_error "weakref3.s" "" "a: would close weakref loop: a => b => c => d => e => a" gas_test_error "weakref4.s" "" "is already defined"