On Thu, Jul 26, 2018 at 12:29 PM Alexander Monakov <amona...@ispras.ru> wrote:
>
> Hi,
>
> when using explicit register variables ('register int foo asm("%ebp");'),
> using const/volatile type qualifiers on the declaration does not result in
> the logically expected effect.
>
> The main issue is that gcc-8 got "better" at propagating initializers of
> 'register const' variables to their uses in asm operands, losing the
> association with the register and thus causing the operand to
> unexpectedly appear in some other register. This caused build issues for
> the Linux kernel and was reported a couple of times in the GCC Bugzilla.
>
> This patch adds a few lines to the documentation to say that qualifiers
> won't work as expected. OK for trunk?

Looks ok to me.  Maybe we should change FEs to ignore those
qualifiers on explicit register variables and emit a warning like

warning: const/volatile qualifier ignored on X

?

> Thanks.
> Alexander
>
>         PR target/86673
>         doc/extend.texi (Global Register Variables): Discourage use of type
>         qualifiers.
>         (Local Register Variables): Likewise.
>
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 7b471ec40f7..9a41f2753e9 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -9591,6 +9591,11 @@ a global variable the declaration appears outside a 
> function. The
>  @code{static}. The register name must be a valid register name for the
>  target platform.
>
> +Do not use type qualifiers such as @code{const} and @code{volatile}, as
> +the result may be contrary to your expectations. In  particular, using
> +the @code{volatile} qualifier does not fully prevent the compiler from
> +optimizing accesses to the register.
> +
>  Registers are a scarce resource on most systems and allowing the
>  compiler to manage their usage usually results in the best code. However,
>  under special circumstances it can make sense to reserve some globally.
> @@ -9698,6 +9703,12 @@ but for a local variable the declaration appears 
> within a function.  The
>  @code{static}.  The register name must be a valid register name for the
>  target platform.
>
> +Do not use type qualifiers such as @code{const} and @code{volatile}, as
> +the result may be contrary to your expectations. In particular, when
> +the @code{const} qualifier is used, the compiler may substitute the
> +variable with its initializer in @code{asm} statements, which may cause
> +the corresponding operand to appear in a different register.
> +
>  As with global register variables, it is recommended that you choose
>  a register that is normally saved and restored by function calls on your
>  machine, so that calls to library routines will not clobber it.

Reply via email to