it's a fundamental disagreement between 3.2 and 2.96. I think 3.2 is
right, 2.96 is wrong. But it bit us, because we conformed to 2.96 usage.
Consider the following:
struct thing { int z; };
struct thingy { int a; struct thing t[1]; };
This is like our irq_table struct now. We wish to have the array t be
variable-sized, and the way you get that in gcc 2 is to just initialize it
as needed:
struct thingy x = {1, {{2}, {3}}};
t will be forced to grow as needed.
What a kludge! We declare it as t[1], but then grow it by making the
initializer too big!
What does gcc 3.2 do with this? Well, that's a good question. I've seen a
few different results from gcc:
- complain, and product a truncated output file with no entries
- not even produce an output file.
- in no case does what it does match what gcc 2 did
gcc 3.2 does the sane thing in my view. If you make the array [1], that's
all you should get. Growing it with too big an initializer is ugly!
So how to declare this? Like this:
struct thing { int z; };
struct thingy { int a; struct thing t[]; };
^^^
struct thingy x = {1, {{2}, {3}}};
This works fine. I am going to modify the irq_table struct, since gcc296
complains about the [] but still produces the right code.
My mistake was zeroing in on the mptable, not the irq_table, because I
forgot that our phase 1 image in IDE-flash is a non-SMP kernel. But it was
a good thing in the end as I found this nasty non-compliant (for 3.2) bit
of code in linuxbios.
ron