forked from OSchip/llvm-project
77 lines
2.0 KiB
ArmAsm
77 lines
2.0 KiB
ArmAsm
# 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
|