llvm::Constant * LLVMInt64Vector(const int64_t *ivec) { std::vector<llvm::Constant *> vals; for (int i = 0; i < g->target.vectorWidth; ++i) vals.push_back(LLVMInt64(ivec[i])); return llvm::ConstantVector::get(vals); }
llvm::Value * Target::SizeOf(LLVM_TYPE_CONST llvm::Type *type, llvm::BasicBlock *insertAtEnd) { if (isa == Target::GENERIC && lGenericTypeLayoutIndeterminate(type)) { llvm::Value *index[1] = { LLVMInt32(1) }; LLVM_TYPE_CONST llvm::PointerType *ptrType = llvm::PointerType::get(type, 0); llvm::Value *voidPtr = llvm::ConstantPointerNull::get(ptrType); #if defined(LLVM_3_0) || defined(LLVM_3_0svn) || defined(LLVM_3_1svn) llvm::ArrayRef<llvm::Value *> arrayRef(&index[0], &index[1]); llvm::Instruction *gep = llvm::GetElementPtrInst::Create(voidPtr, arrayRef, "sizeof_gep", insertAtEnd); #else llvm::Instruction *gep = llvm::GetElementPtrInst::Create(voidPtr, &index[0], &index[1], "sizeof_gep", insertAtEnd); #endif if (is32Bit || g->opt.force32BitAddressing) return new llvm::PtrToIntInst(gep, LLVMTypes::Int32Type, "sizeof_int", insertAtEnd); else return new llvm::PtrToIntInst(gep, LLVMTypes::Int64Type, "sizeof_int", insertAtEnd); } const llvm::TargetData *td = GetTargetMachine()->getTargetData(); Assert(td != NULL); uint64_t byteSize = td->getTypeSizeInBits(type) / 8; if (is32Bit || g->opt.force32BitAddressing) return LLVMInt32((int32_t)byteSize); else return LLVMInt64(byteSize); }
llvm::Constant * LLVMInt64Vector(int64_t ival) { llvm::Constant *v = LLVMInt64(ival); std::vector<llvm::Constant *> vals; for (int i = 0; i < g->target.vectorWidth; ++i) vals.push_back(v); return llvm::ConstantVector::get(vals); }
llvm::Value * Target::SizeOf(LLVM_TYPE_CONST llvm::Type *type) { const llvm::TargetData *td = GetTargetMachine()->getTargetData(); Assert(td != NULL); uint64_t byteSize = td->getTypeSizeInBits(type) / 8; if (is32Bit || g->opt.force32BitAddressing) return LLVMInt32((int32_t)byteSize); else return LLVMInt64(byteSize); }
llvm::Value * Target::StructOffset(LLVM_TYPE_CONST llvm::Type *type, int element) { const llvm::TargetData *td = GetTargetMachine()->getTargetData(); Assert(td != NULL); LLVM_TYPE_CONST llvm::StructType *structType = llvm::dyn_cast<LLVM_TYPE_CONST llvm::StructType>(type); Assert(structType != NULL); const llvm::StructLayout *sl = td->getStructLayout(structType); Assert(sl != NULL); uint64_t offset = sl->getElementOffset(element); if (is32Bit || g->opt.force32BitAddressing) return LLVMInt32((int32_t)offset); else return LLVMInt64(offset); }
llvm::Value * Target::StructOffset(LLVM_TYPE_CONST llvm::Type *type, int element, llvm::BasicBlock *insertAtEnd) { if (isa == Target::GENERIC && lGenericTypeLayoutIndeterminate(type) == true) { llvm::Value *indices[2] = { LLVMInt32(0), LLVMInt32(element) }; LLVM_TYPE_CONST llvm::PointerType *ptrType = llvm::PointerType::get(type, 0); llvm::Value *voidPtr = llvm::ConstantPointerNull::get(ptrType); #if defined(LLVM_3_0) || defined(LLVM_3_0svn) || defined(LLVM_3_1svn) llvm::ArrayRef<llvm::Value *> arrayRef(&indices[0], &indices[2]); llvm::Instruction *gep = llvm::GetElementPtrInst::Create(voidPtr, arrayRef, "offset_gep", insertAtEnd); #else llvm::Instruction *gep = llvm::GetElementPtrInst::Create(voidPtr, &indices[0], &indices[2], "offset_gep", insertAtEnd); #endif if (is32Bit || g->opt.force32BitAddressing) return new llvm::PtrToIntInst(gep, LLVMTypes::Int32Type, "offset_int", insertAtEnd); else return new llvm::PtrToIntInst(gep, LLVMTypes::Int64Type, "offset_int", insertAtEnd); } const llvm::TargetData *td = GetTargetMachine()->getTargetData(); Assert(td != NULL); LLVM_TYPE_CONST llvm::StructType *structType = llvm::dyn_cast<LLVM_TYPE_CONST llvm::StructType>(type); Assert(structType != NULL); const llvm::StructLayout *sl = td->getStructLayout(structType); Assert(sl != NULL); uint64_t offset = sl->getElementOffset(element); if (is32Bit || g->opt.force32BitAddressing) return LLVMInt32((int32_t)offset); else return LLVMInt64(offset); }