diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-11 20:45:13 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2010-03-11 20:45:13 +0000 |
commit | 2fc395659c798b834d57ab79809fc4de09bf4191 (patch) | |
tree | 20959284b46f88a802942987c38b7aaa1e649c08 /llvm/lib/Transforms | |
parent | 01bb5ce9323e32327fc86fd29d462813f310f105 (diff) | |
download | bcm5719-llvm-2fc395659c798b834d57ab79809fc4de09bf4191.tar.gz bcm5719-llvm-2fc395659c798b834d57ab79809fc4de09bf4191.zip |
stpcpy is so similar to strcpy, it doesn't deserve a complete copy of the __strcpy_chk -> strcpy code.
llvm-svn: 98284
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp | 18 | ||||
-rw-r--r-- | llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 24 |
3 files changed, 11 insertions, 58 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 43ff58d8ff1..4b933f08b13 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -819,36 +819,19 @@ Instruction *InstCombiner::tryOptimizeCall(CallInst *CI, const TargetData *TD) { return 0; } - if (Name == "__strcpy_chk") { + if (Name == "__strcpy_chk" || Name == "__stpcpy_chk") { ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); if (!SizeCI) return 0; // If a) we don't have any length information, or b) we know this will - // fit then just lower to a plain strcpy. Otherwise we'll keep our - // strcpy_chk call which may fail at runtime if the size is too long. + // 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. // TODO: It might be nice to get a maximum length out of the possible // string lengths for varying. if (SizeCI->isAllOnesValue() || SizeCI->getZExtValue() >= GetStringLength(CI->getOperand(2))) { - Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD); - return ReplaceInstUsesWith(*CI, Ret); - } - return 0; - } - - // Should be similar to strcpy. - if (Name == "__stpcpy_chk") { - ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); - if (!SizeCI) - return 0; - // If a) we don't have any length information, or b) we know this will - // fit then just lower to a plain stpcpy. Otherwise we'll keep our - // stpcpy_chk call which may fail at runtime if the size is too long. - // TODO: It might be nice to get a maximum length out of the possible - // string lengths for varying. - if (SizeCI->isAllOnesValue() || - SizeCI->getZExtValue() >= GetStringLength(CI->getOperand(2))) { - Value *Ret = EmitStpCpy(CI->getOperand(1), CI->getOperand(2), B, TD); + Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD, + Name.substr(2, 6)); return ReplaceInstUsesWith(*CI, Ret); } return 0; diff --git a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp index c428d2b0b0c..c26d74d0857 100644 --- a/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp +++ b/llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp @@ -620,25 +620,13 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) { return 0; } - if (Name == "__strcpy_chk") { + if (Name == "__strcpy_chk" || Name == "__stpcpy_chk") { ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); if (!SizeCI) return 0; if (SizeCI->isAllOnesValue()) { - Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD); - CI->replaceAllUsesWith(Ret); - CI->eraseFromParent(); - return true; - } - return 0; - } - - if (Name == "__stpcpy_chk") { - ConstantInt *SizeCI = dyn_cast<ConstantInt>(CI->getOperand(3)); - if (!SizeCI) - return 0; - if (SizeCI->isAllOnesValue()) { - Value *Ret = EmitStpCpy(CI->getOperand(1), CI->getOperand(2), B, TD); + Value *Ret = EmitStrCpy(CI->getOperand(1), CI->getOperand(2), B, TD, + Name.substr(2, 6)); CI->replaceAllUsesWith(Ret); CI->eraseFromParent(); return true; diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp index 7f62166f2e2..a4776343606 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -72,39 +72,21 @@ Value *llvm::EmitStrChr(Value *Ptr, char C, IRBuilder<> &B, /// EmitStrCpy - Emit a call to the strcpy function to the builder, for the /// specified pointer arguments. Value *llvm::EmitStrCpy(Value *Dst, Value *Src, IRBuilder<> &B, - const TargetData *TD) { + const TargetData *TD, StringRef Name) { Module *M = B.GetInsertBlock()->getParent()->getParent(); AttributeWithIndex AWI[2]; AWI[0] = AttributeWithIndex::get(2, Attribute::NoCapture); AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind); const Type *I8Ptr = B.getInt8PtrTy(); - Value *StrCpy = M->getOrInsertFunction("strcpy", AttrListPtr::get(AWI, 2), + Value *StrCpy = M->getOrInsertFunction(Name, AttrListPtr::get(AWI, 2), I8Ptr, I8Ptr, I8Ptr, NULL); CallInst *CI = B.CreateCall2(StrCpy, CastToCStr(Dst, B), CastToCStr(Src, B), - "strcpy"); + Name); if (const Function *F = dyn_cast<Function>(StrCpy->stripPointerCasts())) CI->setCallingConv(F->getCallingConv()); return CI; } -/// EmitStpCpy - Emit a call to the stpcpy function to the builder, for the -/// specified pointer arguments. -Value *llvm::EmitStpCpy(Value *Dst, Value *Src, IRBuilder<> &B, - const TargetData *TD) { - Module *M = B.GetInsertBlock()->getParent()->getParent(); - AttributeWithIndex AWI[2]; - AWI[0] = AttributeWithIndex::get(2, Attribute::NoCapture); - AWI[1] = AttributeWithIndex::get(~0u, Attribute::NoUnwind); - const Type *I8Ptr = B.getInt8PtrTy(); - Value *StpCpy = M->getOrInsertFunction("stpcpy", AttrListPtr::get(AWI, 2), - I8Ptr, I8Ptr, I8Ptr, NULL); - CallInst *CI = B.CreateCall2(StpCpy, CastToCStr(Dst, B), CastToCStr(Src, B), - "stpcpy"); - if (const Function *F = dyn_cast<Function>(StpCpy->stripPointerCasts())) - CI->setCallingConv(F->getCallingConv()); - return CI; -} - /// EmitStrNCpy - Emit a call to the strncpy function to the builder, for the /// specified pointer arguments. Value *llvm::EmitStrNCpy(Value *Dst, Value *Src, Value *Len, |