From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from angie.orcam.me.uk (angie.orcam.me.uk [IPv6:2001:4190:8020::34]) by sourceware.org (Postfix) with ESMTP id 3D4EA3858D34 for ; Wed, 21 Feb 2024 14:47:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3D4EA3858D34 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=orcam.me.uk Authentication-Results: sourceware.org; spf=none smtp.mailfrom=orcam.me.uk ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3D4EA3858D34 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2001:4190:8020::34 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708526844; cv=none; b=mBRTr9iWObokmy9A4iW+smPNAvvF9FX7l5uzviB0u7/n9CZUuCeQRMsonOPTcsfZB9JP8OsCuZip1JckQJUHOpKfBHzZXfn8ZTUHlLU42yZts2f5dlE3BTJIOi05y8bGYTmTmLPGlyolYOX7OugFPOp/hpLH1fDCnxdiiQcpl7k= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1708526844; c=relaxed/simple; bh=bsopcPkT7mZRcqUx+AFJyDZbLKlFhiasZxD7QkatdD8=; h=Date:From:To:Subject:Message-ID:MIME-Version; b=XUHArmoJuOQhGxhGEdjM7NQ/hAqAClUmk7siEPYEIekEBDP7/MKV8bC/ujS2mUOJEjgeyDXaBwngp8Pf05U3krukfRld+SJmB9wwJ1QkoF0Pg1xMCmqIYGC7KlCNs7XlW1P+JMcOzrIdXnang9Z9Av8ZzRQ3xmkRCnRLLMctXvg= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by angie.orcam.me.uk (Postfix, from userid 500) id A3C9492009C; Wed, 21 Feb 2024 15:47:21 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by angie.orcam.me.uk (Postfix) with ESMTP id 9CFA092009B; Wed, 21 Feb 2024 14:47:21 +0000 (GMT) Date: Wed, 21 Feb 2024 14:47:21 +0000 (GMT) From: "Maciej W. Rozycki" To: YunQiang Su cc: Nick Clifton , binutils@sourceware.org, xry111@xry111.site Subject: Re: [PATCH] MIPS/Gas: Support .L/$ as the mark of local symbol In-Reply-To: Message-ID: References: <20240205101427.2862503-1-syq@gcc.gnu.org> User-Agent: Alpine 2.21 (DEB 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-3488.5 required=5.0 tests=BAYES_00,KAM_DMARC_STATUS,KAM_INFOUSMEBIZ,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_NONE,SPF_NONE,TXREP,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Wed, 21 Feb 2024, YunQiang Su wrote: > > > In as.texi, there are lines: > > > A local symbol is any symbol beginning with certain local > > > label prefixes. By default, the local label prefix is > > > @samp{.L} for ELF systems or @samp{L} for traditional a.out > > > systems, but each target may have its own set of local > > > label prefixes. > > > > > > Let's support it for MIPS: > > > 1) For OldABI, GCC uses "$" to mark local symbols, and > > > for NewABI, ".L" is used. So let's support both for > > > OldABI, and ".L" only for NewABI. > > > 2) Emit an fatal error, if a local symbol is used, while > > > not defined, just like LLVM does. > > > > I gather you want to avoid a case of an undefined reference making it to > > output for a symbol whose name suggests its a local label, right? > > > > But that seems like material for the generic part of GAS rather than the > > MIPS backend only (and then specifically SVR4 PIC only and not non-PIC or > > VxWorks, according to your code as submitted), so that all targets behave > > consistently, and I can't see e.g. i386 GAS doing it. > > > > So a question raises: what problem are you trying to solve? Can you give > > us a piece of code that you think is handled incorrectly by GAS, and why? > > > > main: > la $4,$hello > > $ mipsel-linux-gnu-as -KPIC tt.s && objdump -dr a.out > > 00000000
: > 0: 8f840000 lw a0,0(gp) > 0: R_MIPS_GOT16 $hello > > In this case, GAS treat $hello as an external symbol, so only a single > R_MIPS_GOT16 is used. So that's indeed a waste of a GOT entry if `$hello' does end up local in the link, but I fail to see it being a problem itself. It's no different from where you have forced an ordinary symbol local via a linker script really: it will have retained its individual GOT entry even though it cannot be preempted anymore and could well use a shared entry with an offset. If you're concerned as to the piece of GAS documentation you quoted, then refer to the paragraph that follows: "Local symbols are defined and used within the assembler, but they are normally not saved in object files. Thus, they are not visible when debugging. You may use the `-L' option (see Section 2.7 [Include Local Symbols], page 26) to retain the local symbols in the object files." -- which clarifies that this is specifically about symbols automatically produced internally by GAS for its own use, e.g. referring to `.' will emit such a symbol. In addition to the prefix described in the previous paragraph they use a non-printable character immediately following so as to make sure they don't clash with a symbol provided by assembly code supplied, cf. LOCAL_LABEL_CHAR. Then symbols supplied by assembly code are interpreted according to their attributes and an undefined symbol is necessarily global. If the supplier of code produced non-compliant code, then the GIGO principle applies, GAS just does what it's been told to, just as will say a C compiler when you use a symbol from a reserved namespace in ordinary user code. Tools must not stand in the way. If you think a warning would be useful here, then I guess that might be acceptable, but as I say that would have to go into a generic part of GAS. Maciej