aboutsummaryrefslogtreecommitdiff
path: root/test/COFF/gfids-relocations64.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/COFF/gfids-relocations64.s')
-rw-r--r--test/COFF/gfids-relocations64.s76
1 files changed, 76 insertions, 0 deletions
diff --git a/test/COFF/gfids-relocations64.s b/test/COFF/gfids-relocations64.s
new file mode 100644
index 000000000000..ae2e687222d5
--- /dev/null
+++ b/test/COFF/gfids-relocations64.s
@@ -0,0 +1,76 @@
+# 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