From patchwork Tue May 2 09:04:28 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 89293 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp459290vqo; Tue, 2 May 2023 02:04:45 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6YW6wZ1itip4jN4Ak+ntb9aRQVQBKZjN7rM068rBBxYrURYdz+/WyhwH9PhAleKFAJeN49 X-Received: by 2002:a17:907:8690:b0:94f:317f:6a58 with SMTP id qa16-20020a170907869000b0094f317f6a58mr12249003ejc.35.1683018285250; Tue, 02 May 2023 02:04:45 -0700 (PDT) Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id br25-20020a170906d15900b0094f55dd096bsi20908997ejb.814.2023.05.02.02.04.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 May 2023 02:04:45 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=Z4yS0Or4; arc=fail (signature failed); spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1D93F3858423 for ; Tue, 2 May 2023 09:04:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1D93F3858423 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1683018282; bh=+eJI5lUvdaR74tzZ1Jm9ovq5a293FDFm30d9L9BDivk=; h=Date:Subject:To:Cc:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=Z4yS0Or4Q4YglleqNRPgNcmffQ2Ky5ACP1R5F1GkPoj0hrecq4VAwM5pokFQyrTpr oHTNoZnkeWcVYF9buYGgGE2RKVNTu5nfflRsA4rsTwyXxbaYpn+FfpM9JDcrwPI+z+ 3Gp41SBi2r59OdYPbSAmeHrQnzwLv7B9BBlHMCao= X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2054.outbound.protection.outlook.com [40.107.22.54]) by sourceware.org (Postfix) with ESMTPS id 969803858D1E; Tue, 2 May 2023 09:04:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 969803858D1E ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Tg4xs03bqGWnH6kw3XmnBHGCNmWuHm9jfHHeq1NERn8AWEvrQjTJx0c7B4nIMTuvv5ON6OGaiRpLJdpvGLSVH/Nq1XyPcJ2Or7j0dEEFe3ULgwkvuykrrw2iQeDhqAwj/wPwpRN0E3coMYIVmp2osjMW83Cu5w9X+8T9HDSy3WdlLhR7ydep9sXne1+Ccy3gHlxH4+valvgZk8Z/435llgfEna+2AUOl0hAyH51ReC6O0bjRIvpSjIC6SzhQIEZHzuxky8Evhbey9yGVVBlEbu7msExzLihp5G8bNU5m1g6MiuNOUGG79xwSJaRD8R91bXHWGSNvTpNiPkdBMbtAag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+eJI5lUvdaR74tzZ1Jm9ovq5a293FDFm30d9L9BDivk=; b=GuumORY1Trkiw94Fa4Mdcyq7nsEjpVspu+ImGgfDy5vzx0hwcGvT01oAQbE4iCbteAxdnPm8aFEClMdSryXDHgIqhKRCo00tTFpoCqgVzm57uHMZE9avl3u9tjSMGwhkOaFnablC0n8aQn90GCfgrumtxidueGY0s3UjVQ19DxgviQYTSVGlj/AgLOBAxy3raswt9LZ1yKRDrtS1k9MS/Cr6aRTzJStZrT26G7Ra83aCJL9k2YZoob4NyTFi+KkqM4qFbkzq0LKBlPyWvnV2HX4FSbvKsnCQ9lFUNomTKVcEIfSOG0dkF3IF72Ouus5qbpsC3Ofgt/9y3pjc25zEQg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=suse.com; dmarc=pass action=none header.from=suse.com; dkim=pass header.d=suse.com; arc=none Received: from VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) by PAXPR04MB8490.eurprd04.prod.outlook.com (2603:10a6:102:1de::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6340.31; Tue, 2 May 2023 09:04:26 +0000 Received: from VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::52b2:f58:e19:56ae]) by VE1PR04MB6560.eurprd04.prod.outlook.com ([fe80::52b2:f58:e19:56ae%2]) with mapi id 15.20.6340.030; Tue, 2 May 2023 09:04:26 +0000 Message-ID: <3a7b6bb3-4ab0-15af-0c74-5d7798ac3793@suse.com> Date: Tue, 2 May 2023 11:04:28 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.10.1 Subject: [PATCH v2] gas: equates of registers To: Binutils Cc: Alan Modra , Peter Bergner , Geoff Keating , "H.J. Lu" , Claudiu Zissulescu , Nikolaos Kavvadias , Jim Wilson , Hans-Peter Nilsson , Alexandre Oliva , Dmitry Diky , Kuan-Lin Chen , Wei-Cheng Wang , Andreas Krebbel , Sean Keys Content-Language: en-US X-ClientProxiedBy: FR3P281CA0082.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::8) To VE1PR04MB6560.eurprd04.prod.outlook.com (2603:10a6:803:122::25) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VE1PR04MB6560:EE_|PAXPR04MB8490:EE_ X-MS-Office365-Filtering-Correlation-Id: 0bdf11d6-36e1-4c2a-0c98-08db4aec3af7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: sefi28VhIWscGy4gSfUQDx60NOC4B+JYx4RjYAr0elOZP/AXw/yU0jBXWUEoA8/Ctf/5ARs0eA/kIPTNaXEOujGsZtH775r6egG1bqAqVCdbGt3pKntRg7ZyxapbwSvRj5VVdVifuQs72kqpd+VP8OwnlVTsnOwgOQM4NbSc7xp+WKzF0mVxjUiZBvVfGTX+0AkZwhIW6YTa11ywK0OMjxGURsxYZZ38DxprzvvgQpd/FrohpuNTuXrfjZd7Pireg/6BKPmGBYFAIL5Y/WixSnOiDkGxdv/4M87y0FiLyd+GJJux82X1c0EiL2AN4BMPLeXs1Dl/oOdKqoExJPuzd5KsNeyA/P+u/geJsiXVqHV7zs8RzCuIpaRtN3DNIeGrKkJh4vLjg6lEYWcDFUxWB1yL3y2RqQKM+Y9bl2NqPxBCUcxeD+P6ZPGrjc3B9na12Gh0ETercv35COtE4Uj6CNUXVorfARoRYRXWldoN3+gvVmM0XMg4T97v/7YqsFgFnimnpIMXJ22PAmGJn24KK6VjBsgCjRO2Fgcz+iD8Efks+ZxeU1A2ZTGExprn7z7DjTWJEg//AX0FACXqlsj74Tb5jASuARQ6O3Y0M/gTqTey+Qzp0sT8CBF8vHtSkyCbFyDfg8WTVRSHWm1IhdvWXA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR04MB6560.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230028)(136003)(346002)(366004)(376002)(396003)(39860400002)(451199021)(54906003)(83380400001)(478600001)(2616005)(31696002)(6486002)(6506007)(26005)(6512007)(4326008)(6916009)(66556008)(66476007)(66946007)(316002)(186003)(31686004)(7416002)(41300700001)(8676002)(5660300002)(8936002)(38100700002)(2906002)(86362001)(36756003)(45980500001)(43740500002); DIR:OUT; SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?YTiiY9HAvHPqsb5pMgbPLuZBdlu5?= =?utf-8?q?LdhHH481xSxVd0ZY7CJMS5U55M4TLl/C3WCQmlvnmpGM9bBawhSX83q01Hr7cyNiA?= =?utf-8?q?UAoxbIXilBNZwaVYQgdfzGKIcZa7EA2AJQDnm/G0S3bRMCde5mIsLOy/gBNQPknHT?= =?utf-8?q?P2ZQz82LFCiH+GsE80JdFLgoxfmCP3IwC3ECB9WahfNPSD+YcZFE1Ac6EAXAGxr20?= =?utf-8?q?xlz5e+TvrAaXd+tNBiPGX7JRMk6zhl1cKimtOAfez0p237Hpdh4jRCWflFeW9rZ5b?= =?utf-8?q?ISpgYUFPfqA3qVDDllPD+sa8H7JC6OGO2yk3tIxKbjkT+8g4BHhbQWV8hE3GaxbRT?= =?utf-8?q?ghBoi6IpaV/TCS3G4Et60PGsi/f2EAP0nuiB6bA7E2dK7ouGVD+9HTRX2+i6GAh6c?= =?utf-8?q?cP+Nt3vzPRs4kUAubRjPa2iVHEY+3Hlgz3yDe7C8ImY5XtK27JUvrWspkJ/9eiaiB?= =?utf-8?q?xsfv6J35UBB6d4lLchggiR8igo3CJpPVB06xZE9D3k7pY1mv/np/91MFp6wvbf7Ly?= =?utf-8?q?6ypFCQemAMM7hHnu8mnt6lNjpXT4UNCE3MWEu8IJgwsCN7EWv1+5s9SPDk0+G4sYE?= =?utf-8?q?tijBxjA5cCpQ0aBGsdgRiRsFo7NUjxOhfjAxHMcyT/34E0GzE9A07RcEnN3df9D+I?= =?utf-8?q?YAcGy7ygXGk5P3Lg7D5ojm1MFvbzass+XW+U6saAEXg3n0ugCFCDDu67t61o5vBvt?= =?utf-8?q?gUpaY5AoB//apTX60MeA7D5get2DbOn4erSsquBAgju26Eg1VSQHmSfAUQxRDsSz2?= =?utf-8?q?AmZaHI8QreFj5xZB1kWKAxtZVeci4vtMcTugcVi9/WFHCT0rWawzui8PsQvs9auVR?= =?utf-8?q?f3ngBQ/6lU5RSdmMJrPM0BAaK4/thWgxyEac0wAOWtNAOvZCQPKDMDBZSTqZGPWiW?= =?utf-8?q?mqspKWdQmuOHeFIguGLf/zToOVXpo/Qrh1KY2rSTlwDrVnTd4O5llTsKMVYZYG6Nj?= =?utf-8?q?Jy2+h5uTWKqtGPSbw8NYFBabCnFQtFxc1nQpMtTaqa3n4s9e/k3iH576LLfKuy8VX?= =?utf-8?q?A7rD6BQffIa4ys9/Vac74WZzqsRx5NLdvnR3qfXTWTEcBSMP+1EPJoPfc01sTooOj?= =?utf-8?q?ULynmqzUCXsNfYAqdLKopsGheZhO9f+XrKWQxOQPMakSwyHgH6Wm0O2sB61SmMWw9?= =?utf-8?q?aCwMTBvj15ultMWZtsDaco68TGqeKunn6pN9CpU3z+hOpnfK1e21lK/4vC/IH2P00?= =?utf-8?q?+yrvedZZJFtx+lvdzyB0EWmU52i/UpU7BwbUh4446Nhi9Gbg32SA8ZCJuTOqXNVQi?= =?utf-8?q?SLwgUxa+yBjcRMgc4LPcGuvkmB44JAT/geSGeyPrlcp2NdY6tSg0+eDCFJfVXyooQ?= =?utf-8?q?9ZYfvd2Iex9EfNx3QBNkIqYnNWpX+TyBWbV8qkZSClHA1oiM1VLLHMvc73AdIznzm?= =?utf-8?q?fW7XDK6ImgjDBj2BP2tOuR0f6bPwCwi2c3oBv5ozbVybs/NalVZmwdUAaYXQOjfQc?= =?utf-8?q?+JdO5TiLfEah/txuW6f1Kor3hXHuHgSJ+baQksKShuFRWLM4nYhrojPZExk0LdCuG?= =?utf-8?q?cc7dG5aLDl1Z?= X-OriginatorOrg: suse.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0bdf11d6-36e1-4c2a-0c98-08db4aec3af7 X-MS-Exchange-CrossTenant-AuthSource: VE1PR04MB6560.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 May 2023 09:04:26.6687 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f7a17af6-1c5c-4a36-aa8b-f5be247aa4ba X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ldiNxYikzd36DoW9UEJbFMP7rSvAe4Muy4lfXHXC4twa1gyHwtpfmngWTFrP+H6R9n/881kilItRSt87xkcvyQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PAXPR04MB8490 X-Spam-Status: No, score=-3027.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE 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.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jan Beulich via Binutils From: Jan Beulich Reply-To: Jan Beulich Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764772581743221045?= X-GMAIL-MSGID: =?utf-8?q?1764772581743221045?= There are two problems: symbol_equated_p() doesn't recognize equates of registers, and S_CAN_BE_REDEFINED() goes by section rather than by expression type. Both together undermine .eqv and .equiv clearly meaning to guard the involved symbols against re-definition (both ways). To compensate pseudo_set() now using O_symbol and S_CAN_BE_REDEFINED() now checking for O_register, - for targets creating register symbols through symbol_{new,create}() -> symbol_init() -> S_SET_VALUE() (alpha, arc, dlx, ia64, m68k, mips, mmix, tic4x, tic54x, plus anything using cgen or itbl-ops), have symbol_init() set their expressions to O_register, - x86'es parse_register() also can't go by section anymore when trying to "look through" equates; probably symbol_equated_p() should have been used there from the beginning, if only that had worked for equates of registers, - various targets need to "look through" equates when parsing insn operands (which also helps transitive forward equates); perhaps even more ought to, but many don't look to consider the possibility of register equates in the first place. This was uncovered by code reported in PR gas/30274 (duplicating PR gas/30272), except that there .eqv was used when really .equ was meant. Therefore that bug report is addressed here only in so far as gas wouldn't crash anymore; the code there still won't assemble successfully, just that now the issues there are properly diagnosed. --- Clearly equates of constants have the same issue of not being viewed as equates by symbol_equated_p(). Changing that isn't the purpose of the change here, and I'm afraid is also yet more likely to trigger issues elsewhere. If the setting to O_register was to occur in S_SET_VALUE() instead of in symbol_init() (which overall would seem more consistent), all callers would need to make sure that they call S_SET_SEGMENT() (if at all) ahead of S_SET_VALUE(), not afterwards. --- v2: Slightly simplify ppc logic, convert it to a function, and re-use it elsewhere. --- a/gas/cgen.c +++ b/gas/cgen.c @@ -385,6 +385,8 @@ gas_cgen_parse_operand (CGEN_CPU_DESC cd /* FIXME: Need to check `want'. */ + resolve_register (&exp); + switch (exp.X_op) { case O_illegal: --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -987,6 +987,7 @@ tokenize_arguments (char *str, /* First try for parenthesized register ... */ expression (tok); + resolve_register (tok); if (*input_line_pointer == ')' && tok->X_op == O_register) { tok->X_op = (saw_comma ? O_cpregister : O_pregister); @@ -1010,6 +1011,8 @@ tokenize_arguments (char *str, if (tok->X_op == O_illegal || tok->X_op == O_absent) goto err; + resolve_register (tok); + saw_comma = 0; saw_arg = 1; ++tok; --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -1312,6 +1312,8 @@ tokenize_arguments (char *str, relocation type as well. */ if (*input_line_pointer == '@') parse_reloc_symbol (tok); + else + resolve_register (tok); debug_exp (tok); --- a/gas/config/tc-dlx.c +++ b/gas/config/tc-dlx.c @@ -632,6 +632,7 @@ parse_operand (char *s, expressionS *ope /* Normal operand parsing. */ input_line_pointer = s; (void) expression (operandp); + resolve_register (operandp); } new_pos = input_line_pointer; --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -13830,11 +13830,11 @@ parse_register (const char *reg_string, input_line_pointer = buf; get_symbol_name (&name); symbolP = symbol_find (name); - while (symbolP && S_GET_SEGMENT (symbolP) != reg_section) + while (symbolP && symbol_equated_p (symbolP)) { const expressionS *e = symbol_get_value_expression(symbolP); - if (e->X_op != O_symbol || e->X_add_number) + if (e->X_add_number) break; symbolP = e->X_add_symbol; } --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -5987,6 +5987,7 @@ parse_operand (expressionS *e, int more) e->X_op = O_absent; SKIP_WHITESPACE (); expression (e); + resolve_register (e); sep = *input_line_pointer; if (more && (sep == ',' || sep == more)) ++input_line_pointer; --- a/gas/config/tc-mmix.c +++ b/gas/config/tc-mmix.c @@ -624,6 +624,8 @@ get_putget_operands (struct mmix_opcode regno = get_spec_regno (sregp); *sregend = c; + resolve_register (expp_reg); + /* Let the caller issue errors; we've made sure the operands are invalid. */ if (expp_reg->X_op != O_illegal --- a/gas/config/tc-mn10200.c +++ b/gas/config/tc-mn10200.c @@ -1025,6 +1025,7 @@ md_assemble (char *str) else { expression (&ex); + resolve_register (&ex); } switch (ex.X_op) --- a/gas/config/tc-mn10300.c +++ b/gas/config/tc-mn10300.c @@ -1669,6 +1669,7 @@ md_assemble (char *str) else { expression (&ex); + resolve_register (&ex); } switch (ex.X_op) --- a/gas/config/tc-msp430.c +++ b/gas/config/tc-msp430.c @@ -415,6 +415,8 @@ parse_exp (char * s, expressionS * op) expression (op); if (op->X_op == O_absent) as_bad (_("missing operand")); + else + resolve_register (op); /* Our caller is likely to check that the entire expression was parsed. If we have found a hex constant with an 'h' suffix, ilp will be left --- a/gas/config/tc-nds32.c +++ b/gas/config/tc-nds32.c @@ -2519,6 +2519,7 @@ parse_expression (char *str, expressionS tmp = input_line_pointer; /* Save line pointer. */ input_line_pointer = str; expression (exp); + resolve_register (exp); s = input_line_pointer; input_line_pointer = tmp; /* Restore line pointer. */ @@ -4571,6 +4572,7 @@ nds32_asm_parse_operand (struct nds32_as hold = input_line_pointer; input_line_pointer = *pstr; expression (pexp); + resolve_register (pexp); *pstr = input_line_pointer; input_line_pointer = hold; --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -3475,6 +3475,8 @@ md_assemble (char *str) str = input_line_pointer; input_line_pointer = hold; + resolve_register (&ex); + if (ex.X_op == O_illegal) as_bad (_("illegal operand")); else if (ex.X_op == O_absent) --- a/gas/config/tc-s390.c +++ b/gas/config/tc-s390.c @@ -1308,7 +1308,10 @@ md_gather_operands (char *str, /* Parse the operand. */ if (! register_name (&ex)) - expression (&ex); + { + expression (&ex); + resolve_register (&ex); + } str = input_line_pointer; input_line_pointer = hold; --- a/gas/config/tc-spu.c +++ b/gas/config/tc-spu.c @@ -573,6 +573,7 @@ get_reg (const char *param, struct spu_i expression (&ex); param = input_line_pointer; input_line_pointer = save_ptr; + resolve_register (&ex); if (ex.X_op == O_register || ex.X_op == O_constant) { insn->opcode |= ex.X_add_number << arg_encode[arg].pos; --- a/gas/config/tc-tic4x.c +++ b/gas/config/tc-tic4x.c @@ -649,6 +649,7 @@ tic4x_expression (char *str, expressionS t = input_line_pointer; /* Save line pointer. */ input_line_pointer = str; expression (exp); + resolve_register (exp); s = input_line_pointer; input_line_pointer = t; /* Restore line pointer. */ return s; /* Return pointer to where parsing stopped. */ --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -2909,6 +2909,7 @@ md_assemble (char *str) else { expression (&ex); + resolve_register (&ex); if ((operand->flags & V850_NOT_IMM0) && ex.X_op == O_constant --- a/gas/config/tc-xgate.c +++ b/gas/config/tc-xgate.c @@ -893,6 +893,8 @@ xgate_parse_exp (char *s, expressionS * expression (op); if (op->X_op == O_absent) as_bad (_("missing operand")); + else + resolve_register (op); return input_line_pointer; } --- a/gas/config/tc-z80.c +++ b/gas/config/tc-z80.c @@ -926,6 +926,7 @@ parse_exp_not_indexed (const char *s, ex } input_line_pointer = (char*) s ; expression (op); + resolve_register (op); switch (op->X_op) { case O_absent: --- a/gas/expr.c +++ b/gas/expr.c @@ -2382,6 +2382,31 @@ resolve_expression (expressionS *express return 1; } + +/* "Look through" register equates. */ +void resolve_register (expressionS *expP) +{ + symbolS *sym; + offsetT acc = 0; + const expressionS *e = expP; + + if (expP->X_op != O_symbol) + return; + + do + { + sym = e->X_add_symbol; + acc += e->X_add_number; + e = symbol_get_value_expression (sym); + } + while (symbol_equated_p (sym)); + + if (e->X_op == O_register) + { + *expP = *e; + expP->X_add_number += acc; + } +} /* This lives here because it belongs equally in expr.c & read.c. expr.c is just a branch office read.c anyway, and putting it --- a/gas/expr.h +++ b/gas/expr.h @@ -190,5 +190,6 @@ extern symbolS *expr_build_dot (void); extern uint32_t generic_bignum_to_int32 (void); extern uint64_t generic_bignum_to_int64 (void); extern int resolve_expression (expressionS *); +extern void resolve_register (expressionS *); extern bool literal_prefix_dollar_hex; --- a/gas/read.c +++ b/gas/read.c @@ -4000,6 +4000,10 @@ pseudo_set (symbolS *symbolP) return; } #endif + /* Make sure symbol_equated_p() recognizes the symbol as an equate. */ + exp.X_add_symbol = make_expr_symbol (&exp); + exp.X_add_number = 0; + exp.X_op = O_symbol; symbol_set_value_expression (symbolP, &exp); S_SET_SEGMENT (symbolP, reg_section); set_zero_frag (symbolP); --- a/gas/symbols.c +++ b/gas/symbols.c @@ -387,6 +387,8 @@ symbol_init (symbolS *symbolP, const cha } S_SET_VALUE (symbolP, valu); + if (sec == reg_section) + symbolP->x->value.X_op = O_register; symbol_clear_list_pointers (symbolP); @@ -2463,7 +2465,7 @@ S_CAN_BE_REDEFINED (const symbolS *s) return (((struct local_symbol *) s)->frag == &predefined_address_frag); /* Permit register names to be redefined. */ - return s->bsym->section == reg_section; + return s->x->value.X_op == O_register; } int