diff options
author | guy <guy> | 2000-10-28 01:22:52 +0000 |
---|---|---|
committer | guy <guy> | 2000-10-28 01:22:52 +0000 |
commit | 8c16ead77826ba9235de16c7a18be576154e75db (patch) | |
tree | 592c41375d81c198f61defb73f333bb3657d6dd7 /optimize.c | |
parent | 82547471f79c2cf4a9943a222d006edc4add2d76 (diff) | |
download | libpcap-8c16ead77826ba9235de16c7a18be576154e75db.tar.gz |
Fix from Jefferson Ogata <jogata@nodc.noaa.gov> - "count_stmts()" wasn't
counting any extra jumps required by a flowgraph node (the conditional
jump instructions have an 8-bit offset; if the target is more than 256
instructions away, we generate a nearby "jump always" to the target, and
jump to that instead).
Diffstat (limited to 'optimize.c')
-rw-r--r-- | optimize.c | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -22,7 +22,7 @@ */ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/libpcap/optimize.c,v 1.65 2000-10-28 00:01:27 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/optimize.c,v 1.66 2000-10-28 01:22:53 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -1782,6 +1782,20 @@ number_blks_r(p) /* * Return the number of stmts in the flowgraph reachable by 'p'. * The nodes should be unmarked before calling. + * + * Note that "stmts" means "instructions", and that this includes + * + * side-effect statements in 'p' (slength(p->stmts)); + * + * statements in the true branch from 'p' (count_stmts(JT(p))); + * + * statements in the false branch from 'p' (count_stmts(JF(p))); + * + * the conditional jump itself (1); + * + * an extra long jump if the true branch requires it (p->longjt); + * + * an extra long jump if the false branch requires it (p->longjf). */ static int count_stmts(p) @@ -1793,7 +1807,7 @@ count_stmts(p) return 0; Mark(p); n = count_stmts(JT(p)) + count_stmts(JF(p)); - return slength(p->stmts) + n + 1; + return slength(p->stmts) + n + 1 + p->longjt + p->longjf; } /* |