LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: David Rientjes <rientjes@google.com>
To: Jan Hubicka <hubicka@ucw.cz>
Cc: Joe Perches <joe@perches.com>, Matthew Wilcox <matthew@wil.cx>,
	LKML <linux-kernel@vger.kernel.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	linux-fsdevel@vger.kernel.org, gcc@gcc.gnu.org,
	zadeck@naturalbridge.com
Subject: Re: [PATCH] linux/fs.h - Convert debug functions declared inline  __attribute__((format (printf,x,y) to statement expression macros
Date: Thu, 28 Feb 2008 00:28:37 -0800 (PST)	[thread overview]
Message-ID: <alpine.DEB.1.00.0802280021250.2818@chino.kir.corp.google.com> (raw)
In-Reply-To: <20080227235835.GA31048@atrey.karlin.mff.cuni.cz>

On Thu, 28 Feb 2008, Jan Hubicka wrote:

> > -static inline void __attribute__((format(printf, 1, 2))) 
> > -__simple_attr_check_format(const char *fmt, ...)
> 
> It would be nice to have a testcase, but I guess it is because GCC can't
> inline variadic functions.  The function gets identified as const and
> removed as unused by DCE, but this happens later (that is after early
> inlining and before real inlining).  GCC 4.0.3 didn't have early inliner
> so it is probably where the difference is comming from.
> 
> One possibility to handle this side case would be to mark const
> functions early during early optimization and only refine it using
> Kenny's existing IPA pass that should turn this issue into no-op.
> 
> We probably also can simply allow inlining variadic functions not
> calling va_start.  I must say that this option appeared to me but I was
> unable to think of any sane use case.  This probably is one ;)
> 

The only testcase I can identify is the current version of Linux, because 
I've certainly never seen this type of behavior before.

What's interesting is that you can remove __simple_attr_check_format() 
completely and replace it with an empty function definition:

	static inline void completely_useless_function(void)
	{
	}

that is not referenced anywhere in the tree:

diff --git a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2044,7 +2044,6 @@ static inline void simple_transaction_set(struct file *file, size_t n)
 #define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt)           \
 static int __fops ## _open(struct inode *inode, struct file *file)     \
 {                                                                      \
-       __simple_attr_check_format(__fmt, 0ull);                        \
        return simple_attr_open(inode, file, __get, __set, __fmt);      \
 }                                                                      \
 static struct file_operations __fops = {                               \
@@ -2055,10 +2054,8 @@ static struct file_operations __fops = {                         \
        .write   = simple_attr_write,                                   \
 };
 
-static inline void __attribute__((format(printf, 1, 2)))
-__simple_attr_check_format(const char *fmt, ...)
+static inline void completely_useless_function(void)
 {
-       /* don't do anything, just let the compiler check the arguments; */
 }
 
 int simple_attr_open(struct inode *inode, struct file *file,


And the size remains identical after this patch has been applied:

   text    data     bss     dec     hex filename
5386111  846328  719560 6951999  6a143f vmlinux.before
5386111  846328  719560 6951999  6a143f vmlinux.after

Yet, if you subsequently remove completely_useless_function(), the image 
is smaller:


diff --git a/include/linux/fs.h b/include/linux/fs.h
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2044,7 +2044,6 @@ static inline void simple_transaction_set(struct file *file, size_t n)
 #define DEFINE_SIMPLE_ATTRIBUTE(__fops, __get, __set, __fmt)           \
 static int __fops ## _open(struct inode *inode, struct file *file)     \
 {                                                                      \
-       __simple_attr_check_format(__fmt, 0ull);                        \
        return simple_attr_open(inode, file, __get, __set, __fmt);      \
 }                                                                      \
 static struct file_operations __fops = {                               \
@@ -2055,12 +2054,6 @@ static struct file_operations __fops = {                         \
        .write   = simple_attr_write,                                   \
 };
 
-static inline void __attribute__((format(printf, 1, 2)))
-__simple_attr_check_format(const char *fmt, ...)
-{
-       /* don't do anything, just let the compiler check the arguments; */
-}
-
 int simple_attr_open(struct inode *inode, struct file *file,
                     int (*get)(void *, u64 *), int (*set)(void *, u64),
                     const char *fmt);


Then:

   text    data     bss     dec     hex filename
5386111  846328  719560 6951999  6a143f vmlinux.before
5386047  846328  719560 6951935  6a13ff vmlinux.after

So the only thing I can imagine is that gcc 4.1.3 and gcc 4.2.2 emit a 
larger text size simply based on the number of functions being defined, 
regardless of whether they are referenced in the source or not.  gcc 4.0.3 
doesn't have this behavior.

It's easy to reproduce:

	$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.3.tar.bz2
	$ tar xvf linux-2.6.24.3.tar.bz2
	$ cd linux-2.6.24.3
	$ make defconfig ARCH=x86_64
	$ make ARCH=x86_64
	$ size vmlinux
	$ patch -p1 < remove-simple-attr-check-format.patch
	$ make ARCH=x86_64
	$ size vmlinux

  reply	other threads:[~2008-02-28  8:29 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-27  3:08 [PATCH] linux/kernel.h linux/device.h " Joe Perches
2008-02-27  4:02 ` [PATCH] linux/fs.h " Joe Perches
2008-02-27  4:13   ` Matthew Wilcox
2008-02-27  4:55     ` Joe Perches
2008-02-27  5:44     ` David Rientjes
2008-02-27  6:54       ` Joe Perches
2008-02-27  7:38         ` David Rientjes
2008-02-27 22:58         ` David Rientjes
2008-02-27 23:58           ` Jan Hubicka
2008-02-28  8:28             ` David Rientjes [this message]
2008-02-28  8:42             ` Jakub Jelinek
2008-02-28 10:23               ` Jan Hubicka
2008-02-29  1:09                 ` Joe Perches
2008-03-23 15:22                   ` Denys Vlasenko
2008-03-24 19:52                     ` Joe Perches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.1.00.0802280021250.2818@chino.kir.corp.google.com \
    --to=rientjes@google.com \
    --cc=gcc@gcc.gnu.org \
    --cc=hubicka@ucw.cz \
    --cc=joe@perches.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=matthew@wil.cx \
    --cc=torvalds@linux-foundation.org \
    --cc=zadeck@naturalbridge.com \
    --subject='Re: [PATCH] linux/fs.h - Convert debug functions declared inline  __attribute__((format (printf,x,y) to statement expression macros' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).