mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[SimplifyLibCalls] Ignore nobuiltin/unavailable fortified libcalls.
We used to do this before refactorings around r225640. Some clang users checked for _chk libcall availability using: __has_builtin(__builtin___memcpy_chk) When compiling with -fno-builtin, this is always true. When passing -ffreestanding/-mkernel, which both imply -fno-builtin, we end up with fortified libcalls, which isn't acceptable in a freestanding environment which only provides their non-fortified counterparts. Until we change clang and/or teach external users to check for availability differently, disregard the "nobuiltin" attribute and TLI::has. Workaround for PR23093. llvm-svn: 233776
This commit is contained in:
parent
7bfde8133e
commit
8544aa4b2b
@ -2322,8 +2322,18 @@ Value *FortifiedLibCallSimplifier::optimizeStrpNCpyChk(CallInst *CI,
|
||||
}
|
||||
|
||||
Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI) {
|
||||
if (CI->isNoBuiltin())
|
||||
return nullptr;
|
||||
// FIXME: We shouldn't be changing "nobuiltin" or TLI unavailable calls here.
|
||||
// Some clang users checked for _chk libcall availability using:
|
||||
// __has_builtin(__builtin___memcpy_chk)
|
||||
// When compiling with -fno-builtin, this is always true.
|
||||
// When passing -ffreestanding/-mkernel, which both imply -fno-builtin, we
|
||||
// end up with fortified libcalls, which isn't acceptable in a freestanding
|
||||
// environment which only provides their non-fortified counterparts.
|
||||
//
|
||||
// Until we change clang and/or teach external users to check for availability
|
||||
// differently, disregard the "nobuiltin" attribute and TLI::has.
|
||||
//
|
||||
// PR23093.
|
||||
|
||||
LibFunc::Func Func;
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
@ -2332,7 +2342,7 @@ Value *FortifiedLibCallSimplifier::optimizeCall(CallInst *CI) {
|
||||
bool isCallingConvC = CI->getCallingConv() == llvm::CallingConv::C;
|
||||
|
||||
// First, check that this is a known library functions.
|
||||
if (!TLI->getLibFunc(FuncName, Func) || !TLI->has(Func))
|
||||
if (!TLI->getLibFunc(FuncName, Func))
|
||||
return nullptr;
|
||||
|
||||
// We never change the calling convention.
|
||||
|
@ -0,0 +1,18 @@
|
||||
; RUN: opt -S -disable-simplify-libcalls -codegenprepare < %s | FileCheck %s
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
; This is a workaround for PR23093: when building with -mkernel/-fno-builtin,
|
||||
; we still generate fortified library calls.
|
||||
|
||||
; Check that we ignore two things:
|
||||
; - attribute nobuiltin
|
||||
; - TLI::has (always returns false thanks to -disable-simplify-libcalls)
|
||||
|
||||
; CHECK-NOT: _chk
|
||||
; CHECK: call void @llvm.memset.p0i8.i64(i8* %dst, i8 0, i64 %len, i32 1, i1 false)
|
||||
define void @test_nobuiltin(i8* %dst, i64 %len) {
|
||||
call i8* @__memset_chk(i8* %dst, i32 0, i64 %len, i64 -1) nobuiltin
|
||||
ret void
|
||||
}
|
||||
|
||||
declare i8* @__memset_chk(i8*, i32, i64, i64)
|
Loading…
Reference in New Issue
Block a user