[Lldb-commits] [lldb] r282683 - Add a unit test for an x86_64 assembly inspection of
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Sep 30 05:27:03 PDT 2016
I made a quick investigation today. The problem is indeed specific to
gcc-4.9. The main differences I could see is that gcc-4.9 generates a
different prologue for the function, and uses pushl for argument passing.
This confuses the emulator/augmenter and the unwind information at some
points ends up being incorrect. Since the problem starts to occur after the
first pushl instruction, i am guessing the problem is with those. I'll try
to investigate more next week.
For reference, the function with 4.9 looks like this:
a.out`main:
0x80484eb <+0>: leal 0x4(%esp), %ecx
0x80484ef <+4>: andl $-0x10, %esp
0x80484f2 <+7>: pushl -0x4(%ecx)
0x80484f5 <+10>: pushl %ebp
0x80484f6 <+11>: movl %esp, %ebp
0x80484f8 <+13>: pushl %edi
0x80484f9 <+14>: pushl %esi
0x80484fa <+15>: pushl %ebx
0x80484fb <+16>: pushl %ecx
0x80484fc <+17>: subl $0x28, %esp
0x80484ff <+20>: subl $0xc, %esp
0x8048502 <+23>: pushl $0x18
0x8048504 <+25>: calll 0x80483d0 ; symbol stub for:
operator new[](unsigned int)
0x8048509 <+30>: addl $0x10, %esp
0x804850c <+33>: movl %eax, %edi
0x804850e <+35>: movl %edi, %eax
0x8048510 <+37>: movl $0x1, %esi
0x8048515 <+42>: movl %eax, %ebx
0x8048517 <+44>: jmp 0x804852b ; <+64> at
main.cpp:26
0x8048519 <+46>: subl $0xc, %esp
0x804851c <+49>: pushl %ebx
0x804851d <+50>: calll 0x80485cc ; foo::foo at
main.cpp:16
0x8048522 <+55>: addl $0x10, %esp
0x8048525 <+58>: addl $0xc, %ebx
0x8048528 <+61>: subl $0x1, %esi
0x804852b <+64>: cmpl $-0x1, %esi
0x804852e <+67>: jne 0x8048519 ; <+46> at
main.cpp:26
0x8048530 <+69>: movl %edi, -0x1c(%ebp)
0x8048533 <+72>: movl -0x1c(%ebp), %eax
0x8048536 <+75>: movl $0x1, (%eax)
0x804853c <+81>: movl -0x1c(%ebp), %eax
0x804853f <+84>: movl $0x9, 0x4(%eax)
0x8048546 <+91>: movl -0x1c(%ebp), %eax
0x8048549 <+94>: addl $0xc, %eax
0x804854c <+97>: movl $0x8, (%eax)
0x8048552 <+103>: movl -0x1c(%ebp), %eax
0x8048555 <+106>: addl $0xc, %eax
0x8048558 <+109>: movl $0x5, 0x4(%eax)
0x804855f <+116>: movl -0x1c(%ebp), %eax
0x8048562 <+119>: addl $0xc, %eax
0x8048565 <+122>: movl $0x7, 0x4(%eax)
0x804856c <+129>: movl -0x1c(%ebp), %eax
0x804856f <+132>: leal 0xc(%eax), %edx
0x8048572 <+135>: movl 0x80486a4, %eax
0x8048577 <+140>: movl %eax, 0x8(%edx)
0x804857a <+143>: leal -0x34(%ebp), %ebx
0x804857d <+146>: movl 0x80486a8, %eax
0x8048582 <+151>: pushl %eax
0x8048583 <+152>: pushl $0x2
0x8048585 <+154>: pushl $0x1
0x8048587 <+156>: pushl %ebx
-> 0x8048588 <+157>: calll 0x80485f0 ; foo::foo at
main.cpp:17
0x804858d <+162>: addl $0x10, %esp
0x8048590 <+165>: leal 0xc(%ebx), %edx
0x8048593 <+168>: movl 0x80486ac, %eax
0x8048598 <+173>: pushl %eax
0x8048599 <+174>: pushl $0x5
0x804859b <+176>: pushl $0x4
0x804859d <+178>: pushl %edx
0x804859e <+179>: calll 0x80485f0 ; foo::foo at
main.cpp:17
0x80485a3 <+184>: addl $0x10, %esp
0x80485a6 <+187>: cmpl $0x0, -0x1c(%ebp)
0x80485aa <+191>: je 0x80485ba ; <+207> at
main.cpp:42
0x80485ac <+193>: subl $0xc, %esp
0x80485af <+196>: pushl -0x1c(%ebp)
0x80485b2 <+199>: calll 0x80483e0 ; symbol stub for:
operator delete[](void*)
0x80485b7 <+204>: addl $0x10, %esp
0x80485ba <+207>: movl $0x0, %eax
0x80485bf <+212>: leal -0x10(%ebp), %esp
0x80485c2 <+215>: popl %ecx
0x80485c3 <+216>: popl %ebx
0x80485c4 <+217>: popl %esi
0x80485c5 <+218>: popl %edi
0x80485c6 <+219>: popl %ebp
0x80485c7 <+220>: leal -0x4(%ecx), %esp
0x80485ca <+223>: retl
whereas the same function compiled with gcc-4.8 is this:
0x804850d <+0>: pushl %ebp
0x804850e <+1>: movl %esp, %ebp
0x8048510 <+3>: pushl %edi
0x8048511 <+4>: pushl %esi
0x8048512 <+5>: pushl %ebx
0x8048513 <+6>: andl $-0x10, %esp
0x8048516 <+9>: subl $0x30, %esp
0x8048519 <+12>: movl $0x18, (%esp)
0x8048520 <+19>: calll 0x80483f0 ; symbol stub for:
operator new[](unsigned int)
0x8048525 <+24>: movl %eax, %edi
0x8048527 <+26>: movl %edi, %eax
0x8048529 <+28>: movl $0x1, %esi
0x804852e <+33>: movl %eax, %ebx
0x8048530 <+35>: jmp 0x8048540 ; <+51> at
main.cpp:26
0x8048532 <+37>: movl %ebx, (%esp)
0x8048535 <+40>: calll 0x8048600 ; foo::foo at
main.cpp:16
0x804853a <+45>: addl $0xc, %ebx
0x804853d <+48>: subl $0x1, %esi
0x8048540 <+51>: cmpl $-0x1, %esi
0x8048543 <+54>: jne 0x8048532 ; <+37> at
main.cpp:26
0x8048545 <+56>: movl %edi, 0x14(%esp)
0x8048549 <+60>: movl 0x14(%esp), %eax
0x804854d <+64>: movl $0x1, (%eax)
0x8048553 <+70>: movl 0x14(%esp), %eax
0x8048557 <+74>: movl $0x9, 0x4(%eax)
0x804855e <+81>: movl 0x14(%esp), %eax
0x8048562 <+85>: addl $0xc, %eax
0x8048565 <+88>: movl $0x8, (%eax)
0x804856b <+94>: movl 0x14(%esp), %eax
0x804856f <+98>: addl $0xc, %eax
0x8048572 <+101>: movl $0x5, 0x4(%eax)
0x8048579 <+108>: movl 0x14(%esp), %eax
0x804857d <+112>: addl $0xc, %eax
0x8048580 <+115>: movl $0x7, 0x4(%eax)
0x8048587 <+122>: movl 0x14(%esp), %eax
0x804858b <+126>: leal 0xc(%eax), %edx
0x804858e <+129>: movl 0x80486e4, %eax
0x8048593 <+134>: movl %eax, 0x8(%edx)
0x8048596 <+137>: leal 0x18(%esp), %ebx
0x804859a <+141>: movl 0x80486e8, %eax
0x804859f <+146>: movl %eax, 0xc(%esp)
0x80485a3 <+150>: movl $0x2, 0x8(%esp)
0x80485ab <+158>: movl $0x1, 0x4(%esp)
0x80485b3 <+166>: movl %ebx, (%esp)
0x80485b6 <+169>: calll 0x8048624 ; foo::foo at
main.cpp:17
0x80485bb <+174>: leal 0xc(%ebx), %edx
0x80485be <+177>: movl 0x80486ec, %eax
0x80485c3 <+182>: movl %eax, 0xc(%esp)
0x80485c7 <+186>: movl $0x5, 0x8(%esp)
0x80485cf <+194>: movl $0x4, 0x4(%esp)
0x80485d7 <+202>: movl %edx, (%esp)
0x80485da <+205>: calll 0x8048624 ; foo::foo at
main.cpp:17
-> 0x80485df <+210>: cmpl $0x0, 0x14(%esp)
0x80485e4 <+215>: je 0x80485f2 ; <+229> at
main.cpp:42
0x80485e6 <+217>: movl 0x14(%esp), %eax
0x80485ea <+221>: movl %eax, (%esp)
0x80485ed <+224>: calll 0x8048400 ; symbol stub for:
operator delete[](void*)
0x80485f2 <+229>: movl $0x0, %eax
0x80485f7 <+234>: leal -0xc(%ebp), %esp
0x80485fa <+237>: popl %ebx
0x80485fb <+238>: popl %esi
0x80485fc <+239>: popl %edi
0x80485fd <+240>: popl %ebp
0x80485fe <+241>: retl
On 29 September 2016 at 14:22, Jason Molenda <jmolenda at apple.com> wrote:
> Interesting, I can't get the failure to repo with i386 + gcc-4.8 on an
> ubuntu 14.04.5 system. Downloading & building gcc-4.9.4 right now.
>
>
>
> $ ./dotest.py -C gcc-4.8 -A i386 --executable ~/build/bin/lldb
> testcases/python_api/sbdata
> LLDB library dir: /home/jmolenda/build/bin
> LLDB import library dir: /home/jmolenda/build/bin
> lldb version 4.0.0 (http://llvm.org/svn/llvm-project/lldb/trunk revision
> 282753 clang revision 282567 llvm revision 282567)
> The 'lldb-mi' executable cannot be located. The lldb-mi tests can not be
> run as a result.
>
> Session logs for test failures/errors/unexpected successes will go into
> directory '2016-09-29-15_09_05'
> Command invoked: ./dotest.py -C gcc-4.8 -A i386 --executable
> /home/jmolenda/build/bin/lldb testcases/python_api/sbdata
> compilers=['gcc-4.8']
>
> Configuration: arch=i386 compiler=gcc-4.8
> ----------------------------------------------------------------------
> Collected 2 tests
>
> ----------------------------------------------------------------------
> Ran 2 tests in 1.540s
>
> RESULT: PASSED (2 passes, 0 failures, 0 errors, 0 skipped, 0 expected
> failures, 0 unexpected successes)
>
>
> J
>
> > On Sep 29, 2016, at 12:29 PM, Jason Molenda <jmolenda at apple.com> wrote:
> >
> > Yep, will do. I saw that build bot result last night and ran the
> testsuite on my local ubuntu box and didn't repo the failure so I thought
> maybe it was an already-failing test case that the bot was just telling me
> about. But I think I was running the test x86_64 - I'll figure out how to
> run it i386 and look into it.
> >
> >> On Sep 29, 2016, at 5:56 AM, Pavel Labath <labath at google.com> wrote:
> >>
> >> Note that the test fails when using gcc as a compiler (specifically
> gcc-4.9 in this case, but hopefully the exact version does not matter here).
> >>
> >> Jason, will you be able to check this out today?
> >>
> >> On 29 September 2016 at 05:45, Dimitar Vlahovski via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
> >> This is the first build that failed right after your CL:
> http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-
> 14.04-cmake/builds/20083
> >>
> >> On Thu, Sep 29, 2016 at 1:35 PM, Dimitar Vlahovski <
> dvlahovski at google.com> wrote:
> >> Hi,
> >>
> >> Is the work that you are currently doing the reason why the lldb build
> on i386 is failing?
> >> http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-14.04-cmake
> >> http://lab.llvm.org:8011/builders/lldb-x86_64-ubuntu-
> 14.04-cmake/builds/20099
> >>
> >> Dimitar
> >>
> >>
> >> On Thu, Sep 29, 2016 at 5:30 AM, Jason Molenda via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
> >> Good suggestions, thanks. I'll fix those when I commit the 32-bit
> version of the same test.
> >>
> >> J
> >>
> >>> On Sep 28, 2016, at 9:28 PM, Zachary Turner <zturner at google.com>
> wrote:
> >>>
> >>>
> >>>
> >>> On Wed, Sep 28, 2016 at 9:10 PM Jason Molenda via lldb-commits <
> lldb-commits at lists.llvm.org> wrote:
> >>>
> >>> + EXPECT_TRUE(regloc.GetOffset() == -8);
> >>> This should be
> >>>
> >>> EXPECT_EQ(-8, regloc.GetOffset());
> >>>
> >>> That way if it fails, you'll get a handy error message that says:
> >>>
> >>> Expected: -8
> >>> Actual: -7
> >>>
> >>> If you use EXPECT_TRUE, it's not going to tell you the actual value.
> The same goes for many other places in the file. Note that you're supposed
> to put the expected value *first*. The test is the same either way
> obviously, but it affects the printing of the above message.
> >>>
> >>> +
> >>> + // these could be set to IsSame and be valid -- meaning that the
> >>> + // register value is the same as the caller's -- but I'd rather
> >>> + // they not be mentioned at all.
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_rbp, regloc) == false);
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_r15, regloc) == false);
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_r14, regloc) == false);
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_r13, regloc) == false);
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_r12, regloc) == false);
> >>> + EXPECT_TRUE(row_sp->GetRegisterInfo(k_rbx, regloc) == false);
> >>> If you're using EXPECT_TRUE and EXPECT_FALSE, I think it's more
> intuitive to not use the comparison operator. The above is just
> >>>
> >>> EXPECT_FALSE(row_sp->GetRegisterInfo(k_rbx, regloc));
> >>
> >> _______________________________________________
> >> lldb-commits mailing list
> >> lldb-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >>
> >>
> >>
> >> _______________________________________________
> >> lldb-commits mailing list
> >> lldb-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
> >>
> >>
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20160930/09a74ec3/attachment-0001.html>
More information about the lldb-commits
mailing list