This doesn't have anything to do with Cocoa. You might have better luck taking 
it up on the Xcode-users list. 

(Sent from my iPad.)

--
Conrad Shultz

On Nov 9, 2011, at 9:39, Don Quixote de la Mancha <quix...@dulcineatech.com> 
wrote:

> My iOS App is build with the Apple LLVM 3.0 compiler in Thumb mode.
> For armv7, I'm pretty sure that's actually Thumb-2.
> 
> I'm reimplementing my two most time-consuming functions in ARM
> assembly code.  The callers of these functions are Thumb, so I use
> Thumb to ARM interworking instructions to switch to ARM in the
> prologue of my functions so I have acesss to ARM's richer instruction
> set and greater number of registers.  At function exit I use ARM to
> Thumb interworking to return to ARM mode.
> 
> GDB's disassembly is correct for the Thumb code, but when I am in ARM
> mode, it disassembles the ARM instructions as if each one were a pair
> of completely nonsensical Thumb instructions.  Is there some way I can
> tell GDB to switch to ARM disassembly, then upon returning to Thumb
> code, use the Thumb disassembler?
> 
> Google is no help.  There are apparently other forks of GDB that can
> do that, but I haven't figured out a way to do it with GDB.
> 
> LLDB apparently supports ARM debugging, but it does not yet work on
> iOS devices in Xcode 4.2.  When I choose the LLDB debugger in Product
> -> Edit Scheme, then set a breakpoint in my code, my App hangs before
> hitting the breakpoint.
> 
> It's been a long time since I've done any assembly of any sort, so I
> am brushing up on the ARM calling conventions by implementing
> functions that take various parameters and return various types of
> results in both C and ARM assembly.  The lower_case functions are C
> and the CamelCase functions are assembly.  I call abiTest the very
> first thing from main(), and use assert() to ensure that it returns
> YES
> 
> BOOL abiTest( void )
> {
>    void_no_args();
>    VoidNoArgs();
> 
>    if ( 42 != int_no_args() )
>        return NO;
> 
>    if ( 42 != IntNoArgs() )
>        return NO;
> 
>    return YES;
> }
> 
> Here is the source for IntNoArgs.  .thumb_func is a directive for the
> linker.  My research seems to indicate that you want it even for ARM
> functions, if one mixes the two types of code
> 
> .globl _IntNoArgs
> .align 2
> .code 16
> .thumb_func _IntNoArgs
> 
> _IntNoArgs:
>    @ int IntNoArgs( void );
>    .loc 1 __LINE__ 0
> 
>    adr r0, Larm1     @ Larm1 is a PC-relative address.  r0's low bit
> will be cleared
>    bx r0                   @ Switch to ARM mode then branch to Larm1.
> That's the next instruction
> 
> .align 4
> .code 32
> Larm1:
>    stmfd sp!, { r7, lr }
> 
>    mov r0, #42
> 
>    ldmfd sp!, { r7, lr }
>    bx lr
> 
> Here is how GDB disassembles the _IntNoArgs.  The first two lines are
> correct, the remainder are completely wrong
> 
> 0x000172c8  <+0000>  add    r0, pc, #0    (adr r0, 0x172cc <VoidNoArgs+4>)
> 0x000172ca  <+0002>  bx    r0
> 0x000172cc  <+0004>  lsls    r0, r0
> 0x000172ce  <+0006>  stmdb    sp!, {r1, r3, r5}
> 0x000172d2  <+0010>  b.n    0x17a16
> 0x000172d4  <+0012>  lsls    r0, r0
> 0x000172d6  <+0014>  ldmia.w    sp!, {r1, r2, r3, r4, r8, r9, r10, r11,
> r12, sp, lr, pc}
> 
> The disassembly stops here because the ldmia.w instruction appears to
> be putting a new value into the program counter after taking it from
> the stack, thereby returning from the subroutine.  After I step over
> this instruction with "si" the disassembly pane show:
> 
> 0x000172d8  <+0016>  vrhadd.u16    d14, d14, d31
> 
> The si instruction always does the right thing, by advancing just one
> instruction whether we are in Thumb or ARM mode.  So GDB _must_ know
> the current instruction set architecture, it's just that the
> disassembler is not getting that information.
> 
> There is a bit in one of the ARM's register that indicates the current
> mode.  Some forks of GDB have the ability to use the value of that bit
> when determining which ISA to disassemble as, but this is apparently
> not the case with Xcode 4.2's GDB.
> 
> Xcode's GDB has a command "set arm disassembler" and its corresponding
> "show arm disassembler" that looks like it would help, but it doesn't.
> That apparently is meant to support other kinds of ARM variants than
> what the iOS devices use.
> 
> "set fallback-mode" can be set to arm, thumb or auto in other forks of
> GDB, but not Xcodes.  Ditto for "set disassembler-flavor".
> 
> What I would REALLY REALLY REALLY like is a machine debugger that
> worked just like MacsBug did on the Classic Mac OS.  While GDB is
> generally capable of doing assembler debugging, it totally sucks for
> that purpose.  That's not anyone's fault, really, because it is
> designed for source debugging.  A good assembly debugger is designed
> to do it that way from the ground up.
> 
> Thanks for any help you can give me,
> 
> Don Quixote
> -- 
> Don Quixote de la Mancha
> Dulcinea Technologies Corporation
> Software of Elegance and Beauty
> http://www.dulcineatech.com
> quix...@dulcineatech.com
> _______________________________________________
> 
> Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)
> 
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
> 
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/cocoa-dev/conrad%40synthetiqsolutions.com
> 
> This email sent to con...@synthetiqsolutions.com
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to