From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 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-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 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+eJI5lUvdaR74tzZ1Jm9ovq5a293FDFm30d9L9BDivk=; b=T7x4kTGqW0ZUIWSAQ1SRaf575XkKlzmjnGx4fy6LRBScUODM7NfztdsbSsc052Bnc/FpNFpIWltpG1kOKVyGUOSs56DiYy4WgOcKChvdEG1mtA2JPvntZEyJiy3rxTqA7tDTCUcg9h345/GX3uxor8SXR+n+2OnEhh3MGoFpOuWSdu25Xv3QojEYPYhXLtEjTSg6Q1KNVja32/IJKi/cjd5Q0Y4VsrJJvKjerG/6gqftpmbUAn2Cf08TBOL5e6Tm6hWg8sL8lWxz54M8MMqRzNQG1mSlSQ+WwIyssCQmmHyAVKs6g+xjwtAyq3mVliOfH6LHSJuMXNxa8yN4YyuaDw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=suse.com; 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 From: Jan Beulich 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 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit 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?B?WVRpaVk5SEF2SFBxc2I1cE1nYlBMdVpCZGx1NUxkaEhINDgxeFN4VmQwWlk3?= =?utf-8?B?Q0pNUzVVNTVNNFRMbC9DM1dDUW1sdm5tcEdNOWJCYXdoU1g4M3EwMUhyN2N5?= =?utf-8?B?TmlBVUFveGJJWGlsQk5ad2FWWVFnZGZ6R0tJY1phN0VBMkFKUURubS9HMFMz?= =?utf-8?B?YlJNQ2RlNW1Jc0xPeS9nQk5RUGtuSFRQMlpRejgyTEZDaUgrR3NFODBKZEZM?= =?utf-8?B?Z294Zm1DUDNJd0MzRUNCOVdhaGZOUFNEK1ljWkZFMUFjNkVBWEFHeHIyMHhs?= =?utf-8?B?ejVlK1R2ckFhWGQrdE5CaVBHWDdKUk1rNnpobDFjS2ltdE9BZmV6MHAyMzdI?= =?utf-8?B?cGRoNGpSQ1dmbEZlVzlyWjViSVNwZ1lVRlBmcUEzcVZERGxsUEQrc2E4SDdK?= =?utf-8?B?QzZPR08yeWszdEl4S2Jqa1QrOGc0QkhoYlFXVjhoRTNHYXhiUlRnaEJvaTZJ?= =?utf-8?B?cGFWL1RDUzNHNEV0NjBQR3NpL2YyRUFQMG51aUI2YkE3RTJkSzdvdUdWRCs5?= =?utf-8?B?SFRSWDIraTZHQWg2Y2NQK050M3Z6UFJzNGtVQXViUmpQYTJpVkhFWSszSGxn?= =?utf-8?B?ejN5RGU3QzhJbVk1WHRLMjdKVXZyV3Nwa0ovOWVpYWlCeHNmdjZKMzVVQkI2?= =?utf-8?B?ZDRsTGNoZ2dpUjhpZ28zQ0pwUFZCMDZ4WkU5RDNrN3BZMW12L25wLzkxTUZw?= =?utf-8?B?Nnd2YmY3THk2eXBGQ1FlbUFNTTdoSG51OG1udDZsTmpwWFQ0VU5DRTNNV0V1?= =?utf-8?B?OElKZ3dzQ043RVd2MSs1czlTUERrMCtHNHNZRXRpakJ4akE1Y0NwUTBhQkdz?= =?utf-8?B?ZGdSaVJzRm83TlVqeE9oZmpBeEhNY3lULzM0RTBHekU5QTA3UmNFbk4zZGY5?= =?utf-8?B?RCtJWUFjR3k3eWdYR2s1UDNMZzdENW9qbTFNRnZiemFzcytYVytVNnNhQUVY?= =?utf-8?B?ZzNuMHVnQ0ZDRER1Njd0NjFvNXZCdnRnVXBhWTVBb0IvL2FwVFg2ME1lQTdE?= =?utf-8?B?NWdldDJEYk9uNGVyU3NxdUJBZ2p1MjZFZzFWU1FIbVNmQVVReFJEc1N6MkFt?= =?utf-8?B?WmFISThRcmVGajV4WkIxa1dLQXh0WlZlY2k0dnRNY1R1Z2NWaTkvV0ZIQ1Qw?= =?utf-8?B?cldhd3p1aThQc1F2czlhdVZSZjNuZ0JRLzZsVTVSU2RtTUpyUE0wQkFhSzQv?= =?utf-8?B?dGhXZ3h5RWFjMHdBT1d0TkFPdlpDUVBLRE1EQlpTVHFaR1BXaVdtcXNwS1dk?= =?utf-8?B?UW11T0hlRklndUdMZi96VG9PVlhwby9RcmgxS1kyclNUbHdEclZuVGQ0TzVs?= =?utf-8?B?bFRzS01WWVpZRzZOakp5MitoNXVUV0txdEdQU2J3OE5ZRkJhYkNuRlF0Rnhj?= =?utf-8?B?MW5RcE10VGFxYTNuNHM5ZS9rM2lINTc2TExmS3V5OFZYQTdyRDZCUWZmSWE0?= =?utf-8?B?eXM5L1ZhYzc0V1p6cXNSeDVOTGR2blIzcWZYVFdURWNCU01QKzFFUEpvUGZj?= =?utf-8?B?MDFzVG9vT2pVTHlubXF6VUNYc05mWUFxZExLb3BzR2hlWmhPOWYrWHJLV1F4?= =?utf-8?B?T1FQTWFrU3d5SGdINldtME8yc0I2MVNtTVd3OWFDd01UQnZqMTV1bHRNV1p0?= =?utf-8?B?c0RhY282OFRHcWVLdW5uNnBOOUNwVTN6K2hPcG5mSzFlMjFsSy80dkMvSUgy?= =?utf-8?B?UDAwK3lydmVkWlpKRnR4K2x2ZHp5QjBFV21VNTJpL1VwVTdCd2JVaDQ0NDZO?= =?utf-8?B?aGk5R2JnMzJTQThaQ0p1VE9xWE5WUWlTTHdnVXhhK3lCamNSTWdjNExQY0d1?= =?utf-8?B?dmttQjQ0SkFUL2dlU0dleVBybGNwMk5kWTZ0U2cwK2VEQ0ZKZlZYeW9vUTla?= =?utf-8?B?WWZ2ZDJJZXg5RWZOeDNRQk5rSXFZbk5XcFgrVHlCV2JWOHFrWlNDbEhBMW9p?= =?utf-8?B?TTFWTExITXZjNzNBZEl6bnptZlc3WERLNkltZ2pEQmoyQlAydE91UjBmNmJQ?= =?utf-8?B?d0N3aTJjM29CdjVvemJWeWJzL05hbFZabXdkVUFhWVhRT2pmUWMrSmRPNVRp?= =?utf-8?B?TGZFYWgvdHh1VzZmMUtvcjNoWEh1SGdTSitiYVFrc0tTaHVGUldMTTRuWWhy?= =?utf-8?Q?ojPZExk0LdCuGcc7dG5aLDl1Z?= 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 List-Id: 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