Mercurial > projects > ldc
comparison gen/classes.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 | 635f91212b78 |
children | f04dde6e882c |
comparison
equal
deleted
inserted
replaced
736:e4e50f4b58cd | 737:041c1596d217 |
---|---|
55 } | 55 } |
56 } | 56 } |
57 | 57 |
58 ////////////////////////////////////////////////////////////////////////////////////////// | 58 ////////////////////////////////////////////////////////////////////////////////////////// |
59 | 59 |
60 static void LLVM_AddBaseClassData(BaseClasses* bcs) | 60 static void LLVM_AddBaseClassData(IrStruct* irstruct, BaseClasses* bcs) |
61 { | 61 { |
62 // add base class data members first | 62 // add base class data members first |
63 for (int j=0; j<bcs->dim; j++) | 63 for (int j=0; j<bcs->dim; j++) |
64 { | 64 { |
65 BaseClass* bc = (BaseClass*)(bcs->data[j]); | 65 BaseClass* bc = (BaseClass*)(bcs->data[j]); |
67 // interfaces never add data fields | 67 // interfaces never add data fields |
68 if (bc->base->isInterfaceDeclaration()) | 68 if (bc->base->isInterfaceDeclaration()) |
69 continue; | 69 continue; |
70 | 70 |
71 // recursively add baseclass data | 71 // recursively add baseclass data |
72 LLVM_AddBaseClassData(&bc->base->baseclasses); | 72 LLVM_AddBaseClassData(irstruct, &bc->base->baseclasses); |
73 | 73 |
74 Array* arr = &bc->base->fields; | 74 Array* arr = &bc->base->fields; |
75 if (arr->dim == 0) | 75 if (arr->dim == 0) |
76 continue; | 76 continue; |
77 | 77 |
78 Logger::println("Adding base class members of %s", bc->base->toChars()); | 78 Logger::println("Adding base class members of %s", bc->base->toChars()); |
79 LOG_SCOPE; | 79 LOG_SCOPE; |
80 | 80 |
81 for (int k=0; k < arr->dim; k++) { | 81 for (int k=0; k < arr->dim; k++) { |
82 VarDeclaration* v = (VarDeclaration*)(arr->data[k]); | 82 VarDeclaration* v = (VarDeclaration*)(arr->data[k]); |
83 v->toObjFile(0); // TODO: multiobj | 83 Logger::println("Adding field: %s %s", v->type->toChars(), v->toChars()); |
84 // init fields, used to happen in VarDeclaration::toObjFile | |
85 irstruct->addField(v); | |
84 } | 86 } |
85 } | 87 } |
86 } | 88 } |
87 | 89 |
88 ////////////////////////////////////////////////////////////////////////////////////////// | 90 ////////////////////////////////////////////////////////////////////////////////////////// |
141 | 143 |
142 // add monitor | 144 // add monitor |
143 fieldtypes.push_back(getVoidPtrType()); | 145 fieldtypes.push_back(getVoidPtrType()); |
144 | 146 |
145 // add base class data fields first | 147 // add base class data fields first |
146 LLVM_AddBaseClassData(&cd->baseclasses); | 148 LLVM_AddBaseClassData(irstruct, &cd->baseclasses); |
147 | 149 |
148 // then add own members, if any | 150 // add own fields |
151 Array* fields = &cd->fields; | |
152 for (int k=0; k < fields->dim; k++) | |
153 { | |
154 VarDeclaration* v = (VarDeclaration*)fields->data[k]; | |
155 Logger::println("Adding field: %s %s", v->type->toChars(), v->toChars()); | |
156 // init fields, used to happen in VarDeclaration::toObjFile | |
157 irstruct->addField(v); | |
158 } | |
159 | |
160 // then add other members of us, if any | |
149 if(cd->members) { | 161 if(cd->members) { |
150 for (int k=0; k < cd->members->dim; k++) { | 162 for (int k=0; k < cd->members->dim; k++) { |
151 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]); | 163 Dsymbol* dsym = (Dsymbol*)(cd->members->data[k]); |
152 dsym->toObjFile(0); // TODO: multiobj | 164 dsym->toObjFile(0); // TODO: multiobj |
153 } | 165 } |