ARM c++ exceptions handling not working with clang/llvm-3.2?

Hello,
am I wrong or the ARM c++ exceptions handling does not work?
See the difference between assembly generated by clang and gcc
with the following test code:

#include <stdio.h>
#include <exception>

# test.cpp
int main()
{
     try {
         throw 20;
     } catch (int e) {
         printf("Exception Nr %d occurred\n", e);
     }

     return 0;
}

tools-armel-linux-arm920t/bin/armel-unknown-linux-gnueabi-clang++ -v -save-temps -mcpu=arm920t -std=c++11 test.cpp -o test
clang version 3.2 (tags/RELEASE_32/final)
Target: armel-unknown-linux-gnueabi
Thread model: posix
  "/home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/armel-unknown-linux-gnueabi-clang" -cc1 -triple armv4t-unknown-linux-gnueabi -E -disable-free -main-file-name test.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -mconstructor-aliases -fuse-init-array -target-abi aapcs-linux -target-cpu arm920t -msoft-float -mfloat-abi soft -target-feature +soft-float -target-feature +soft-float-abi -target-feature -neon -target-linker-version 2.22 -momit-leaf-frame-pointer -v -resource-dir /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/clang/3.2 -isysroot /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t -fmodule-cache-path /var/tmp/clang-module-cache -internal-isystem /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3 -internal-isystem /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3/armel-unknown-linux-gnueabi -internal-isystem /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3/backward -internal-isystem /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/local/include -internal-isystem /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/clang/3.2/include -internal-externc-isystem /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/include -internal-externc-isystem /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/include -std=c++11 -fdeprecated-macro -fno-dwarf-directory-asm -fdebug-compilation-dir /home/walsimou/embtoolkit.git -ferror-limit 19 -fmessage-length 212 -mstackrealign -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o test.ii -x c++ test.cpp
clang -cc1 version 3.2 based upon LLVM 3.2svn default target armel-unknown-linux-gnueabi
ignoring nonexistent directory "/home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/local/include"
ignoring nonexistent directory "/home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/include"
#include "..." search starts here:
#include <...> search starts here:
  /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3
  /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3/armel-unknown-linux-gnueabi
  /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/../../../../armel-unknown-linux-gnueabi/include/c++/4.7.3/backward
  /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/clang/3.2/include
  /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/include
End of search list.
  "/home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/armel-unknown-linux-gnueabi-clang" -cc1 -triple armv4t-unknown-linux-gnueabi -S -disable-free -main-file-name test.cpp -mrelocation-model static -mdisable-fp-elim -fmath-errno -mconstructor-aliases -fuse-init-array -target-abi aapcs-linux -target-cpu arm920t -msoft-float -mfloat-abi soft -target-feature +soft-float -target-feature +soft-float-abi -target-feature -neon -target-linker-version 2.22 -momit-leaf-frame-pointer -v -resource-dir /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/clang/3.2 -std=c++11 -fdeprecated-macro -fno-dwarf-directory-asm -fdebug-compilation-dir /home/walsimou/embtoolkit.git -ferror-limit 19 -fmessage-length 212 -mstackrealign -fno-signed-char -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o test.s -x c++-cpp-output test.ii
clang -cc1 version 3.2 based upon LLVM 3.2svn default target armel-unknown-linux-gnueabi
#include "..." search starts here:
End of search list.
  "/home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/armel-unknown-linux-gnueabi-as" -mfloat-abi=soft -mcpu=arm920t -o test.o test.s
  "/home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/armel-unknown-linux-gnueabi-ld" --sysroot=/home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t -z relro -X --hash-style=gnu --build-id --eh-frame-hdr -m armelf_linux_eabi -dynamic-linker /lib/ld-linux.so.3 -o test /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/lib/crt1.o /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/lib/crti.o /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/crtbegin.o -L/home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3 -L/home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/lib -L/home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/lib test.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /home/walsimou/embtoolkit.git/tools-armel-linux-arm920t/bin/../lib/gcc/armel-unknown-linux-gnueabi/4.7.3/crtend.o /home/walsimou/embtoolkit.git/sysroot-armel-linux-arm920t/usr/lib/crtn.o

----- CLANG/LLVM-3.2 assembly out--------
     .syntax unified
     .eabi_attribute 6, 2
     .eabi_attribute 20, 1
     .eabi_attribute 21, 1
     .eabi_attribute 23, 3
     .eabi_attribute 24, 1
     .eabi_attribute 25, 1
     .file "test.ii"
     .text
     .globl main
     .align 2
     .type main,%function
