diff options
-rw-r--r-- | lib/CodeGen/IntrinsicLowering.cpp | 16 | ||||
-rw-r--r-- | lib/VMCore/Function.cpp | 3 | ||||
-rw-r--r-- | lib/VMCore/IntrinsicLowering.cpp | 16 | ||||
-rw-r--r-- | lib/VMCore/Verifier.cpp | 2 |
4 files changed, 35 insertions, 2 deletions
diff --git a/lib/CodeGen/IntrinsicLowering.cpp b/lib/CodeGen/IntrinsicLowering.cpp index 026150f..48ae015 100644 --- a/lib/CodeGen/IntrinsicLowering.cpp +++ b/lib/CodeGen/IntrinsicLowering.cpp @@ -13,8 +13,8 @@ #include "llvm/IntrinsicLowering.h" #include "llvm/Constant.h" +#include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/Type.h" #include "llvm/iOther.h" using namespace llvm; @@ -57,6 +57,20 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { if (CI->getType() != Type::VoidTy) CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); break; // Simply strip out debugging intrinsics + + case Intrinsic::memcpy: { + // The memcpy intrinsic take an extra alignment argument that the memcpy + // libc function does not. + const FunctionType *CFT = Callee->getFunctionType(); + FunctionType *FT = + FunctionType::get(*CFT->param_begin(), + std::vector<const Type*>(CFT->param_begin(), CFT->param_end()-1), + false); + Function *MemCpy = M->getOrInsertFunction("memcpy", FT); + new CallInst(MemCpy, std::vector<Value*>(CI->op_begin()+1, CI->op_end()-1), + CI->getName(), CI); + break; + } } assert(CI->use_empty() && diff --git a/lib/VMCore/Function.cpp b/lib/VMCore/Function.cpp index f98a7c7..a4bc4ea 100644 --- a/lib/VMCore/Function.cpp +++ b/lib/VMCore/Function.cpp @@ -217,6 +217,9 @@ unsigned Function::getIntrinsicID() const { case 'l': if (getName() == "llvm.longjmp") return Intrinsic::longjmp; break; + case 'm': + if (getName() == "llvm.memcpy") return Intrinsic::memcpy; + break; case 's': if (getName() == "llvm.setjmp") return Intrinsic::setjmp; if (getName() == "llvm.sigsetjmp") return Intrinsic::sigsetjmp; diff --git a/lib/VMCore/IntrinsicLowering.cpp b/lib/VMCore/IntrinsicLowering.cpp index 026150f..48ae015 100644 --- a/lib/VMCore/IntrinsicLowering.cpp +++ b/lib/VMCore/IntrinsicLowering.cpp @@ -13,8 +13,8 @@ #include "llvm/IntrinsicLowering.h" #include "llvm/Constant.h" +#include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/Type.h" #include "llvm/iOther.h" using namespace llvm; @@ -57,6 +57,20 @@ void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { if (CI->getType() != Type::VoidTy) CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); break; // Simply strip out debugging intrinsics + + case Intrinsic::memcpy: { + // The memcpy intrinsic take an extra alignment argument that the memcpy + // libc function does not. + const FunctionType *CFT = Callee->getFunctionType(); + FunctionType *FT = + FunctionType::get(*CFT->param_begin(), + std::vector<const Type*>(CFT->param_begin(), CFT->param_end()-1), + false); + Function *MemCpy = M->getOrInsertFunction("memcpy", FT); + new CallInst(MemCpy, std::vector<Value*>(CI->op_begin()+1, CI->op_end()-1), + CI->getName(), CI); + break; + } } assert(CI->use_empty() && diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 1a66a9f..71ea54e 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -561,6 +561,8 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { case Intrinsic::dbg_region_end: NumArgs = 1; break; case Intrinsic::dbg_func_start: NumArgs = 1; break; case Intrinsic::dbg_declare: NumArgs = 1; break; + + case Intrinsic::memcpy: NumArgs = 4; break; case Intrinsic::alpha_ctlz: NumArgs = 1; break; case Intrinsic::alpha_cttz: NumArgs = 1; break; |