Wrong code generated since r22341
Original Reporter info from Mantis: ludob
-
Reporter name: Ludo Brands
Original Reporter info from Mantis: ludob
- Reporter name: Ludo Brands
Description:
Follow up from issue 22842.
Found the following assembler generated for http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/components/codetools/finddeclarationtool.pas?view=markup&revision=38521 around lines 2658:
2657 if (Params.OnIdentifierFound<>@CheckSrcIdentifier) then exit;
2658 if (Params.FoundProc<>nil) then exit; // do not cache proc searches
2659 // cache result
2660 if (Params.NewNode<>nil) and (Params.NewNode.Desc=ctnProcedure) then begin
gdb) x/20i $pc-40
0xb1538e <CACHERESULT+110>: mov -0x8(%rax),%ecx
0xb15391 <CACHERESULT+113>: mov -0x18(%rbp),%rax
0xb15395 <CACHERESULT+117>: mov -0x10(%rax),%rax
0xb15399 <CACHERESULT+121>: mov 0x8f9128(%rip),%rdx # 0x140e4c8
0xb153a0 <CACHERESULT+128>: mov %rdx,-0x20(%rbp)
0xb153a4 <CACHERESULT+132>: mov %rax,-0x18(%rbp)
0xb153a8 <CACHERESULT+136>: mov 0x38(%rcx),%rax
0xb153ac <CACHERESULT+140>: cmp -0x20(%rbp),%rax
0xb153b0 <CACHERESULT+144>: jne 0xb15447 <CACHERESULT+295>
=> 0xb153b6 <CACHERESULT+150>: mov -0x18(%rbp),%rax
0xb153ba <CACHERESULT+154>: mov -0x8(%rax),%rax
0xb153be <CACHERESULT+158>: mov 0x50(%rax),%rax
0xb153c2 <CACHERESULT+162>: test %rax,%rax
0xb153c5 <CACHERESULT+165>: jne 0xb15447 <CACHERESULT+295>
0xb153cb <CACHERESULT+171>: mov -0x18(%rbp),%rax
0xb153cf <CACHERESULT+175>: mov -0x8(%rax),%rax
0xb153d3 <CACHERESULT+179>: mov 0x80(%rax),%rax
0xb153da <CACHERESULT+186>: test %rax,%rax
0xb153dd <CACHERESULT+189>: je 0xb15406 <CACHERESULT+230>
0xb153df <CACHERESULT+191>: mov -0x18(%rbp),%rax
Problem is mov %rax,-0x18(%rbp) which overwrites the object pointer used later.
fpc 2.6.1 generated:
(gdb) x/20i 0xb8d868
0xb8d868 <CACHERESULT+112>: mov -0x8(%rax),%edx
0xb8d86b <CACHERESULT+115>: mov -0x18(%rbp),%rax
0xb8d86f <CACHERESULT+119>: mov -0x10(%rax),%rax
0xb8d873 <CACHERESULT+123>: mov %rax,-0x20(%rbp)
0xb8d877 <CACHERESULT+127>: mov 0xc6456a(%rip),%rax # 0x17f1de8
0xb8d87e <CACHERESULT+134>: mov %rax,-0x28(%rbp)
0xb8d882 <CACHERESULT+138>: mov 0x38(%rdx),%rax
0xb8d886 <CACHERESULT+142>: cmp -0x28(%rbp),%rax
0xb8d88a <CACHERESULT+146>: jne 0xb8d91e <CACHERESULT+294>
0xb8d890 <CACHERESULT+152>: mov -0x18(%rbp),%rax
0xb8d894 <CACHERESULT+156>: mov -0x8(%rax),%rax
0xb8d898 <CACHERESULT+160>: mov 0x50(%rax),%rax
0xb8d89c <CACHERESULT+164>: test %rax,%rax
0xb8d89f <CACHERESULT+167>: jne 0xb8d91e <CACHERESULT+294>
0xb8d8a5 <CACHERESULT+173>: mov -0x18(%rbp),%rax
0xb8d8a9 <CACHERESULT+177>: mov -0x8(%rax),%rax
0xb8d8ad <CACHERESULT+181>: mov 0x80(%rax),%rax
0xb8d8b4 <CACHERESULT+188>: test %rax,%rax
0xb8d8b7 <CACHERESULT+191>: je 0xb8d8e0 <CACHERESULT+232>
0xb8d8b9 <CACHERESULT+193>: mov -0x18(%rbp),%rax
On i386 the code generated is
(gdb) x/20i 0x83809c5
0x83809c5 <CACHERESULT+85>: mov -0xc(%ebp),%eax
0x83809c8 <CACHERESULT+88>: mov -0x4(%eax),%ecx
0x83809cb <CACHERESULT+91>: mov -0xc(%ebp),%eax
0x83809ce <CACHERESULT+94>: mov -0x8(%eax),%edx
0x83809d1 <CACHERESULT+97>: mov $0x838b700,%eax
0x83809d6 <CACHERESULT+102>: mov %eax,-0x10(%ebp)
0x83809d9 <CACHERESULT+105>: mov %edx,-0xc(%ebp)
0x83809dc <CACHERESULT+108>: mov 0x1c(%ecx),%eax
0x83809df <CACHERESULT+111>: cmp -0x10(%ebp),%eax
0x83809e2 <CACHERESULT+114>: jne 0x8380a4d <CACHERESULT+221>
0x83809e4 <CACHERESULT+116>: mov -0xc(%ebp),%eax
0x83809e7 <CACHERESULT+119>: mov -0x4(%eax),%eax
0x83809ea <CACHERESULT+122>: mov 0x28(%eax),%eax
0x83809ed <CACHERESULT+125>: test %eax,%eax
0x83809ef <CACHERESULT+127>: jne 0x8380a4d <CACHERESULT+221>
0x83809f1 <CACHERESULT+129>: mov -0xc(%ebp),%eax
0x83809f4 <CACHERESULT+132>: mov -0x4(%eax),%eax
0x83809f7 <CACHERESULT+135>: mov 0x40(%eax),%eax
0x83809fa <CACHERESULT+138>: test %eax,%eax
0x83809fc <CACHERESULT+140>: je 0x8380a1c <CACHERESULT+172>
Here also the object pointer is overwritten with mov %edx,-0xc(%ebp)
Mantis conversion info:
- Mantis ID: 22864
- Build: 22373
- Platform: x64 i386
- Version: 2.7.1
- Fixed in version: 3.0.0
- Fixed in revision: 22864 (#312e8b8e)
- Monitored by: » BigChimp (Reinier Olislagers), » lks (lks), » AntonK (Anton Kavalenka)