mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +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() { } | SimplifyFortifiedLibCalls::~SimplifyFortifiedLibCalls() { } | ||||||
|  |  | ||||||
| bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) { | bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) { | ||||||
|  |   // We really need TargetData for later. | ||||||
|  |   if (!TD) return false; | ||||||
|  |    | ||||||
|   this->CI = CI; |   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(); |   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. |   // Set the builder to the instruction after the call. | ||||||
|   B.SetInsertPoint(BB, CI); |   B.SetInsertPoint(BB, CI); | ||||||
|  |  | ||||||
|   if (Name == "__memcpy_chk") { |   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)) { |     if (isFoldable(4, 3, false)) { | ||||||
|       EmitMemCpy(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), |       EmitMemCpy(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), | ||||||
|                  1, false, B, TD); |                  1, false, B, TD); | ||||||
| @@ -397,6 +411,14 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (Name == "__memmove_chk") { |   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)) { |     if (isFoldable(4, 3, false)) { | ||||||
|       EmitMemMove(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), |       EmitMemMove(CI->getOperand(1), CI->getOperand(2), CI->getOperand(3), | ||||||
|                   1, false, B, TD); |                   1, false, B, TD); | ||||||
| @@ -407,6 +429,14 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (Name == "__memset_chk") { |   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)) { |     if (isFoldable(4, 3, false)) { | ||||||
|       Value *Val = B.CreateIntCast(CI->getOperand(2), B.getInt8Ty(), |       Value *Val = B.CreateIntCast(CI->getOperand(2), B.getInt8Ty(), | ||||||
|                                    false); |                                    false); | ||||||
| @@ -418,6 +448,15 @@ bool SimplifyFortifiedLibCalls::fold(CallInst *CI, const TargetData *TD) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   if (Name == "__strcpy_chk" || Name == "__stpcpy_chk") { |   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 |     // 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 |     // 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. |     // 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") { |   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)) { |     if (isFoldable(4, 3, false)) { | ||||||
|       Value *Ret = EmitStrNCpy(CI->getOperand(1), CI->getOperand(2), |       Value *Ret = EmitStrNCpy(CI->getOperand(1), CI->getOperand(2), | ||||||
|                                CI->getOperand(3), B, TD, Name.substr(2, 7)); |                                CI->getOperand(3), B, TD, Name.substr(2, 7)); | ||||||
|   | |||||||
| @@ -111,10 +111,10 @@ define i32 @test4() nounwind ssp { | |||||||
| entry: | entry: | ||||||
|   %0 = alloca %struct.data, align 8 |   %0 = alloca %struct.data, align 8 | ||||||
|   %1 = bitcast %struct.data* %0 to i8* |   %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-NOT: @llvm.objectsize | ||||||
| ; CHECK: @llvm.memset.p0i8.i64(i8* %1, i8 0, i64 1824, i32 8, i1 false) | ; CHECK: @llvm.memset.p0i8.i32(i8* %1, i8 0, i32 1824, i32 8, i1 false) | ||||||
|   %3 = call i8* @__memset_chk(i8* %1, i32 0, i64 1824, i64 %2) nounwind |   %3 = call i8* @__memset_chk(i8* %1, i32 0, i32 1824, i32 %2) nounwind | ||||||
|   ret i32 0 |   ret i32 0 | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -150,5 +150,3 @@ declare i8* @__memset_chk(i8*, i32, i64, i64) nounwind | |||||||
| declare noalias i8* @malloc(i32) nounwind | declare noalias i8* @malloc(i32) nounwind | ||||||
|  |  | ||||||
| declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly | declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly | ||||||
|  |  | ||||||
| declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readonly |  | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| ; RUN: opt < %s -instcombine -S | FileCheck %s | ; 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] | @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] | @.str = private constant [8 x i8] c"abcdefg\00"   ; <[8 x i8]*> [#uses=1] | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user