iphone + LDC, a new ARM adventure
Dan Olson
zans.is.for.cans at yahoo.com
Sun Jan 5 09:28:59 PST 2014
Jacob Carlborg <doob at me.com> writes:
> On 2014-01-05 08:34, Dan Olson wrote:
>
>> Ah, I didn't connect SLJL with setjmp/longjmp. Good clue. Yes, it
>> appears arm-apple-darwin exceptions are setjmp based (confirmed by
>> compiling a c++ function with clang). Ok, I will dig in some more, see
>> where it leads me.
>
> Hmm, I would have thought iOS used DWARF-based exception handling.
Hi Jacob.
Yeah, I probably have called it wrong as I am just learning about
exception handling implementations. clangc c++ exception handling for
C++ armv7-apple-darwin is emitting __gxx_personality_sj0 and plugs in
_Unwind_SjLj_Register/_Unwind_SjLj_Unregister. Perhaps those are just
for catching C code longjmps?
For example, this C++ code:
try {
death();
}
catch (...) {
puts("got it");
}
produced (edited):
_main:
.cfi_startproc
.cfi_personality 155, L___gxx_personality_sj0$non_lazy_ptr
Leh_func_begin0:
.cfi_lsda 16, Lexception0
@ BB#0: @ %entry
push {r4, r5, r6, r7, lr}
--- snip ---
LPC0_1:
add r1, pc
str.w sp, [sp, #52]
str r1, [sp, #48]
movs r1, #1
str r1, [sp, #16]
blx __Unwind_SjLj_Register
Ltmp0:
blx __Z5deathv
Ltmp1:
LBB0_1: @ %try.cont
add r0, sp, #12
blx __Unwind_SjLj_Unregister
add r4, sp, #64
movs r0, #0
--- snip function prologue ---
LBB0_5: @ %invoke.cont2
Ltmp2:
ldr r0, [sp, #20]
ldr r1, [sp, #24]
blx ___cxa_begin_catch
movw r0, :lower16:(L_.str-(LPC0_3+4))
movt r0, :upper16:(L_.str-(LPC0_3+4))
LPC0_3:
add r0, pc
blx _puts
mov.w r0, #-1
str r0, [sp, #16]
blx ___cxa_end_catch
b LBB0_1
And I do see an exception table.
.section __TEXT,__gcc_except_tab
.align 2
GCC_except_table0:
Lexception0:
L_LSDA_0:
.byte 255 @ @LPStart Encoding = omit
.byte 155 @ @TType Encoding = indirect pcrel sdata4
.asciz "\212\200\200" @ @TType base offset
.byte 3 @ Call site Encoding = udata4
.byte 2 @ Call site table length
.byte 0 @ >> Call Site 0 <<
@ On exception at call site 0
.byte 1 @ Action: 1
.byte 1 @ >> Action Record 1 <<
@ Catch TypeInfo 1
.byte 0 @ No further actions
@ >> Catch TypeInfos <<
.long 0 @ TypeInfo 1
.align 2
I read llvm source code for a while yesterday and really haven't wrapped
by brain around it yet.
Dan
More information about the digitalmars-d-ldc
mailing list