1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00
llvm-mirror/test/CodeGen/WinCFGuard/cfguard-cast.ll
Reid Kleckner 178c3cb32f [WinCFG] Handle constant casts carefully in .gfids emission
Summary:
The general Function::hasAddressTaken has two issues that make it
inappropriate for our purposes:
1. it is sensitive to dead constant users (PR43858 / crbug.com/1019970),
   leading to different codegen when debu info is enabled
2. it considers direct calls via a function cast to be address escapes

The first is fixable, but the second is not, because IPO clients rely on
this behavior. They assume this function means that all call sites are
analyzable for IPO purposes.

So, implement our own analysis, which gets closer to finding functions
that may be indirect call targets.

Reviewers: ajpaverd, efriedma, hans

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69676
2019-11-01 13:32:03 -07:00

36 lines
843 B
LLVM

; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc | FileCheck %s
; Check how constant function pointer casts are handled.
declare void @unprototyped(...)
define i32 @call_unprototyped() {
call void bitcast (void (...)* @unprototyped to void ()*)()
ret i32 0
}
; CHECK-LABEL: call_unprototyped:
; CHECK: callq unprototyped
; CHECK: xorl %eax, %eax
; CHECK: retq
declare void @escaped_cast()
define i32 @escape_it_with_cast(i8** %p) {
store i8* bitcast (void ()* @escaped_cast to i8*), i8** %p
ret i32 0
}
declare void @dead_constant()
!llvm.module.flags = !{!0}
!0 = !{i32 2, !"cfguard", i32 1}
!dead_constant_root = !{!1}
!1 = !DITemplateValueParameter(name: "dead_constant", value: i8* bitcast (void ()* @dead_constant to i8*))
; CHECK-LABEL: .section .gfids$y,"dr"
; CHECK-NEXT: .symidx escaped_cast
; CHECK-NOT: .symidx