• J
    driver core: Convert debug functions declared inline __attribute__((format... · 1429db83
    Joe Perches 提交于
    driver core: Convert debug functions declared inline __attribute__((format (printf,x,y) to statement expression macros
    
    When DEBUG is not defined, pr_debug and dev_dbg and some
    other local debugging functions are specified as:
    
    "inline __attribute__((format (printf, x, y)))"
    
    This is done to validate printk arguments when not debugging.
    
    Converting these functions to macros or statement expressions
    "do { if (0) printk(fmt, ##arg); } while (0)"
    or
    "({ if (0) printk(fmt, ##arg); 0; })
    makes at least gcc 4.2.2 produce smaller objects.
    
    This has the additional benefit of allowing the optimizer to
    avoid calling functions like print_mac that might have been
    arguments to the printk.
    
    defconfig x86 current:
    
    $ size vmlinux
       text    data     bss     dec     hex filename
    4716770  474560  618496 5809826  58a6a2 vmlinux
    
    all converted: (More patches follow)
    
    $ size vmlinux
       text    data     bss     dec     hex filename
    4716642  474560  618496 5809698  58a622 vmlinux
    
    Even kernel/sched.o, which doesn't even use these
    functions, becomes smaller.
    
    It appears that merely having an indirect include
    of <linux/device.h> can cause bigger objects.
    
    $ size sched.inline.o sched.if0.o
       text    data     bss     dec     hex filename
      31385    2854     328   34567    8707 sched.inline.o
      31366    2854     328   34548    86f4 sched.if0.o
    
    The current preprocessed only kernel/sched.i file contains:
    
    # 612 "include/linux/device.h"
    static inline __attribute__((always_inline)) int __attribute__ ((format (printf, 2, 3)))
    dev_dbg(struct device *dev, const char *fmt, ...)
    {
     return 0;
    }
    # 628 "include/linux/device.h"
    static inline __attribute__((always_inline)) int __attribute__ ((format (printf, 2, 3)))
    dev_vdbg(struct device *dev, const char *fmt, ...)
    {
     return 0;
    }
    
    Removing these unused inlines from sched.i shrinks sched.o
    Signed-off-by: NJoe Perches <joe@perches.com>
    Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
    
    1429db83
device.h 20.7 KB