[Lldb-commits] Possible UnwindAssembly-x86 Problem & Fix

Jason Molenda jason at molenda.com
Fri Jul 25 12:34:35 PDT 2014


I think we have three problems with writing these tests:

(1) A driver main.c file is needed which does all the process startup/shutdown and calls a test function with no arguments.  We want this to be in C so the compiler can generate the appropriate assembly for each platform.

(2) The assembly will have some template things specific to an OS.  For instance, the symbol name needs to be prefixed with an underscore on a Mac ("_main:") unlike Linux ("main:") for external linkage visibility.  If it's just internal linkage, I think you can get away no-underscore on Mac.  Normally in Mac assembly you want to have a section directive and set alignment before your functions -- but it seems to work without those?  Anyway, it's clear that different systems will have slight variances on the template of the assembly that they need.

(3) The assembly may have ABI specific details even for the same processor.  x86_64 is not a difficult one because Linux/BSD/Mac all use SysV ABI as a base with little deviance.  I have no idea what the windows ABI would look like. i386 is slightly trickier because Mac requires a 16-byte stack frame whereas the other unixes use 4-byte.  And things get even more different if we start to talk about ARMv7 or AArch64.  The main concern would be the C file to assembly file interface layer and a func call with no arguments is probably going to work for all ABIs.


Given the stability of the assembly unwinders, I don't feel super motivated to add these tests, but it'd be a good addition if someone wants to do it.  The easiest would be to make a "Linux x86_64" specific test".  I think with a little fiddling it may be possible to make a "x86_64" specific test, probably passing the assembly through the C preprocessor to handle OS differences.



On Jul 25, 2014, at 9:36 AM, Todd Fiala <tfiala at google.com> wrote:

