aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/ast/ast.go2
-rw-r--r--pkg/compiler/check.go38
-rw-r--r--pkg/compiler/consts.go13
-rw-r--r--pkg/declextract/declextract.go15
-rw-r--r--sys/linux/auto.txt151
-rw-r--r--sys/linux/auto.txt.const48
-rw-r--r--tools/syz-declextract/declextract.go21
-rw-r--r--tools/syz-declextract/testdata/file_operations.c14
-rw-r--r--tools/syz-declextract/testdata/file_operations.c.json41
-rw-r--r--tools/syz-declextract/testdata/file_operations.c.txt1
-rw-r--r--tools/syz-declextract/testdata/functions.c.txt4
-rw-r--r--tools/syz-declextract/testdata/include/uapi/unused_ioctl.h6
-rw-r--r--tools/syz-declextract/testdata/io_uring.c.txt5
-rw-r--r--tools/syz-declextract/testdata/netlink.c.txt3
-rw-r--r--tools/syz-declextract/testdata/syscall.c.txt4
-rw-r--r--tools/syz-declextract/testdata/types.c.txt4
16 files changed, 138 insertions, 232 deletions
diff --git a/pkg/ast/ast.go b/pkg/ast/ast.go
index bd2d97c23..7c1db28ea 100644
--- a/pkg/ast/ast.go
+++ b/pkg/ast/ast.go
@@ -71,7 +71,7 @@ type Include struct {
}
func (n *Include) Info() (Pos, string, string) {
- return n.Pos, tok2str[tokInclude], ""
+ return n.Pos, tok2str[tokInclude], n.File.Value
}
type Incdir struct {
diff --git a/pkg/compiler/check.go b/pkg/compiler/check.go
index 92e3e5e03..fbf84857d 100644
--- a/pkg/compiler/check.go
+++ b/pkg/compiler/check.go
@@ -676,6 +676,44 @@ func CollectUnused(desc *ast.Description, target *targets.Target, eh ast.ErrorHa
return nodes, nil
}
+// CollectUnusedConsts returns unused defines/includes. This is used only for auto-generated descriptions.
+func CollectUnusedConsts(desc *ast.Description, target *targets.Target, includeUse map[string]string,
+ eh ast.ErrorHandler) ([]ast.Node, error) {
+ comp := createCompiler(desc, target, eh)
+ comp.typecheck()
+ if comp.errors > 0 {
+ return nil, errors.New("typecheck failed")
+ }
+
+ var unused []ast.Node
+ for file, info := range comp.extractConsts() {
+ if !comp.fileMeta(ast.Pos{File: file}).Automatic {
+ continue
+ }
+ usedDefines := make(map[string]bool)
+ usedIncludes := make(map[string]bool)
+ for _, c := range info.Consts {
+ if c.Used {
+ usedDefines[c.Name] = true
+ usedIncludes[includeUse[c.Name]] = true
+ }
+ }
+ for _, decl := range comp.desc.Nodes {
+ switch n := decl.(type) {
+ case *ast.Define:
+ if n.Pos.File == file && !usedDefines[n.Name.Name] {
+ unused = append(unused, n)
+ }
+ case *ast.Include:
+ if n.Pos.File == file && !usedIncludes[n.File.Value] {
+ unused = append(unused, n)
+ }
+ }
+ }
+ }
+ return unused, nil
+}
+
func (comp *compiler) collectUnused() []ast.Node {
var unused []ast.Node
diff --git a/pkg/compiler/consts.go b/pkg/compiler/consts.go
index bcbd40e52..6ce3f81f1 100644
--- a/pkg/compiler/consts.go
+++ b/pkg/compiler/consts.go
@@ -23,6 +23,7 @@ type ConstInfo struct {
type Const struct {
Name string
Pos ast.Pos
+ Used bool // otherwise only defined
}
func ExtractConsts(desc *ast.Description, target *targets.Target, eh ast.ErrorHandler) map[string]*ConstInfo {
@@ -86,7 +87,7 @@ func (comp *compiler) extractConsts() map[string]*ConstInfo {
comp.error(pos, "redefining builtin const %v", name)
}
info.defines[name] = v
- comp.addConst(ctx, pos, name)
+ ctx.addConst(pos, name, false)
case *ast.Call:
if comp.target.HasCallNumber(n.CallName) {
comp.addConst(ctx, pos, comp.target.SyscallPrefix+n.CallName)
@@ -178,10 +179,10 @@ func (comp *compiler) addConst(ctx *constContext, pos ast.Pos, name string) {
if _, isFlag := comp.intFlags[name]; isFlag {
return
}
- ctx.addConst(pos, name)
+ ctx.addConst(pos, name, true)
for _, instantions := range ctx.instantionStack {
for _, pos1 := range instantions {
- ctx.addConst(pos1, name)
+ ctx.addConst(pos1, name, true)
}
}
}
@@ -193,11 +194,15 @@ type constInfo struct {
incdirArray []string
}
-func (ctx *constContext) addConst(pos ast.Pos, name string) {
+func (ctx *constContext) addConst(pos ast.Pos, name string, used bool) {
info := ctx.getConstInfo(pos)
+ if c := info.consts[name]; c != nil && c.Used {
+ used = true
+ }
info.consts[name] = &Const{
Pos: pos,
Name: name,
+ Used: used,
}
}
diff --git a/pkg/declextract/declextract.go b/pkg/declextract/declextract.go
index fdf06b373..9df449b63 100644
--- a/pkg/declextract/declextract.go
+++ b/pkg/declextract/declextract.go
@@ -16,7 +16,7 @@ import (
)
func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string, trace io.Writer) (
- []byte, []*Interface, error) {
+ []byte, []*Interface, map[string]string, error) {
ctx := &context{
Output: out,
probe: probe,
@@ -29,7 +29,7 @@ func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string,
}
ctx.processFunctions()
ctx.processTypingFacts()
- ctx.processConsts()
+ includeUse := ctx.processConsts()
ctx.processEnums()
ctx.processStructs()
ctx.processSyscalls()
@@ -37,7 +37,7 @@ func Run(out *Output, probe *ifaceprobe.Info, syscallRename map[string][]string,
ctx.serialize()
ctx.finishInterfaces()
- return ctx.descriptions.Bytes(), ctx.interfaces, errors.Join(ctx.errs...)
+ return ctx.descriptions.Bytes(), ctx.interfaces, includeUse, errors.Join(ctx.errs...)
}
type context struct {
@@ -75,7 +75,7 @@ func (ctx *context) trace(msg string, args ...any) {
}
}
-func (ctx *context) processConsts() {
+func (ctx *context) processConsts() map[string]string {
replaces := map[string]string{
// Arches may use some includes from asm-generic and some from arch/arm.
// If the arch used for extract used asm-generic for a header,
@@ -85,6 +85,7 @@ func (ctx *context) processConsts() {
"include/uapi/asm-generic/sockios.h": "asm/sockios.h",
}
defineDedup := make(map[string]bool)
+ includeUse := make(map[string]string)
for _, ci := range ctx.Consts {
if strings.Contains(ci.Filename, "/uapi/") && !strings.Contains(ci.Filename, "arch/x86/") &&
strings.HasSuffix(ci.Filename, ".h") {
@@ -93,6 +94,7 @@ func (ctx *context) processConsts() {
filename = replace
}
ctx.includes = append(ctx.includes, filename)
+ includeUse[ci.Name] = filename
continue
}
// Remove duplicate defines (even with different values). Unfortunately we get few of these.
@@ -118,6 +120,11 @@ func (ctx *context) processConsts() {
"linux/types.h",
"net/netlink.h",
}, ctx.includes...)
+ // Also pretend they are used.
+ includeUse["__NR_read"] = "vdso/bits.h"
+ includeUse["__NR_write"] = "linux/types.h"
+ includeUse["__NR_close"] = "net/netlink.h"
+ return includeUse
}
func (ctx *context) processEnums() {
diff --git a/sys/linux/auto.txt b/sys/linux/auto.txt
index f2e97b77d..2e5f8bc3e 100644
--- a/sys/linux/auto.txt
+++ b/sys/linux/auto.txt
@@ -12,166 +12,65 @@ type auto_union[INFERRED, RAW] [
include <vdso/bits.h>
include <linux/types.h>
include <net/netlink.h>
-include <arch/x86/include/uapi/asm/msr.h>
-include <arch/x86/include/uapi/asm/sgx.h>
include <asm/ioctls.h>
-include <asm/sockios.h>
include <include/uapi/asm-generic/termbits-common.h>
include <include/uapi/linux/android/binderfs.h>
include <include/uapi/linux/batman_adv.h>
include <include/uapi/linux/btrfs.h>
-include <include/uapi/linux/caif/if_caif.h>
-include <include/uapi/linux/can/gw.h>
-include <include/uapi/linux/can/netlink.h>
-include <include/uapi/linux/can/vxcan.h>
-include <include/uapi/linux/cdrom.h>
include <include/uapi/linux/cec.h>
include <include/uapi/linux/cgroupstats.h>
include <include/uapi/linux/cifs/cifs_netlink.h>
include <include/uapi/linux/comedi.h>
-include <include/uapi/linux/counter.h>
-include <include/uapi/linux/cryptouser.h>
-include <include/uapi/linux/dcbnl.h>
-include <include/uapi/linux/devlink.h>
-include <include/uapi/linux/dma-buf.h>
include <include/uapi/linux/dma-heap.h>
include <include/uapi/linux/ethtool_netlink.h>
-include <include/uapi/linux/eventpoll.h>
-include <include/uapi/linux/exfat.h>
-include <include/uapi/linux/fib_rules.h>
-include <include/uapi/linux/fou.h>
include <include/uapi/linux/fs.h>
include <include/uapi/linux/fuse.h>
include <include/uapi/linux/genetlink.h>
include <include/uapi/linux/gtp.h>
include <include/uapi/linux/handshake.h>
-include <include/uapi/linux/hiddev.h>
-include <include/uapi/linux/hidraw.h>
include <include/uapi/linux/hsr_netlink.h>
include <include/uapi/linux/i2c-dev.h>
-include <include/uapi/linux/if_addr.h>
-include <include/uapi/linux/if_addrlabel.h>
-include <include/uapi/linux/if_bridge.h>
-include <include/uapi/linux/if_link.h>
include <include/uapi/linux/if_macsec.h>
-include <include/uapi/linux/if_team.h>
include <include/uapi/linux/if_tun.h>
-include <include/uapi/linux/if_tunnel.h>
-include <include/uapi/linux/iio/buffer.h>
include <include/uapi/linux/ila.h>
-include <include/uapi/linux/inotify.h>
-include <include/uapi/linux/io_uring.h>
include <include/uapi/linux/ioam6_genl.h>
include <include/uapi/linux/ip_vs.h>
-include <include/uapi/linux/joystick.h>
-include <include/uapi/linux/kcov.h>
include <include/uapi/linux/kvm.h>
include <include/uapi/linux/l2tp.h>
include <include/uapi/linux/landlock.h>
include <include/uapi/linux/loop.h>
-include <include/uapi/linux/lp.h>
-include <include/uapi/linux/lwtunnel.h>
-include <include/uapi/linux/media.h>
-include <include/uapi/linux/mei.h>
-include <include/uapi/linux/mpls_iptunnel.h>
-include <include/uapi/linux/mptcp_pm.h>
-include <include/uapi/linux/msdos_fs.h>
include <include/uapi/linux/nbd-netlink.h>
include <include/uapi/linux/ncsi.h>
-include <include/uapi/linux/neighbour.h>
include <include/uapi/linux/net_dropmon.h>
-include <include/uapi/linux/net_namespace.h>
include <include/uapi/linux/net_shaper.h>
-include <include/uapi/linux/netconf.h>
include <include/uapi/linux/netdev.h>
-include <include/uapi/linux/netfilter/ipset/ip_set.h>
-include <include/uapi/linux/netfilter/nf_tables.h>
-include <include/uapi/linux/netfilter/nf_tables_compat.h>
-include <include/uapi/linux/netfilter/nfnetlink.h>
-include <include/uapi/linux/netfilter/nfnetlink_acct.h>
-include <include/uapi/linux/netfilter/nfnetlink_conntrack.h>
-include <include/uapi/linux/netfilter/nfnetlink_cthelper.h>
-include <include/uapi/linux/netfilter/nfnetlink_cttimeout.h>
-include <include/uapi/linux/netfilter/nfnetlink_log.h>
-include <include/uapi/linux/netfilter/nfnetlink_osf.h>
-include <include/uapi/linux/netfilter/nfnetlink_queue.h>
-include <include/uapi/linux/nexthop.h>
include <include/uapi/linux/nfc.h>
include <include/uapi/linux/nfsd_netlink.h>
include <include/uapi/linux/nl80211.h>
include <include/uapi/linux/nsfs.h>
include <include/uapi/linux/nvram.h>
include <include/uapi/linux/openvswitch.h>
-include <include/uapi/linux/pidfd.h>
-include <include/uapi/linux/pkt_cls.h>
-include <include/uapi/linux/pkt_sched.h>
include <include/uapi/linux/ppp-ioctl.h>
include <include/uapi/linux/ppp_defs.h>
-include <include/uapi/linux/pps.h>
include <include/uapi/linux/psample.h>
include <include/uapi/linux/random.h>
include <include/uapi/linux/rfkill.h>
-include <include/uapi/linux/rpl_iptunnel.h>
include <include/uapi/linux/rtc.h>
-include <include/uapi/linux/rtnetlink.h>
-include <include/uapi/linux/seccomp.h>
include <include/uapi/linux/seg6_genl.h>
-include <include/uapi/linux/seg6_iptunnel.h>
-include <include/uapi/linux/seg6_local.h>
include <include/uapi/linux/smc.h>
include <include/uapi/linux/sockios.h>
include <include/uapi/linux/soundcard.h>
include <include/uapi/linux/suspend_ioctls.h>
-include <include/uapi/linux/sync_file.h>
include <include/uapi/linux/taskstats.h>
-include <include/uapi/linux/tc_act/tc_bpf.h>
-include <include/uapi/linux/tc_act/tc_connmark.h>
-include <include/uapi/linux/tc_act/tc_csum.h>
-include <include/uapi/linux/tc_act/tc_ct.h>
-include <include/uapi/linux/tc_act/tc_ctinfo.h>
-include <include/uapi/linux/tc_act/tc_defact.h>
-include <include/uapi/linux/tc_act/tc_gact.h>
-include <include/uapi/linux/tc_act/tc_gate.h>
-include <include/uapi/linux/tc_act/tc_ife.h>
-include <include/uapi/linux/tc_act/tc_mirred.h>
-include <include/uapi/linux/tc_act/tc_mpls.h>
-include <include/uapi/linux/tc_act/tc_nat.h>
-include <include/uapi/linux/tc_act/tc_pedit.h>
-include <include/uapi/linux/tc_act/tc_sample.h>
-include <include/uapi/linux/tc_act/tc_skbedit.h>
-include <include/uapi/linux/tc_act/tc_skbmod.h>
-include <include/uapi/linux/tc_act/tc_tunnel_key.h>
-include <include/uapi/linux/tc_act/tc_vlan.h>
-include <include/uapi/linux/tc_ematch/tc_em_ipt.h>
-include <include/uapi/linux/tc_ematch/tc_em_meta.h>
include <include/uapi/linux/tcp_metrics.h>
-include <include/uapi/linux/tee.h>
include <include/uapi/linux/thermal.h>
-include <include/uapi/linux/timerfd.h>
include <include/uapi/linux/tipc_netlink.h>
-include <include/uapi/linux/udf_fs_i.h>
include <include/uapi/linux/udmabuf.h>
-include <include/uapi/linux/usb/cdc-wdm.h>
-include <include/uapi/linux/usb/functionfs.h>
-include <include/uapi/linux/usb/g_hid.h>
-include <include/uapi/linux/usb/g_printer.h>
-include <include/uapi/linux/usb/gadgetfs.h>
include <include/uapi/linux/usb/raw_gadget.h>
-include <include/uapi/linux/usb/tmc.h>
-include <include/uapi/linux/userfaultfd.h>
include <include/uapi/linux/vdpa.h>
-include <include/uapi/linux/vduse.h>
-include <include/uapi/linux/veth.h>
-include <include/uapi/linux/vfio.h>
include <include/uapi/linux/vhost.h>
-include <include/uapi/linux/watch_queue.h>
-include <include/uapi/linux/watchdog.h>
include <include/uapi/linux/wireguard.h>
-include <include/uapi/linux/wwan.h>
-include <include/uapi/linux/xfrm.h>
include <include/uapi/mtd/ubi-user.h>
-include <include/uapi/rdma/rdma_netlink.h>
-include <include/uapi/rdma/rdma_user_ioctl.h>
include <include/uapi/sound/asound.h>
NPmode$auto = NPMODE_PASS, NPMODE_DROP, NPMODE_ERROR, NPMODE_QUEUE
@@ -6797,16 +6696,7 @@ define IEEE802154_SET_MACPARAMS 35
define IEEE802154_START_REQ 13
define IMADDTIMER 2147764544
define IMDELTIMER 2147764545
-define IOCNR_GET_BUS_ADDRESS 5
-define IOCNR_GET_DEVICE_ID 1
-define IOCNR_GET_PROTOCOLS 2
-define IOCNR_GET_VID_PID 6
-define IOCNR_HP_SET_CHANNEL 4
-define IOCNR_SET_PROTOCOL 3
-define IOCNR_SOFT_RESET 7
define IOCTL_CONFIG_SYS_RESOURCE_PARAMETERS 1074356480
-define IOCTL_GET_DRV_VERSION 2
-define IOCTL_GET_HARD_VERSION 1
define IOCTL_GET_NUM_DEVICES 1074028804
define IOCTL_START_ACCEL_DEV 1074356482
define IOCTL_STATUS_ACCEL_DEV 1074028803
@@ -6828,9 +6718,6 @@ define IOCTL_VMCI_QUEUEPAIR_SETVA 1956
define IOCTL_VMCI_SET_NOTIFY 1995
define IOCTL_VMCI_VERSION 1951
define IOCTL_VMCI_VERSION2 1959
-define IOW_GETINFO 2150154243
-define IOW_READ 1074315266
-define IOW_WRITE 1074315265
define MAC802154_HWSIM_ATTR_RADIO_EDGE 2
define MAC802154_HWSIM_ATTR_RADIO_EDGES 3
define MAC802154_HWSIM_ATTR_RADIO_ID 1
@@ -6840,8 +6727,6 @@ define MAC802154_HWSIM_CMD_GET_RADIO 1
define MAC802154_HWSIM_CMD_NEW_EDGE 8
define MAC802154_HWSIM_CMD_NEW_RADIO 3
define MAC802154_HWSIM_CMD_SET_EDGE 6
-define MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID 1
-define MAC802154_HWSIM_EDGE_ATTR_LQI 2
define MON_IOCG_STATS 2148045315
define MON_IOCH_MFLUSH 37384
define MON_IOCQ_RING_SIZE 37381
@@ -6875,8 +6760,6 @@ define NL802154_ATTR_PID 28
define NL802154_ATTR_SCAN_CHANNELS 33
define NL802154_ATTR_SCAN_DONE_REASON 37
define NL802154_ATTR_SCAN_DURATION 36
-define NL802154_ATTR_SCAN_MEAN_PRF 35
-define NL802154_ATTR_SCAN_PREAMBLE_CODES 34
define NL802154_ATTR_SCAN_TYPE 31
define NL802154_ATTR_SEC_DEVICE 46
define NL802154_ATTR_SEC_DEVKEY 47
@@ -6931,32 +6814,6 @@ define NL802154_CMD_SET_TX_POWER 12
define NL802154_CMD_SET_WPAN_PHY_NETNS 20
define NL802154_CMD_STOP_BEACONS 39
define NL802154_CMD_TRIGGER_SCAN 35
-define NL802154_DEVKEY_ATTR_EXTENDED_ADDR 2
-define NL802154_DEVKEY_ATTR_FRAME_COUNTER 1
-define NL802154_DEVKEY_ATTR_ID 3
-define NL802154_DEV_ADDR_ATTR_EXTENDED 4
-define NL802154_DEV_ADDR_ATTR_MODE 2
-define NL802154_DEV_ADDR_ATTR_PAN_ID 1
-define NL802154_DEV_ADDR_ATTR_SHORT 3
-define NL802154_DEV_ATTR_EXTENDED_ADDR 4
-define NL802154_DEV_ATTR_FRAME_COUNTER 1
-define NL802154_DEV_ATTR_KEY_MODE 6
-define NL802154_DEV_ATTR_PAN_ID 2
-define NL802154_DEV_ATTR_SECLEVEL_EXEMPT 5
-define NL802154_DEV_ATTR_SHORT_ADDR 3
-define NL802154_KEY_ATTR_BYTES 4
-define NL802154_KEY_ATTR_ID 1
-define NL802154_KEY_ATTR_USAGE_CMDS 3
-define NL802154_KEY_ATTR_USAGE_FRAMES 2
-define NL802154_KEY_ID_ATTR_IMPLICIT 3
-define NL802154_KEY_ID_ATTR_INDEX 2
-define NL802154_KEY_ID_ATTR_MODE 1
-define NL802154_KEY_ID_ATTR_SOURCE_EXTENDED 5
-define NL802154_KEY_ID_ATTR_SOURCE_SHORT 4
-define NL802154_SECLEVEL_ATTR_CMD_FRAME 3
-define NL802154_SECLEVEL_ATTR_DEV_OVERRIDE 4
-define NL802154_SECLEVEL_ATTR_FRAME 2
-define NL802154_SECLEVEL_ATTR_LEVELS 1
define NLBL_CALIPSO_A_DOI 1
define NLBL_CALIPSO_A_MTYPE 2
define NLBL_CALIPSO_C_ADD 1
@@ -7008,12 +6865,9 @@ define NLBL_UNLABEL_C_STATICLIST 5
define NLBL_UNLABEL_C_STATICLISTDEF 8
define NLBL_UNLABEL_C_STATICREMOVE 4
define NLBL_UNLABEL_C_STATICREMOVEDEF 7
-define QCA_WLAN_VENDOR_ATTR_MAX 8
-define ROCCATIOCGREPSIZE 2147764465
define SCSI_IOCTL_GET_BUS_NUMBER 21382
define SCSI_IOCTL_GET_IDLUN 21378
define SCSI_IOCTL_SEND_COMMAND 1
-define SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR 2148016386
define SG_EMULATED_HOST 8707
define SG_GET_COMMAND_Q 8816
define SG_GET_RESERVED_SIZE 8818
@@ -7023,11 +6877,10 @@ define SG_IO 8837
define SG_SET_COMMAND_Q 8817
define SG_SET_RESERVED_SIZE 8821
define SG_SET_TIMEOUT 8705
-define SISUSB_COMMAND 3222074173
-define SISUSB_GET_CONFIG 2152002367
-define SISUSB_GET_CONFIG_SIZE 2147808062
define SNDRV_RAWMIDI_IOCTL_STATUS32 3223607072
define SNDRV_RAWMIDI_IOCTL_STATUS64 3224917792
define SW_SYNC_GET_DEADLINE 3222296322
define SW_SYNC_IOC_CREATE_FENCE 3223869184
define SW_SYNC_IOC_INC 1074026241
+define X86_IOC_RDMSR_REGS 3223348128
+define X86_IOC_WRMSR_REGS 3223348129
diff --git a/sys/linux/auto.txt.const b/sys/linux/auto.txt.const
index 9c0077ba4..9d1a9bcc6 100644
--- a/sys/linux/auto.txt.const
+++ b/sys/linux/auto.txt.const
@@ -509,16 +509,7 @@ IOAM6_CMD_DEL_SCHEMA = 5
IOAM6_CMD_DUMP_NAMESPACES = 3
IOAM6_CMD_DUMP_SCHEMAS = 6
IOAM6_CMD_NS_SET_SCHEMA = 7
-IOCNR_GET_BUS_ADDRESS = 5
-IOCNR_GET_DEVICE_ID = 1
-IOCNR_GET_PROTOCOLS = 2
-IOCNR_GET_VID_PID = 6
-IOCNR_HP_SET_CHANNEL = 4
-IOCNR_SET_PROTOCOL = 3
-IOCNR_SOFT_RESET = 7
IOCTL_CONFIG_SYS_RESOURCE_PARAMETERS = 1074356480
-IOCTL_GET_DRV_VERSION = 2
-IOCTL_GET_HARD_VERSION = 1
IOCTL_GET_NUM_DEVICES = 1074028804
IOCTL_START_ACCEL_DEV = 1074356482
IOCTL_STATUS_ACCEL_DEV = 1074028803
@@ -540,9 +531,6 @@ IOCTL_VMCI_QUEUEPAIR_SETVA = 1956
IOCTL_VMCI_SET_NOTIFY = 1995
IOCTL_VMCI_VERSION = 1951
IOCTL_VMCI_VERSION2 = 1959
-IOW_GETINFO = 2150154243
-IOW_READ = 1074315266
-IOW_WRITE = 1074315265
IPVS_CMD_ATTR_DAEMON = 3
IPVS_CMD_ATTR_DEST = 2
IPVS_CMD_ATTR_SERVICE = 1
@@ -625,8 +613,6 @@ MAC802154_HWSIM_CMD_GET_RADIO = 1
MAC802154_HWSIM_CMD_NEW_EDGE = 8
MAC802154_HWSIM_CMD_NEW_RADIO = 3
MAC802154_HWSIM_CMD_SET_EDGE = 6
-MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID = 1
-MAC802154_HWSIM_EDGE_ATTR_LQI = 2
MACSEC_ATTR_IFINDEX = 1
MACSEC_ATTR_OFFLOAD = 9
MACSEC_ATTR_RXSC_CONFIG = 2
@@ -1283,8 +1269,6 @@ NL802154_ATTR_PID = 28
NL802154_ATTR_SCAN_CHANNELS = 33
NL802154_ATTR_SCAN_DONE_REASON = 37
NL802154_ATTR_SCAN_DURATION = 36
-NL802154_ATTR_SCAN_MEAN_PRF = 35
-NL802154_ATTR_SCAN_PREAMBLE_CODES = 34
NL802154_ATTR_SCAN_TYPE = 31
NL802154_ATTR_SEC_DEVICE = 46
NL802154_ATTR_SEC_DEVKEY = 47
@@ -1339,32 +1323,6 @@ NL802154_CMD_SET_TX_POWER = 12
NL802154_CMD_SET_WPAN_PHY_NETNS = 20
NL802154_CMD_STOP_BEACONS = 39
NL802154_CMD_TRIGGER_SCAN = 35
-NL802154_DEVKEY_ATTR_EXTENDED_ADDR = 2
-NL802154_DEVKEY_ATTR_FRAME_COUNTER = 1
-NL802154_DEVKEY_ATTR_ID = 3
-NL802154_DEV_ADDR_ATTR_EXTENDED = 4
-NL802154_DEV_ADDR_ATTR_MODE = 2
-NL802154_DEV_ADDR_ATTR_PAN_ID = 1
-NL802154_DEV_ADDR_ATTR_SHORT = 3
-NL802154_DEV_ATTR_EXTENDED_ADDR = 4
-NL802154_DEV_ATTR_FRAME_COUNTER = 1
-NL802154_DEV_ATTR_KEY_MODE = 6
-NL802154_DEV_ATTR_PAN_ID = 2
-NL802154_DEV_ATTR_SECLEVEL_EXEMPT = 5
-NL802154_DEV_ATTR_SHORT_ADDR = 3
-NL802154_KEY_ATTR_BYTES = 4
-NL802154_KEY_ATTR_ID = 1
-NL802154_KEY_ATTR_USAGE_CMDS = 3
-NL802154_KEY_ATTR_USAGE_FRAMES = 2
-NL802154_KEY_ID_ATTR_IMPLICIT = 3
-NL802154_KEY_ID_ATTR_INDEX = 2
-NL802154_KEY_ID_ATTR_MODE = 1
-NL802154_KEY_ID_ATTR_SOURCE_EXTENDED = 5
-NL802154_KEY_ID_ATTR_SOURCE_SHORT = 4
-NL802154_SECLEVEL_ATTR_CMD_FRAME = 3
-NL802154_SECLEVEL_ATTR_DEV_OVERRIDE = 4
-NL802154_SECLEVEL_ATTR_FRAME = 2
-NL802154_SECLEVEL_ATTR_LEVELS = 1
NLBL_CALIPSO_A_DOI = 1
NLBL_CALIPSO_A_MTYPE = 2
NLBL_CALIPSO_C_ADD = 1
@@ -1509,7 +1467,6 @@ PPPIOCSPASS = 1074820167, 386:arm:1074295879, mips64le:ppc64le:2148561991
PPPIOCUNBRIDGECHAN = 29748, mips64le:ppc64le:536900660
PROCMAP_QUERY = 3228067345
PSAMPLE_CMD_GET_GROUP = 1
-QCA_WLAN_VENDOR_ATTR_MAX = 8
RFKILL_IOC_MAX_SIZE = 2
RFKILL_IOC_NOINPUT = 1
RNDADDENTROPY = 1074287107, mips64le:ppc64le:2148028931
@@ -1518,7 +1475,6 @@ RNDCLEARPOOL = 20998, mips64le:ppc64le:536891910
RNDGETENTCNT = 2147766784, mips64le:ppc64le:1074024960
RNDRESEEDCRNG = 20999, mips64le:ppc64le:536891911
RNDZAPENTCNT = 20996, mips64le:ppc64le:536891908
-ROCCATIOCGREPSIZE = 2147764465
RTC_AIE_OFF = 28674, mips64le:ppc64le:536899586
RTC_AIE_ON = 28673, mips64le:ppc64le:536899585
RTC_ALM_READ = 2149871624, mips64le:ppc64le:1076129800
@@ -1541,7 +1497,6 @@ RTC_WKALM_SET = 1076391951, mips64le:ppc64le:2150133775
SCSI_IOCTL_GET_BUS_NUMBER = 21382
SCSI_IOCTL_GET_IDLUN = 21378
SCSI_IOCTL_SEND_COMMAND = 1
-SECCOMP_IOCTL_NOTIF_ID_VALID_WRONG_DIR = 2148016386
SEG6_ATTR_ALGID = 6
SEG6_ATTR_DST = 1
SEG6_ATTR_DSTLEN = 2
@@ -1564,9 +1519,6 @@ SG_SET_RESERVED_SIZE = 8821
SG_SET_TIMEOUT = 8705
SIOCGIFHWADDR = 35111
SIOCSIFHWADDR = 35108
-SISUSB_COMMAND = 3222074173
-SISUSB_GET_CONFIG = 2152002367
-SISUSB_GET_CONFIG_SIZE = 2147808062
SMC_NETLINK_ADD_UEID = 10
SMC_NETLINK_DISABLE_HS_LIMITATION = 18
SMC_NETLINK_DISABLE_SEID = 15
diff --git a/tools/syz-declextract/declextract.go b/tools/syz-declextract/declextract.go
index 0853756bf..7d85adaf8 100644
--- a/tools/syz-declextract/declextract.go
+++ b/tools/syz-declextract/declextract.go
@@ -62,7 +62,7 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c
if err != nil {
return err
}
- descriptions, interfaces, err := declextract.Run(out, probeInfo, syscallRename, cfg.DebugTrace)
+ descriptions, interfaces, includeUse, err := declextract.Run(out, probeInfo, syscallRename, cfg.DebugTrace)
if err != nil {
return err
}
@@ -94,6 +94,20 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c
if err := osutil.WriteFile(autoFile+".info", serialize(interfaces)); err != nil {
return err
}
+ removeUnused(desc, "", unusedNodes)
+ // Second pass to remove unused defines/includes. This needs to be done after removing
+ // other garbage b/c they may be used by other garbage.
+ unusedConsts, err := compiler.CollectUnusedConsts(desc.Clone(), target, includeUse, eh)
+ if err != nil {
+ return fmt.Errorf("failed to typecheck descriptions: %w\n%s", err, errors.Bytes())
+ }
+ removeUnused(desc, autoFile, unusedConsts)
+ // We need re-parse them again b/c new lines are fixed up during parsing.
+ formatted := ast.Format(ast.Parse(ast.Format(desc), autoFile, nil))
+ return osutil.WriteFile(autoFile, formatted)
+}
+
+func removeUnused(desc *ast.Description, autoFile string, unusedNodes []ast.Node) {
unused := make(map[string]bool)
for _, n := range unusedNodes {
_, typ, name := n.Info()
@@ -101,11 +115,8 @@ func run(autoFile string, loadProbeInfo func() (*ifaceprobe.Info, error), cfg *c
}
desc.Nodes = slices.DeleteFunc(desc.Nodes, func(n ast.Node) bool {
pos, typ, name := n.Info()
- return pos.File != autoFile || unused[typ+name]
+ return autoFile != "" && pos.File != autoFile || unused[typ+name]
})
- // We need re-parse them again b/c new lines are fixed up during parsing.
- formatted := ast.Format(ast.Parse(ast.Format(desc), autoFile, nil))
- return osutil.WriteFile(autoFile, formatted)
}
func prepare(loadProbeInfo func() (*ifaceprobe.Info, error), cfg *clangtool.Config) (
diff --git a/tools/syz-declextract/testdata/file_operations.c b/tools/syz-declextract/testdata/file_operations.c
index 04d548f98..0dd8b9b21 100644
--- a/tools/syz-declextract/testdata/file_operations.c
+++ b/tools/syz-declextract/testdata/file_operations.c
@@ -3,6 +3,7 @@
#include "include/fs.h"
#include "include/uapi/file_operations.h"
+#include "include/uapi/unused_ioctl.h"
static void foo_open() {}
static void foo_read() {}
@@ -43,3 +44,16 @@ const struct file_operations proc_ops[] = {
.unlocked_ioctl = proc_ioctl,
},
};
+
+#define UNUSED_IOCTL2 _IO('c', 2)
+
+static void unused_ioctl(unsigned int cmd) {
+ switch (cmd) {
+ case UNUSED_IOCTL1:
+ case UNUSED_IOCTL2:
+ }
+}
+
+const struct file_operations unused = {
+ .unlocked_ioctl = unused_ioctl,
+};
diff --git a/tools/syz-declextract/testdata/file_operations.c.json b/tools/syz-declextract/testdata/file_operations.c.json
index df1c9a20f..716dbec38 100644
--- a/tools/syz-declextract/testdata/file_operations.c.json
+++ b/tools/syz-declextract/testdata/file_operations.c.json
@@ -45,6 +45,12 @@
"name": "proc_write",
"file": "file_operations.c",
"is_static": true
+ },
+ {
+ "name": "unused_ioctl",
+ "file": "file_operations.c",
+ "is_static": true,
+ "loc": 4
}
],
"consts": [
@@ -72,6 +78,16 @@
"name": "FOO_IOCTL5",
"filename": "include/uapi/file_operations.h",
"value": 3221775109
+ },
+ {
+ "name": "UNUSED_IOCTL1",
+ "filename": "include/uapi/unused_ioctl.h",
+ "value": 25345
+ },
+ {
+ "name": "UNUSED_IOCTL2",
+ "filename": "file_operations.c",
+ "value": 25346
}
],
"structs": [
@@ -185,6 +201,31 @@
"mmap": "proc_open",
"ioctl": "proc_ioctl",
"source_file": "file_operations.c"
+ },
+ {
+ "name": "unused_file_operations",
+ "ioctl": "unused_ioctl",
+ "ioctl_cmds": [
+ {
+ "name": "UNUSED_IOCTL2",
+ "type": {
+ "int": {
+ "byte_size": 1,
+ "is_const": true
+ }
+ }
+ },
+ {
+ "name": "UNUSED_IOCTL1",
+ "type": {
+ "int": {
+ "byte_size": 1,
+ "is_const": true
+ }
+ }
+ }
+ ],
+ "source_file": "file_operations.c"
}
]
} \ No newline at end of file
diff --git a/tools/syz-declextract/testdata/file_operations.c.txt b/tools/syz-declextract/testdata/file_operations.c.txt
index f2a0455bc..e94856980 100644
--- a/tools/syz-declextract/testdata/file_operations.c.txt
+++ b/tools/syz-declextract/testdata/file_operations.c.txt
@@ -6,7 +6,6 @@ type auto_todo int8
include <vdso/bits.h>
include <linux/types.h>
-include <net/netlink.h>
include <include/uapi/file_operations.h>
resource fd_foo_file_operations[fd]
diff --git a/tools/syz-declextract/testdata/functions.c.txt b/tools/syz-declextract/testdata/functions.c.txt
index 6dc51303b..8bd11c8fc 100644
--- a/tools/syz-declextract/testdata/functions.c.txt
+++ b/tools/syz-declextract/testdata/functions.c.txt
@@ -4,8 +4,4 @@ meta automatic
type auto_todo int8
-include <vdso/bits.h>
-include <linux/types.h>
-include <net/netlink.h>
-
functions$auto(x fd) fd
diff --git a/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h b/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h
new file mode 100644
index 000000000..6c3dbb036
--- /dev/null
+++ b/tools/syz-declextract/testdata/include/uapi/unused_ioctl.h
@@ -0,0 +1,6 @@
+// Copyright 2024 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+#include "ioctl.h"
+
+#define UNUSED_IOCTL1 _IO('c', 1)
diff --git a/tools/syz-declextract/testdata/io_uring.c.txt b/tools/syz-declextract/testdata/io_uring.c.txt
index 77183198f..2829bcbf1 100644
--- a/tools/syz-declextract/testdata/io_uring.c.txt
+++ b/tools/syz-declextract/testdata/io_uring.c.txt
@@ -3,8 +3,3 @@
meta automatic
type auto_todo int8
-
-include <vdso/bits.h>
-include <linux/types.h>
-include <net/netlink.h>
-include <include/uapi/io_uring.h>
diff --git a/tools/syz-declextract/testdata/netlink.c.txt b/tools/syz-declextract/testdata/netlink.c.txt
index e61244406..6ceb9111e 100644
--- a/tools/syz-declextract/testdata/netlink.c.txt
+++ b/tools/syz-declextract/testdata/netlink.c.txt
@@ -4,9 +4,6 @@ meta automatic
type auto_todo int8
-include <vdso/bits.h>
-include <linux/types.h>
-include <net/netlink.h>
include <include/uapi/netlink_family.h>
resource genl_bar_family_id$auto[int16]
diff --git a/tools/syz-declextract/testdata/syscall.c.txt b/tools/syz-declextract/testdata/syscall.c.txt
index de87f1866..bb0cad8c4 100644
--- a/tools/syz-declextract/testdata/syscall.c.txt
+++ b/tools/syz-declextract/testdata/syscall.c.txt
@@ -4,9 +4,5 @@ meta automatic
type auto_todo int8
-include <vdso/bits.h>
-include <linux/types.h>
-include <net/netlink.h>
-
chmod$auto(filename ptr[in, filename], mode int32)
open$auto(filename ptr[in, filename], flags int32, mode int32)
diff --git a/tools/syz-declextract/testdata/types.c.txt b/tools/syz-declextract/testdata/types.c.txt
index 45d451d8a..04a160771 100644
--- a/tools/syz-declextract/testdata/types.c.txt
+++ b/tools/syz-declextract/testdata/types.c.txt
@@ -4,10 +4,6 @@ meta automatic
type auto_todo int8
-include <vdso/bits.h>
-include <linux/types.h>
-include <net/netlink.h>
-
bitfield_enum$auto = a, b, c
types_syscall$auto(p ptr[inout, anon_struct$auto], y ptr[inout, void], b ptr[inout, bitfields$auto], pid pid, f int32, v ptr[inout, various$auto])