mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
Verify function prototypes before trying to optimize functions. We also
need TargetData, just return false if we don't have it. Update testcases accordingly. Fixes PR6807. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@101011 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -373,15 +373,29 @@ void llvm::EmitFWrite(Value *Ptr, Value *Size, Value *File,
|
||||
SimplifyFortifiedLibCalls::~SimplifyFortifiedLibCalls() { }
|
||||
|
||||
bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) {
|
||||
// We really need TargetData for later.
|
||||
if (!TD) return false;
|
||||
|
||||
this->CI = CI;
|
||||
StringRef Name = CI->getCalledFunction()->getName();
|
||||
Function *Callee = CI->getCalledFunction();
|
||||
StringRef Name = Callee->getName();
|
||||
const FunctionType *FT = Callee->getFunctionType();
|
||||
BasicBlock *BB = CI->getParent();
|
||||
IRBuilder<> B(CI->getParent()->getContext());
|
||||
LLVMContext &Context = CI->getParent()->getContext();
|
||||
IRBuilder<> B(Context);
|
||||
|
||||
// Set the builder to the instruction after the call.
|
||||
B.SetInsertPoint(BB, CI);
|
||||
|
||||
if (Name == "__memcpy_chk") {
|
||||
// Check if this has the right signature.
|
||||
if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isPointerTy() ||
|
||||
!FT->getParamType(1)->isPointerTy() ||
|
||||
FT->getParamType(2) != TD->getIntPtrType(Context) ||
|
||||
FT->getParamType(3) != TD->getIntPtrType(Context))
|
||||
return false;
|
||||
|
||||
if (isFoldable(4, 3, false)) {
|
||||
EmitMemCpy(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3),
|
||||
1, false, B, TD);
|
||||
@@ -397,6 +411,14 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) {
|
||||
}
|
||||
|
||||
if (Name == "__memmove_chk") {
|
||||
// Check if this has the right signature.
|
||||
if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isPointerTy() ||
|
||||
!FT->getParamType(1)->isPointerTy() ||
|
||||
FT->getParamType(2) != TD->getIntPtrType(Context) ||
|
||||
FT->getParamType(3) != TD->getIntPtrType(Context))
|
||||
return false;
|
||||
|
||||
if (isFoldable(4, 3, false)) {
|
||||
EmitMemMove(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3),
|
||||
1, false, B, TD);
|
||||
@@ -407,6 +429,14 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) {
|
||||
}
|
||||
|
||||
if (Name == "__memset_chk") {
|
||||
// Check if this has the right signature.
|
||||
if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
!FT->getParamType(0)->isPointerTy() ||
|
||||
!FT->getParamType(1)->isIntegerTy() ||
|
||||
FT->getParamType(2) != TD->getIntPtrType(Context) ||
|
||||
FT->getParamType(3) != TD->getIntPtrType(Context))
|
||||
return false;
|
||||
|
||||
if (isFoldable(4, 3, false)) {
|
||||
Value *Val = B.CreateIntCast(CI->getOperand(2), B.getInt8Ty(),
|
||||
false);
|
||||
@@ -418,6 +448,15 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) {
|
||||
}
|
||||
|
||||
if (Name == "__strcpy_chk" || Name == "__stpcpy_chk") {
|
||||
// Check if this has the right signature.
|
||||
if (FT->getNumParams() != 3 ||
|
||||
FT->getReturnType() != FT->getParamType(0) ||
|
||||
FT->getParamType(0) != FT->getParamType(1) ||
|
||||
FT->getParamType(0) != Type::getInt8PtrTy(Context) ||
|
||||
FT->getParamType(2) != TD->getIntPtrType(Context))
|
||||
return 0;
|
||||
|
||||
|
||||
// If a) we don't have any length information, or b) we know this will
|
||||
// fit then just lower to a plain st[rp]cpy. Otherwise we'll keep our
|
||||
// st[rp]cpy_chk call which may fail at runtime if the size is too long.
|
||||
@@ -433,6 +472,13 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) {
|
||||
}
|
||||
|
||||
if (Name == "__strncpy_chk" || Name == "__stpncpy_chk") {
|
||||
// Check if this has the right signature.
|
||||
if (FT->getNumParams() != 4 || FT->getReturnType() != FT->getParamType(0) ||
|
||||
FT->getParamType(0) != FT->getParamType(1) ||
|
||||
FT->getParamType(0) != Type::getInt8PtrTy(Context) ||
|
||||
!FT->getParamType(2)->isIntegerTy() ||
|
||||
FT->getParamType(3) != TD->getIntPtrType(Context))
|
||||
|
||||
if (isFoldable(4, 3, false)) {
|
||||
Value *Ret = EmitStrNCpy(CI->getOperand(1), CI->getOperand(2),
|
||||
CI->getOperand(3), B, TD, Name.substr(2, 7));
|
||||
|
||||
@@ -111,10 +111,10 @@ define i32 @test4() nounwind ssp {
|
||||
entry:
|
||||
%0 = alloca %struct.data, align 8
|
||||
%1 = bitcast %struct.data* %0 to i8*
|
||||
%2 = call i64 @llvm.objectsize.i64(i8* %1, i1 false) nounwind
|
||||
%2 = call i32 @llvm.objectsize.i32(i8* %1, i1 false) nounwind
|
||||
; CHECK-NOT: @llvm.objectsize
|
||||
; CHECK: @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 1824, i32 8, i1 false)
|
||||
%3 = call i8* @__memset_chk(i8* %1, i32 0, i64 1824, i64 %2) nounwind
|
||||
; CHECK: @llvm.memset.p0i8.i32(i8* %1, i8 0, i32 1824, i32 8, i1 false)
|
||||
%3 = call i8* @__memset_chk(i8* %1, i32 0, i32 1824, i32 %2) nounwind
|
||||
ret i32 0
|
||||
}
|
||||
|
||||
@@ -149,6 +149,4 @@ declare i8* @__memset_chk(i8*, i32, i64, i64) nounwind
|
||||
|
||||
declare noalias i8* @malloc(i32) nounwind
|
||||
|
||||
declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
|
||||
|
||||
declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readonly
|
||||
declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly
|
||||
@@ -1,4 +1,5 @@
|
||||
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
|
||||
@a = common global [60 x i8] zeroinitializer, align 1 ; <[60 x i8]*> [#uses=1]
|
||||
@.str = private constant [8 x i8] c"abcdefg\00" ; <[8 x i8]*> [#uses=1]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user