mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-04 00:55:49 +03:00
merge
This commit is contained in:
commit
aae027961c
14 changed files with 75 additions and 38 deletions
|
@ -956,6 +956,9 @@ void DtoConstInitGlobal(VarDeclaration* vd)
|
||||||
llvm::GlobalVariable* gvar = llvm::cast<llvm::GlobalVariable>(vd->ir.irGlobal->value);
|
llvm::GlobalVariable* gvar = llvm::cast<llvm::GlobalVariable>(vd->ir.irGlobal->value);
|
||||||
if (!(vd->storage_class & STCextern) && (vd->getModule() == gIR->dmodule || istempl))
|
if (!(vd->storage_class & STCextern) && (vd->getModule() == gIR->dmodule || istempl))
|
||||||
{
|
{
|
||||||
|
Logger::println("setting initializer");
|
||||||
|
Logger::cout() << "global: " << *gvar << '\n';
|
||||||
|
Logger::cout() << "init: " << *_init << '\n';
|
||||||
gvar->setInitializer(_init);
|
gvar->setInitializer(_init);
|
||||||
// do debug info
|
// do debug info
|
||||||
if (global.params.symdebug)
|
if (global.params.symdebug)
|
||||||
|
@ -1253,22 +1256,7 @@ LLConstant* DtoConstInitializer(Type* type, Initializer* init)
|
||||||
if (!init)
|
if (!init)
|
||||||
{
|
{
|
||||||
Logger::println("const default initializer for %s", type->toChars());
|
Logger::println("const default initializer for %s", type->toChars());
|
||||||
|
_init = DtoDefaultInit(type);
|
||||||
if(type->ty == Tsarray)
|
|
||||||
{
|
|
||||||
Logger::println("type is a static array, building constant array initializer");
|
|
||||||
TypeSArray* arrtype = (TypeSArray*)type;
|
|
||||||
Type* elemtype = type->next;
|
|
||||||
|
|
||||||
integer_t arraydim;
|
|
||||||
arraydim = arrtype->dim->toInteger();
|
|
||||||
|
|
||||||
std::vector<LLConstant*> inits(arraydim, elemtype->defaultInit()->toConstElem(gIR));
|
|
||||||
const LLArrayType* arrty = LLArrayType::get(DtoType(elemtype),arraydim);
|
|
||||||
_init = LLConstantArray::get(arrty, inits);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
_init = type->defaultInit()->toConstElem(gIR);
|
|
||||||
}
|
}
|
||||||
else if (ExpInitializer* ex = init->isExpInitializer())
|
else if (ExpInitializer* ex = init->isExpInitializer())
|
||||||
{
|
{
|
||||||
|
@ -1391,6 +1379,74 @@ DValue* DtoInitializer(LLValue* target, Initializer* init)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static LLConstant* expand_to_sarray(Type *base, Expression* exp)
|
||||||
|
{
|
||||||
|
Logger::println("building type %s from expression (%s) of type %s", base->toChars(), exp->toChars(), exp->type->toChars());
|
||||||
|
const LLType* dstTy = DtoType(base);
|
||||||
|
Logger::cout() << "final llvm type requested: " << *dstTy << '\n';
|
||||||
|
|
||||||
|
LLConstant* val = exp->toConstElem(gIR);
|
||||||
|
|
||||||
|
Type* expbase = exp->type->toBasetype();
|
||||||
|
Type* t = base;
|
||||||
|
|
||||||
|
LLSmallVector<size_t, 4> dims;
|
||||||
|
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
if (t->equals(expbase))
|
||||||
|
break;
|
||||||
|
assert(t->ty == Tsarray);
|
||||||
|
TypeSArray* tsa = (TypeSArray*)t;
|
||||||
|
dims.push_back(tsa->dim->toInteger());
|
||||||
|
assert(t->next);
|
||||||
|
t = t->next->toBasetype();
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t i = dims.size();
|
||||||
|
assert(i);
|
||||||
|
|
||||||
|
std::vector<LLConstant*> inits;
|
||||||
|
while (i--)
|
||||||
|
{
|
||||||
|
const LLArrayType* arrty = LLArrayType::get(val->getType(), dims[i]);
|
||||||
|
inits.clear();
|
||||||
|
inits.insert(inits.end(), dims[i], val);
|
||||||
|
val = LLConstantArray::get(arrty, inits);
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
LLConstant* DtoDefaultInit(Type* type)
|
||||||
|
{
|
||||||
|
Expression* exp = type->defaultInit();
|
||||||
|
|
||||||
|
Type* expbase = exp->type->toBasetype();
|
||||||
|
Type* base = type->toBasetype();
|
||||||
|
|
||||||
|
// if not the same basetypes, we won't get the same llvm types either
|
||||||
|
if (!expbase->equals(base))
|
||||||
|
{
|
||||||
|
if (base->ty == Tsarray)
|
||||||
|
{
|
||||||
|
Logger::println("type is a static array, building constant array initializer from single value");
|
||||||
|
return expand_to_sarray(base, exp);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error("cannot yet convert default initializer %s from type %s to %s", exp->toChars(), exp->type->toChars(), type->toChars());
|
||||||
|
fatal();
|
||||||
|
}
|
||||||
|
assert(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return exp->toConstElem(gIR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,9 @@ void findDefaultTarget();
|
||||||
/// Converts any value to a boolean (llvm i1)
|
/// Converts any value to a boolean (llvm i1)
|
||||||
LLValue* DtoBoolean(Loc& loc, DValue* dval);
|
LLValue* DtoBoolean(Loc& loc, DValue* dval);
|
||||||
|
|
||||||
|
/// get the default initializer of the type
|
||||||
|
LLConstant* DtoDefaultInit(Type* t);
|
||||||
|
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
// gen/tocall.cpp stuff below
|
// gen/tocall.cpp stuff below
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
module imports_1of2;
|
|
||||||
|
|
||||||
import imports_2of2;
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
assert(func() == 42);
|
|
||||||
S s;
|
|
||||||
s.l = 32;
|
|
||||||
assert(s.l == 32);
|
|
||||||
}
|
|
|
@ -1,11 +0,0 @@
|
||||||
module imports_2of2;
|
|
||||||
|
|
||||||
int func()
|
|
||||||
{
|
|
||||||
return 42;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct S
|
|
||||||
{
|
|
||||||
long l;
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue