void visit(TypeInfoDeclaration *tid) { //printf("TypeInfoDeclaration::toObjFile(%p '%s') protection %d\n", tid, tid->toChars(), tid->protection); if (multiobj) { obj_append(tid); return; } Symbol *s = toSymbol(tid); s->Sclass = SCcomdat; s->Sfl = FLdata; TypeInfo_toDt(&s->Sdt, tid); dt_optimize(s->Sdt); // See if we can convert a comdat to a comdef, // which saves on exe file space. if (s->Sclass == SCcomdat && dtallzeros(s->Sdt)) { s->Sclass = SCglobal; dt2common(&s->Sdt); } outdata(s); if (tid->isExport()) objmod->export_symbol(s, 0); }
void visit(TypeInfoDeclaration *tid) { if (isSpeculativeType(tid->tinfo)) { //printf("-speculative '%s'\n", tid->toPrettyChars()); return; } //printf("TypeInfoDeclaration::toObjFile(%p '%s') protection %d\n", tid, tid->toChars(), tid->protection); if (multiobj) { obj_append(tid); return; } Symbol *s = toSymbol(tid); s->Sclass = SCcomdat; s->Sfl = FLdata; DtBuilder dtb; TypeInfo_toDt(&dtb, tid); s->Sdt = dtb.finish(); // See if we can convert a comdat to a comdef, // which saves on exe file space. if (s->Sclass == SCcomdat && dtallzeros(s->Sdt)) { s->Sclass = SCglobal; dt2common(&s->Sdt); } outdata(s); if (tid->isExport()) objmod->export_symbol(s, 0); }
void visit(VarDeclaration *vd) { //printf("VarDeclaration::toObjFile(%p '%s' type=%s) protection %d\n", vd, vd->toChars(), vd->type->toChars(), vd->protection); //printf("\talign = %d\n", vd->alignment); if (vd->type->ty == Terror) { vd->error("had semantic errors when compiling"); return; } if (vd->aliassym) { visitNoMultiObj(vd->toAlias()); return; } // Do not store variables we cannot take the address of if (!vd->canTakeAddressOf()) { return; } if (!vd->isDataseg() || vd->storage_class & STCextern) return; Symbol *s = toSymbol(vd); unsigned sz = vd->type->size(); Dsymbol *parent = vd->toParent(); s->Sclass = SCglobal; do { /* Global template data members need to be in comdat's * in case multiple .obj files instantiate the same * template with the same types. */ if (parent->isTemplateInstance() && !parent->isTemplateMixin()) { s->Sclass = SCcomdat; break; } parent = parent->parent; } while (parent); s->Sfl = FLdata; if (vd->init) { s->Sdt = Initializer_toDt(vd->init); // Look for static array that is block initialized ExpInitializer *ie = vd->init->isExpInitializer(); Type *tb = vd->type->toBasetype(); if (tb->ty == Tsarray && ie && !tb->nextOf()->equals(ie->exp->type->toBasetype()->nextOf()) && ie->exp->implicitConvTo(tb->nextOf()) ) { size_t dim = ((TypeSArray *)tb)->dim->toInteger(); // Duplicate Sdt 'dim-1' times, as we already have the first one dt_t **pdt = &s->Sdt; while (--dim > 0) { pdt = Expression_toDt(ie->exp, pdt); } } } else { Type_toDt(vd->type, &s->Sdt); } dt_optimize(s->Sdt); // See if we can convert a comdat to a comdef, // which saves on exe file space. if (s->Sclass == SCcomdat && s->Sdt && dtallzeros(s->Sdt) && !vd->isThreadlocal()) { s->Sclass = SCglobal; dt2common(&s->Sdt); } if (!sz && vd->type->toBasetype()->ty != Tsarray) assert(0); // this shouldn't be possible if (sz || objmod->allowZeroSize()) { outdata(s); if (vd->isExport()) objmod->export_symbol(s, 0); } }
void visit(VarDeclaration *vd) { //printf("VarDeclaration::toObjFile(%p '%s' type=%s) protection %d\n", vd, vd->toChars(), vd->type->toChars(), vd->protection); //printf("\talign = %d\n", vd->alignment); if (vd->type->ty == Terror) { vd->error("had semantic errors when compiling"); return; } if (vd->aliassym) { visitNoMultiObj(vd->toAlias()); return; } // Do not store variables we cannot take the address of if (!vd->canTakeAddressOf()) { return; } if (!vd->isDataseg() || vd->storage_class & STCextern) return; Symbol *s = toSymbol(vd); d_uns64 sz64 = vd->type->size(vd->loc); if (sz64 == SIZE_INVALID) { vd->error("size overflow"); return; } if (sz64 >= 0x1000000) // there has to be some 'reasonable' limit on the size { vd->error("size of x%llx exceeds max allowed size 0x100_0000", sz64); } unsigned sz = (unsigned)sz64; Dsymbol *parent = vd->toParent(); s->Sclass = SCglobal; do { /* Global template data members need to be in comdat's * in case multiple .obj files instantiate the same * template with the same types. */ if (parent->isTemplateInstance() && !parent->isTemplateMixin()) { s->Sclass = SCcomdat; break; } parent = parent->parent; } while (parent); s->Sfl = FLdata; if (config.objfmt == OBJ_MACH && I64 && (s->ty() & mTYLINK) == mTYthread) { DtBuilder dtb; tlsToDt(vd, s, dtb); s->Sdt = dtb.finish(); } else if (vd->_init) { DtBuilder dtb; initializerToDt(vd, dtb); s->Sdt = dtb.finish(); } else { DtBuilder dtb; Type_toDt(vd->type, &dtb); s->Sdt = dtb.finish(); } // See if we can convert a comdat to a comdef, // which saves on exe file space. if (s->Sclass == SCcomdat && s->Sdt && dtallzeros(s->Sdt) && !vd->isThreadlocal()) { s->Sclass = SCglobal; dt2common(&s->Sdt); } if (!sz && vd->type->toBasetype()->ty != Tsarray) assert(0); // this shouldn't be possible if (sz || objmod->allowZeroSize()) { outdata(s); if (vd->isExport()) objmod->export_symbol(s, 0); } }
void VarDeclaration::toObjFile(int multiobj) { Symbol *s; unsigned sz; Dsymbol *parent; //printf("VarDeclaration::toObjFile(%p '%s' type=%s) protection %d\n", this, toChars(), type->toChars(), protection); //printf("\talign = %d\n", alignment); if (type->ty == Terror) { error("had semantic errors when compiling"); return; } if (aliassym) { toAlias()->toObjFile(0); return; } // Do not store variables we cannot take the address of if (!canTakeAddressOf()) { return; } if (isDataseg() && !(storage_class & STCextern)) { s = toSymbol(); sz = type->size(); parent = this->toParent(); { if (storage_class & STCcomdat) s->Sclass = SCcomdat; else s->Sclass = SCglobal; do { /* Global template data members need to be in comdat's * in case multiple .obj files instantiate the same * template with the same types. */ if (parent->isTemplateInstance() && !parent->isTemplateMixin()) { s->Sclass = SCcomdat; break; } parent = parent->parent; } while (parent); } s->Sfl = FLdata; if (init) { s->Sdt = init->toDt(); // Look for static array that is block initialized Type *tb; ExpInitializer *ie = init->isExpInitializer(); tb = type->toBasetype(); if (tb->ty == Tsarray && ie && !tb->nextOf()->equals(ie->exp->type->toBasetype()->nextOf()) && ie->exp->implicitConvTo(tb->nextOf()) ) { size_t dim = ((TypeSArray *)tb)->dim->toInteger(); // Duplicate Sdt 'dim-1' times, as we already have the first one dt_t **pdt = &s->Sdt; while (--dim > 0) { pdt = ie->exp->toDt(pdt); } } } else if (storage_class & STCextern) { s->Sclass = SCextern; s->Sfl = FLextern; s->Sdt = NULL; // BUG: if isExport(), shouldn't we make it dllimport? return; } else { type->toDt(&s->Sdt); } dt_optimize(s->Sdt); // See if we can convert a comdat to a comdef, // which saves on exe file space. if (s->Sclass == SCcomdat && s->Sdt && dtallzeros(s->Sdt) && !isThreadlocal()) { s->Sclass = SCglobal; dt2common(&s->Sdt); } if (!sz && type->toBasetype()->ty != Tsarray) assert(0); // this shouldn't be possible if (sz || objmod->allowZeroSize()) { outdata(s); if (isExport()) objmod->export_symbol(s,0); } } }