Short code to determine compiler's
Bennett Todd
bet at orion.mc.duke.edu
Wed Jul 19 06:45:35 AEST 1989
In article <579 at targon.UUCP>, andre at targon (andre) writes:
>/* test register usage of compiler */
>
>main()
>{
> register n1, n2, n3, n4, n5, n6, n7, n8; /* etc. */
> int *a;
>
> a = &n8;
> a = &n7;
>
> /* repeat n6 - n2 */
> a = &n1;
>}
>
>/* end */
Compilers are completely within their rights to give error messages for
all these "®" expressions, whether or not they put any of them in
registers. In fact, the "register" modifier is routinely ignored by both
the stupidest and the smartest compilers; *very* *very* smart compilers
could if they wished note ONLY that such variables may not have their
address taken (a vaguely similar optimization hint to the unlamented
"noalias"). In fact, as far as I know, the prohibition on taking the
address of a variable flagged as "register" is the only language defined
effect it has.
Now, to check a specific, real compiler. Using gcc 1.34, I compiled the
following:
int main()
{
register n1, n2, n3, n4, n5, n6, n7, n8; /* etc. */
register n9, n10,n11,n12,n13,n14,n15,n16,n17;
int *a;
a = &n17;
a = &n16;
a = &n15;
a = &n14;
a = &n13;
a = &n12;
a = &n11;
a = &n10;
a = &n9;
a = &n8;
a = &n7;
a = &n6;
a = &n5;
a = &n4;
a = &n3;
a = &n2;
a = &n1;
return(0);
}
Calling that file "junk.c" I then ran the command
make junk.o >& output
which, because of how I define CC and CFLAGS, produced this in "output"
(manually edited to break the gcc command line in two):
gcc -O -g -Wall -Wwrite-strings -msoft-float -fstrength-reduce \
-finline-functions -I/usr/local/include -c junk.c -o junk.o
junk.c: In function main:
junk.c:6: address of global register variable requested
junk.c:7: address of global register variable requested
junk.c:8: address of global register variable requested
junk.c:9: address of global register variable requested
junk.c:10: address of global register variable requested
junk.c:11: address of global register variable requested
junk.c:12: address of global register variable requested
junk.c:13: address of global register variable requested
junk.c:14: address of global register variable requested
junk.c:15: address of global register variable requested
junk.c:16: address of global register variable requested
junk.c:17: address of global register variable requested
junk.c:18: address of global register variable requested
junk.c:19: address of global register variable requested
junk.c:20: address of global register variable requested
junk.c:21: address of global register variable requested
junk.c:22: address of global register variable requested
make: *** Error 1
Look, ma, 17 registers allocated for integers on a 68020!
I would conclude that a teacher giving his students the assignment of
determining how many register variables are actively supported by their
compiler had better be teaching compiler internals, and not the C
programming language.
-Bennett
bet at orion.mc.duke.edu
More information about the Comp.lang.c
mailing list