> Ok - maybe we write it up as ABI-agnostic as we can, and if we find combinations that fail the test because of ABI-isms that creep in, then we disable on those combinations at that time ?
> 
> 
> On Fri, Jul 25, 2014 at 9:04 AM, <jingham at apple.com> wrote:
> The function you write in the .s file is going to encode an ABI, so if you try to call it from a .c file, the compiler compiling that .c file has to follow that ABI.  So you could get into OS dependencies at that point.
> 
> But if you make a wrapper in the .s file that takes no arguments and returns nothing, then have that call whatever test code you are going to write in the .s file, you're probably OK.  It is possible to have two ABI's decide that they want to call no-arguments/no return functions differently on the same architecture, but that seems much less likely...
> 
> Jim
> 
> 
> > On Jul 25, 2014, at 7:11 AM, Todd Fiala <tfiala at google.com> wrote:
> >
> > >  If you were to make them only run on one OS it would be pretty easy to do it with hand written assembly.
> >
> > Yeah I was planning on having that get added as a follow-up pass.  We'll just have it qualified to only run locally and only when the host architecture is what we need (which I think is x86_64 in this case).  I think with the assembly it will be OS agnostic but architecture specific as long as we get the build rules right?
> >
> > -Todd
> >
> >
> > On Fri, Jul 25, 2014 at 3:03 AM, Jason Molenda <jason at molenda.com> wrote:
> > It's a little tricky to write unwinder tests - they have to be written in assembly to set up conditions correctly and that makes them OS/ABI-specific.  A combination of a C driver program (with a main() function) and a .s file that main() calls might be possible to do for Mac/Linux/*BSD but I'm not sure about that.  If you were to make them only run on one OS it would be pretty easy to do it with hand written assembly.
> >
> > On Jul 24, 2014, at 10:26 PM, Zachary Turner <zturner at google.com> wrote:
> >
> > > Can we add Tong's test case as an LLDB test?
> > >
> > >
> > > On Thu, Jul 24, 2014 at 6:24 PM, Todd Fiala <tfiala at google.com> wrote:
> > > Tested and committed:
> > >
> > > svn commit
> > > Sending        source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp
> > > Transmitting file data .
> > > Committed revision 213914.
> > >
> > >
> > >
> > > On Thu, Jul 24, 2014 at 5:35 PM, Todd Fiala <tfiala at google.com> wrote:
> > > :-)
> > >
> > >
> > > On Thu, Jul 24, 2014 at 5:34 PM, Tong Shen <endlessroad at google.com> wrote:
> > > Thanks Todd!
> > >
> > >
> > > On Thu, Jul 24, 2014 at 5:33 PM, Todd Fiala <tfiala at google.com> wrote:
> > > Hey Tong - I'll add that and do all the test runs.  I'll get it checked in unless something breaks.
> > >
> > > -Todd
> > >
> > >
> > > On Thu, Jul 24, 2014 at 5:32 PM, Tong Shen <endlessroad at google.com> wrote:
> > > Hi Jason,
> > >
> > > I don't have any strong preference here, so let's do it the way you see fit :-)
> > > Your patch works fine, though there's a right bracket missing at the end of line:
> > >  regloc.SetAtCFAPlusOffset (-(stack_offset + row->GetCFAOffset());
> > >
> > > Thank you for looking into this!
> > >
> > >
> > > On Thu, Jul 24, 2014 at 5:16 PM, Jason Molenda <jmolenda at apple.com> wrote:
> > > Good catch Tong.  I don't think clang generates this instruction pattern (it normally pushq's all the registers in the prologue that it wants to preserve) so we've never hit this bug.
> > >
> > > I don't have a strong preference about mov_reg_to_local_stack_frame_p() returning a positive value in rbp_offset except that we have other sections returning an offset from the CFA e.g. UnwindPlan::Row::GetCFAOffset() which return a positive offset value that must be subtracted from the CFA to get the correct address.
> > >
> > > If you would prefer to change mov_reg_to_local_stack_frame_p() to return a negative value, I'm not going to argue against it.  But maybe a slight change to your patch like this?  It's complicated enough code that I added a couple of comments while I was at it.
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > > On Jul 24, 2014, at 3:33 PM, Tong Shen <endlessroad at google.com> wrote:
> > > >
> > > > Hi jmolenda, lldb-commits,
> > > >
> > > > While hacking around x86 assembly profiler, I found a problem about non-volatile register information.
> > > >
> > > > At UnwindAssembly-x86.cpp line 630 (ViewVC link), stack_offset is calculated but not used.
> > > > I think it should be used in line 636:
> > > >         regloc.SetAtCFAPlusOffset (-row->GetCFAOffset() + stack_offset);
> > > > instead of what's there now:
> > > >         regloc.SetAtCFAPlusOffset (-row->GetCFAOffset());
> > > >
> > > > Also, in line 417 of the same file, when calculating stack_offset, why is rbp_offset set to abs(offset)?
> > > >
> > > > For testing, I wrote an assembly (test.S in attachment) to test if lldb can recover non-volatile registers.
> > > > You can put a breakpoint after where asm_frame() overrides %rbx, then do "f 1" & "register read" to see if %rbx is correctly restored.
> > > > In my test, unmodified lldb gives wrong %rbx.
> > > > Attached patch solved this problem, and make lldb recover those registers correctly.
> > > >
> > > > Am I missing anything here? Is the original behavior intentional? Please correct me if I'm wrong :-)
> > > >
> > > > Thank you.
> > > >
> > > > --
> > > > Best Regards, Tong Shen
> > > > <test.S><1.patch>
> > >
> > >
> > >
> > >
> > >
> > > --
> > > Best Regards, Tong Shen
> > >
> > > _______________________________________________
> > > lldb-commits mailing list
> > > lldb-commits at cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> > >
> > >
> > >
> > >
> > > --
> > > Todd Fiala |   Software Engineer |     tfiala at google.com |     650-943-3180
> > >
> > >
> > >
> > >
> > > --
> > > Best Regards, Tong Shen
> > >
> > >
> > >
> > > --
> > > Todd Fiala |   Software Engineer |     tfiala at google.com |     650-943-3180
> > >
> > >
> > >
> > >
> > > --
> > > Todd Fiala |   Software Engineer |     tfiala at google.com |     650-943-3180
> > >
> > >
> > > _______________________________________________
> > > lldb-commits mailing list
> > > lldb-commits at cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> > >
> > >
> > > _______________________________________________
> > > lldb-commits mailing list
> > > lldb-commits at cs.uiuc.edu
> > > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> >
> >
> >
> >
> > --
> > Todd Fiala |   Software Engineer |     tfiala at google.com |     650-943-3180
> >
> > _______________________________________________
> > lldb-commits mailing list
> > lldb-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
> 
> 
> 
> 
> -- 
> Todd Fiala |	 Software Engineer |	 tfiala at google.com |	 650-943-3180
> 





More information about the lldb-commits mailing list