# REQUIRES: x86 # RUN: llvm-mc -triple x86_64-windows-msvc %s -filetype=obj -o %t.obj # RUN: lld-link %t.obj -guard:cf -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: 0x10500 # CHECK: GuardAddressTakenIatEntryTable: 0x0 # CHECK: GuardAddressTakenIatEntryCount: 0 # CHECK: GuardLongJumpTargetTable: 0x14000{{.*}} # CHECK: GuardLongJumpTargetCount: 1 # CHECK: ] # CHECK: GuardLJmpTable [ # CHECK-NEXT: 0x14000{{.*}} # CHECK-NEXT: ] # This assembly is reduced from C code like: # #include # jmp_buf buf; # void g() { longjmp(buf, 1); } # void f() { # if (setjmp(buf)) # return; # g(); # } # int main() { f(); } # We need @feat.00 to have 0x800 to indicate /guard:cf. .def @feat.00; .scl 3; .type 0; .endef .globl @feat.00 @feat.00 = 0x801 .def f; .scl 2; .type 32; .endef .globl f f: pushq %rbp subq $32, %rsp leaq 32(%rsp), %rbp leaq buf(%rip), %rcx leaq -32(%rbp), %rdx callq _setjmp .Lljmp1: testl %eax, %eax je .LBB1_1 addq $32, %rsp popq %rbp retq .LBB1_1: # %if.end leaq buf(%rip), %rcx movl $1, %edx callq longjmp ud2 # Record the longjmp target. .section .gljmp$y,"dr" .symidx .Lljmp1 .text # Provide setjmp/longjmp stubs. .def _setjmp; .scl 2; .type 32; .endef .globl _setjmp _setjmp: retq .def longjmp; .scl 2; .type 32; .endef .globl longjmp longjmp: retq .def main; .scl 2; .type 32; .endef .globl main # -- Begin function main main: # @main subq $40, %rsp callq f xorl %eax, %eax addq $40, %rsp retq .comm buf,256,4 # @buf .section .rdata,"dr" .globl _load_config_used _load_config_used: .long 256 .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_fids_count .fill 84, 1, 0