Mercurial > projects > ldc
comparison gen/toir.c @ 78:2332006e1fa4 trunk
[svn r82] Fixed: Fall-through switch cases were broken.
author | lindquist |
---|---|
date | Wed, 31 Oct 2007 20:50:21 +0100 |
parents | 714057ff2dbb |
children | 3587401b6eeb |
comparison
equal
deleted
inserted
replaced
77:714057ff2dbb | 78:2332006e1fa4 |
---|---|
1443 Type* vdtype = LLVM_DtoDType(vd->type); | 1443 Type* vdtype = LLVM_DtoDType(vd->type); |
1444 | 1444 |
1445 llvm::Value* llvalue = vd->nestedref ? LLVM_DtoNestedVariable(vd) : vd->llvmValue; | 1445 llvm::Value* llvalue = vd->nestedref ? LLVM_DtoNestedVariable(vd) : vd->llvmValue; |
1446 | 1446 |
1447 if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) { | 1447 if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) { |
1448 Logger::println("struct"); | |
1448 TypeStruct* vdt = (TypeStruct*)vdtype; | 1449 TypeStruct* vdt = (TypeStruct*)vdtype; |
1449 assert(vdt->sym); | 1450 assert(vdt->sym); |
1450 e = new elem; | 1451 e = new elem; |
1451 const llvm::Type* llt = LLVM_DtoType(t); | 1452 const llvm::Type* llt = LLVM_DtoType(t); |
1452 if (offset == 0) { | 1453 if (offset == 0) { |
1453 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp"); | 1454 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp"); |
1454 } | 1455 } |
1455 else { | 1456 else { |
1456 std::vector<unsigned> dst; | 1457 std::vector<unsigned> dst; |
1457 e->mem = LLVM_DtoIndexStruct(llvalue,vdt->sym, tnext, offset, dst); | 1458 e->mem = LLVM_DtoIndexStruct(llvalue,vdt->sym, tnext, offset, dst); |
1458 /*size_t fo = vdt->sym->offsetToIndex(tnext, offset, dst); | |
1459 llvm::Value* ptr = llvalue; | |
1460 assert(ptr); | |
1461 e->mem = LLVM_DtoGEP(ptr,dst,"tmp"); | |
1462 if (e->mem->getType() != llt) { | |
1463 e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp"); | |
1464 } | |
1465 if (fo == (size_t)-1) { | |
1466 size_t llt_sz = gTargetData->getTypeSize(llt->getContainedType(0)); | |
1467 assert(offset % llt_sz == 0); | |
1468 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(offset / llt_sz), "tmp", p->scopebb()); | |
1469 } | |
1470 else if (fo) { | |
1471 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(fo), "tmp", p->scopebb()); | |
1472 }*/ | |
1473 } | 1459 } |
1474 e->type = elem::VAL; | 1460 e->type = elem::VAL; |
1475 e->field = true; | 1461 e->field = true; |
1476 } | 1462 } |
1477 else if (vdtype->ty == Tsarray) { | 1463 else if (vdtype->ty == Tsarray) { |
1464 Logger::println("sarray"); | |
1478 e = new elem; | 1465 e = new elem; |
1479 assert(llvalue); | 1466 assert(llvalue); |
1480 e->arg = llvalue; | 1467 e->arg = llvalue; |
1481 e->type = elem::VAL; | 1468 e->type = elem::VAL; |
1482 | 1469 |
1494 assert(offset == 0); | 1481 assert(offset == 0); |
1495 e->mem = LLVM_DtoGEPi(llvalue,0,0,"tmp"); | 1482 e->mem = LLVM_DtoGEPi(llvalue,0,0,"tmp"); |
1496 } | 1483 } |
1497 } | 1484 } |
1498 else if (offset == 0) { | 1485 else if (offset == 0) { |
1486 Logger::println("normal symoff"); | |
1499 e = new elem; | 1487 e = new elem; |
1500 e->type = elem::VAL; | 1488 e->type = elem::VAL; |
1501 assert(llvalue); | 1489 assert(llvalue); |
1502 e->mem = llvalue; | 1490 e->mem = llvalue; |
1503 | 1491 |