X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FVMCore%2FiMemory.cpp;h=0a62d1cae069f313e6cfaafad6e0dd28a5fa62d5;hb=905f311d051496023e31fa8ba98db4f5b8f54c17;hp=eefeeefdc173084a9c623a21ca2c2efe70d3de82;hpb=bc7a95eb7ae8b79de22dcaa5463a7f25d524098e;p=oota-llvm.git diff --git a/lib/VMCore/iMemory.cpp b/lib/VMCore/iMemory.cpp index eefeeefdc17..0a62d1cae06 100644 --- a/lib/VMCore/iMemory.cpp +++ b/lib/VMCore/iMemory.cpp @@ -5,7 +5,38 @@ //===----------------------------------------------------------------------===// #include "llvm/iMemory.h" -#include "llvm/ConstPoolVals.h" +#include "llvm/Constants.h" +#include "llvm/DerivedTypes.h" + +static inline const Type *checkType(const Type *Ty) { + assert(Ty && "Invalid indices for type!"); + return Ty; +} + +AllocationInst::AllocationInst(const Type *Ty, Value *ArraySize, unsigned iTy, + const std::string &Name = "") + : Instruction(Ty, iTy, Name) { + assert(Ty->isPointerType() && "Can't allocate a non pointer type!"); + + // ArraySize defaults to 1. + if (!ArraySize) ArraySize = ConstantUInt::get(Type::UIntTy, 1); + + Operands.reserve(1); + assert(ArraySize->getType() == Type::UIntTy && + "Malloc/Allocation array size != UIntTy!"); + + Operands.push_back(Use(ArraySize, this)); +} + +bool AllocationInst::isArrayAllocation() const { + return getNumOperands() == 1 && + getOperand(0) != ConstantUInt::get(Type::UIntTy, 1); +} + +const Type *AllocationInst::getAllocatedType() const { + return getType()->getElementType(); +} + //===----------------------------------------------------------------------===// // MemAccessInst Implementation @@ -18,39 +49,35 @@ // pointer type. // const Type* MemAccessInst::getIndexedType(const Type *Ptr, - const vector &Idx, - bool AllowStructLeaf = false) { + const std::vector &Idx, + bool AllowCompositeLeaf = false) { if (!Ptr->isPointerType()) return 0; // Type isn't a pointer type! + + // Handle the special case of the empty set index set... + if (Idx.empty()) return cast(Ptr)->getElementType(); - // Get the type pointed to... - Ptr = ((const PointerType*)Ptr)->getValueType(); - - if (Ptr->isStructType()) { - unsigned CurIDX = 0; - while (Ptr->isStructType()) { - if (Idx.size() == CurIDX) - return AllowStructLeaf ? Ptr : 0; // Can't load a whole structure!?!? - if (Idx[CurIDX]->getType() != Type::UByteTy) return 0; // Illegal idx - unsigned NextIdx = ((ConstPoolUInt*)Idx[CurIDX++])->getValue(); - - const StructType *ST = (const StructType *)Ptr; - Ptr = ST->getElementTypes()[NextIdx]; + unsigned CurIDX = 0; + while (const CompositeType *CT = dyn_cast(Ptr)) { + if (Idx.size() == CurIDX) { + if (AllowCompositeLeaf || CT->isFirstClassType()) return Ptr; + return 0; // Can't load a whole structure or array!?!? } - return Ptr; - } else if (Ptr->isArrayType()) { - assert(0 && "Loading from arrays not implemented yet!"); - } else { - return (Idx.size() == 0) ? Ptr : 0; // Load directly through ptr + + Value *Index = Idx[CurIDX++]; + if (!CT->indexValid(Index)) return 0; + Ptr = CT->getTypeAtIndex(Index); } + return CurIDX == Idx.size() ? Ptr : 0; } + //===----------------------------------------------------------------------===// // LoadInst Implementation //===----------------------------------------------------------------------===// -LoadInst::LoadInst(Value *Ptr, const vector &Idx, - const string &Name = "") - : MemAccessInst(getIndexedType(Ptr->getType(), Idx), Load, Idx, Name) { +LoadInst::LoadInst(Value *Ptr, const std::vector &Idx, + const std::string &Name = "") + : MemAccessInst(checkType(getIndexedType(Ptr->getType(), Idx)), Load, Name) { assert(getIndexedType(Ptr->getType(), Idx) && "Load operands invalid!"); Operands.reserve(1+Idx.size()); Operands.push_back(Use(Ptr, this)); @@ -60,14 +87,20 @@ LoadInst::LoadInst(Value *Ptr, const vector &Idx, } +LoadInst::LoadInst(Value *Ptr, const std::string &Name = "") + : MemAccessInst(cast(Ptr->getType())->getElementType(), + Load, Name) { + Operands.reserve(1); + Operands.push_back(Use(Ptr, this)); +} + //===----------------------------------------------------------------------===// // StoreInst Implementation //===----------------------------------------------------------------------===// -StoreInst::StoreInst(Value *Val, Value *Ptr, const vector &Idx, - const string &Name = "") - : MemAccessInst(Type::VoidTy, Store, Idx, Name) { +StoreInst::StoreInst(Value *Val, Value *Ptr, const std::vector &Idx) + : MemAccessInst(Type::VoidTy, Store, "") { assert(getIndexedType(Ptr->getType(), Idx) && "Store operands invalid!"); Operands.reserve(2+Idx.size()); @@ -78,16 +111,24 @@ StoreInst::StoreInst(Value *Val, Value *Ptr, const vector &Idx, Operands.push_back(Use(Idx[i], this)); } +StoreInst::StoreInst(Value *Val, Value *Ptr) + : MemAccessInst(Type::VoidTy, Store, "") { + + Operands.reserve(2); + Operands.push_back(Use(Val, this)); + Operands.push_back(Use(Ptr, this)); +} + //===----------------------------------------------------------------------===// // GetElementPtrInst Implementation //===----------------------------------------------------------------------===// -GetElementPtrInst::GetElementPtrInst(Value *Ptr, - const vector &Idx, - const string &Name = "") - : MemAccessInst(PointerType::get(getIndexedType(Ptr->getType(), Idx, true)), - GetElementPtr, Idx, Name) { +GetElementPtrInst::GetElementPtrInst(Value *Ptr, const std::vector &Idx, + const std::string &Name = "") + : MemAccessInst(PointerType::get(checkType(getIndexedType(Ptr->getType(), + Idx, true))), + GetElementPtr, Name) { assert(getIndexedType(Ptr->getType(), Idx, true) && "gep operands invalid!"); Operands.reserve(1+Idx.size()); Operands.push_back(Use(Ptr, this)); @@ -96,6 +137,14 @@ GetElementPtrInst::GetElementPtrInst(Value *Ptr, Operands.push_back(Use(Idx[i], this)); } -bool GetElementPtrInst::isStructSelector() const { - return ((PointerType*)Operands[0]->getType())->getValueType()->isStructType(); + +//===----------------------------------------------------------------------===// +// FreeInst Implementation +//===----------------------------------------------------------------------===// + +FreeInst::FreeInst(Value *Ptr) : Instruction(Type::VoidTy, Free, "") { + assert(Ptr->getType()->isPointerType() && "Can't free nonpointer!"); + Operands.reserve(1); + Operands.push_back(Use(Ptr, this)); } +