Kill count device support from config. I've changed the last few

remaining consumers to have the count passed as an option.  This is
i4b, pc98/wdc, and coda.

Bump configvers.h from 500013 to 600000.

Remove heuristics that tried to parse "device ed5" as 5 units of the ed
device.  This broke things like the snd_emu10k1 device, which required
quotes to make it parse right.  The no-longer-needed quotes have been
removed from NOTES, GENERIC etc.  eg, I've removed the quotes from:
   device  snd_maestro
   device  "snd_maestro3"
   device  snd_mss

I believe everything will still compile and work after this.
This commit is contained in:
Peter Wemm 2004-08-30 23:03:58 +00:00
parent c591d41f7c
commit f37a929ca1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=134542
37 changed files with 98 additions and 292 deletions

View File

@ -31,7 +31,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "vcoda.h"
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$");
extern int coda_nc_initialized; /* Set if cache has been initialized */
#include <vcoda.h>
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -43,7 +43,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <vcoda.h>
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -17,7 +17,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
.if !defined(S)
.if exists(./@/.)

View File

@ -18,7 +18,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
STD8X16FONT?= iso

View File

@ -17,7 +17,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
# Temporary stuff while we're still embryonic
NO_MODULES?= yes

View File

@ -17,7 +17,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
STD8X16FONT?= iso

View File

@ -19,7 +19,7 @@
GCC3= you bet
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
STD8X16FONT?= iso

View File

@ -19,7 +19,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
.if !defined(S)
.if exists(./@/.)

View File

@ -17,7 +17,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
# Temporary stuff while we're still embryonic
NO_MODULES?= yes

View File

@ -17,7 +17,7 @@
#
# Which version of config(8) is required.
%VERSREQ= 500013
%VERSREQ= 600000
STD8X16FONT?= iso

View File

@ -817,10 +817,11 @@ options NFS_DEBUG # Enable NFS Debugging
# Coda stuff:
options CODA #CODA filesystem.
device vcoda 4 #coda minicache <-> venus comm.
device vcoda #coda minicache <-> venus comm.
# Use the old Coda 5.x venus<->kernel interface instead of the new
# realms-aware 6.x protocol.
#options CODA_COMPAT_5
options NVCODA=4
#
# Add support for the EXT2FS filesystem of Linux fame. Be a bit
@ -1869,32 +1870,32 @@ device sound
# snd_vibes: S3 Sonicvibes PCI.
# snd_uaudio: USB audio.
device "snd_ad1816"
device "snd_als4000"
#device "snd_au88x0"
device snd_ad1816
device snd_als4000
#device snd_au88x0
device snd_cmi
device "snd_cs4281"
device snd_cs4281
device snd_csa
device "snd_ds1"
device "snd_emu10k1"
device "snd_es137x"
device snd_ds1
device snd_emu10k1
device snd_es137x
device snd_ess
device "snd_fm801"
device snd_fm801
device snd_gusc
device snd_ich
device snd_maestro
device "snd_maestro3"
device snd_maestro3
device snd_mss
device snd_neomagic
device "snd_sb16"
device "snd_sb8"
device snd_sb16
device snd_sb8
device snd_sbc
device snd_solo
device "snd_t4dwave"
device "snd_via8233"
device "snd_via82c686"
device snd_t4dwave
device snd_via8233
device snd_via82c686
device snd_vibes
#device "snd_vortex1"
#device snd_vortex1
device snd_uaudio
# For non-pnp sound cards:

View File

@ -82,7 +82,7 @@ cam/scsi/scsi_sa.c optional sa
cam/scsi/scsi_ses.c optional ses
cam/scsi/scsi_targ_bh.c optional targbh
cam/scsi/scsi_target.c optional targ
coda/coda_fbsd.c count vcoda
coda/coda_fbsd.c optional vcoda
coda/coda_namecache.c optional vcoda
coda/coda_psdev.c optional vcoda
coda/coda_subr.c optional vcoda
@ -992,14 +992,14 @@ gnu/ext2fs/ext2_vnops.c optional ext2fs
#
# isdn4bsd device drivers
#
i4b/driver/i4b_trace.c count i4btrc
i4b/driver/i4b_rbch.c count i4brbch
i4b/driver/i4b_tel.c count i4btel
i4b/driver/i4b_ipr.c count i4bipr
i4b/driver/i4b_trace.c optional i4btrc
i4b/driver/i4b_rbch.c optional i4brbch
i4b/driver/i4b_tel.c optional i4btel
i4b/driver/i4b_ipr.c optional i4bipr
net/slcompress.c optional i4bipr
i4b/driver/i4b_ctl.c optional i4bctl
i4b/driver/i4b_ing.c count i4bing
i4b/driver/i4b_isppp.c count i4bisppp
i4b/driver/i4b_ing.c optional i4bing
i4b/driver/i4b_isppp.c optional i4bisppp
net/slcompress.c optional i4bisppp
#
# isdn4bsd CAPI driver

