http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59197

            Bug ID: 59197
           Summary: An alias from an always_inline function causes
                    inconsistent behavior
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: luto at mit dot edu

This program:

extern void func(void);
extern __inline __attribute__((__always_inline__))
__attribute__((__gnu_inline__)) void func(void) { }

extern void alias_target_func(void) {}
extern void func(void) __attribute__((alias("alias_target_func")));

extern void caller(void)
{
  func();
}

fails to compile on 4.7, 4.8, and trunk with -c -fPIC -O2, saying:

inline_alias.c: In function ‘caller’:
inline_alias.c:5:13: error: inlining failed in call to always_inline ‘func’:
function body can be overwritten at link time
 extern void func(void) __attribute__((alias("alias_target_func")));
             ^
inline_alias.c:9:7: error: called from here
   func();
       ^

It compiles on an old copy of gcc 4.5 I have lying around, although I don't
think I agree with the generated code.

gcc 4.5.1 (and gcc 4.8.2 with -O0) emit the call to func.  With the alias
removed, the call to func is not emitted, even at -O0.  Oddly, without -fPIC,
gcc 4.8 and trunk inline the call to func.

trunk's behavior with -O0 (w/o -fPIC) is even stranger: it emits a call to
alias_target_func.  I can't reproduce that with other flags or on gcc 4.8.

I think that the correct behavior would be to either (a) reject the alias as a
redefinition of func or (b) accept this code as valid and inline func.  Given
the documented behavior for "extern __attribute__((gnu_inline))", the inline
version of func should be used (or this code should be rejected outright).

This may be related to PR33763 or PR46596, but I don't think it's the same
issue as either one, although the respective fixes could be involved in the
behavior changes.

It came up in practice when openonload-201310 failed to build with
_FORTIFY_SOURCE=2.

Reply via email to