Fix misaligned vector variable initializers

GitHub: Closes #1092.
This commit is contained in:
David Nadlinger 2015-09-26 19:48:54 +02:00
parent 97819eb7ff
commit c897015f62
3 changed files with 9 additions and 6 deletions

View file

@ -363,15 +363,15 @@ static void DtoSetArray(DValue* array, LLValue* dim, LLValue* ptr)
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
LLConstant* DtoConstArrayInitializer(ArrayInitializer* arrinit) LLConstant* DtoConstArrayInitializer(ArrayInitializer* arrinit, Type* targetType)
{ {
IF_LOG Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), arrinit->type->toChars()); IF_LOG Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), targetType->toChars());
LOG_SCOPE; LOG_SCOPE;
assert(arrinit->value.dim == arrinit->index.dim); assert(arrinit->value.dim == arrinit->index.dim);
// get base array type // get base array type
Type* arrty = arrinit->type->toBasetype(); Type* arrty = targetType->toBasetype();
size_t arrlen = arrinit->dim; size_t arrlen = arrinit->dim;
// for statis arrays, dmd does not include any trailing default // for statis arrays, dmd does not include any trailing default

View file

@ -30,8 +30,11 @@ llvm::StructType* DtoArrayType(Type* arrayTy);
llvm::StructType* DtoArrayType(LLType* elemTy); llvm::StructType* DtoArrayType(LLType* elemTy);
llvm::ArrayType* DtoStaticArrayType(Type* sarrayTy); llvm::ArrayType* DtoStaticArrayType(Type* sarrayTy);
LLType* DtoConstArrayInitializerType(ArrayInitializer* arrinit); /// Creates a (global) constant with the element data for the given arary
LLConstant* DtoConstArrayInitializer(ArrayInitializer* si); /// initializer. targetType is explicit because the frontend sometimes emits
/// ArrayInitializers for vectors typed as static arrays.
LLConstant* DtoConstArrayInitializer(ArrayInitializer* si, Type* targetType);
LLConstant* DtoConstSlice(LLConstant* dim, LLConstant* ptr, Type *type = 0); LLConstant* DtoConstSlice(LLConstant* dim, LLConstant* ptr, Type *type = 0);
/// Returns whether the array literal can be evaluated to a (LLVM) constant. /// Returns whether the array literal can be evaluated to a (LLVM) constant.

View file

@ -1178,7 +1178,7 @@ LLConstant* DtoConstInitializer(Loc& loc, Type* type, Initializer* init)
else if (ArrayInitializer* ai = init->isArrayInitializer()) else if (ArrayInitializer* ai = init->isArrayInitializer())
{ {
Logger::println("const array initializer"); Logger::println("const array initializer");
_init = DtoConstArrayInitializer(ai); _init = DtoConstArrayInitializer(ai, type);
} }
else if (init->isVoidInitializer()) else if (init->isVoidInitializer())
{ {