comparison gen/structs.cpp @ 737:041c1596d217

Removed warnings on ignored aligns. Only do aligment on packed structs, align(1) struct Packed { ... } Changed the way struct/class fields are added, first small part of cleaning up these... Make struct/class/union fields aware of any anonymous struct/union they might be part of, not yet really useful, but part of getting better union support.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 28 Oct 2008 15:41:09 +0100
parents 3e143b611c1e
children 6e7a4c3b64d2
comparison
equal deleted inserted replaced
736:e4e50f4b58cd 737:041c1596d217
90 LOG_SCOPE; 90 LOG_SCOPE;
91 91
92 TypeStruct* ts = (TypeStruct*)sd->type->toBasetype(); 92 TypeStruct* ts = (TypeStruct*)sd->type->toBasetype();
93 93
94 // this struct is a forward declaration 94 // this struct is a forward declaration
95 // didn't even know had those ... 95 // didn't even know D had those ...
96 if (sd->sizeok != 1) 96 if (sd->sizeok != 1)
97 { 97 {
98 sd->ir.irStruct = new IrStruct(ts); 98 sd->ir.irStruct = new IrStruct(ts);
99 ts->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get()); 99 ts->ir.type = new llvm::PATypeHolder(llvm::OpaqueType::get());
100 return; 100 return;
101 } 101 }
102 102
103 bool ispacked = (ts->alignsize() == 1); 103 bool ispacked = (ts->alignsize() == 1);
104 104
105 // create the IrStruct
105 IrStruct* irstruct = new IrStruct(ts); 106 IrStruct* irstruct = new IrStruct(ts);
106 sd->ir.irStruct = irstruct; 107 sd->ir.irStruct = irstruct;
107 gIR->structs.push_back(irstruct); 108 gIR->structs.push_back(irstruct);
109
110 // add fields
111 Array* fields = &sd->fields;
112 for (int k=0; k < fields->dim; k++)
113 {
114 VarDeclaration* v = (VarDeclaration*)fields->data[k];
115 Logger::println("Adding field: %s %s", v->type->toChars(), v->toChars());
116 // init fields, used to happen in VarDeclaration::toObjFile
117 irstruct->addField(v);
118 }
108 119
109 irstruct->packed = ispacked; 120 irstruct->packed = ispacked;
110 121
111 bool thisModule = false; 122 bool thisModule = false;
112 if (sd->getModule() == gIR->dmodule) 123 if (sd->getModule() == gIR->dmodule)