View File

@ -347,8 +347,8 @@ pc98/pc98/scvtbpc98.c optional sc
pc98/pc98/sio.c optional sio
pc98/pc98/sio_cbus.c optional sio isa
pc98/pc98/syscons_pc98.c optional sc
pc98/pc98/wd.c count wdc
pc98/pc98/wd_cd.c count wcd wdc
pc98/pc98/wd.c optional wdc
pc98/pc98/wd_cd.c optional wcd wdc
pccard/mecia.c optional mecia card
pci/agp_ali.c optional agp
pci/agp_amd.c optional agp

View File

@ -60,6 +60,7 @@ ADAPTIVE_GIANT opt_adaptive_mutexes.h
NO_ADAPTIVE_MUTEXES opt_adaptive_mutexes.h
ALQ
CODA_COMPAT_5 opt_coda.h
NVCODA opt_coda.h
COMPAT_43 opt_compat.h
COMPAT_FREEBSD4 opt_compat.h
COMPILING_LINT opt_global.h
@ -679,3 +680,11 @@ DCONS_BUF_SIZE opt_dcons.h
DCONS_POLL_HZ opt_dcons.h
DCONS_FORCE_CONSOLE opt_dcons.h
DCONS_FORCE_GDB opt_dcons.h
# Static unit counts
NI4BTRC opt_i4b.h
NI4BRBCH opt_i4b.h
NI4BTEL opt_i4b.h
NI4BIPR opt_i4b.h
NI4BING opt_i4b.h
NI4BISPPP opt_i4b.h

View File

@ -108,3 +108,7 @@ PC98 opt_global.h
DEV_APIC opt_apic.h
DEV_MECIA opt_mecia.h
DEV_NPX opt_npx.h
DEV_WCD opt_wcd.h
# Static unit counts
NWDC opt_wdc.h

View File

@ -31,7 +31,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "vcoda.h"
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -54,7 +54,7 @@ __FBSDID("$FreeBSD$");
extern int coda_nc_initialized; /* Set if cache has been initialized */
#include <vcoda.h>
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -43,7 +43,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include <vcoda.h>
#include "opt_coda.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -471,7 +471,7 @@ device acpi_video
# for AGP r128 and radeon cards.
device mgadrm
device "r128drm"
device r128drm
device radeondrm
device sisdrm
device tdfxdrm
@ -870,7 +870,7 @@ device ifpi
# ifpi2 driver for AVM Fritz!Card PCI version 2
#
# AVM Fritz!Card PCI version 2
device "ifpi2"
device ifpi2
#
#---------------------------------------------------------------------------
# iwic driver for Winbond W6692 chipset
@ -900,34 +900,38 @@ hint.iavc.0.irq="5"
# ISDN Protocol Stack - mandatory for all hardware drivers
#
# Q.921 / layer 2 - i4b passive cards D channel handling
device "i4bq921"
device i4bq921
#
# Q.931 / layer 3 - i4b passive cards D channel handling
device "i4bq931"
device i4bq931
#
# layer 4 - i4b common passive and active card handling
device "i4b"
device i4b
#
#---------------------------------------------------------------------------
# ISDN devices - mandatory for all hardware drivers
#
# userland driver to do ISDN tracing (for passive cards only)
device "i4btrc" 4
device i4btrc
options NI4BTRC=4
#
# userland driver to control the whole thing
device "i4bctl"
device i4bctl
#
#---------------------------------------------------------------------------
# ISDN devices - optional
#
# userland driver for access to raw B channel
device "i4brbch" 4
device i4brbch
options NI4BRBCH=4
#
# userland driver for telephony
device "i4btel" 2
device i4btel
options NI4BTEL=2
#
# network driver for IP over raw HDLC ISDN
device "i4bipr" 4
device i4bipr
options NI4BIPR=4
# enable VJ header compression detection for ipr i/f
options IPR_VJ
# enable logging of the first n IP packets to isdnd (n=32 here)
@ -935,13 +939,15 @@ options IPR_LOG=32
#
# network driver for sync PPP over ISDN; requires an equivalent
# number of sppp device to be configured
device "i4bisppp" 4
device i4bisppp
options NI4BISPPP=4
#
# B-channel interface to the netgraph subsystem
device "i4bing" 2
device i4bing
options NI4BING=2
#
# CAPI driver needed for active ISDN cards (see iavc driver above)
device "i4bcapi"
device i4bcapi
#
#---------------------------------------------------------------------------

