
On AIX, the __ehinfo toc-entry is never referenced directly using instructions, therefore we can allocate them with the TE storage mapping class to move them to the end of TOC.
191 lines
7.8 KiB
LLVM
191 lines
7.8 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,ASMNFS,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,ASMNFS,ASM64 %s
|
|
|
|
; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
|
|
; RUN: -mattr=-altivec -simplifycfg-require-and-preserve-domtree=1 \
|
|
; RUN: -function-sections < %s | \
|
|
; RUN: FileCheck --check-prefixes=ASM,ASMFS,ASM32 %s
|
|
|
|
; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
|
|
; RUN: -mattr=-altivec -simplifycfg-require-and-preserve-domtree=1 \
|
|
; RUN: -function-sections < %s | \
|
|
; RUN: FileCheck --check-prefixes=ASM,ASMFS,ASM64 %s
|
|
|
|
@_ZTIi = external constant ptr
|
|
|
|
define void @_Z9throwFuncv() {
|
|
entry:
|
|
%exception = call ptr @__cxa_allocate_exception(i32 4) #2
|
|
store i32 1, ptr %exception, align 16
|
|
call void @__cxa_throw(ptr %exception, ptr @_ZTIi, ptr null) #3
|
|
unreachable
|
|
}
|
|
|
|
; ASMNFS: ._Z9throwFuncv:
|
|
; ASMFS: .csect ._Z9throwFuncv[PR],5
|
|
; 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 ptr @__xlcxx_personality_v1 {
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
%exn.slot = alloca ptr, 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 { ptr, i32 }
|
|
catch ptr @_ZTIi
|
|
%2 = extractvalue { ptr, i32 } %1, 0
|
|
store ptr %2, ptr %exn.slot, align 4
|
|
%3 = extractvalue { ptr, i32 } %1, 1
|
|
store i32 %3, ptr %ehselector.slot, align 4
|
|
br label %catch.dispatch
|
|
|
|
catch.dispatch: ; preds = %lpad
|
|
%sel = load i32, ptr %ehselector.slot, align 4
|
|
%4 = call i32 @llvm.eh.typeid.for(ptr @_ZTIi) #2
|
|
%matches = icmp eq i32 %sel, %4
|
|
br i1 %matches, label %catch, label %eh.resume
|
|
|
|
catch: ; preds = %catch.dispatch
|
|
%exn = load ptr, ptr %exn.slot, align 4
|
|
%5 = call ptr @__cxa_begin_catch(ptr %exn) #2
|
|
%6 = load i32, ptr %5, align 4
|
|
store i32 %6, ptr %0, align 4
|
|
store i32 2, ptr %retval, align 4
|
|
call void @__cxa_end_catch() #2
|
|
br label %return
|
|
|
|
try.cont: ; preds = %invoke.cont
|
|
store i32 1, ptr %retval, align 4
|
|
br label %return
|
|
|
|
return: ; preds = %try.cont, %catch
|
|
%7 = load i32, ptr %retval, align 4
|
|
ret i32 %7
|
|
|
|
eh.resume: ; preds = %catch.dispatch
|
|
%exn1 = load ptr, ptr %exn.slot, align 4
|
|
%sel2 = load i32, ptr %ehselector.slot, align 4
|
|
%lpad.val = insertvalue { ptr, i32 } undef, ptr %exn1, 0
|
|
%lpad.val3 = insertvalue { ptr, i32 } %lpad.val, i32 %sel2, 1
|
|
resume { ptr, i32 } %lpad.val3
|
|
}
|
|
|
|
; ASMNFS: ._Z9catchFuncv:
|
|
; ASMFS: .csect ._Z9catchFuncv[PR],5
|
|
; 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 0x20 # -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 0x80 # +HasExtensionTable, -HasVectorInfo, NumOfGPRsSaved = 0
|
|
; ASM: .byte 0x00 # NumberOfFixedParms = 0
|
|
; ASM: .byte 0x01 # NumberOfFPParms = 0, +HasParmsOnStack
|
|
; ASMNFS: .vbyte 4, L.._Z9catchFuncv0-._Z9catchFuncv # Function size
|
|
; ASMFS: .vbyte 4, L.._Z9catchFuncv0-._Z9catchFuncv[PR] # Function size
|
|
; ASM: .vbyte 2, 0x000d # Function name len = 13
|
|
; ASM: .byte "_Z9catchFuncv" # 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:
|
|
|
|
; ASMNFS: .csect .gcc_except_table[RO],2
|
|
; ASMFS: .csect .gcc_except_table._Z9catchFuncv[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
|
|
|
|
; ASMNFS: .csect .eh_info_table[RW],2
|
|
; ASMFS: .csect .eh_info_table._Z9catchFuncv[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[TE],__ehinfo.1
|
|
|
|
declare ptr @__cxa_allocate_exception(i32)
|
|
declare void @__cxa_throw(ptr, ptr, ptr)
|
|
declare i32 @__xlcxx_personality_v1(...)
|
|
declare i32 @llvm.eh.typeid.for(ptr)
|
|
declare ptr @__cxa_begin_catch(ptr)
|
|
declare void @__cxa_end_catch()
|