[svn r52] fixed static arrays in struct literals

This commit is contained in:
Tomas Lindquist Olsen
2007-10-19 17:15:30 +02:00
parent cca32e4efd
commit 6445254a7b
4 changed files with 37 additions and 0 deletions

View File

@@ -354,6 +354,28 @@ void LLVM_DtoArrayCopy(elem* dst, elem* src)
new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
}
//////////////////////////////////////////////////////////////////////////////////////////
void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src)
{
assert(dst->getType() == src->getType());
size_t arrsz = gTargetData->getTypeSize(dst->getType()->getContainedType(0));
llvm::Value* n = llvm::ConstantInt::get(LLVM_DtoSize_t(), arrsz, false);
llvm::Type* arrty = llvm::PointerType::get(llvm::Type::Int8Ty);
llvm::Value* dstarr = new llvm::BitCastInst(dst,arrty,"tmp",gIR->scopebb());
llvm::Value* srcarr = new llvm::BitCastInst(src,arrty,"tmp",gIR->scopebb());
llvm::Function* fn = (global.params.is64bit) ? LLVM_DeclareMemCpy64() : LLVM_DeclareMemCpy32();
std::vector<llvm::Value*> llargs;
llargs.resize(4);
llargs[0] = dstarr;
llargs[1] = srcarr;
llargs[2] = n;
llargs[3] = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", gIR->scopebb());
}
//////////////////////////////////////////////////////////////////////////////////////////
llvm::Constant* LLVM_DtoConstantSlice(llvm::Constant* dim, llvm::Constant* ptr)
{

View File

@@ -19,6 +19,7 @@ void LLVM_DtoResizeDynArray(llvm::Value* arr, llvm::Value* sz);
void LLVM_DtoCatArrayElement(llvm::Value* arr, Expression* exp);
void LLVM_DtoStaticArrayCopy(llvm::Value* dst, llvm::Value* src);
llvm::Value* LLVM_DtoStaticArrayCompare(TOK op, llvm::Value* l, llvm::Value* r);
#endif // LLVMC_GEN_ARRAYS_H

View File

@@ -1517,6 +1517,9 @@ elem* StructLiteralExp::toElem(IRState* p)
else if (vxtype->ty == Tarray) {
LLVM_DtoArrayAssign(arrptr,val);
}
else if (vxtype->ty == Tsarray) {
LLVM_DtoStaticArrayCopy(arrptr,val);
}
else
new llvm::StoreInst(val, arrptr, p->scopebb());
}

11
test/bug18.d Normal file
View File

@@ -0,0 +1,11 @@
module bug18;
struct S {
int[9] i;
}
void main()
{
int[9] i;
auto s = S(i);
}