NEVERMIND! (was: Re: A question on volatile accesses)

Ron Guilmette rfg at lupine.ncd.com
Sun Nov 4 19:21:35 AEST 1990


In article <1990Nov3.231856.20556 at zoo.toronto.edu> henry at zoo.toronto.edu (Henry Spencer) writes:
>
>>This seems entirely counter-intutive to me, and yet one supposedly ANSI
>>C compiler provides such a treatment.
>
>Your use of the word "supposedly" is appropriate.  The way you asked this
>implies that this doesn't happen if the thing pointed at is not `volatile'.
>My diagnosis would be as mentioned above:  somebody kludged `volatile' into
>a compiler that originally didn't support it, and broke the prefix `++'
>operator in the process.

OK.  Let me apologize to everyone for having wasted net bandwidth on
this question.

Here is what was *actually* happening.

	char *extern_charptr_func ();
	int extern_int_func ();

	void example ()
	{
		int i = extern_int_func ();
		volatile char *cp = extern_charptr_func ();

		do {
			i--;
			(++cp)[0];
		} while (i);
	}

Now in this particular compiler (which happens to be GCC, as I believe
Henry guessed) I asked the author (Richard Stallman) some time back to
add a nice little feature for me, which he was nice enough to do.

The feature that I asked for was to have the values of volatile
expressions evaluated, even if the result was not used, so that:

	volatile char *cp;

		...
		*cp;
		...

would in fact cause a (byte) fetch from the address pointed to by `cp'.

Now apparently, the ANSI standard doesn't explicitly require such treatment,
but it certainly doesn't rule it out either.  I found this feature quite
useful in certain circumstances (e.g. driving I/O chips) in order to be
able to code (entirely in C) a simple load operation (on say a device
register which recognizes the load itself as a signal to do something).

Unfortunately, due to a minor oversight while implementing this enviable
feature, Richard caused such expressions to have code for their side
effects generated *twice*.

Thus, for my complete example above, the pointer `cp' was being incremented
*twice* (once before the indirection and once after) for each trip thru
the loop.  The latter increment was (later) getting stuffed into a
delay slot.

Serves me right for asking for a bizzare feature.

Anyway, I just tracked down the bug and wrote a three line fix.  Now,
only one increment is generated (prior to the indirection) and correct
ordering of operations is maintained nicely.  (Try that on your binary-
only compilers!)

So anyway, NEVERMIND!



More information about the Comp.std.c mailing list