View File

@ -33,8 +33,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4bing.h"
#include "opt_i4b.h"
#include <sys/param.h>

View File

@ -56,8 +56,6 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4bipr.h"
#include "opt_i4b.h"
#include <sys/param.h>

View File

@ -41,7 +41,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4bisppp.h"
#include "opt_i4b.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -33,7 +33,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4brbch.h"
#include "opt_i4b.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -33,7 +33,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4btel.h"
#include "opt_i4b.h"
#undef I4BTELDEBUG

View File

@ -35,7 +35,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4btrc.h"
#include "opt_i4b.h"
#include <sys/param.h>
#include <sys/systm.h>

View File

@ -33,8 +33,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4bipr.h"
#include "i4btel.h"
#include "opt_i4b.h"
#include <sys/param.h>
#include <sys/ioccom.h>
@ -48,9 +47,6 @@ __FBSDID("$FreeBSD$");
#include <sys/selinfo.h>
#include <net/if.h>
#include "i4bing.h"
#include "i4bisppp.h"
#include <machine/i4b_debug.h>
#include <machine/i4b_ioctl.h>
#include <machine/i4b_cause.h>

View File

@ -33,18 +33,13 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
#include "i4bipr.h"
#include "opt_i4b.h"
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
#include "i4bing.h"
#include "i4bisppp.h"
#include "i4brbch.h"
#include "i4btel.h"
#include <machine/i4b_debug.h>
#include <machine/i4b_ioctl.h>
#include <machine/i4b_cause.h>

View File

@ -89,10 +89,11 @@ device atapist # ATAPI tape drives
options ATA_STATIC_ID # Static device numbering
# IDE controller and disks
#device wdc 1 # Needs COMPAT_OLDISA
#device wdc # Needs COMPAT_OLDISA
#options NWDC=1
# ATAPI devices on wdc
#device wcd 1 # IDE CD-ROM
#device wcd # IDE CD-ROM
# SCSI Controllers
device adv # Advansys SCSI adapters

View File

@ -101,11 +101,8 @@
*/
#undef DEBUG
#include "wdc.h"
#include "wcd.h"
#if NWDC > 0
#include "opt_wcd.h"
#include "opt_wdc.h"
#include <sys/param.h>
#include <sys/systm.h>
@ -248,14 +245,14 @@ int atapi_attach (int ctlr, int unit, int port)
break;
case AT_TYPE_DIRECT: /* direct-access */
#if NWCD > 0
#ifdef DEV_WCD
/* FALLTHROUGH */
#else
printf ("wdc%d: ATAPI Floppies not configured\n", ctlr);
break;
#endif
case AT_TYPE_CDROM: /* CD-ROM device */
#if NWCD > 0
#ifdef DEV_WCD
/* ATAPI CD-ROM & CD-R/RW drives */
if (acdattach (ata, unit, ap, ata->debug) < 0)
break;
@ -966,5 +963,3 @@ struct atapires atapi_request_immediate (struct atapi *ata, int unit,
}
return (ac->result);
}
#endif /* NWDC */

View File

@ -48,12 +48,10 @@
* driver entries for polled reinit and polled write).
*/
#include "wdc.h"
#include "opt_wdc.h"
#undef NWD
#define NWD (NWDC * 4) /* 4 drives per wdc on PC98 */
#if NWDC > 0
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
@ -2068,5 +2066,3 @@ wdwait(struct softc *du, u_char bits_wanted, int timeout)
} while (--timeout != 0);
return (-1);
}
#endif /* NWDC > 0 */

View File

