summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-07-22 08:49:22 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-07-22 08:49:22 -0700
commit3730793d457fed79a6d49bae72996d458c8e4f2d (patch)
tree69fbde0ab59f4ee04cc4169e7f9f63ec55682ea8 /drivers/video
parentaea1f7964ae6cba5eb419a958956deb9016b3341 (diff)
downloadlinux-3.10-3730793d457fed79a6d49bae72996d458c8e4f2d.tar.gz
linux-3.10-3730793d457fed79a6d49bae72996d458c8e4f2d.tar.bz2
linux-3.10-3730793d457fed79a6d49bae72996d458c8e4f2d.zip
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: Krzysztof Oledzki <olel@ans.pl> Found-by: Troy Moure <twmoure@szypr.net> Gcc-bug-acked-by: Ian Lance Taylor <iant@google.com> Cc: stable@kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/fbmon.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
index 5c1a2c01778..9ae9cd32bd0 100644
--- a/drivers/video/fbmon.c
+++ b/drivers/video/fbmon.c
@@ -256,8 +256,8 @@ static void fix_edid(unsigned char *edid, int fix)
static int edid_checksum(unsigned char *edid)
{
- unsigned char i, csum = 0, all_null = 0;
- int err = 0, fix = check_edid(edid);
+ unsigned char csum = 0, all_null = 0;
+ int i, err = 0, fix = check_edid(edid);
if (fix)
fix_edid(edid, fix);