Skip to content

uselex.rb as a tiny tool to find dead code

Sergei Trofimovich linux-btrfs lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest7 patches 10 repliesIn review

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/7btrfs: cleanup: mark 'btrfs_lookup_fs_root' as staticfs/btrfs/disk-io.c+2 -20 replies
2/7btrfs: cleanup: mark 'set_state_private' as staticfs/btrfs/extent_io.c fs/btrfs/extent_io.h+1 -20 replies
3/7btrfs: cleanup: mark 'btrfs_write_and_wait_marked_extents' as staticfs/btrfs/transaction.c fs/btrfs/transaction.h+2 -41 reply
4/7btrfs: cleanup: removed unused 'btrfs_start_transaction_lflush'fs/btrfs/transaction.c fs/btrfs/transaction.h+0 -91 reply
5/7btrfs: cleanup: mark 'btrfs_read_root_item' as staticfs/btrfs/ctree.h fs/btrfs/root-tree.c+2 -40 replies
6/7btrfs: cleanup: removed unused 'btrfs_reada_detach'fs/btrfs/ctree.h fs/btrfs/reada.c+1 -95 replies
7/7btrfs: cleanup: removed unused 'btrfs_get_inode_ref_index'fs/btrfs/ctree.h fs/btrfs/inode-item.c+0 -711 reply

Reviews trailers per patch

1 of 7 patches has a Reviewed-by or Acked-by.

PatchDavid Sterba
1/7
2/7
3/7
4/7
5/7
6/7
7/7R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [PATCH 0/7] uselex.rb as a tiny tool to find dead code

From: Sergei Trofimovich <[email protected]>

Hi guys!

TL;DR:

the patches remove (currently or already) dead code and localize symbol visibility used only in one module.

Thanks!

The Story:

Once upon a time I've got very simple idea to find dead code in large C/C++ mixed project at work.

The things of my primary interest were things of too large visibility scope, like:
- externally visible global variables used only in module defining the variable
- and functions of the same property

Once you identify those functions and mark as 'static' you achieve two goals:

- minor: give compiler possibility to inline code a bit better (especially for one-caller case)
- more interesting: possibility to spot that the symbol is no longer used at all

Hence the project idea:
1. scan all intermediate object (.o) files for exported symbols
2. find such symbols that are not imported into any .o files

Meet uselex.rb: one-file script to parse 'nm' output:

https://github.com/trofi/uselex/blob/master/uselex.rb

For linux's kernel it's use is as simple as:

    $ make $config && make
    $ uselex.rb `find -name '*.o'`

and you've got material to look at!

It outputs 3000 symbols thus I've started small:

    $ uselex.rb `find fs/btrfs -name '*.o'

To get an impression it reports such things:

set_state_private: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/btrfs.o fs/btrfs/extent_io.o
btrfs_get_inode_ref_index: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/inode-item.o fs/btrfs/btrfs.o
btrfs_print_tree: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/print-tree.o fs/btrfs/btrfs.o
btrfs_reada_detach: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/reada.o fs/btrfs/btrfs.o __btrfs_getxattr: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/xattr.o fs/btrfs/btrfs.o __btrfs_setxattr: [R]: exported from: fs/btrfs/built-in.o fs/btrfs/xattr.o fs/btrfs/btrfs.o
btrfs_read_root_item: [R]: exported from: fs/btrfs/root-tree.o fs/btrfs/built-in.o fs/btrfs/btrfs.o __tracepoint_btrfs_sync_fs: [R]: exported from: fs/btrfs/super.o fs/btrfs/built-in.o fs/btrfs/btrfs.o btrfs_start_transaction_lflush: [R]: exported from: fs/btrfs/transaction.o fs/btrfs/built-in.o fs/btrfs/btrfs.o btrfs_write_and_wait_marked_extents: [R]: exported from: fs/btrfs/transaction.o fs/btrfs/built-in.o fs/btrfs/btrfs.o
ulist_fini: [R]: exported from: fs/btrfs/ulist.o fs/btrfs/built-in.o fs/btrfs/btrfs.o
ulist_init: [R]: exported from: fs/btrfs/ulist.o fs/btrfs/built-in.o fs/btrfs/btrfs.o

You just need to make sure it does not lie too much.

For example '__btrfs_getxattr' needs to be brought under '#ifdef CONFIG_BTRFS_FS_POSIX_ACL' and not removed entirely.

Thanks for your patience!