178 lines
7.2 KiB
LLVM
178 lines
7.2 KiB
LLVM
; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
|
|
; RUN: -mattr=-altivec -simplifycfg-require-and-preserve-domtree=1 < %s | \
|
|
; RUN: FileCheck --check-prefixes=ASM,ASM32 %s
|
|
|
|
; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
|
|
; RUN: -mattr=-altivec -simplifycfg-require-and-preserve-domtree=1 < %s | \
|
|
; RUN: FileCheck --check-prefixes=ASM,ASM64 %s
|
|
|
|
@_ZTIi = external constant i8*
|
|
|
|
define void @_Z9throwFuncv() {
|
|
entry:
|
|
%exception = call i8* @__cxa_allocate_exception(i32 4) #2
|
|
%0 = bitcast i8* %exception to i32*
|
|
store i32 1, i32* %0, align 16
|
|
call void @__cxa_throw(i8* %exception, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #3
|
|
unreachable
|
|
}
|
|
|
|
; ASM: ._Z9throwFuncv:
|
|
; ASM: bl .__cxa_allocate_exception[PR]
|
|
; ASM: nop
|
|
; ASM32: lwz 4, L..C0(2)
|
|
; ASM64: ld 4, L..C0(2)
|
|
; ASM: bl .__cxa_throw[PR]
|
|
; ASM: nop
|
|
|
|
define i32 @_Z9catchFuncv() personality i8* bitcast (i32 (...)* @__xlcxx_personality_v1 to i8*) {
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
%exn.slot = alloca i8*, align 4
|
|
%ehselector.slot = alloca i32, align 4
|
|
%0 = alloca i32, align 4
|
|
invoke void @_Z9throwFuncv()
|
|
to label %invoke.cont unwind label %lpad
|
|
|
|
invoke.cont: ; preds = %entry
|
|
br label %try.cont
|
|
|
|
lpad: ; preds = %entry
|
|
%1 = landingpad { i8*, i32 }
|
|
catch i8* bitcast (i8** @_ZTIi to i8*)
|
|
%2 = extractvalue { i8*, i32 } %1, 0
|
|
store i8* %2, i8** %exn.slot, align 4
|
|
%3 = extractvalue { i8*, i32 } %1, 1
|
|
store i32 %3, i32* %ehselector.slot, align 4
|
|
br label %catch.dispatch
|
|
|
|
catch.dispatch: ; preds = %lpad
|
|
%sel = load i32, i32* %ehselector.slot, align 4
|
|
%4 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*)) #2
|
|
%matches = icmp eq i32 %sel, %4
|
|
br i1 %matches, label %catch, label %eh.resume
|
|
|
|
catch: ; preds = %catch.dispatch
|
|
%exn = load i8*, i8** %exn.slot, align 4
|
|
%5 = call i8* @__cxa_begin_catch(i8* %exn) #2
|
|
%6 = bitcast i8* %5 to i32*
|
|
%7 = load i32, i32* %6, align 4
|
|
store i32 %7, i32* %0, align 4
|
|
store i32 2, i32* %retval, align 4
|
|
call void @__cxa_end_catch() #2
|
|
br label %return
|
|
|
|
try.cont: ; preds = %invoke.cont
|
|
store i32 1, i32* %retval, align 4
|
|
br label %return
|
|
|
|
return: ; preds = %try.cont, %catch
|
|
%8 = load i32, i32* %retval, align 4
|
|
ret i32 %8
|
|
|
|
eh.resume: ; preds = %catch.dispatch
|
|
%exn1 = load i8*, i8** %exn.slot, align 4
|
|
%sel2 = load i32, i32* %ehselector.slot, align 4
|
|
%lpad.val = insertvalue { i8*, i32 } undef, i8* %exn1, 0
|
|
%lpad.val3 = insertvalue { i8*, i32 } %lpad.val, i32 %sel2, 1
|
|
resume { i8*, i32 } %lpad.val3
|
|
}
|
|
|
|
; ASM: ._Z9catchFuncv:
|
|
; ASM: L..func_begin0:
|
|
; ASM: # %bb.0: # %entry
|
|
; ASM: mflr 0
|
|
; ASM: L..tmp0:
|
|
; ASM: bl ._Z9throwFuncv
|
|
; ASM: nop
|
|
; ASM: L..tmp1:
|
|
; ASM: # %bb.1: # %invoke.cont
|
|
; ASM: li 3, 1
|
|
; ASM: L..BB1_2: # %return
|
|
; ASM: mtlr 0
|
|
; ASM: blr
|
|
; ASM: L..BB1_3: # %lpad
|
|
; ASM: L..tmp2:
|
|
; ASM: bl .__cxa_begin_catch[PR]
|
|
; ASM: nop
|
|
; ASM: bl .__cxa_end_catch[PR]
|
|
; ASM: nop
|
|
; ASM: b L..BB1_2
|
|
|
|
; ASM: L.._Z9catchFuncv0:
|
|
; ASM: .vbyte 4, 0x00000000 # Traceback table begin
|
|
; ASM: .byte 0x00 # Version = 0
|
|
; ASM: .byte 0x09 # Language = CPlusPlus
|
|
; ASM: .byte 0x22 # -IsGlobaLinkage, -IsOutOfLineEpilogOrPrologue
|
|
; ASM: # +HasTraceBackTableOffset, -IsInternalProcedure
|
|
; ASM: # -HasControlledStorage, -IsTOCless
|
|
; ASM: # +IsFloatingPointPresent
|
|
; ASM: # -IsFloatingPointOperationLogOrAbortEnabled
|
|
; ASM: .byte 0x41 # -IsInterruptHandler, +IsFunctionNamePresent, -IsAllocaUsed
|
|
; ASM: # OnConditionDirective = 0, -IsCRSaved, +IsLRSaved
|
|
; ASM: .byte 0x80 # +IsBackChainStored, -IsFixup, NumOfFPRsSaved = 0
|
|
; ASM: .byte 0x40 # -HasVectorInfo, +HasExtensionTable, NumOfGPRsSaved = 0
|
|
; ASM: .byte 0x00 # NumberOfFixedParms = 0
|
|
; ASM: .byte 0x01 # NumberOfFPParms = 0, +HasParmsOnStack
|
|
; ASM: .vbyte 4, L.._Z9catchFuncv0-._Z9catchFuncv # Function size
|
|
; ASM: .vbyte 2, 0x000d # Function name len = 13
|
|
; ASM: .byte '_,'Z,'9,'c,'a,'t,'c,'h,'F,'u,'n,'c,'v # Function Name
|
|
; ASM: .byte 0x08 # ExtensionTableFlag = TB_EH_INFO
|
|
; ASM: .align 2
|
|
; ASM32: .vbyte 4, L..C1-TOC[TC0] # EHInfo Table
|
|
; ASM64: .vbyte 8, L..C1-TOC[TC0] # EHInfo Table
|
|
; ASM: L..func_end0:
|
|
|
|
; ASM: .csect .gcc_except_table[RO],2
|
|
; ASM: .align 2
|
|
; ASM: GCC_except_table1:
|
|
; ASM: L..exception0:
|
|
; ASM: .byte 255 # @LPStart Encoding = omit
|
|
; ASM32: .byte 187 # @TType Encoding = indirect datarel sdata4
|
|
; ASM64: .byte 188 # @TType Encoding = indirect datarel sdata8
|
|
; ASM32: .byte 37
|
|
; ASM64: .byte 41
|
|
; ASM: .byte 3 # Call site Encoding = udata4
|
|
; ASM: .byte 26
|
|
; ASM: .vbyte 4, L..tmp0-L..func_begin0 # >> Call Site 1 <<
|
|
; ASM: .vbyte 4, L..tmp1-L..tmp0 # Call between L..tmp0 and L..tmp1
|
|
; ASM: .vbyte 4, L..tmp2-L..func_begin0 # jumps to L..tmp2
|
|
; ASM: .byte 1 # On action: 1
|
|
; ASM: .vbyte 4, L..tmp1-L..func_begin0 # >> Call Site 2 <<
|
|
; ASM: .vbyte 4, L..func_end0-L..tmp1 # Call between L..tmp1 and L..func_end0
|
|
; ASM: .vbyte 4, 0 # has no landing pad
|
|
; ASM: .byte 0 # On action: cleanup
|
|
; ASM: L..cst_end0:
|
|
; ASM: .byte 1 # >> Action Record 1 <<
|
|
; ASM: # Catch TypeInfo 1
|
|
; ASM: .byte 0 # No further actions
|
|
; ASM: .align 2
|
|
; ASM: # >> Catch TypeInfos <<
|
|
; ASM32: .vbyte 4, L..C0-TOC[TC0] # TypeInfo 1
|
|
; ASM64: .vbyte 8, L..C0-TOC[TC0] # TypeInfo 1
|
|
; ASM: L..ttbase0:
|
|
; ASM: .align 2
|
|
|
|
; ASM: .csect .eh_info_table[RW],2
|
|
; ASM: __ehinfo.1:
|
|
; ASM: .vbyte 4, 0
|
|
; ASM32: .align 2
|
|
; ASM32: .vbyte 4, GCC_except_table1
|
|
; ASM32: .vbyte 4, __xlcxx_personality_v1[DS]
|
|
; ASM64: .align 3
|
|
; ASM64: .vbyte 8, GCC_except_table1
|
|
; ASM64: .vbyte 8, __xlcxx_personality_v1[DS]
|
|
|
|
; ASM: .toc
|
|
; ASM: L..C0:
|
|
; ASM: .tc _ZTIi[TC],_ZTIi[UA]
|
|
; ASM: L..C1:
|
|
; ASM: .tc __ehinfo.1[TC],__ehinfo.1
|
|
|
|
declare i8* @__cxa_allocate_exception(i32)
|
|
declare void @__cxa_throw(i8*, i8*, i8*)
|
|
declare i32 @__xlcxx_personality_v1(...)
|
|
declare i32 @llvm.eh.typeid.for(i8*)
|
|
declare i8* @__cxa_begin_catch(i8*)
|
|
declare void @__cxa_end_catch()
|