[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


            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):
ffffffff817663ab:       89 83 30 07 00 00       mov    %eax,0x730(%rbx)
ffffffff817663b1:       75 26                   jne    ffffffff817663d9
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
ffffffff817663c5:       48 89 df                mov    %rbx,%rdi
ffffffff817663c8:       e8 43 e2 ff ff          callq  ffffffff81764610
ffffffff817663cd:       48 8d 83 80 00 00 00    lea    0x80(%rbx),%rax
ffffffff817663d4:       e9 aa fd ff ff          jmpq   ffffffff81766183
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

the normal entry of tcp_v4_mtu_reduced:
ffffffff817646c0 <tcp_v4_mtu_reduced>:
ffffffff817646c0:       e8 3b f6 0b 00          callq  ffffffff81823d00
                        ffffffff817646c1: R_X86_64_PC32 __fentry__-0x4
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
ffffffff817646d3:       c3                      retq   
ffffffff817646d4:       55                      push   %rbp
ffffffff817646d5:       48 89 e5                mov    %rsp,%rbp
ffffffff817646d8:       e8 33 ff ff ff          callq  ffffffff81764610
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