bypass indirection through pointer objects to access stdin/out/err
authorRich Felker <dalias@aerifal.cx>
Thu, 18 Oct 2018 03:57:28 +0000 (23:57 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 18 Oct 2018 04:32:20 +0000 (00:32 -0400)
commitd8f2efa708a027132d443f45a8c98a0c7c1b2d77
tree887db37b661d946d28aa5f542e5401318bd75ff1
parentd664061adb4d7f6647ab2059bc351daa394bf5da
bypass indirection through pointer objects to access stdin/out/err

by ABI, the public stdin/out/err macros use extern pointer objects,
and this is necessary to avoid copy relocations that would be
expensive and make the size of the FILE structure part of the ABI.
however, internally it makes sense to access the underlying FILE
objects directly. this avoids both an indirection through the GOT to
find the address of the stdin/out/err pointer objects (which can't be
computed PC-relative because they may have been moved to the main
program by copy relocations) and an indirection through the resulting
pointer object.

in most places this is just a minor optimization, but in the case of
getchar and putchar (and the unlocked versions thereof), ipa constant
propagation makes all accesses to members of stdin/out PC-relative or
GOT-relative, possibly reducing register pressure as well.
src/include/stdio.h [new file with mode: 0644]
src/stdio/stderr.c
src/stdio/stdin.c
src/stdio/stdout.c