Re: [PATCH] sh: Implement _THIS_IP_ using inline asm

Rich Felker <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.ports.sh.devel
Message-ID <[email protected]>
On Thu, May 21, 2026 at 02:31:58PM +0200, Marco Elver wrote:
> Both GCC [1] and Clang [2] consider the generic version of _THIS_IP_ to
> be broken:
> 
>         #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })
> 
> In particular, the address of a label is only expected to be used with a
> computed goto.
> 
> While the generic version more or less works today, it is known to be
> brittle and may break with current and future optimizations. For
> example, Clang -O2 always returns 1 when this function is inlined:
> 
>         static inline unsigned long get_ip(void)
>         { return ({ __label__ __here; __here: (unsigned long)&&__here; }); }
> 
> Fix it by overriding _THIS_IP_ in <asm/linkage.h> (which is included by
> <linux/instruction_pointer.h>) using an architecture-specific inline asm
> version. Additionally, avoiding taking the address of a label prevents
> compilers from emitting spurious indirect branch targets (e.g. ENDBR or
> BTI) under control-flow integrity schemes.
> 
> Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120071 [1]
> Link: https://github.com/llvm/llvm-project/issues/138272 [2]
> Signed-off-by: Marco Elver <[email protected]>
> ---
>  arch/sh/include/asm/linkage.h | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/arch/sh/include/asm/linkage.h b/arch/sh/include/asm/linkage.h
> index 7c2fa27a43f8..af56b38b6001 100644
> --- a/arch/sh/include/asm/linkage.h
> +++ b/arch/sh/include/asm/linkage.h
> @@ -5,4 +5,6 @@
>  #define __ALIGN .balign 4
>  #define __ALIGN_STR ".balign 4"
>  
> +#define _THIS_IP_ ({ unsigned long __ip; asm volatile("mova 1f, %0\n1:" : "=z" (__ip)); __ip; })
> +
>  #endif
> -- 
> 2.54.0.746.g67dd491aae-goog

Does this need an alignment directive before the label? mova can only
emit 32-bit-aligned addresses, and I think the assembler will complain
(since you'll be getting the wrong result) if the address isn't
aligned.

Rich
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.