forked from OSchip/llvm-project
add methods to IRBuilder to create memcpy/memset/memmove.
llvm-svn: 122571
This commit is contained in:
parent
54462cd730
commit
143a07cfee
|
@ -235,13 +235,48 @@ public:
|
|||
return Type::getVoidTy(Context);
|
||||
}
|
||||
|
||||
const PointerType *getInt8PtrTy() {
|
||||
return Type::getInt8PtrTy(Context);
|
||||
const PointerType *getInt8PtrTy(unsigned AddrSpace = 0) {
|
||||
return Type::getInt8PtrTy(Context, AddrSpace);
|
||||
}
|
||||
|
||||
/// getCurrentFunctionReturnType - Get the return type of the current function
|
||||
/// that we're emitting into.
|
||||
const Type *getCurrentFunctionReturnType() const;
|
||||
|
||||
/// CreateMemSet - Create and insert a memset to the specified pointer and the
|
||||
/// specified value. If the pointer isn't an i8*, it will be converted. If a
|
||||
/// TBAA tag is specified, it will be added to the instruction.
|
||||
CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0) {
|
||||
return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile, TBAATag);
|
||||
}
|
||||
|
||||
CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0);
|
||||
|
||||
/// CreateMemCpy - Create and insert a memcpy between the specified pointers.
|
||||
/// If the pointers aren't i8*, they will be converted. If a TBAA tag is
|
||||
/// specified, it will be added to the instruction.
|
||||
CallInst *CreateMemCpy(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0) {
|
||||
return CreateMemCpy(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag);
|
||||
}
|
||||
|
||||
CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0);
|
||||
|
||||
/// CreateMemMove - Create and insert a memmove between the specified
|
||||
/// pointers. If the pointers aren't i8*, they will be converted. If a TBAA
|
||||
/// tag is specified, it will be added to the instruction.
|
||||
CallInst *CreateMemMove(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0) {
|
||||
return CreateMemMove(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag);
|
||||
}
|
||||
|
||||
CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
||||
bool isVolatile = false, MDNode *TBAATag = 0);
|
||||
private:
|
||||
Value *getCastedInt8PtrValue(Value *Ptr);
|
||||
};
|
||||
|
||||
/// IRBuilder - This provides a uniform API for creating instructions and
|
||||
|
@ -279,6 +314,11 @@ public:
|
|||
SetInsertPoint(TheBB);
|
||||
}
|
||||
|
||||
explicit IRBuilder(Instruction *IP)
|
||||
: IRBuilderBase(IP->getContext()), Folder(Context) {
|
||||
SetInsertPoint(IP);
|
||||
}
|
||||
|
||||
IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F)
|
||||
: IRBuilderBase(TheBB->getContext()), Folder(F) {
|
||||
SetInsertPoint(TheBB, IP);
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "llvm/Support/IRBuilder.h"
|
||||
#include "llvm/GlobalVariable.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Intrinsics.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
using namespace llvm;
|
||||
|
||||
|
@ -36,3 +37,83 @@ const Type *IRBuilderBase::getCurrentFunctionReturnType() const {
|
|||
assert(BB && BB->getParent() && "No current function!");
|
||||
return BB->getParent()->getReturnType();
|
||||
}
|
||||
|
||||
Value *IRBuilderBase::getCastedInt8PtrValue(Value *Ptr) {
|
||||
const PointerType *PT = cast<PointerType>(Ptr->getType());
|
||||
if (PT->getElementType()->isIntegerTy(8))
|
||||
return Ptr;
|
||||
|
||||
// Otherwise, we need to insert a bitcast.
|
||||
PT = getInt8PtrTy(PT->getAddressSpace());
|
||||
BitCastInst *BCI = new BitCastInst(Ptr, PT, "");
|
||||
BB->getInstList().insert(InsertPt, BCI);
|
||||
SetInstDebugLocation(BCI);
|
||||
return BCI;
|
||||
}
|
||||
|
||||
static CallInst *createCallHelper(Value *Callee, Value *const* Ops,
|
||||
unsigned NumOps, IRBuilderBase *Builder) {
|
||||
CallInst *CI = CallInst::Create(Callee, Ops, Ops + NumOps, "");
|
||||
Builder->GetInsertBlock()->getInstList().insert(Builder->GetInsertPoint(),CI);
|
||||
Builder->SetInstDebugLocation(CI);
|
||||
return CI;
|
||||
}
|
||||
|
||||
|
||||
CallInst *IRBuilderBase::
|
||||
CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
|
||||
bool isVolatile, MDNode *TBAATag) {
|
||||
Ptr = getCastedInt8PtrValue(Ptr);
|
||||
Value *Ops[] = { Ptr, Val, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
const Type *Tys[] = { Ptr->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys, 2);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
|
||||
return CI;
|
||||
}
|
||||
|
||||
CallInst *IRBuilderBase::
|
||||
CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
||||
bool isVolatile, MDNode *TBAATag) {
|
||||
Dst = getCastedInt8PtrValue(Dst);
|
||||
Src = getCastedInt8PtrValue(Src);
|
||||
|
||||
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
const Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memcpy, Tys, 3);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
|
||||
return CI;
|
||||
}
|
||||
|
||||
CallInst *IRBuilderBase::
|
||||
CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
|
||||
bool isVolatile, MDNode *TBAATag) {
|
||||
Dst = getCastedInt8PtrValue(Dst);
|
||||
Src = getCastedInt8PtrValue(Src);
|
||||
|
||||
Value *Ops[] = { Dst, Src, Size, getInt32(Align), getInt1(isVolatile) };
|
||||
const Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() };
|
||||
Module *M = BB->getParent()->getParent();
|
||||
Value *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memmove, Tys, 3);
|
||||
|
||||
CallInst *CI = createCallHelper(TheFn, Ops, 5, this);
|
||||
|
||||
// Set the TBAA info if present.
|
||||
if (TBAATag)
|
||||
CI->setMetadata(LLVMContext::MD_tbaa, TBAATag);
|
||||
|
||||
return CI;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue