aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2025-01-17 10:39:47 +0100
committerDmitry Vyukov <dvyukov@google.com>2025-01-17 18:09:32 +0000
commitf2cb035c8f931efff4a020b164e657f16f51934b (patch)
tree967cd39fb98171cba878893a41ca461ffa993c8c
parent38ee454540b9b41d5cc173871dfbf7dd140e8abc (diff)
pkg/declextract: remove unused includes and defines
This is nice on its own, but this will also help to prevent lots of problems when we export more info from the clang tool in future. The clang tool does not know what will end up in the final descriptions, so it exports info about all consts that it encounters. As the result we pull in lots of includes/defines, and lots of kernel includes/defines are broken or create problems. So the fewer we have, the better.
-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])