From patchwork Fri Nov 22 12:47:47 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 101743 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 D8DEB3857015 for ; Fri, 22 Nov 2024 12:48:25 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id D4F023858416 for ; Fri, 22 Nov 2024 12:47:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D4F023858416 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 D4F023858416 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::636 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732279674; cv=none; b=rY+pnOE1ub+7scnesnkwzCz/rFPXGUiQaLbsEIhlQLz0HNtQHbGZZEmIlAA4hmqyAeFubNXVDWhm2f0mvKG+FqLNmGw8M0X8usGWuawqIDW+aXZKfCXdBQY6YRpIu0ytyS8Kpj/092nadRaEfTpJFo/vKCJy1uvpWBU9F7TFje8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732279674; c=relaxed/simple; bh=JBfLlxhX/UxILJlBJ84Bx8QWIRfjTk1cb6Y1dergHtM=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:From:To; b=Q/lDEgXGPo1gaAYGtQib3/C8KBuENWFOI2/3BNPqI+L1FNJyeQdvjAfUiEy3u0d0KOY4mSTHdMGFER9eLfiQy/FDvZwullQgREv/vNZBvwr3IGMwePoMGC+DhFSmezfjbHGfvrr7PqqzdaBeJQYjeMU2FeLWjRmdUmTG3d4L2NQ= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-a9ed49edd41so346289866b.0 for ; Fri, 22 Nov 2024 04:47:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1732279670; x=1732884470; darn=sourceware.org; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:cc:to:from:subject:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=0DKPGqzPZWwABUCIxT4hqfbS7qaK6X1+BWy8vApW6OI=; b=R3cmXgKbsUN7weqqhQSq7NiZHOOGqH0oVTJYjVQ7ueOdKUK2slWQB4BtIthuP8AM3m XWxYeOYmmCwUJ145y9tpQYfmyuw/ubA2Pqcn07HU7FOJJ4cfjRiSg/k34H1tfatgbLQI jiPtGOz3KJZUmClEmK7CAzACxnpK0BewaY8MwSJ7xoYucSl5IaYxibBccxY3HpIpeReA tW4HQ/bPRGNmBw5YpFf/7Q9FR+cpX1YEOQuRqgyHwYVbN9MAsa9T5uXkjxqAfk0aiTvz sTlzQ3dJghk3/EZGRMd4odwRuvsGwksQwiLFhnNJkQFb5DWaEFnjIc5nltjm4nUs5X9W YbsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732279670; x=1732884470; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:cc:to:from:subject:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0DKPGqzPZWwABUCIxT4hqfbS7qaK6X1+BWy8vApW6OI=; b=YVsV6vSMqiUWFDkwO5Z/IkFKxKAJbv2LmTjPCZcj25Gvebo7LXhTlXvW5W9TOOOWd1 fWOq+/2N6eF4lWF/Gosg2AJvQTEUnMRDNUNRdhl3OXv7TbtUFR6zIxyAU1TpjOe564nG ABTSYLW4YCWOZJ0w2CzmEn5X6VgmJn/UKS9w9QbWobF4rfzB29KPOD2Se2e0tj8FC2lG tU80Pb1hIhvg+Fu6l3FkCClpYfZXKkITAlEpE6/uIQO+KqAu5LzMlfc0DWMD7+q7+zDI Q8spaa64SQklphgW9xrj/qTJCeOR6bYpMobh6DfcptPS9/F/f9OuG6kaqShVtye2F/h6 9+CQ== X-Gm-Message-State: AOJu0YyjUM5BpOZASTNSoc9EgRp5KhnZCjWQoE5JEqB9vlLWo4Ao3CWZ /LzGytxGulvgvCrir3LMP2AVSfKKsvioGN9kKBVvInS9QCq+NpwaTPdM5u75w4skvXvxD4EkayM = X-Gm-Gg: ASbGncuZrdvT3nHU32whwEkE9Lbr4zg5lFIM6EEVPFlOL5y39fhXtGjFwBbtx5rQLu6 /qP3jz+5p55fy2vcw6yjFUF8d+/fNBb/3dmmz4f+li+iGKMjf5c2fZNkSID2p4Aff4Mycu4O0iR 9qXTnSjM13Wd0b3sn9dsxpDq3oCR7r2iVuzdNIy0rIoc9uPfa4uznDMA6nl2y1CkJvD83GRlBYJ kRfivk1W4/GNDM6fAqjTiv9HMz7r6caEf1iIkVIaB7n+V4URCFMnjlfCYWIx9Cgcxhp049bQh9Q Sn/OX5MqojyLpejkEFsEzfw9PIlEdZDfWsA= X-Google-Smtp-Source: AGHT+IHgIILK7wXaNkfxUKSH+K/QgDYnsj2oWTy3vKL5calYR1o/R8I6ijawJMpPj1JfYepW/qUExA== X-Received: by 2002:a17:906:3155:b0:a9a:230b:fb5e with SMTP id a640c23a62f3a-aa509966471mr225367566b.4.1732279670080; Fri, 22 Nov 2024 04:47:50 -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 a640c23a62f3a-aa50b52fb87sm96095166b.95.2024.11.22.04.47.49 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 22 Nov 2024 04:47:49 -0800 (PST) Message-ID: <1a9cfc5a-03ca-47cd-a3d8-abc00b779fad@suse.com> Date: Fri, 22 Nov 2024 13:47:47 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 5/5] aarch64: re-work PR gas/27217 fix again From: Jan Beulich To: Binutils Cc: Richard Earnshaw , Marcus Shawcroft , Alan Modra , Nick Clifton 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.8 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 Commit c1723a8118f0 ("Arm64: re-work PR gas/27217 fix") really was only a band-aid; Nick's original solution to the problem was technically preferable, yet didn't work when . came into play. Undo most of that change, but use the new expr_defer_latch_dot expression parsing mode. Also add testing for the . case, which I should have done already back at the time. --- Quite likely tc-spu.c will want to use latched_dot_expression() as well, perhaps allowing the double parsing to be dropped. Question really is: Should the new mode become the default, with just pseudo_set() using the variant not evaluating dot? In which case names likely would want changing (e.g. expr_defer and expr_defer_dot, with the latter better not even given a wrapper, i.e. truly only for pseudo_set() to use). I wasn't certain whether to keep the md_apply_fix() hunk, or rather leave that code untouched here. The extra check was necessary to add back at the time, and I wonder whether it really wants/needs removing again. --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -666,18 +666,25 @@ static bool in_aarch64_get_expression = #define ALLOW_ABSENT false #define REJECT_ABSENT true +/* Fifth argument to aarch64_get_expression. */ +#define NORMAL_RESOLUTION false + /* Return TRUE if the string pointed by *STR is successfully parsed as an valid expression; *EP will be filled with the information of such an expression. Otherwise return FALSE. If ALLOW_IMMEDIATE_PREFIX is true then skip a '#' at the start. - If REJECT_ABSENT is true then trat missing expressions as an error. */ + If REJECT_ABSENT is true then trat missing expressions as an error. + If DEFER_RESOLUTION is true, then do not resolve expressions against + constant symbols. Necessary if the expression is part of a fixup + that uses a reloc that must be emitted. */ static bool aarch64_get_expression (expressionS * ep, char ** str, bool allow_immediate_prefix, - bool reject_absent) + bool reject_absent, + bool defer_resolution) { char *save_in; segT seg; @@ -697,7 +704,10 @@ aarch64_get_expression (expressionS * e save_in = input_line_pointer; input_line_pointer = *str; in_aarch64_get_expression = true; - seg = expression (ep); + if (defer_resolution) + seg = latched_dot_expression (ep); + else + seg = expression (ep); in_aarch64_get_expression = false; if (ep->X_op == O_illegal || (reject_absent && ep->X_op == O_absent)) @@ -1163,7 +1173,8 @@ parse_index_expression (char **str, int6 { expressionS exp; - aarch64_get_expression (&exp, str, GE_NO_PREFIX, REJECT_ABSENT); + aarch64_get_expression (&exp, str, GE_NO_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION); if (exp.X_op != O_constant) { first_error (_("constant expression required")); @@ -2546,7 +2557,8 @@ parse_immediate_expression (char **str, return false; } - aarch64_get_expression (exp, str, GE_OPT_PREFIX, REJECT_ABSENT); + aarch64_get_expression (exp, str, GE_OPT_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION); if (exp->X_op == O_absent) { @@ -2780,7 +2792,8 @@ parse_big_immediate (char **str, int64_t return false; } - aarch64_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, REJECT_ABSENT); + aarch64_get_expression (&inst.reloc.exp, &ptr, GE_OPT_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION); if (inst.reloc.exp.X_op == O_constant) *imm = inst.reloc.exp.X_add_number; @@ -3677,7 +3690,8 @@ parse_shift (char **str, aarch64_opnd_in p++; exp_has_prefix = 1; } - aarch64_get_expression (&exp, &p, GE_NO_PREFIX, ALLOW_ABSENT); + aarch64_get_expression (&exp, &p, GE_NO_PREFIX, ALLOW_ABSENT, + NORMAL_RESOLUTION); } if (kind == AARCH64_MOD_MUL_VL) /* For consistency, give MUL VL the same shift amount as an implicit @@ -3741,7 +3755,7 @@ parse_shifter_operand_imm (char **str, a /* Accept an immediate expression. */ if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_OPT_PREFIX, - REJECT_ABSENT)) + REJECT_ABSENT, NORMAL_RESOLUTION)) return false; /* Accept optional LSL for arithmetic immediate values. */ @@ -3900,7 +3914,8 @@ parse_shifter_operand_reloc (char **str, /* Next, we parse the expression. */ if (! aarch64_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX, - REJECT_ABSENT)) + REJECT_ABSENT, + aarch64_force_reloc (entry->add_type) == 1)) return false; /* Record the relocation type (use the ADD variant here). */ @@ -4095,7 +4110,8 @@ parse_address_main (char **str, aarch64_ } /* #:: */ - if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) + if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, + aarch64_force_reloc (ty) == 1)) { set_syntax_error (_("invalid relocation expression")); return false; @@ -4111,7 +4127,8 @@ parse_address_main (char **str, aarch64_ /* =immediate; need to generate the literal in the literal pool. */ inst.gen_lit_pool = 1; - if (!aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) + if (!aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION)) { set_syntax_error (_("invalid address")); return false; @@ -4225,7 +4242,8 @@ parse_address_main (char **str, aarch64_ /* We now have the group relocation table entry corresponding to the name in the assembler source. Next, we parse the expression. */ - if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) + if (! aarch64_get_expression (exp, &p, GE_NO_PREFIX, REJECT_ABSENT, + aarch64_force_reloc (entry->ldst_type) == 1)) { set_syntax_error (_("invalid relocation expression")); return false; @@ -4238,7 +4256,8 @@ parse_address_main (char **str, aarch64_ } else { - if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT)) + if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION)) { set_syntax_error (_("invalid expression in the address")); return false; @@ -4294,7 +4313,8 @@ parse_address_main (char **str, aarch64_ operand->addr.offset.regno = reg->number; operand->addr.offset.is_reg = 1; } - else if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT)) + else if (! aarch64_get_expression (exp, &p, GE_OPT_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION)) { /* [Xn],#expr */ set_syntax_error (_("invalid expression in the address")); @@ -4422,7 +4442,8 @@ parse_half (char **str, int *internal_fi else *internal_fixup_p = 1; - if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) + if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT, + aarch64_force_reloc (inst.reloc.type) == 1)) return false; *str = p; @@ -4464,7 +4485,8 @@ parse_adrp (char **str) inst.reloc.type = BFD_RELOC_AARCH64_ADR_HI21_PCREL; inst.reloc.pc_rel = 1; - if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT)) + if (! aarch64_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX, REJECT_ABSENT, + aarch64_force_reloc (inst.reloc.type) == 1)) return false; *str = p; return true; @@ -7223,7 +7245,8 @@ parse_operands (char *str, const aarch64 goto failure; str = saved; po_misc_or_fail (aarch64_get_expression (&inst.reloc.exp, &str, - GE_OPT_PREFIX, REJECT_ABSENT)); + GE_OPT_PREFIX, REJECT_ABSENT, + NORMAL_RESOLUTION)); /* The MOV immediate alias will be fixed up by fix_mov_imm_insn later. fix_mov_imm_insn will try to determine a machine instruction (MOVZ, MOVN or ORR) for it and will issue an error @@ -9605,8 +9628,7 @@ md_apply_fix (fixS * fixP, valueT * valP /* Note whether this will delete the relocation. */ - if (fixP->fx_addsy == 0 && !fixP->fx_pcrel - && aarch64_force_reloc (fixP->fx_r_type) <= 0) + if (fixP->fx_addsy == 0 && !fixP->fx_pcrel) fixP->fx_done = 1; /* Process the relocations. */ --- a/gas/expr.h +++ b/gas/expr.h @@ -163,6 +163,7 @@ enum expr_mode #define expression(result) expr (0, result, expr_normal) #define expression_and_evaluate(result) expr (0, result, expr_evaluate) #define deferred_expression(result) expr (0, result, expr_defer) +#define latched_dot_expression(result) expr (0, result, expr_defer_latch_dot) /* If an expression is O_big, look here for its value. These common data may be clobbered whenever expr() is called. */ --- a/gas/testsuite/gas/aarch64/pr27217.d +++ b/gas/testsuite/gas/aarch64/pr27217.d @@ -10,8 +10,19 @@ Disassembly of section \.text: 0+000 <.*>: [ ]+0:[ ]+90000000[ ]+adrp[ ]+x0, [0-9]*[ ]+<.*> -[ ]+0:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+\*ABS\*\+0x12345678 +[ ]+0:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+bar [ ]+4:[ ]+91000000[ ]+add[ ]+x0, x0, #0x0 -[ ]+4:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+\*ABS\*\+0x12345678 +[ ]+4:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+bar [ ]+8:[ ]+d65f03c0[ ]+ret +#... +0+010 <.*>: +[ ]+10:[ ]+90000000[ ]+adrp[ ]+x0, [0-9]*[ ]+<.*> +[ ]+10:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+\.text\+0x10 +[ ]+14:[ ]+91000000[ ]+add[ ]+x0, x0, #0x0 +[ ]+14:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+\.text\+0x10 +[ ]+18:[ ]+90000001[ ]+adrp[ ]+x1, [0-9]*[ ]+<.*> +[ ]+18:[ ]+R_AARCH64(|_P32)_ADR_PREL_PG_HI21[ ]+\.text\+0x1c +[ ]+1c:[ ]+91000021[ ]+add[ ]+x1, x1, #0x0 +[ ]+1c:[ ]+R_AARCH64(|_P32)_ADD_ABS_LO12_NC[ ]+\.text\+0x1c +[ ]+20:[ ]+d65f03c0[ ]+ret #pass --- a/gas/testsuite/gas/aarch64/pr27217.s +++ b/gas/testsuite/gas/aarch64/pr27217.s @@ -13,4 +13,13 @@ foo: add x0, x0, :lo12:bar ret .size foo, .-foo - .ident "GCC: (GNU) 10.2.1 20201030 (RTEMS 6, RSB " + + .p2align 4 + .type dot, %function +dot: + adrp x0, . + add x0, x0, :lo12:. - 4 + adrp x1, . + 4 + add x1, x1, :lo12:. + ret + .size dot, .-dot