[lldb-dev] lldb test failures on 32bit

Kaylor, Andrew andrew.kaylor at intel.com
Fri Jul 19 15:34:21 PDT 2013


Hi Mike,

I think I've tracked down the sources of both of these problems.

The problem with not being able to call functions in the target seems to be a failure in the MCJIT relocation mechanism.  Because LLDB is generating IR with absolute addresses for function calls, the JITed code contains relocations with absolute values rather than symbols.  This is a problem I fixed a short time ago, but it seems to have come undone again (at least in this particular case).  The attached 'reloc-fix-32.patch' (to be applied to the LLVM repository) should fix that.

I need to do a bit of investigation to settle some questions about why this condition came back or was specific to the 32-bit case before I commit this, but I think this is correct.

The problem where you lose source after stepping seems to be a matter of incorrect stack unwinding.  There were two problems lurking here.

First, the RegisterContext::ConvertBetweenRegisterKinds() function wasn't making any provision for a 32-bit inferior running on a 64-bit target.  The way the x86-64 register context class is implemented it defines 64-bit registers and 32-bit registers in the same RegisterInfo structure, and there is some overlap in how these get mapped to DWARF/GDB/GCC register numbers.  RegisterContext::ConvertBetweenRegisterKinds() was just iterating through the list and returning the first match it found, which was the 64-bit register.

I added a special case to call RegisterContext::ConvertRegisterKindToRegisterNumber() when the target kind is eRegisterKindLLDB.  This invokes the RegisterContext_x86_64 overload of that method which knows how to distinguish the 32-bit and 64-bit registers.  I'm not convinced that this is the best way to solve this problem, but it works.

The second issue was that the ABIMacOSX_i386 plug-in (which also gets used for 32-bit inferiors on Linux) was rejecting call frame addresses that weren't 8-byte aligned whereas, at least on Linux, 4-byte alignment is allowed.  If 32-bit processes on MacOSX require 8-byte alignment then we'll need to do some additional checking, but for now I just modified it to only check for 4-byte alignment.

Both of the stack unwinding issues should be fixed by the attached 'stack-fix-32.patch' file.

Can you try out these patches and verify that they work for you?

Thanks,
Andy

From: Michael Sartain [mailto:mikesart at gmail.com]
Sent: Tuesday, July 16, 2013 6:14 PM
To: Malea, Daniel; Kaylor, Andrew; Kopec, Matt; Thirumurthi, Ashok
Cc: Matthew Sorrels
Subject: Fwd: lldb test failures on 32bit

I think the below are the largest 32-bit blocking issues right now.

Is this something any of you have any familiarity with and have time to look at?

If not, let me know and I'll start investigating...

Thanks much!
 -Mike

#################################
## Can't call functions in target
#################################
mikesart at mikesart-rad:~/data/src/blah2/build$ lldb -x -- blah
Current executable set to 'blah' (i386).
(lldb) b main
Breakpoint 1: where = blah`main + 29 at blah.cpp:29, address = 0x0804884d
(lldb) r
Process 6745 launched: '/home/mikesart/data/src/blah2/build/blah' (i386)
Process 6745 stopped
* thread #1: tid = 0x1a59, 0x0804884d blah`main(argc=1, argv=0xfffc8c54) + 29 at blah.cpp:29, name = 'blah, stop reason = breakpoint 1.1
    frame #0: 0x0804884d blah`main(argc=1, argv=0xfffc8c54) + 29 at blah.cpp:29
   26
   27   int main( int argc, char *argv[] )
   28   {
-> 29           printf("hello world.\n");
   30
   31           Set *foo = new Set();
   32
(lldb) expr (int)printf("hi there!\n");
error: Execution was interrupted, reason: invalid address (fault address: 0xeef60020).
The process has been returned to the state before expression evaluation.
(lldb) n
Process 6745 exited with status = -1 (0xffffffff)

#################################
## Lose source with first next command
#################################
mikesart at mikesart-rad:~/data/src/blah2/build$ lldb -x -- blah
Current executable set to 'blah' (i386).
(lldb) b main
Breakpoint 1: where = blah`main + 29 at blah.cpp:29, address = 0x0804884d
(lldb) r
Process 7471 launched: '/home/mikesart/data/src/blah2/build/blah' (i386)
Process 7471 stopped
* thread #1: tid = 0x1d2f, 0x0804884d blah`main(argc=1, argv=0xffb36464) + 29 at blah.cpp:29, name = 'blah, stop reason = breakpoint 1.1
    frame #0: 0x0804884d blah`main(argc=1, argv=0xffb36464) + 29 at blah.cpp:29
   26
   27   int main( int argc, char *argv[] )
   28   {
-> 29           printf("hello world.\n");
   30
   31           Set *foo = new Set();
   32
(lldb) n
Process 7471 stopped
* thread #1: tid = 0x1d2f, 0x080486f0 blah, name = 'blah, stop reason = step over
    frame #0: 0x080486f0 blah
-> 0x80486f0:  jmpl   *134520844
   0x80486f6:  pushl  $24
   0x80486fb:  jmp    0x80486b0                 ; blah..plt + 0
   0x8048700:  jmpl   *134520848
(lldb)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130719/8e0ac6cd/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: reloc-fix-32.patch
Type: application/octet-stream
Size: 579 bytes
Desc: reloc-fix-32.patch
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130719/8e0ac6cd/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: stack-fix-32.patch
Type: application/octet-stream
Size: 1588 bytes
Desc: stack-fix-32.patch
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20130719/8e0ac6cd/attachment-0001.obj>


More information about the lldb-dev mailing list