main:
     push {r11, lr}
     mov r11, sp
     sub sp, sp, #24
     mov r0, #0
     str r0, [r11, #-4]
     mov r1, #4
     str r0, [sp, #4]
     mov r0, r1
     bl __cxa_allocate_exception
     mov r1, #20
     str r1, [r0]
     ldr r1, .LCPI0_0
     ldr r2, [sp, #4]
     bl __cxa_throw
     .align 2
.LCPI0_0:
     .long _ZTIi
.Ltmp0:
     .size main, .Ltmp0-main

     .type .L.str,%object
     .section .rodata.str1.1,"aMS",%progbits,1
.L.str:
     .asciz "Exception Nr %d occurred\n"
     .size .L.str, 26

----- GCC assembly output --------
     .cpu arm920t
     .fpu softvfp
     .eabi_attribute 20, 1
     .eabi_attribute 21, 1
     .eabi_attribute 23, 3
     .eabi_attribute 24, 1
     .eabi_attribute 25, 1
     .eabi_attribute 26, 2
     .eabi_attribute 30, 6
     .eabi_attribute 34, 0
     .eabi_attribute 18, 4
     .file "test.cpp"
     .section .rodata
     .align 2
.LC0:
     .ascii "Exception Nr %d occurred\012\000"
     .text
     .align 2
     .global main
     .type main, %function
main:
     .fnstart
.LFB6:
     @ Function supports interworking.
     @ args = 0, pretend = 0, frame = 8
     @ frame_needed = 1, uses_anonymous_args = 0
     stmfd sp!, {fp, lr}
     .save {fp, lr}
     .setfp fp, sp, #4
     add fp, sp, #4
     .pad #8
     sub sp, sp, #8
     mov r0, #4
     bl __cxa_allocate_exception
     mov r3, r0
     mov r2, #20
     str r2, [r3, #0]
     mov r0, r3
     ldr r1, .L9
     mov r2, #0
.LEHB0:
     bl __cxa_throw
.LEHE0:
.L8:
     bl __cxa_end_catch
.LEHB1:
     bl __cxa_end_cleanup
.L7:
     mov r3, r0
     mov r2, r1
     cmp r2, #1
     beq .L6
     bl __cxa_end_cleanup
.LEHE1:
.L6:
     mov r0, r3
     bl __cxa_begin_catch
     mov r3, r0
     ldr r3, [r3, #0]
     str r3, [fp, #-8]
     ldr r0, .L9+4
     ldr r1, [fp, #-8]
.LEHB2:
     bl printf
.LEHE2:
     bl __cxa_end_catch
     mov r3, #0
     mov r0, r3
     sub sp, fp, #4
     ldmfd sp!, {fp, lr}
     bx lr
.L10:
     .align 2
.L9:
     .word _ZTIi
     .word .LC0
     .global __gxx_personality_v0
     .personality __gxx_personality_v0
     .handlerdata
     .align 2
.LLSDA6:
     .byte 0xff
     .byte 0
     .uleb128 .LLSDATT6-.LLSDATTD6
.LLSDATTD6:
     .byte 0x1
     .uleb128 .LLSDACSE6-.LLSDACSB6
.LLSDACSB6:
     .uleb128 .LEHB0-.LFB6
     .uleb128 .LEHE0-.LEHB0
     .uleb128 .L7-.LFB6
     .uleb128 0x1
     .uleb128 .LEHB1-.LFB6
     .uleb128 .LEHE1-.LEHB1
     .uleb128 0
     .uleb128 .LEHB2-.LFB6
     .uleb128 .LEHE2-.LEHB2
     .uleb128 .L8-.LFB6
     .uleb128 0
.LLSDACSE6:
     .byte 0x1
     .byte 0
     .align 2
     .word _ZTIi(TARGET2)
.LLSDATT6:
     .text
     .fnend
     .size main, .-main
     .ident "GCC: (embtoolkit-00149-g2857df9) 4.7.3 20121216 (prerelease)"
     .section .note.GNU-stack,"",%progbits

am I wrong or the ARM c++ exceptions handling does not work?

Yes, it's still work-in-progress option disabled by default. You might
want to give it a try via special cmdline line -mllvm
-arm-enable-ehabi

am I wrong or the ARM c++ exceptions handling does not work?

Yes, it's still work-in-progress option disabled by default. You might
want to give it a try via special cmdline line -mllvm
-arm-enable-ehabi

Ohhh I see, thanks for the input!

You may also need to use:
-mllvm -enable-correct-eh-support -mllvm -arm-enable-ehabi-descriptors

-Chris

-mllvm -enable-correct-eh-support

This one is irrelevant here. It's used by LowerInvoke transformation
pass, which is not used in clang pipeline at all.