summaryrefslogtreecommitdiff
path: root/test/COFF/gfids-relocations32.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/COFF/gfids-relocations32.s')
-rw-r--r--test/COFF/gfids-relocations32.s87
1 files changed, 87 insertions, 0 deletions
diff --git a/test/COFF/gfids-relocations32.s b/test/COFF/gfids-relocations32.s
new file mode 100644
index 0000000000000..0f7efeb460784
--- /dev/null
+++ b/test/COFF/gfids-relocations32.s
@@ -0,0 +1,87 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple i686-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
+
+# Only f and _main should go in the table.
+# (use /lldmap:map.txt to check their addresses).
+#
+# CHECK: GuardFidTable [
+# CHECK-NEXT: 0x401000
+# CHECK-NEXT: 0x401030
+# CHECK-NEXT: ]
+
+# The input was loosly based on studying this program:
+#
+# void foo() { return; }
+# void bar() { return; }
+# int main() {
+# foo();
+# void (*arr[])() = { &bar };
+# (*arr[0])();
+# return 0;
+# }
+# cl /c a.cc && dumpbin /disasm a.obj > a.txt &&
+# link a.obj /guard:cf /map:map.txt && dumpbin /loadconfig a.exe
+
+
+
+ .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: .long f # DIR32 relocation to function
+ .long 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_DIRECTORY32).
+# The linker will define the ___guard_* symbols.
+ .section .rdata,"dr"
+.globl __load_config_used
+__load_config_used:
+ .long 104 # Size.
+ .fill 76, 1, 0
+ .long ___guard_fids_table
+ .long ___guard_fids_count
+ .long ___guard_flags
+ .fill 12, 1, 0