[LLVMdev] Exception handling question
James Williams
junk at giantblob.com
Fri Jan 22 00:48:05 PST 2010
2010/1/22 James Williams <junk at giantblob.com>
>
>
> 2010/1/22 Duncan Sands <baldrick at free.fr>
>
> Hi James,
>>
>>
>> I've been trying to get a minimal test function to work, which simply
>>> invokes _Unwind_RaiseException with a single clean-up landing pad. However.
>>> when I run it my personality function is not getting called -
>>> _Unwind_RaiseException simply returns apparently doing nothing. Looking at
>>> the x86-64 assembly output from llc, I can see this is happening because the
>>> personality function is not getting into the DWARF eh table (the landing pad
>>> is there though).
>>>
>>
>> do you mean that the personality function doesn't turn up in the assembler
>> at all? It should be! Consider the following simplified example:
>>
>
> Yes - no reference to the personality function at all. I tried Bill
> Wendling's suggestion to add an i8* null to the llvm.eh.selector.i64
> parameter list but I still get no reference to the personality function.
> Compared to your example my eh table seems to be missing a load of stuff.
> The complete LLVM generated x86-64 assembler for my function including eh
> table is:
>
BTW: I'm using LLVM 2.6 compiled from source on Ubuntu 9.10 in case it's
relevant.
>
>
> .text
> .align 16
> .globl _ZN4N0014Main5test5EN2IO6WriterEiA_l
> .type _ZN4N0014Main5test5EN2IO6WriterEiA_l, at function
> _ZN4N0014Main5test5EN2IO6WriterEiA_l: #
> @_ZN4N0014Main5test5EN2IO6WriterEiA_l
> .Leh_func_begin153:
> .Lfunc_begin153:
> .LBB153_0: # %entry
> subq $56, %rsp
> .Llabel294:
>
> .LBB153_1:
> movq %rdi, 24(%rsp)
> movq %rsi, 48(%rsp)
> movl %edx, 44(%rsp)
> movq %rcx, 32(%rsp)
> .LBB153_2: # %.try_body
> movq 32(%rsp), %rdi
> .Llabel291:
>
> addq $16, %rdi
> xorb %al, %al
> call _Unwind_RaiseException
> .Llabel292:
>
> jmp .LBB153_4
> .LBB153_3: # %.finally_pad
> .Llabel293:
>
> movq %rax, 16(%rsp)
> testq %rdx, %rdx
> setne %al
> movzbl %al, %eax
> movq %rax, (%rsp)
> .LBB153_4: #
> %.finally_handler
> movl $.L__string_27, %edi
> xorb %al, %al
> call printf
> xorl %eax, %eax
> addq $56, %rsp
> ret
> .size _ZN4N0014Main5test5EN2IO6WriterEiA_l,
> .-_ZN4N0014Main5test5EN2IO6WriterEiA_l
> .Lfunc_end153:
> .Leh_func_end153:
> .section .gcc_except_table,"a", at progbits
> .align 4
> GCC_except_table153:
> .byte 0x0 # Padding
> .Lexception153:
> .byte 0xFF # @LPStart format
> (DW_EH_PE_omit)
> .byte 0x0 # @TType format
> (DW_EH_PE_absptr)
> .uleb128 28 # @TType base offset
>
> .byte 0x3 # Call site format
> (DW_EH_PE_udata4)
> .uleb128 26 # Call site table size
> .long .Llabel291-.Leh_func_begin153 # Region start
> .long .Llabel292-.Llabel291 # Region length
> .long .Llabel293-.Leh_func_begin153 # Landing pad
> .uleb128 0 # Action
> .long .Llabel292-.Leh_func_begin153 # Region start
> .long .Leh_func_end153-.Llabel292 # Region length
> .long 0x0 # Landing pad
>
> .uleb128 0 # Action
> .align 4
>
>
>
>
>> declare void @g()
>>
>> define void @f() {
>> e:
>> invoke void @g()
>> to label %c unwind label %u
>>
>> c: ; preds = %e
>> ret void
>>
>> u: ; preds = %e
>> %ptr = tail call i8* @llvm.eh.exception() nounwind ; <i8*> [#uses=1]
>> %select = tail call i32 (i8*, i8*, ...)* @llvm.eh.selector(i8* %ptr, i8*
>> bitcast (i32 (...)* @personality to i8*)) nounwind ; <i32> [#uses=0]
>> ret void
>> }
>>
>> declare i8* @llvm.eh.exception() nounwind readonly
>>
>> declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind
>>
>> declare i32 @personality(...)
>>
>>
>>
>> This compiles down to the following, which has a "cleanup" noted in the
>> dwarf eh table, and has the personality function recorded in the CIE.
>> This is with llc from top-of-tree. Do you see something different?
>>
>> Ciao,
>>
>> Duncan.
>>
>>
>>
>> .file "selector.ll"
>>
>>
>> .text
>> .align 16
>> .globl f
>> .type f, at function
>> f: # @f
>> .Leh_func_begin1:
>> # BB#0: # %e
>> subq $8, %rsp
>> .Llabel4:
>> .Llabel1:
>> callq g
>> .Llabel2:
>> # BB#1: # %c
>> addq $8, %rsp
>> ret
>> .LBB1_2:
>> # %u
>> .Llabel3:
>> addq $8, %rsp
>> ret
>> .size f, .-f
>> .Leh_func_end1:
>>
>> .section .gcc_except_table,"a", at progbits
>> .align 4
>> GCC_except_table1:
>> .byte 0
>> # Padding
>> .byte 0
>> # Padding
>> .Lexception1:
>> .byte 255
>> # @LPStart
>> format (omit)
>> .byte 0
>> # @TType format
>> (absptr)
>> .uleb128 15 # @TType base
>> offset
>> .byte 3
>> # Call site
>> format (udata4)
>> .uleb128 13 # Call site
>> table size
>> .long .Llabel1-.Leh_func_begin1 # Region start
>> .long .Llabel2-.Llabel1 # Region length
>> .long .Llabel3-.Leh_func_begin1 # Landing pad
>> .uleb128 0 # Action
>> .align 4
>> .section .eh_frame,"aw", at progbits
>> .LEH_frame0:
>> .Lsection_eh_frame:
>> .Leh_frame_common:
>> .long .Leh_frame_common_end-.Leh_frame_common_begin # Length of
>> Common Information Entry
>> .Leh_frame_common_begin:
>> .long 0
>> # CIE
>> Identifier Tag
>> .byte 1
>> # CIE Version
>> .asciz "zPLR" # CIE
>> Augmentation
>> .uleb128 1 # CIE Code
>> Alignment Factor
>> .sleb128 -8 # CIE Data
>> Alignment Factor
>> .byte 16
>> # CIE Return
>> Address Column
>> .uleb128 7 # Augmentation
>> Size
>> .byte 27
>> # Personality
>> (pcrel sdata4)
>> .Lpersonalityref_addr1_0:
>> .long personality-.Lpersonalityref_addr1_0 # Personality
>> .byte 27
>> # LSDA Encoding
>> (pcrel sdata4)
>> .byte 27
>> # FDE Encoding
>> (pcrel sdata4)
>> .byte 12
>> #
>> DW_CFA_def_cfa
>> .uleb128 7 # Register
>> .uleb128 8 # Offset
>> .byte 144
>> # DW_CFA_offset
>> + Reg (16)
>> .uleb128 1 # Offset
>> .align 8
>> .Leh_frame_common_end:
>>
>> .Lf.eh:
>> .long .Leh_frame_end1-.Leh_frame_begin1 # Length of
>> Frame Information Entry
>> .Leh_frame_begin1:
>> .long .Leh_frame_begin1-.Leh_frame_common # FDE CIE
>> offset
>> .long .Leh_func_begin1-. # FDE initial
>> location
>> .long .Leh_func_end1-.Leh_func_begin1 # FDE address
>> range
>> .uleb128 8 # Augmentation
>> size
>> .quad .Lexception1-. # Language
>> Specific Data Area
>> .byte 4
>> #
>> DW_CFA_advance_loc4
>> .long .Llabel4-.Leh_func_begin1
>> .byte 14
>> #
>> DW_CFA_def_cfa_offset
>> .uleb128 16 # Offset
>> .align 8
>> .Leh_frame_end1:
>>
>>
>> .section .note.GNU-stack,"", at progbits
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100122/ac8361fa/attachment.html>
More information about the llvm-dev
mailing list