1# REQUIRES: x86
2# RUN: llvm-mc -triple x86_64-pc-win32 %s -filetype=obj -o %t.obj
3# RUN: lld-link %t.obj -guard:cf -out:%t.exe -entry:main
4# RUN: llvm-readobj --coff-load-config %t.exe | FileCheck %s --check-prefix=CHECK
5
6# f, g, and main go in the table.
7# Including g isn't strictly necessary since it's not an indirect call target,
8# however the linker can't know that because relative relocations are used both
9# for direct calls and for getting the absolute address of a function.
10# (use /lldmap:map.txt to check their addresses).
11#
12# CHECK: GuardFidTable [
13# CHECK-NEXT: 0x140001000
14# CHECK-NEXT: 0x140001010
15# CHECK-NEXT: 0x140001030
16# CHECK-NEXT: ]
17
18        .def    f;
19        .scl    3;
20        .type   32;
21        .endef
22        .section       .text,"xr",one_only,f
23        .p2align 4
24f:      movl $1, %eax
25        ret
26
27
28        .def    g;
29        .scl    3;
30        .type   32;
31        .endef
32        .section       .text,"xr",one_only,g
33        .p2align 4
34g:      movl $2, %eax
35        ret
36
37
38        .def    label;
39        .scl    6;     # StorageClass: Label
40        .type   0;     # Type: Not a function.
41        .endef
42        .section       .text,"xr",one_only,label
43        .p2align 4
44label:  ret
45
46
47        .data
48        .globl fp
49        .p2align 4
50fp:     .quad f        # DIR32 relocation to function
51        .quad label    # DIR32 relocation to label
52
53
54        .def    main;
55        .scl    2;
56        .type   32;
57        .endef
58        .section       .text,"xr",one_only,main
59        .globl  main
60        .p2align 4
61main:   call *fp       # DIR32 relocation to data
62        call g         # REL32 relocation to function
63        ret
64
65
66# Load configuration directory entry (winnt.h _IMAGE_LOAD_CONFIG_DIRECTORY64).
67# The linker will define the __guard_* symbols.
68        .section .rdata,"dr"
69.globl _load_config_used
70_load_config_used:
71        .long 256
72        .fill 124, 1, 0
73        .quad __guard_fids_table
74        .quad __guard_fids_count
75        .long __guard_flags
76        .fill 128, 1, 0
77