Mercurial > projects > ldc
comparison gen/toir.c @ 77:714057ff2dbb trunk
[svn r81] Fixed: Union support was very buggy. Should be fairly solid now.
author | lindquist |
---|---|
date | Wed, 31 Oct 2007 09:34:18 +0100 |
parents | 9e1bd80a7e98 |
children | 2332006e1fa4 |
comparison
equal
deleted
inserted
replaced
76:9e1bd80a7e98 | 77:714057ff2dbb |
---|---|
638 //assert(l->field); | 638 //assert(l->field); |
639 assert(r->type == elem::CONST); | 639 assert(r->type == elem::CONST); |
640 llvm::ConstantInt* cofs = llvm::cast<llvm::ConstantInt>(r->val); | 640 llvm::ConstantInt* cofs = llvm::cast<llvm::ConstantInt>(r->val); |
641 | 641 |
642 TypeStruct* ts = (TypeStruct*)e1type->next; | 642 TypeStruct* ts = (TypeStruct*)e1type->next; |
643 std::vector<unsigned> offsets(1,0); | 643 std::vector<unsigned> offsets; |
644 ts->sym->offsetToIndex(t->next, cofs->getZExtValue(), offsets); | 644 e->mem = LLVM_DtoIndexStruct(l->getValue(), ts->sym, t->next, cofs->getZExtValue(), offsets); |
645 e->mem = LLVM_DtoGEP(l->getValue(), offsets, "tmp", p->scopebb()); | |
646 e->type = elem::VAR; | 645 e->type = elem::VAR; |
647 e->field = true; | 646 e->field = true; |
648 } | 647 } |
649 else if (e1->type->ty == Tpointer) { | 648 else if (e1->type->ty == Tpointer) { |
650 e->val = new llvm::GetElementPtrInst(l->getValue(), r->getValue(), "tmp", p->scopebb()); | 649 e->val = new llvm::GetElementPtrInst(l->getValue(), r->getValue(), "tmp", p->scopebb()); |
1452 const llvm::Type* llt = LLVM_DtoType(t); | 1451 const llvm::Type* llt = LLVM_DtoType(t); |
1453 if (offset == 0) { | 1452 if (offset == 0) { |
1454 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp"); | 1453 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp"); |
1455 } | 1454 } |
1456 else { | 1455 else { |
1457 std::vector<unsigned> dst(1,0); | 1456 std::vector<unsigned> dst; |
1458 size_t fo = vdt->sym->offsetToIndex(tnext, offset, dst); | 1457 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; | 1459 llvm::Value* ptr = llvalue; |
1460 assert(ptr); | 1460 assert(ptr); |
1461 e->mem = LLVM_DtoGEP(ptr,dst,"tmp"); | 1461 e->mem = LLVM_DtoGEP(ptr,dst,"tmp"); |
1462 if (e->mem->getType() != llt) { | 1462 if (e->mem->getType() != llt) { |
1463 e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp"); | 1463 e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp"); |
1467 assert(offset % llt_sz == 0); | 1467 assert(offset % llt_sz == 0); |
1468 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(offset / llt_sz), "tmp", p->scopebb()); | 1468 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(offset / llt_sz), "tmp", p->scopebb()); |
1469 } | 1469 } |
1470 else if (fo) { | 1470 else if (fo) { |
1471 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(fo), "tmp", p->scopebb()); | 1471 e->mem = new llvm::GetElementPtrInst(e->mem, LLVM_DtoConstUint(fo), "tmp", p->scopebb()); |
1472 } | 1472 }*/ |
1473 } | 1473 } |
1474 e->type = elem::VAL; | 1474 e->type = elem::VAL; |
1475 e->field = true; | 1475 e->field = true; |
1476 } | 1476 } |
1477 else if (vdtype->ty == Tsarray) { | 1477 else if (vdtype->ty == Tsarray) { |
1562 Type* e1type = LLVM_DtoDType(e1->type); | 1562 Type* e1type = LLVM_DtoDType(e1->type); |
1563 | 1563 |
1564 Logger::print("e1->type=%s\n", e1type->toChars()); | 1564 Logger::print("e1->type=%s\n", e1type->toChars()); |
1565 | 1565 |
1566 if (VarDeclaration* vd = var->isVarDeclaration()) { | 1566 if (VarDeclaration* vd = var->isVarDeclaration()) { |
1567 std::vector<unsigned> vdoffsets(1,0); | 1567 llvm::Value* arrptr; |
1568 llvm::Value* src = 0; | |
1569 if (e1type->ty == Tpointer) { | 1568 if (e1type->ty == Tpointer) { |
1570 assert(e1type->next->ty == Tstruct); | 1569 assert(e1type->next->ty == Tstruct); |
1571 TypeStruct* ts = (TypeStruct*)e1type->next; | 1570 TypeStruct* ts = (TypeStruct*)e1type->next; |
1572 ts->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); | |
1573 Logger::println("Struct member offset:%d", vd->offset); | 1571 Logger::println("Struct member offset:%d", vd->offset); |
1574 src = l->val ? l->val : l->mem; | 1572 llvm::Value* src = l->val ? l->val : l->mem; |
1573 std::vector<unsigned> vdoffsets; | |
1574 arrptr = LLVM_DtoIndexStruct(src, ts->sym, vd->type, vd->offset, vdoffsets); | |
1575 } | 1575 } |
1576 else if (e1->type->ty == Tclass) { | 1576 else if (e1->type->ty == Tclass) { |
1577 TypeClass* tc = (TypeClass*)e1type; | 1577 TypeClass* tc = (TypeClass*)e1type; |
1578 Logger::println("Class member offset: %d", vd->offset); | 1578 Logger::println("Class member offset: %d", vd->offset); |
1579 std::vector<unsigned> vdoffsets(1,0); | |
1579 tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); | 1580 tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); |
1580 src = l->getValue(); | 1581 llvm::Value* src = l->getValue(); |
1581 } | 1582 Logger::cout() << "src: " << *src << '\n'; |
1582 assert(vdoffsets.size() != 1); | 1583 arrptr = LLVM_DtoGEP(src,vdoffsets,"tmp",p->scopebb()); |
1583 assert(src != 0); | 1584 } |
1584 Logger::cout() << "src: " << *src << '\n'; | 1585 else |
1585 llvm::Value* arrptr = LLVM_DtoGEP(src,vdoffsets,"tmp",p->scopebb()); | 1586 assert(0); |
1586 e->mem = arrptr; | 1587 e->mem = arrptr; |
1587 Logger::cout() << "mem: " << *e->mem << '\n'; | 1588 Logger::cout() << "mem: " << *e->mem << '\n'; |
1588 e->type = elem::VAR; | 1589 e->type = elem::VAR; |
1589 } | 1590 } |
1590 else if (FuncDeclaration* fdecl = var->isFuncDeclaration()) | 1591 else if (FuncDeclaration* fdecl = var->isFuncDeclaration()) |
1696 if (!vx) continue; | 1697 if (!vx) continue; |
1697 tys.push_back(LLVM_DtoType(vx->type)); | 1698 tys.push_back(LLVM_DtoType(vx->type)); |
1698 } | 1699 } |
1699 const llvm::StructType* t = llvm::StructType::get(tys); | 1700 const llvm::StructType* t = llvm::StructType::get(tys); |
1700 if (t != llt) { | 1701 if (t != llt) { |
1701 assert(gTargetData->getTypeSize(t) == gTargetData->getTypeSize(llt)); | 1702 if (gTargetData->getTypeSize(t) != gTargetData->getTypeSize(llt)) { |
1703 Logger::cout() << "got size " << gTargetData->getTypeSize(t) << ", expected " << gTargetData->getTypeSize(llt) << '\n'; | |
1704 assert(0 && "type size mismatch"); | |
1705 } | |
1702 sptr = p->ir->CreateBitCast(sptr, llvm::PointerType::get(t), "tmp"); | 1706 sptr = p->ir->CreateBitCast(sptr, llvm::PointerType::get(t), "tmp"); |
1703 Logger::cout() << "sptr type is now: " << *t << '\n'; | 1707 Logger::cout() << "sptr type is now: " << *t << '\n'; |
1704 } | 1708 } |
1705 } | 1709 } |
1706 | 1710 |