LLVM Bugzilla is read-only and represents the historical archive of all LLVM issues filled before November 26, 2021. Use github to submit LLVM bugs

Bug 51181 - Emitted binary code changes when -g is enabled at -O0
Summary: Emitted binary code changes when -g is enabled at -O0
Status: CONFIRMED
Alias: None
Product: libraries
Classification: Unclassified
Component: Common Code Generator Code (show other bugs)
Version: trunk
Hardware: PC Linux
: P enhancement
Assignee: Unassigned LLVM Bugs
URL:
Keywords:
Depends on:
Blocks: 37728
  Show dependency tree
 
Reported: 2021-07-23 07:19 PDT by Theodore Wang
Modified: 2021-08-19 14:49 PDT (History)
4 users (show)

See Also:
Fixed By Commit(s):


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Theodore Wang 2021-07-23 07:19:46 PDT
The .text section for the following program (transformed_program0.c) changes after toggling the -g flag.

$ cat transformed_program0.c
int main() {
  goto a;
b:
  return 0;
a:;
}
$
$ clang-trunk -v
clang version 13.0.0 (https://github.com/llvm/llvm-project.git ab5ac659c81a453a3f58df94f39fe8ba3cd35918)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/cnsun/usr/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
$
$ clang-trunk -O0 transformed_program0.c ; objdump --disassemble --section=.text a.out > no_g.txt
$ clang-trunk -g -O0 transformed_program0.c ; objdump --disassemble --section=.text a.out > g.txt
$ diff no_g.txt g.txt
16,17c16,17
<   401033:	49 c7 c0 90 11 40 00 	mov    $0x401190,%r8
<   40103a:	48 c7 c1 20 11 40 00 	mov    $0x401120,%rcx
---
>   401033:	49 c7 c0 a0 11 40 00 	mov    $0x4011a0,%r8
>   40103a:	48 c7 c1 30 11 40 00 	mov    $0x401130,%rcx
90,133c90,131
<   40111b:	8b 45 fc             	mov    -0x4(%rbp),%eax
<   40111e:	5d                   	pop    %rbp
<   40111f:	c3                   	retq
<
< 0000000000401120 <__libc_csu_init>:
<   401120:	f3 0f 1e fa          	endbr64
<   401124:	41 57                	push   %r15
<   401126:	4c 8d 3d 23 2d 00 00 	lea    0x2d23(%rip),%r15        # 403e50 <__frame_dummy_init_array_entry>
<   40112d:	41 56                	push   %r14
<   40112f:	49 89 d6             	mov    %rdx,%r14
<   401132:	41 55                	push   %r13
<   401134:	49 89 f5             	mov    %rsi,%r13
<   401137:	41 54                	push   %r12
<   401139:	41 89 fc             	mov    %edi,%r12d
<   40113c:	55                   	push   %rbp
<   40113d:	48 8d 2d 14 2d 00 00 	lea    0x2d14(%rip),%rbp        # 403e58 <__do_global_dtors_aux_fini_array_entry>
<   401144:	53                   	push   %rbx
<   401145:	4c 29 fd             	sub    %r15,%rbp
<   401148:	48 83 ec 08          	sub    $0x8,%rsp
<   40114c:	e8 af fe ff ff       	callq  401000 <_init>
<   401151:	48 c1 fd 03          	sar    $0x3,%rbp
<   401155:	74 1f                	je     401176 <__libc_csu_init+0x56>
<   401157:	31 db                	xor    %ebx,%ebx
<   401159:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
<   401160:	4c 89 f2             	mov    %r14,%rdx
<   401163:	4c 89 ee             	mov    %r13,%rsi
<   401166:	44 89 e7             	mov    %r12d,%edi
<   401169:	41 ff 14 df          	callq  *(%r15,%rbx,8)
<   40116d:	48 83 c3 01          	add    $0x1,%rbx
<   401171:	48 39 dd             	cmp    %rbx,%rbp
<   401174:	75 ea                	jne    401160 <__libc_csu_init+0x40>
<   401176:	48 83 c4 08          	add    $0x8,%rsp
<   40117a:	5b                   	pop    %rbx
<   40117b:	5d                   	pop    %rbp
<   40117c:	41 5c                	pop    %r12
<   40117e:	41 5d                	pop    %r13
<   401180:	41 5e                	pop    %r14
<   401182:	41 5f                	pop    %r15
<   401184:	c3                   	retq
<   401185:	66 66 2e 0f 1f 84 00 	data16 nopw %cs:0x0(%rax,%rax,1)
<   40118c:	00 00 00 00
<
< 0000000000401190 <__libc_csu_fini>:
<   401190:	f3 0f 1e fa          	endbr64
---
>   40111b:	e9 00 00 00 00       	jmpq   401120 <main+0x10>
>   401120:	8b 45 fc             	mov    -0x4(%rbp),%eax
>   401123:	5d                   	pop    %rbp
>   401124:	c3                   	retq
>   401125:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
>   40112c:	00 00 00
>   40112f:	90                   	nop
>
> 0000000000401130 <__libc_csu_init>:
>   401130:	f3 0f 1e fa          	endbr64
>   401134:	41 57                	push   %r15
>   401136:	4c 8d 3d 13 2d 00 00 	lea    0x2d13(%rip),%r15        # 403e50 <__frame_dummy_init_array_entry>
>   40113d:	41 56                	push   %r14
>   40113f:	49 89 d6             	mov    %rdx,%r14
>   401142:	41 55                	push   %r13
>   401144:	49 89 f5             	mov    %rsi,%r13
>   401147:	41 54                	push   %r12
>   401149:	41 89 fc             	mov    %edi,%r12d
>   40114c:	55                   	push   %rbp
>   40114d:	48 8d 2d 04 2d 00 00 	lea    0x2d04(%rip),%rbp        # 403e58 <__do_global_dtors_aux_fini_array_entry>
>   401154:	53                   	push   %rbx
>   401155:	4c 29 fd             	sub    %r15,%rbp
>   401158:	48 83 ec 08          	sub    $0x8,%rsp
>   40115c:	e8 9f fe ff ff       	callq  401000 <_init>
>   401161:	48 c1 fd 03          	sar    $0x3,%rbp
>   401165:	74 1f                	je     401186 <__libc_csu_init+0x56>
>   401167:	31 db                	xor    %ebx,%ebx
>   401169:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
>   401170:	4c 89 f2             	mov    %r14,%rdx
>   401173:	4c 89 ee             	mov    %r13,%rsi
>   401176:	44 89 e7             	mov    %r12d,%edi
>   401179:	41 ff 14 df          	callq  *(%r15,%rbx,8)
>   40117d:	48 83 c3 01          	add    $0x1,%rbx
>   401181:	48 39 dd             	cmp    %rbx,%rbp
>   401184:	75 ea                	jne    401170 <__libc_csu_init+0x40>
>   401186:	48 83 c4 08          	add    $0x8,%rsp
>   40118a:	5b                   	pop    %rbx
>   40118b:	5d                   	pop    %rbp
>   40118c:	41 5c                	pop    %r12
>   40118e:	41 5d                	pop    %r13
>   401190:	41 5e                	pop    %r14
>   401192:	41 5f                	pop    %r15
134a133,138
>   401195:	66 66 2e 0f 1f 84 00 	data16 nopw %cs:0x0(%rax,%rax,1)
>   40119c:	00 00 00 00
>
> 00000000004011a0 <__libc_csu_fini>:
>   4011a0:	f3 0f 1e fa          	endbr64
>   4011a4:	c3                   	retq
Comment 1 Jeremy Morse 2021-07-23 07:27:08 PDT
It looks to me like unreachableblockelim declines to delete a block with a dbg.label intrinsic in it, which leads to an extraneous empty block.
Comment 2 Paul Robinson 2021-07-23 08:46:28 PDT
(In reply to Jeremy Morse from comment #1)
> It looks to me like unreachableblockelim declines to delete a block with a
> dbg.label intrinsic in it, which leads to an extraneous empty block.

Right, the net difference is this extra jmp:
>   40111b:	e9 00 00 00 00       	jmpq   401120 <main+0x10>
and everything else is a consequence of the extra instruction
causing addresses of things to change.

Knowing when to ignore debug-info instructions is an ongoing pain point.
Comment 3 Theodore Wang 2021-08-19 14:49:31 PDT
Just for reference, here's the diff of the object files. 

$ clang-trunk -v
clang version 14.0.0 (https://github.com/llvm/llvm-project.git f5d5f17d3ad455de2fbb9448acea66cbc09561c5)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /home/cnsun/usr/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Candidate multilib: .;@m64
Candidate multilib: 32;@m32
Candidate multilib: x32;@mx32
Selected multilib: .;@m64
$
$ clang-trunk -O0 -c program.c ; objdump --disassemble --section=.text program.o > no_g.txt
$ clang-trunk -O0 -c -g program.c ; objdump --disassemble --section=.text program.o > g.txt
$ diff no_g.txt g.txt
11,13c11,14
<    b:	8b 45 fc             	mov    -0x4(%rbp),%eax
<    e:	5d                   	pop    %rbp
<    f:	c3                   	retq
---
>    b:	e9 00 00 00 00       	jmpq   10 <main+0x10>
>   10:	8b 45 fc             	mov    -0x4(%rbp),%eax
>   13:	5d                   	pop    %rbp
>   14:	c3                   	retq