static dt_t *createTsarrayDt(dt_t * dt, Type *t) { assert(dt != NULL); size_t eoa_size = dt_size(dt); if (eoa_size == t->size()) return dt; else { TypeSArray * tsa = (TypeSArray *) t->toBasetype(); assert(tsa->ty == Tsarray); size_t dim = tsa->dim->toInteger(); dt_t * adt = NULL; dt_t ** padt = & adt; if (eoa_size * dim == eoa_size) { for (size_t i = 0; i < dim; i++) padt = dtcontainer(padt, NULL, dt); } else { assert(tsa->size(0) % eoa_size == 0); for (size_t i = 0; i < dim; i++) padt = dtcontainer(padt, NULL, createTsarrayDt(dt, tsa->next)); } dt_t * cdt = NULL; dtcontainer(& cdt, t, adt); return cdt; } }
void visit(TypeInfoStaticArrayDeclaration *decl) override { IF_LOG Logger::println("TypeInfoStaticArrayDeclaration::llvmDefine() %s", decl->toChars()); LOG_SCOPE; assert(decl->tinfo->ty == Tsarray); TypeSArray *tc = static_cast<TypeSArray *>(decl->tinfo); RTTIBuilder b(getStaticArrayTypeInfoType()); // value typeinfo b.push_typeinfo(tc->nextOf()); // length b.push(DtoConstSize_t(static_cast<size_t>(tc->dim->toUInteger()))); // finish b.finalize(gvar); }
void TypeInfoStaticArrayDeclaration::llvmDefine() { Logger::println("TypeInfoStaticArrayDeclaration::llvmDefine() %s", toChars()); LOG_SCOPE; assert(tinfo->ty == Tsarray); TypeSArray *tc = static_cast<TypeSArray *>(tinfo); RTTIBuilder b(Type::typeinfostaticarray); // value typeinfo b.push_typeinfo(tc->nextOf()); // length b.push(DtoConstSize_t(static_cast<size_t>(tc->dim->toUInteger()))); // finish b.finalize(ir.irGlobal); }
Expression *AddrExp::optimize(int result) { Expression *e; //printf("AddrExp::optimize(result = %d) %s\n", result, toChars()); /* Rewrite &(a,b) as (a,&b) */ if (e1->op == TOKcomma) { CommaExp *ce = (CommaExp *)e1; AddrExp *ae = new AddrExp(loc, ce->e2); ae->type = type; e = new CommaExp(ce->loc, ce->e1, ae); e->type = type; return e->optimize(result); } if (e1->op == TOKvar) { VarExp *ve = (VarExp *)e1; if (ve->var->storage_class & STCmanifest) e1 = e1->optimize(result); } else e1 = e1->optimize(result); // Convert &*ex to ex if (e1->op == TOKstar) { Expression *ex; ex = ((PtrExp *)e1)->e1; if (type->equals(ex->type)) e = ex; else { e = ex->copy(); e->type = type; } return e; } if (e1->op == TOKvar) { VarExp *ve = (VarExp *)e1; if (!ve->var->isOut() && !ve->var->isRef() && !ve->var->isImportedSymbol()) { SymOffExp *se = new SymOffExp(loc, ve->var, 0, ve->hasOverloads); se->type = type; return se; } } if (e1->op == TOKindex) { // Convert &array[n] to &array+n IndexExp *ae = (IndexExp *)e1; if (ae->e2->op == TOKint64 && ae->e1->op == TOKvar) { integer_t index = ae->e2->toInteger(); VarExp *ve = (VarExp *)ae->e1; if (ve->type->ty == Tsarray && !ve->var->isImportedSymbol()) { TypeSArray *ts = (TypeSArray *)ve->type; integer_t dim = ts->dim->toInteger(); /* if (index < 0 || index >= dim) error("array index %jd is out of bounds [0..%jd]", index, dim); */ e = new SymOffExp(loc, ve->var, index * ts->nextOf()->size()); e->type = type; return e; } } } return this; }
Expression *AddrExp::optimize(int result) { Expression *e; //printf("AddrExp::optimize(result = %d) %s\n", result, toChars()); // LDC never try to interpret: it could change the semantics by turning // const p = &s; into an something like const p = &(Struct()); /* Rewrite &(a,b) as (a,&b) */ if (e1->op == TOKcomma) { CommaExp *ce = (CommaExp *)e1; AddrExp *ae = new AddrExp(loc, ce->e2); ae->type = type; e = new CommaExp(ce->loc, ce->e1, ae); e->type = type; return e->optimize(result & ~WANTinterpret); } #if IN_LLVM if (e1->op == TOKindex) { IndexExp *ae = (IndexExp *)e1; if (ae->e2->op == TOKint64 && ae->e1->op == TOKvar) { dinteger_t index = ae->e2->toInteger(); VarExp *ve = (VarExp *)ae->e1; if (ve->type->ty == Tsarray && !ve->var->isImportedSymbol()) { TypeSArray *ts = (TypeSArray *)ve->type; dinteger_t dim = ts->dim->toInteger(); if (index < 0 || index >= dim) error("array index %jd is out of bounds [0..%jd]", index, dim); return this; } } } #endif if (e1->op == TOKvar) { VarExp *ve = (VarExp *)e1; if (ve->var->storage_class & STCmanifest) e1 = e1->optimize(result & ~WANTinterpret); } else e1 = e1->optimize(result); // Convert &*ex to ex if (e1->op == TOKstar) { Expression *ex; ex = ((PtrExp *)e1)->e1; if (type->equals(ex->type)) e = ex; else { e = ex->copy(); e->type = type; } return e; } #if !IN_LLVM if (e1->op == TOKvar) { VarExp *ve = (VarExp *)e1; if (!ve->var->isOut() && !ve->var->isRef() && !ve->var->isImportedSymbol()) { SymOffExp *se = new SymOffExp(loc, ve->var, 0, ve->hasOverloads); se->type = type; return se; } } if (e1->op == TOKindex) { // Convert &array[n] to &array+n IndexExp *ae = (IndexExp *)e1; if (ae->e2->op == TOKint64 && ae->e1->op == TOKvar) { dinteger_t index = ae->e2->toInteger(); VarExp *ve = (VarExp *)ae->e1; if (ve->type->ty == Tsarray && !ve->var->isImportedSymbol()) { TypeSArray *ts = (TypeSArray *)ve->type; dinteger_t dim = ts->dim->toInteger(); if (index < 0 || index >= dim) error("array index %lld is out of bounds [0..%lld]", index, dim); e = new SymOffExp(loc, ve->var, index * ts->nextOf()->size()); e->type = type; return e; } } } #endif return this; }