Mercurial > projects > ldc
comparison gen/arrays.cpp @ 88:058d3925950e trunk
[svn r92] Fixed support for statically initialized unions. lots of bugfixes as cleanups too.
author | lindquist |
---|---|
date | Tue, 06 Nov 2007 10:03:14 +0100 |
parents | fd32135dca3e |
children | 61615fa85940 |
comparison
equal
deleted
inserted
replaced
87:25d4fcce53f4 | 88:058d3925950e |
---|---|
249 } | 249 } |
250 | 250 |
251 ////////////////////////////////////////////////////////////////////////////////////////// | 251 ////////////////////////////////////////////////////////////////////////////////////////// |
252 llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit) | 252 llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit) |
253 { | 253 { |
254 Logger::println("arr init begin"); | 254 Logger::println("DtoConstArrayInitializer: %s | %s", arrinit->toChars(), arrinit->type->toChars()); |
255 LOG_SCOPE; | |
256 | |
255 Type* arrinittype = DtoDType(arrinit->type); | 257 Type* arrinittype = DtoDType(arrinit->type); |
256 | 258 |
257 Type* t; | 259 Type* t; |
258 integer_t tdim; | 260 integer_t tdim; |
259 if (arrinittype->ty == Tsarray) { | 261 if (arrinittype->ty == Tsarray) { |
262 Logger::println("static array"); | |
260 TypeSArray* tsa = (TypeSArray*)arrinittype; | 263 TypeSArray* tsa = (TypeSArray*)arrinittype; |
261 tdim = tsa->dim->toInteger(); | 264 tdim = tsa->dim->toInteger(); |
262 t = tsa; | 265 t = tsa; |
263 } | 266 } |
264 else if (arrinittype->ty == Tarray) { | 267 else if (arrinittype->ty == Tarray) { |
268 Logger::println("dynamic array"); | |
265 t = arrinittype; | 269 t = arrinittype; |
266 tdim = arrinit->dim; | 270 tdim = arrinit->dim; |
267 } | 271 } |
268 else | 272 else |
269 assert(0); | 273 assert(0); |
270 | 274 |
271 std::vector<llvm::Constant*> inits(tdim, 0); | 275 Logger::println("dim = %u", tdim); |
276 | |
277 std::vector<llvm::Constant*> inits(tdim, NULL); | |
272 | 278 |
273 const llvm::Type* elemty = DtoType(arrinittype->next); | 279 const llvm::Type* elemty = DtoType(arrinittype->next); |
274 | 280 |
275 assert(arrinit->index.dim == arrinit->value.dim); | 281 assert(arrinit->index.dim == arrinit->value.dim); |
276 for (int i=0,j=0; i < tdim; ++i) | 282 for (unsigned i=0,j=0; i < tdim; ++i) |
277 { | 283 { |
278 Initializer* init = 0; | 284 Initializer* init = 0; |
279 Expression* idx = (Expression*)arrinit->index.data[j]; | 285 Expression* idx = (Expression*)arrinit->index.data[j]; |
280 | 286 |
281 if (idx) | 287 if (idx) |
282 { | 288 { |
283 integer_t k = idx->toInteger(); | 289 // this is pretty weird :/ idx->type turned out NULL for the initializer: |
284 if (i == k) | 290 // const in6_addr IN6ADDR_ANY = { s6_addr8: [0] }; |
285 { | 291 // in std.c.linux.socket |
286 init = (Initializer*)arrinit->value.data[j]; | 292 if (idx->type) { |
287 assert(init); | 293 //integer_t k = idx->toInteger(); |
288 ++j; | 294 Logger::println("getting value for exp: %s | %s", idx->toChars(), idx->type->toChars()); |
295 llvm::Constant* cc = idx->toConstElem(gIR); | |
296 Logger::println("value gotten"); | |
297 assert(cc != NULL); | |
298 llvm::ConstantInt* ci = llvm::dyn_cast<llvm::ConstantInt>(cc); | |
299 assert(ci != NULL); | |
300 uint64_t k = ci->getZExtValue(); | |
301 if (i == k) | |
302 { | |
303 init = (Initializer*)arrinit->value.data[j]; | |
304 assert(init); | |
305 ++j; | |
306 } | |
289 } | 307 } |
290 } | 308 } |
291 else | 309 else |
292 { | 310 { |
293 init = (Initializer*)arrinit->value.data[j]; | 311 init = (Initializer*)arrinit->value.data[j]; |
294 ++j; | 312 ++j; |
295 } | 313 } |
296 | 314 |
297 llvm::Constant* v = 0; | 315 llvm::Constant* v = DtoConstInitializer(t->next, init); |
298 | |
299 if (!init) | |
300 { | |
301 v = t->next->defaultInit()->toConstElem(gIR); | |
302 } | |
303 else if (ExpInitializer* ex = init->isExpInitializer()) | |
304 { | |
305 v = ex->exp->toConstElem(gIR); | |
306 } | |
307 else if (StructInitializer* si = init->isStructInitializer()) | |
308 { | |
309 v = DtoConstStructInitializer(si); | |
310 } | |
311 else if (ArrayInitializer* ai = init->isArrayInitializer()) | |
312 { | |
313 v = DtoConstArrayInitializer(ai); | |
314 } | |
315 else if (init->isVoidInitializer()) | |
316 { | |
317 v = llvm::UndefValue::get(elemty); | |
318 } | |
319 else | |
320 assert(v); | 316 assert(v); |
321 | 317 |
322 inits[i] = v; | 318 inits[i] = v; |
323 } | 319 } |
324 | 320 |