summaryrefslogtreecommitdiff
path: root/optimize.c
diff options
context:
space:
mode:
authorguy <guy>2000-10-28 01:22:52 +0000
committerguy <guy>2000-10-28 01:22:52 +0000
commit8c16ead77826ba9235de16c7a18be576154e75db (patch)
tree592c41375d81c198f61defb73f333bb3657d6dd7 /optimize.c
parent82547471f79c2cf4a9943a222d006edc4add2d76 (diff)
downloadlibpcap-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.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/optimize.c b/optimize.c
index fe2c2cae..453d49d9 100644
--- a/optimize.c
+++ b/optimize.c
@@ -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;
}
/*