[Bug c/82999] New: a func has two entrys: one inlined, another is normal

zuogang at huawei dot com gcc-bugzilla@gcc.gnu.org
Wed Nov 15 03:12:00 GMT 2017


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82999

            Bug ID: 82999
           Summary: a func has two entrys: one inlined, another is normal
           Product: gcc
           Version: 5.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: zuogang at huawei dot com
  Target Milestone: ---

centos 7 kernel: 3.10.0-693.2.2.el7.x86_64
global func tcp_v4_mtu_reduced has two entrys , one is inlined when called in
the same file (such as func tcp_v4_err call tcp_v4_mtu_reduced), aother is a
normal entry call the .part. stub.

the inlined entry of tcp_v4_mtu_reduced (part of code of func tcp_v4_err):
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:445
ffffffff817663ab:       89 83 30 07 00 00       mov    %eax,0x730(%rbx)
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:446
ffffffff817663b1:       75 26                   jne    ffffffff817663d9
<tcp_v4_err+0x499>
tcp_v4_mtu_reduced():
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:276
ffffffff817663b3:       0f b6 43 12             movzbl 0x12(%rbx),%eax
ffffffff817663b7:       ba 80 04 00 00          mov    $0x480,%edx
ffffffff817663bc:       0f a3 c2                bt     %eax,%edx
ffffffff817663bf:       0f 82 b7 fd ff ff       jb     ffffffff8176617c
<tcp_v4_err+0x23c>
ffffffff817663c5:       48 89 df                mov    %rbx,%rdi
ffffffff817663c8:       e8 43 e2 ff ff          callq  ffffffff81764610
<tcp_v4_mtu_reduced.part.29>
ffffffff817663cd:       48 8d 83 80 00 00 00    lea    0x80(%rbx),%rax
ffffffff817663d4:       e9 aa fd ff ff          jmpq   ffffffff81766183
<tcp_v4_err+0x243>
test_and_set_bit():
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/arch/x86/include/asm/bitops.h:206
ffffffff817663d9:       f0 0f ba ab 30 05 00    lock btsl $0x5,0x530(%rbx)
ffffffff817663e0:       00 05 
ffffffff817663e2:       0f 82 94 fd ff ff       jb     ffffffff8176617c
<tcp_v4_err+0x23c>


the normal entry of tcp_v4_mtu_reduced:
ffffffff817646c0 <tcp_v4_mtu_reduced>:
tcp_v4_mtu_reduced():
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:271
ffffffff817646c0:       e8 3b f6 0b 00          callq  ffffffff81823d00
<__fentry__>
                        ffffffff817646c1: R_X86_64_PC32 __fentry__-0x4
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:276
ffffffff817646c5:       0f b6 47 12             movzbl 0x12(%rdi),%eax
ffffffff817646c9:       ba 80 04 00 00          mov    $0x480,%edx
ffffffff817646ce:       0f a3 c2                bt     %eax,%edx
ffffffff817646d1:       73 01                   jae    ffffffff817646d4
<tcp_v4_mtu_reduced+0x14>
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:303
ffffffff817646d3:       c3                      retq   
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:271
ffffffff817646d4:       55                      push   %rbp
ffffffff817646d5:       48 89 e5                mov    %rsp,%rbp
ffffffff817646d8:       e8 33 ff ff ff          callq  ffffffff81764610
<tcp_v4_mtu_reduced.part.29>
/usr/src/debug/kernel-4.9.el7.centos/linux-4.9.54-203.el7.centos.x86_64/net/ipv4/tcp_ipv4.c:303
ffffffff817646dd:       5d                      pop    %rbp
ffffffff817646de:       66 90                   xchg   %ax,%ax
ffffffff817646e0:       c3                      retq   


gcc generated code like this make ftrace and other kernel tools functions
abnormal, when a func is called, ftrace cannot knew it, so I think when gcc
want to do some works about generate stub func .part., should know the target
func is global or not, if it is global, don't do like that, it will make a func
has two entrys and confuse the kernel and peoples.


More information about the Gcc-bugs mailing list