From 850b610cc5c2357039fa8c5e175d82e66c47662a Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 14 Mar 2018 19:49:28 +0000 Subject: [PATCH] [COFF] Add integration test for LTO + /guard:cf This tests that LLVM emits the relocations that /guard:cf needs to identify address taken. This was PR36624, which was fixed in r327557. llvm-svn: 327559 --- lld/test/COFF/Inputs/loadconfig-cfg-x64.s | 11 +++++++++ lld/test/COFF/guardcf-lto.ll | 39 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 lld/test/COFF/Inputs/loadconfig-cfg-x64.s create mode 100644 lld/test/COFF/guardcf-lto.ll diff --git a/lld/test/COFF/Inputs/loadconfig-cfg-x64.s b/lld/test/COFF/Inputs/loadconfig-cfg-x64.s new file mode 100644 index 0000000..1440b11 --- /dev/null +++ b/lld/test/COFF/Inputs/loadconfig-cfg-x64.s @@ -0,0 +1,11 @@ +# This is the _load_config_used definition needed for /guard:cf tests. + + .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 diff --git a/lld/test/COFF/guardcf-lto.ll b/lld/test/COFF/guardcf-lto.ll new file mode 100644 index 0000000..8675117 --- /dev/null +++ b/lld/test/COFF/guardcf-lto.ll @@ -0,0 +1,39 @@ +; Set up an import library for a DLL that will do the indirect call. +; RUN: echo -e 'LIBRARY library\nEXPORTS\n do_indirect_call\n' > %t.def +; RUN: lld-link -lib -def:%t.def -out:%t.lib -machine:x64 + +; Generate an object that will have the load configuration normally provided by +; the CRT. +; RUN: llvm-mc -triple x86_64-windows-msvc -filetype=obj %S/Inputs/loadconfig-cfg-x64.s -o %t.ldcfg.obj + +; RUN: llvm-as %s -o %t.bc +; RUN: lld-link -entry:main -guard:cf -dll %t.bc %t.lib %t.ldcfg.obj -out:%t.dll +; RUN: llvm-readobj -coff-load-config %t.dll | FileCheck %s + +; There must be *two* entries in the table: DLL entry point, and my_handler. + +; CHECK: LoadConfig [ +; CHECK: GuardCFFunctionTable: 0x{{[^0].*}} +; CHECK-NEXT: GuardCFFunctionCount: 2 +; CHECK-NEXT: GuardFlags: 0x10500 +; CHECK: ] +; CHECK: GuardFidTable [ +; CHECK-NEXT: 0x180{{.*}} +; CHECK-NEXT: 0x180{{.*}} +; CHECK-NEXT: ] + +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-windows-msvc19.12.25835" + +declare dllimport void @do_indirect_call(void ()*) + +define dso_local i32 @main() local_unnamed_addr { +entry: + tail call void @do_indirect_call(void ()* nonnull @my_handler) + ret i32 0 +} + +define dso_local void @my_handler() { +entry: + ret void +} -- 2.7.4