> -----Original Message-----
> From: Matthew Gretton-Dann 

[...]
> After some work with NCommander on IRC yesterday afternoon we 
> identified a problem with privateSnippetExecutor being marked 
> CANTUNWIND.
> 
> Examination of the source shows that this is a piece of 
> handwritten assembly which did not have unwind directives 
> added to it (source snippet available at 
> http://paste.ubuntu.com/391906/.  NCommander tried to add 
> unwind directives to it (see http://paste.ubuntu.com/391919/ 
> however this did not work.

[continues below]

[From http://paste.ubuntu.com/391906/:]

>        ~/chroot/karmic/src/OOO320_m12/bridges/source/cpp_uno/gcc3_linux_arm$ 
> cat armhelper.s 
>        @ ARM support code for OpenOffice C++/UNO bridging
>        @
>        @ Written by Peter Naulls <pe...@chocky.org>
>        @ Modified by Caolan McNamara <caol...@redhat.com>
>               .file   "armhelper.s"
>               .text
>               .align  4
>               .global privateSnippetExecutor
>               .type privateSnippetExecutor, %function
>        privateSnippetExecutor:
>                stmfd sp!, {r0-r3}         @ follow other parameters on stack
>               mov   r0, ip               @ r0 points to functionoffset/vtable
>                mov   ip, sp              @ fix up the ip
>                stmfd sp!, {fp,ip,lr,pc}   @ 8 x 4 => stack remains 8 aligned
>               sub   fp, ip, #4           @ set frame pointer
>        
>                add   r1, sp, #16          @ r1 points to this and params
>                bl    cpp_vtable_call(PLT)
>        
>                add  sp, sp, #32           @ restore stack
>                ldr  fp, [sp, #-32]       @ restore frame pointer
>                ldr  pc, [sp, #-24]        @ return

>       src/OOO320_m12/bridges# cat source/cpp_uno/gcc3_linux_arm/armhelper.s 
>       @ ARM support code for OpenOffice C++/UNO bridging
>       @
>       @ Written by Peter Naulls <pe...@chocky.org>
>       @ Modified by Caolan McNamara <caol...@redhat.com>
>               .file   "armhelper.s"
>               .text
>               .align  4
>               .global privateSnippetExecutor
>               .type privateSnippetExecutor, %function
>       privateSnippetExecutor:
>               .fnstart
>               .save {r0, r1, r2, r3}
>               stmfd sp!, {r0-r3}         @ follow other parameters on stack
>               mov   r0, ip               @ r0 points to functionoffset/vtable
>               mov   ip, sp               @ fix up the ip
>       
>               .save {fp,ip,lr,pc}
>               stmfd sp!, {fp,ip,lr,pc}   @ 8 x 4 => stack remains 8 aligned
>               sub   fp, ip, #4           @ set frame pointer
>       
>               add   r1, sp, #16          @ r1 points to this and params
>               bl    cpp_vtable_call(PLT)
>       
>               add  sp, sp, #32           @ restore stack
>               ldr  fp, [sp, #-32]        @ restore frame pointer
>               ldr  pc, [sp, #-24]        @ return
>               .fnend

[From http://paste.ubuntu.com/391919/:]

>       src/OOO320_m12/bridges# cat source/cpp_uno/gcc3_linux_arm/armhelper.s 
>       @ ARM support code for OpenOffice C++/UNO bridging
>       @
>       @ Written by Peter Naulls <pe...@chocky.org>
>       @ Modified by Caolan McNamara <caol...@redhat.com>
>               .file   "armhelper.s"
>               .text
>               .align  4
>               .global privateSnippetExecutor
>               .type privateSnippetExecutor, %function
>       privateSnippetExecutor:
>               .fnstart
>               .save {r0, r1, r2, r3}
>               stmfd sp!, {r0-r3}         @ follow other parameters on stack
>               mov   r0, ip               @ r0 points to functionoffset/vtable
>               mov   ip, sp               @ fix up the ip
>       
>               .save {fp,ip,lr,pc}
>               stmfd sp!, {fp,ip,lr,pc}   @ 8 x 4 => stack remains 8 aligned
>               sub   fp, ip, #4           @ set frame pointer
>       
>               add   r1, sp, #16          @ r1 points to this and params
>               bl    cpp_vtable_call(PLT)
>       
>               add  sp, sp, #32           @ restore stack
>               ldr  fp, [sp, #-32]        @ restore frame pointer
>               ldr  pc, [sp, #-24]        @ return
>               .fnend

[continuation]

> After some thought and examination last night I have come to 
> the conclusion that this function is fundamentally broken, 
> and needs a complete rewrite.  If you look at the source the 
> last two instructions load from a negative offset from the SP 
> which breaks the ABI (and if I signal occurred would cause 
> the stack to get corrupted).  Ramana and I also can't work 
> out what ip should contain on entry to the function (and why 
> it is expected to contain a value at all).  In its current 
> state I don't think we can write an unwinder for this 
> function without writing personality routines by hand.
> 
> Someone (in OpenOffice land) needs to examine this function, 
> work out what is going on and make it conform to the ABI, and 
> add an unwinder.  This is not a tools issue.
> 
> Unfortunately this is only step one, once this function is 
> sorted I doubt the bug will be fixed.  The other immediate 
> issue to be investigated is to find out where the .eh_frame 
> sections present in the library are coming from.  These 
> should not be present on ARM and may be causing an issue.

-- 
FFE for lucid - gdb-7.1 (or gdb-7.0.90.2010xxyy)
https://bugs.launchpad.net/bugs/535179
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to