@ -41,7 +41,7 @@
struct file_list {
STAILQ_ENTRY(file_list) f_next;
char *f_fn; /* the name */
int f_type; /* type or count */
int f_type; /* type */
u_char f_flags; /* see below */
char *f_compilewith; /* special make rule if present */
char *f_depends; /* additional dependancies */
@ -72,14 +72,12 @@ struct files_name {
#define NO_IMPLCT_RULE 1
#define NO_OBJ 2
#define BEFORE_DEPEND 4
#define NEED_COUNT 8
#define ISDUP 16
#define NOWERROR 32
#define ISDUP 8
#define NOWERROR 16
struct device {
int d_done; /* processed */
char *d_name; /* name of device (e.g. rk11) */
int d_count; /* device count */
#define UNKNOWN -2 /* -2 means not set yet */
STAILQ_ENTRY(device) d_next; /* Next one in list */
};

View File

@ -250,16 +250,7 @@ Device_spec:
= {
newopt(&opt, devopt($2), ns("1"));
/* and the device part */
newdev($2, UNKNOWN);
} |
DEVICE Dev NUMBER
= {
newopt(&opt, devopt($2), ns("1"));
/* and the device part */
newdev($2, $3);
if ($3 == 0)
errx(1, "%s:%d: devices with zero units are not "
"likely to be correct", yyfile, yyline);
newdev($2);
} |
NODEVICE Dev
= {
@ -298,14 +289,13 @@ newfile(char *name)
* add a device to the list of devices
*/
static void
newdev(char *name, int count)
newdev(char *name)
{
struct device *np;
np = (struct device *) malloc(sizeof *np);
memset(np, 0, sizeof(*np));
np->d_name = name;
np->d_count = count;
STAILQ_INSERT_TAIL(&dtab, np, d_next);
}

View File

@ -8,4 +8,4 @@
*
* $FreeBSD$
*/
#define CONFIGVERS 500013
#define CONFIGVERS 600000

View File

@ -89,11 +89,10 @@ unsigned int hex(const char *);
int yyerror(const char *);
%}
WORD [A-Za-z_][-A-Za-z_]*
ID [A-Za-z_][-A-Za-z_0-9]*
%START NONUM TOEOL
%START TOEOL
%%
<NONUM>{WORD} {
{ID} {
int i;
BEGIN 0;
@ -104,20 +103,6 @@ ID [A-Za-z_][-A-Za-z_0-9]*
}
return i;
}
<INITIAL>{WORD}/[0-9]* {
int i;
if ((i = kw_lookup(yytext)) == -1)
REJECT;
if (i == DEVICE || i == NODEVICE)
BEGIN NONUM;
return i;
}
<INITIAL>{ID} {
BEGIN 0;
yylval.str = strdup(yytext);
return ID;
}
\\\"[^"]+\\\" {
BEGIN 0;
yytext[yyleng-2] = '"';

View File

@ -47,10 +47,6 @@ static const char rcsid[] =
#include "config.h"
#include "y.tab.h"
static int do_header(char *, int);
static char *toheader(char *);
static char *tomacro(char *);
void
headers(void)
{
@ -69,8 +65,6 @@ headers(void)
dp->d_done |= DEVDONE;
}
}
if (fl->f_flags & NEED_COUNT)
errors += do_header(fl->f_needs, match);
}
}
STAILQ_FOREACH(dp, &dtab, d_next) {
@ -79,157 +73,7 @@ headers(void)
dp->d_name);
errors++;
}
if (dp->d_count == UNKNOWN)
continue;
match = 0;
STAILQ_FOREACH(fl, &ftab, f_next) {
if (fl->f_needs == 0)
continue;
if ((fl->f_flags & NEED_COUNT) == 0)
continue;
if (eq(dp->d_name, fl->f_needs)) {
match++;
break;
}
}
if (match == 0) {
warnx("Error: device \"%s\" does not take a count",
dp->d_name);
errors++;
}
}
if (errors)
errx(1, "%d errors", errors);
}
static int
do_header(char *dev, int match)
{
char *file, *name, *inw;
struct file_list *fl, *tflp;
struct file_list_head fl_head;
struct device *dp;
FILE *inf, *outf;
int inc, oldcount;
int count, hicount;
int errors;
/*
* After this loop, "count" will be the actual number of units,
* and "hicount" will be the highest unit declared. do_header()
* must use this higher of these values.
*/
errors = 0;
hicount = count = 0;
STAILQ_FOREACH(dp, &dtab, d_next) {
if (eq(dp->d_name, dev)) {
if (dp->d_count == UNKNOWN) {
warnx("Device \"%s\" requires a count", dev);
return 1;
}
count = dp->d_count;
break;
}
}
file = toheader(dev);
name = tomacro(dev);
if (match)
fprintf(stderr,
"FYI: static unit limits for %s are set: %s=%d\n",
dev, name, count);
remember(file);
inf = fopen(file, "r");
oldcount = -1;
if (inf == 0) {
outf = fopen(file, "w");
if (outf == 0)
err(1, "%s", file);
fprintf(outf, "#ifndef BURN_BRIDGES\n");
fprintf(outf, "#define %s %d\n", name, count);
fprintf(outf, "#endif\n");
(void) fclose(outf);
return 0;
}
STAILQ_INIT(&fl_head);
for (;;) {
char *cp;
if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
break;
if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
break;
inw = ns(inw);
cp = get_word(inf);
if (cp == 0 || cp == (char *)EOF)
break;
inc = atoi(cp);
if (eq(inw, name)) {
oldcount = inc;
inc = count;
}
cp = get_word(inf);
if (cp == (char *)EOF)
break;
fl = (struct file_list *) malloc(sizeof *fl);
bzero(fl, sizeof(*fl));
fl->f_fn = inw; /* malloced */
fl->f_type = inc;
STAILQ_INSERT_HEAD(&fl_head, fl, f_next);
}
(void) fclose(inf);
if (count == oldcount) {
for (fl = STAILQ_FIRST(&fl_head); fl != NULL; fl = tflp) {
tflp = STAILQ_NEXT(fl, f_next);
free(fl->f_fn);
free(fl);
}
return 0;
}
if (oldcount == -1) {
fl = (struct file_list *) malloc(sizeof *fl);
bzero(fl, sizeof(*fl));
fl->f_fn = ns(name);
fl->f_type = count;
STAILQ_INSERT_HEAD(&fl_head, fl, f_next);
}
outf = fopen(file, "w");
if (outf == 0)
err(1, "%s", file);
for (fl = STAILQ_FIRST(&fl_head); fl != NULL; fl = tflp) {
fprintf(outf,
"#define %s %u\n", fl->f_fn, count ? fl->f_type : 0);
tflp = STAILQ_NEXT(fl, f_next);
free(fl->f_fn);
free(fl);
}
(void) fclose(outf);
return 0;
}
/*
* convert a dev name to a .h file name
*/
static char *
toheader(char *dev)
{
static char hbuf[MAXPATHLEN];
snprintf(hbuf, sizeof(hbuf), "%s.h", path(dev));
return (hbuf);
}
/*
* convert a dev name to a macro name
*/
static char *
tomacro(char *dev)
{
static char mbuf[20];
char *cp;
cp = mbuf;
*cp++ = 'N';
while (*dev)
*cp++ = islower(*dev) ? toupper(*dev++) : *dev++;
*cp++ = 0;
return (mbuf);
}

