Daniel Lohmann wrote:
Jim Marshall schrieb:
I have some code which we have been compiling with GCC 3.2.2 (yes its
old). We recently added Solaris SPARC which has GCC 3.4.6. I have a
couple of functions that I would prefer to be inline all the time. On
GCC 3.2.2 I receive no warnings when I compile my code (which makes me
believe these functions are inlined). I am using the following compile
options:
cc -o /home/jmars/server/lib/schema.o -O3 -finline-functions
-fmerge-constants -fexpensive-optimizations -Wuninitialized -fpic -c
-Werror -Winline -Wformat -Wno-return-type
-Werror-implicit-function-declaration -Wparentheses -Wredundant-decls
-m32 -msse -minline-all-stringops -finline -D_UNICODE -DUNICODE
-D_COMPILE_UNIX -D__USE_POSIX -D_GNU_SOURCE -DTHREAD_SAFE -D_REENTRANT
-D_LINUX -I./include -DWSI_EXPAT_BUILD
-I/home/jmars/server/private/include -I/home/jmars/api/include
-I/home/jmars/utils/include -I/home/jmars/common/lib/include
-I/home/jmars/202/wsi/thirdparty/expat/include -D_USE_GC
./src/cimxml_schema.c
and I get the following warning (this is with GCC 4.1.1 on Linux FC 6)
- (I don't have direct access to my Sparc machine but the warning was
similar)
./src/schema.c: In function ‘scope_encodeformat’:
/home/jmars/server/api/include/apiext.h:382: warning: inlining failed
in call to ‘freeValidMemory’: --param inline-unit-growth limit reached
./src/schema.c:3285: warning: called from here
make[2]: *** [/home/jmars/proto/temp/server/lib/schema.o] Error 1
The function is question is (in this case INLINE is defined as #define
INLINE inline):
static INLINE void freeValidMemory(void* vptr, wsi_heap heap)
{
if (vptr != NULL)
{
/* if we are finding leaks, make sure we always call GC_free */
if (GC_find_leak == 0)
{
/* not looking for leaks */
size_t ptrSize = GC_size(vptr);
if (ptrSize > 0 && ptrSize <= GC_SMALL_SIZE)
{
/* set the first element to 0 (NULL) */
memset(vptr, 0, 1);
} else {
GC_FREE(vptr);
}
} else {
/* looking for leaks, call GC_FREE */
GC_FREE(vptr);
}
}
}
Any thoughts on how I can force this function to be inline?
If you want a function to be inlined in any case define it with
__attribute__((always_inline)).
Another option might be to generally increase the inline limit with
-finline-limit=<high number>. The default is, AFAIK, 600, so giving it a
6000 should inline almost everything. Take a look at the inline options
in the gcc manual.
Daniel
Hi Daniel,
Thanks for the reply. I was trying to avoid the -finline-limit usage.
I tried the __attribute__((always_inline)) but this causes other
warnings due to some of the other compiler flags I have. Specifically
because I have the function declared in a header as static any module
that includes this header but doesn't use these functions generate a
warning "'freeValidMemory' defined but not used" :(
I think I will just stick with letting the compiler determine what it
can inline and remove the -Winline, the compiler probably knows better
then I do anyway :O
Thanks for the quick reply, I appreciate it!
-Jim