Commit 3730793d authored by Linus Torvalds's avatar Linus Torvalds

fbmon: work around compiler bug in gcc-2.4.2

There's some odd bug in gcc-4.2 where it miscompiles a simple loop whent
he loop counter is of type 'unsigned char' and it should count to 128.

The compiler will incorrectly decide that a trivial loop like this:

	unsigned char i, ...

	for (i = 0; i < 128; i++) {
		..

is endless, and will compile it to a single instruction that just
branches to itself.

This was triggered by the addition of '-fno-strict-overflow', and we
could play games with compiler versions and go back to '-fwrapv'
instead, but the trivial way to avoid it is to just make the loop
induction variable be an 'int' instead.

Thanks to Krzysztof Oledzki for reporting and testing and to Troy Moure
for digging through assembler differences and finding it.
Reported-and-tested-by: default avatarKrzysztof Oledzki <olel@ans.pl>
Found-by: default avatarTroy Moure <twmoure@szypr.net>
Gcc-bug-acked-by: default avatarIan Lance Taylor <iant@google.com>
Cc: stable@kernel.org
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent aea1f796
...@@ -256,8 +256,8 @@ static void fix_edid(unsigned char *edid, int fix) ...@@ -256,8 +256,8 @@ static void fix_edid(unsigned char *edid, int fix)
static int edid_checksum(unsigned char *edid) static int edid_checksum(unsigned char *edid)
{ {
unsigned char i, csum = 0, all_null = 0; unsigned char csum = 0, all_null = 0;
int err = 0, fix = check_edid(edid); int i, err = 0, fix = check_edid(edid);
if (fix) if (fix)
fix_edid(edid, fix); fix_edid(edid, fix);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment