David Holland wrote:
On Sun, Feb 10, 2008 at 09:31:31AM +1100, Darren Reed wrote: > Can anyone explain why gcc is doing what it is below?> > [...]> (gdb) print hlen > $1 = 4448 Does slen (set to l3len - hlen) come out correct? Given that it's inlined htons, I'm assuming you compiled with a nontrivial -O level, so it shouldn't be surprising either that it optimized out a local variable or that the debug info gives you misleading results which may or may not reflect what's actually happening.
A better example of how it is not getting things right:
Breakpoint 1, fr_cksum (m=0xbfbfc650, ip=0xbfbfc660, l4proto=17,
l4hdr=0xbfbfc660, l3len=24) at ../../fil.c:3274
warning: Source file is more recent than executable.
3274 csump = NULL;
(gdb) s
3275 sumsave = 0;
(gdb)
3277 sp = NULL;
(gdb)
3278 slen = 0;
(gdb)
68 __asm __volatile ("rorw $8, %w1" : "=r" (x) : "0" (x));
(gdb)
67 {
(gdb)
3287 if (IP_V(ip) == 4) {
(gdb)
3298 } else if (IP_V(ip) == 6) {
(gdb)
3299 ip6 = (ip6_t *)ip;
(gdb)
3301 slen = l3len - hlen;
(gdb)
68 __asm __volatile ("rorw $8, %w1" : "=r" (x) : "0" (x));
(gdb) p l3len
$1 = 24
(gdb) p hlen
$2 = 4448
(gdb) p slen
$3 = 65520
Both the initialisation of hlen to 0 and assigning it 40 are missing.
Darren