Bug 82999 - a func has two entrys: one inlined, another is normal
Summary: a func has two entrys: one inlined, another is normal
Status: RESOLVED WONTFIX
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 5.4.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-11-15 03:12 UTC by zuogang
Modified: 2017-11-15 08:38 UTC (History)
0 users

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description zuogang 2017-11-15 03:12:19 UTC
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.
Comment 1 Richard Biener 2017-11-15 08:38:01 UTC
Just use -fno-partial-inlining if you don't like it.