Mercurial > projects > ldc
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) |