forked from OSchip/llvm-project
224 lines
7.3 KiB
ArmAsm
224 lines
7.3 KiB
ArmAsm
# REQUIRES: x86
|
|
# RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj
|
|
# RUN: lld-link %t.obj -guard:cf -guard:ehcont -out:%t.exe -entry:main
|
|
# RUN: llvm-readobj --file-headers --coff-load-config %t.exe | FileCheck %s
|
|
|
|
# CHECK: ImageBase: 0x140000000
|
|
# CHECK: LoadConfig [
|
|
# CHECK: SEHandlerTable: 0x0
|
|
# CHECK: SEHandlerCount: 0
|
|
# CHECK: GuardCFCheckFunction: 0x0
|
|
# CHECK: GuardCFCheckDispatch: 0x0
|
|
# CHECK: GuardCFFunctionTable: 0x14000{{.*}}
|
|
# CHECK: GuardCFFunctionCount: 1
|
|
# CHECK: GuardFlags: 0x400500
|
|
# CHECK: GuardAddressTakenIatEntryTable: 0x0
|
|
# CHECK: GuardAddressTakenIatEntryCount: 0
|
|
# CHECK: GuardEHContinuationTable: 0x14000{{.*}}
|
|
# CHECK: GuardEHContinuationCount: 1
|
|
# CHECK: ]
|
|
# CHECK: GuardEHContTable [
|
|
# CHECK-NEXT: 0x14000{{.*}}
|
|
# CHECK-NEXT: ]
|
|
|
|
|
|
# This assembly is reduced from C code like:
|
|
# int main()
|
|
# {
|
|
# try {
|
|
# throw 3;
|
|
# }
|
|
# catch (int e) {
|
|
# return e != 3;
|
|
# }
|
|
# return 2;
|
|
# }
|
|
|
|
# We need @feat.00 to have 0x4000 to indicate /guard:ehcont.
|
|
.def @feat.00;
|
|
.scl 3;
|
|
.type 0;
|
|
.endef
|
|
.globl @feat.00
|
|
@feat.00 = 0x4000
|
|
.def main; .scl 2; .type 32; .endef
|
|
.globl main # -- Begin function main
|
|
.p2align 4, 0x90
|
|
main: # @main
|
|
.Lfunc_begin0:
|
|
.seh_proc main
|
|
.intel_syntax
|
|
.seh_handler __CxxFrameHandler3, @unwind, @except
|
|
# %bb.0: # %entry
|
|
push rbp
|
|
.seh_pushreg rbp
|
|
sub rsp, 64
|
|
.seh_stackalloc 64
|
|
lea rbp, [rsp + 64]
|
|
.seh_setframe rbp, 64
|
|
.seh_endprologue
|
|
mov qword ptr [rbp - 16], -2
|
|
mov dword ptr [rbp - 20], 0
|
|
mov dword ptr [rbp - 24], 3
|
|
.Ltmp0:
|
|
lea rdx, [rip + _TI1H]
|
|
lea rcx, [rbp - 24]
|
|
call _CxxThrowException
|
|
.Ltmp1:
|
|
jmp .LBB0_3
|
|
.LBB0_2: # Block address taken
|
|
# %catchret.dest
|
|
$ehgcr_0_2:
|
|
mov eax, dword ptr [rbp - 20]
|
|
add rsp, 64
|
|
pop rbp
|
|
ret
|
|
.LBB0_3: # %unreachable
|
|
int3
|
|
.seh_handlerdata
|
|
.long ($cppxdata$main)@IMGREL
|
|
.text
|
|
.seh_endproc
|
|
.def "?catch$1@?0?main@4HA";
|
|
.scl 3;
|
|
.type 32;
|
|
.endef
|
|
.p2align 4, 0x90
|
|
"?catch$1@?0?main@4HA":
|
|
.seh_proc "?catch$1@?0?main@4HA"
|
|
.seh_handler __CxxFrameHandler3, @unwind, @except
|
|
.LBB0_1: # %catch
|
|
mov qword ptr [rsp + 16], rdx
|
|
push rbp
|
|
.seh_pushreg rbp
|
|
sub rsp, 32
|
|
.seh_stackalloc 32
|
|
lea rbp, [rdx + 64]
|
|
.seh_endprologue
|
|
mov eax, dword ptr [rbp - 4]
|
|
sub eax, 3
|
|
setne al
|
|
movzx eax, al
|
|
mov dword ptr [rbp - 20], eax
|
|
lea rax, [rip + .LBB0_2]
|
|
add rsp, 32
|
|
pop rbp
|
|
ret # CATCHRET
|
|
.def free; .scl 2; .type 32; .endef
|
|
.globl free
|
|
free:
|
|
ret
|
|
.def __CxxFrameHandler3; .scl 2; .type 32; .endef
|
|
.globl __CxxFrameHandler3
|
|
__CxxFrameHandler3:
|
|
ret
|
|
.def _CxxThrowException; .scl 2; .type 32; .endef
|
|
.globl _CxxThrowException
|
|
_CxxThrowException:
|
|
ret
|
|
.Lfunc_end0:
|
|
.seh_handlerdata
|
|
.long ($cppxdata$main)@IMGREL
|
|
.text
|
|
.seh_endproc
|
|
.section .xdata,"dr"
|
|
.p2align 2
|
|
$cppxdata$main:
|
|
.long 429065506 # MagicNumber
|
|
.long 2 # MaxState
|
|
.long ($stateUnwindMap$main)@IMGREL # UnwindMap
|
|
.long 1 # NumTryBlocks
|
|
.long ($tryMap$main)@IMGREL # TryBlockMap
|
|
.long 4 # IPMapEntries
|
|
.long ($ip2state$main)@IMGREL # IPToStateXData
|
|
.long 48 # UnwindHelp
|
|
.long 0 # ESTypeList
|
|
.long 1 # EHFlags
|
|
$stateUnwindMap$main:
|
|
.long -1 # ToState
|
|
.long 0 # Action
|
|
.long -1 # ToState
|
|
.long 0 # Action
|
|
$tryMap$main:
|
|
.long 0 # TryLow
|
|
.long 0 # TryHigh
|
|
.long 1 # CatchHigh
|
|
.long 1 # NumCatches
|
|
.long ($handlerMap$0$main)@IMGREL # HandlerArray
|
|
$handlerMap$0$main:
|
|
.long 0 # Adjectives
|
|
.long "??_R0H@8"@IMGREL # Type
|
|
.long 60 # CatchObjOffset
|
|
.long "?catch$1@?0?main@4HA"@IMGREL # Handler
|
|
.long 56 # ParentFrameOffset
|
|
$ip2state$main:
|
|
.long .Lfunc_begin0@IMGREL # IP
|
|
.long -1 # ToState
|
|
.long .Ltmp0@IMGREL+1 # IP
|
|
.long 0 # ToState
|
|
.long .Ltmp1@IMGREL+1 # IP
|
|
.long -1 # ToState
|
|
.long "?catch$1@?0?main@4HA"@IMGREL # IP
|
|
.long 1 # ToState
|
|
.text
|
|
# -- End function
|
|
.section .data,"dw",discard,"??_R0H@8"
|
|
.globl "??_R0H@8" # @"??_R0H@8"
|
|
.p2align 4
|
|
"??_R0H@8":
|
|
.quad 0
|
|
.quad 0
|
|
.asciz ".H"
|
|
.zero 5
|
|
|
|
.section .xdata,"dr",discard,"_CT??_R0H@84"
|
|
.globl "_CT??_R0H@84" # @"_CT??_R0H@84"
|
|
.p2align 4
|
|
"_CT??_R0H@84":
|
|
.long 1 # 0x1
|
|
.long "??_R0H@8"@IMGREL
|
|
.long 0 # 0x0
|
|
.long 4294967295 # 0xffffffff
|
|
.long 0 # 0x0
|
|
.long 4 # 0x4
|
|
.long 0 # 0x0
|
|
|
|
.section .xdata,"dr",discard,_CTA1H
|
|
.globl _CTA1H # @_CTA1H
|
|
.p2align 3
|
|
_CTA1H:
|
|
.long 1 # 0x1
|
|
.long "_CT??_R0H@84"@IMGREL
|
|
|
|
.section .xdata,"dr",discard,_TI1H
|
|
.globl _TI1H # @_TI1H
|
|
.p2align 3
|
|
_TI1H:
|
|
.long 0 # 0x0
|
|
.long 0 # 0x0
|
|
.long 0 # 0x0
|
|
.long _CTA1H@IMGREL
|
|
|
|
.section .gehcont$y,"dr"
|
|
.symidx $ehgcr_0_2
|
|
.addrsig_sym _CxxThrowException
|
|
.addrsig_sym __CxxFrameHandler3
|
|
.addrsig_sym "??_R0H@8"
|
|
.addrsig_sym __ImageBase
|
|
.section .rdata,"dr"
|
|
.globl _load_config_used
|
|
_load_config_used:
|
|
.long 312
|
|
.fill 124, 1, 0
|
|
.quad __guard_fids_table
|
|
.quad __guard_fids_count
|
|
.long __guard_flags
|
|
.fill 12, 1, 0
|
|
.quad __guard_iat_table
|
|
.quad __guard_iat_count
|
|
.quad __guard_longjmp_table
|
|
.quad __guard_longjmp_count
|
|
.fill 72, 1, 0
|
|
.quad __guard_eh_cont_table
|
|
.quad __guard_eh_cont_count
|
|
.fill 32, 1, 0 |