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