# REQUIRES: x86 # RUN: llvm-mc -triple x86_64-pc-win32 %s -filetype=obj -o %t.obj # RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main # RUN: llvm-readobj --coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK # f, g, and main go in the table. # Including g isn't strictly necessary since it's not an indirect call target, # however the linker can't know that because relative relocations are used both # for direct calls and for getting the absolute address of a function. # (use /lldmap:map.txt to check their addresses). # # CHECK: GuardFidTable [ # CHECK-NEXT: 0x140001000 # CHECK-NEXT: 0x140001010 # CHECK-NEXT: 0x140001030 # CHECK-NEXT: ] .def f; .scl 3; .type 32; .endef .section .text,"xr",one_only,f .p2align 4 f: movl $1, %eax ret .def g; .scl 3; .type 32; .endef .section .text,"xr",one_only,g .p2align 4 g: movl $2, %eax ret .def label; .scl 6; # StorageClass: Label .type 0; # Type: Not a function. .endef .section .text,"xr",one_only,label .p2align 4 label: ret .data .globl fp .p2align 4 fp: .quad f # DIR32 relocation to function .quad label # DIR32 relocation to label .def main; .scl 2; .type 32; .endef .section .text,"xr",one_only,main .globl main .p2align 4 main: call *fp # DIR32 relocation to data call g # REL32 relocation to function ret # Load configuration directory entry (winnt.h _IMAGE_LOAD_CONFIG_DIRECTORY64). # The linker will define the __guard_* symbols. .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 128, 1, 0