A few questions:

1) I'm not clear precisely what problem this patch fixes.  It's true
that some people have incorrectly assumed that basic asm clobbers memory
and this change would fix their code.  But some people also incorrectly
assume it clobbers registers.  I assume that's why Jeff Law proposed
making basic asm "an opaque blob that read/write/clobber any register or
memory location."  Do we have enough problem reports from users to know
which is the real solution here?

Whenever I do something for gcc I do it actually for myself, in my own
best interest.  And this is no exception.

Seems fair.  You are the one putting the time in to change it.

But do you have actual code that is affected by this? You can't really be planning to wait until v7 is released to have your projects work correctly?

The way I see it, is this: in simple cases a basic asm behaves as if
it would clobber memory, because of the way Jeff implemented the
asm handling in sched-deps.c some 20 years ago.

Look for ASM_INPUT where we have this comment:
"Traditional and volatile asm instructions must be considered to use
   and clobber all hard registers, all pseudo-registers and all of
   memory."

The assumption that it is OK to clobber memory in a basic asm will only
break if the asm statement is inlined in a loop, and that may happen
unexpectedly, when gcc rolls out new optimizations.
That's why I consider this to be security relevant.

I'm not sure I follow. Do you fear that gcc could mistakenly move the asm into a nearby loop during optimization (resulting in who-knows-what results)? Or is there some way that any basic asm in a loop could have some kind of a problem?

But OTOH you see immediately that all general registers are in use
by gcc, unless you declare a variable like
register int eax __asm__("rax");
then it is perfectly OK to use rax in a basic asm of course.

According to the docs, that is only supported for global registers. The docs for local register variables explicitly say that it can't be used as input/outputs for basic asm.

And if we want to have implicitly clobbered registers, like the
diab compiler handles the basic asm, then this patch will
make it possible to add a target hook that clobbers additional
registers for basic asm.

I think we should try to avoid changing the semantics in v7 for memory and then changing them again in v8 for registers.

IOW, if I see some basic asm in a project (or on stack overflow/blog as a code fragment), should I assume it was intended for v6 semantics? v7? v8? People often copy this stuff without understanding what it does. The more often the semantics change, the harder it is to use correctly and maintain.

2) The -Wbasic-asm warning patch wasn't approved for v6.  If we are
going to change this behavior now, is it time?

Yes. We have stage1 for gcc-7 development, I can't think of a better
time for it.
I would even say, the -Wbasic-asm warning patch makes more sense now,
because we could warn, that the basich asm clobbers memory, which it
did not previously.

After your patch has been checked in, I'll re-submit this.

4) There are more basic asm docs that need to change: "It also does not
know about side effects of the assembler code, such as modifications to
memory or registers. Unlike some compilers, GCC assumes that no changes
to either memory or registers occur. This assumption may change in a
future release."

Yes, I should change that sentence too.

Maybe this way:

"Unlike some compilers, GCC assumes that no changes to registers
occur.  This assumption may change in a future release."

Is it worth describing the fact that the semantics have changed here? Something like "Before v7, gcc assumed no changes were made to memory." I guess users can "figure it out" by reading the v6 docs and comparing it to v7. But if the semantic change has introduced a problem that someone is trying to debug, this could help them track it down.

Also, I'm kind of hoping that v7 is the 'future release.' If we are going to change the clobbers, I'd hope that we'd do it all at one time, rather than spreading it out across several releases.

If no one is prepared to step up and implement (or at least defend) the idea of clobbering registers, I'd like to see the "This assumption may change in a future release" part removed. Since (theoretically) anything can change at any time, the only reason this text made sense was because a change was imminent. If that's no longer true, it's time for it to go.

dw

Reply via email to