| # 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 |