View File

@ -298,14 +298,14 @@ read_file(char *fname)
struct opt *op;
char *wd, *this, *needs, *compilewith, *depends, *clean, *warning;
int nreqs, isdup, std, filetype,
imp_rule, no_obj, needcount, before_depend, mandatory, nowerror;
imp_rule, no_obj, before_depend, mandatory, nowerror;
fp = fopen(fname, "r");
if (fp == 0)
err(1, "%s", fname);
next:
/*
* filename [ standard | mandatory | optional | count ]
* filename [ standard | mandatory | optional ]
* [ dev* | profiling-routine ] [ no-obj ]
* [ compile-with "compile rule" [no-implicit-rule] ]
* [ dependency "dependency-list"] [ before-depend ]
@ -345,7 +345,6 @@ read_file(char *fname)
std = mandatory = 0;
imp_rule = 0;
no_obj = 0;
needcount = 0;
before_depend = 0;
nowerror = 0;
filetype = NORMAL;
@ -358,10 +357,8 @@ read_file(char *fname)
*/
} else if (eq(wd, "mandatory")) {
mandatory = 1;
} else if (eq(wd, "count")) {
needcount = 1;
} else if (!eq(wd, "optional")) {
printf("%s: %s must be count, optional, mandatory or standard\n",
printf("%s: %s must be optional, mandatory or standard\n",
fname, this);
exit(1);
}
@ -451,11 +448,8 @@ read_file(char *fname)
if (isdup)
goto invis;
STAILQ_FOREACH(dp, &dtab, d_next)
if (eq(dp->d_name, wd)) {
if (std && dp->d_count <= 0)
dp->d_count = 1;
if (eq(dp->d_name, wd))
goto nextparam;
}
if (mandatory) {
printf("%s: mandatory device \"%s\" not found\n",
fname, wd);
@ -483,8 +477,6 @@ read_file(char *fname)
tp->f_type = INVISIBLE;
tp->f_needs = needs;
tp->f_flags |= isdup;
if (needcount)
tp->f_flags |= NEED_COUNT;
tp->f_compilewith = compilewith;
tp->f_depends = depends;
tp->f_clean = clean;
@ -516,8 +508,6 @@ read_file(char *fname)
tp->f_flags |= NO_OBJ;
if (before_depend)
tp->f_flags |= BEFORE_DEPEND;
if (needcount)
tp->f_flags |= NEED_COUNT;
if (nowerror)
tp->f_flags |= NOWERROR;
tp->f_needs = needs;