comparison gen/toir.c @ 64:b688ad419f8c trunk

[svn r68] Added support for multi-dimensional static arrays. Several bugfixes to array support.
author lindquist
date Thu, 25 Oct 2007 12:09:13 +0200
parents b86e00b938a5
children 0c5f410d973c
comparison
equal deleted inserted replaced
63:2c39b5292cf3 64:b688ad419f8c
1456 e = new elem; 1456 e = new elem;
1457 std::vector<unsigned> dst(1,0); 1457 std::vector<unsigned> dst(1,0);
1458 vdt->sym->offsetToIndex(t->next, offset, dst); 1458 vdt->sym->offsetToIndex(t->next, 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",p->scopebb()); 1461 e->mem = LLVM_DtoGEP(ptr,dst,"tmp");
1462 e->type = elem::VAL; 1462 e->type = elem::VAL;
1463 e->field = true; 1463 e->field = true;
1464 } 1464 }
1465 else if (vdtype->ty == Tsarray) { 1465 else if (vdtype->ty == Tsarray) {
1466 /*e = new elem;
1467 llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
1468 e->val = new llvm::GetElementPtrInst(vd->llvmValue,idx0,idx0,"tmp",p->scopebb());*/
1469 e = new elem; 1466 e = new elem;
1470 llvm::Value* idx0 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); 1467 assert(llvalue);
1471 //llvm::Value* idx1 = llvm::ConstantInt::get(llvm::Type::Int32Ty, 1, false);
1472 e->mem = LLVM_DtoGEP(llvalue,idx0,idx0,"tmp",p->scopebb());
1473 e->arg = llvalue; 1468 e->arg = llvalue;
1474 e->type = elem::VAL; 1469 e->type = elem::VAL;
1470
1471 const llvm::Type* llt = LLVM_DtoType(t);
1472 llvm::Value* off = 0;
1473 if (offset != 0) {
1474 Logger::println("offset = %d\n", offset);
1475 }
1476 if (llvalue->getType() != llt) {
1477 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp");
1478 if (offset != 0)
1479 e->mem = LLVM_DtoGEPi(e->mem, offset, "tmp");
1480 }
1481 else {
1482 assert(offset == 0);
1483 e->mem = LLVM_DtoGEPi(llvalue,0,0,"tmp");
1484 }
1475 } 1485 }
1476 else if (offset == 0) { 1486 else if (offset == 0) {
1477 e = new elem; 1487 e = new elem;
1488 e->type = elem::VAL;
1478 assert(llvalue); 1489 assert(llvalue);
1479 e->mem = llvalue; 1490 e->mem = llvalue;
1491
1480 const llvm::Type* llt = LLVM_DtoType(t); 1492 const llvm::Type* llt = LLVM_DtoType(t);
1481 if (llvalue->getType() != llt) { 1493 if (llvalue->getType() != llt) {
1482 Logger::cout() << "llt is:" << *llt << '\n';
1483 //const llvm::PointerType* vpty = llvm::PointerType::get(llvm::Type::Int8Ty);
1484 e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp"); 1494 e->mem = p->ir->CreateBitCast(e->mem, llt, "tmp");
1485 } 1495 }
1486 e->type = elem::VAL;
1487 } 1496 }
1488 else { 1497 else {
1489 assert(0); 1498 assert(0);
1490 } 1499 }
1491 } 1500 }
2007 Type* e2t = LLVM_DtoDType(e2->type); 2016 Type* e2t = LLVM_DtoDType(e2->type);
2008 assert(t == e2t); 2017 assert(t == e2t);
2009 2018
2010 if (t->isintegral() || t->ty == Tpointer) 2019 if (t->isintegral() || t->ty == Tpointer)
2011 { 2020 {
2021 Logger::println("integral or pointer");
2012 llvm::ICmpInst::Predicate cmpop; 2022 llvm::ICmpInst::Predicate cmpop;
2013 switch(op) 2023 switch(op)
2014 { 2024 {
2015 case TOKequal: 2025 case TOKequal:
2016 cmpop = llvm::ICmpInst::ICMP_EQ; 2026 cmpop = llvm::ICmpInst::ICMP_EQ;
2023 } 2033 }
2024 e->val = new llvm::ICmpInst(cmpop, l->getValue(), r->getValue(), "tmp", p->scopebb()); 2034 e->val = new llvm::ICmpInst(cmpop, l->getValue(), r->getValue(), "tmp", p->scopebb());
2025 } 2035 }
2026 else if (t->isfloating()) 2036 else if (t->isfloating())
2027 { 2037 {
2038 Logger::println("floating");
2028 llvm::FCmpInst::Predicate cmpop; 2039 llvm::FCmpInst::Predicate cmpop;
2029 switch(op) 2040 switch(op)
2030 { 2041 {
2031 case TOKequal: 2042 case TOKequal:
2032 cmpop = llvm::FCmpInst::FCMP_OEQ; 2043 cmpop = llvm::FCmpInst::FCMP_OEQ;
2039 } 2050 }
2040 e->val = new llvm::FCmpInst(cmpop, l->getValue(), r->getValue(), "tmp", p->scopebb()); 2051 e->val = new llvm::FCmpInst(cmpop, l->getValue(), r->getValue(), "tmp", p->scopebb());
2041 } 2052 }
2042 else if (t->ty == Tsarray) 2053 else if (t->ty == Tsarray)
2043 { 2054 {
2055 Logger::println("static array");
2044 e->val = LLVM_DtoStaticArrayCompare(op,l->mem,r->mem); 2056 e->val = LLVM_DtoStaticArrayCompare(op,l->mem,r->mem);
2045 } 2057 }
2046 else if (t->ty == Tarray) 2058 else if (t->ty == Tarray)
2047 { 2059 {
2060 Logger::println("dynamic array");
2048 e->val = LLVM_DtoDynArrayCompare(op,l->mem,r->mem); 2061 e->val = LLVM_DtoDynArrayCompare(op,l->mem,r->mem);
2049 } 2062 }
2050 else if (t->ty == Tdelegate) 2063 else if (t->ty == Tdelegate)
2051 { 2064 {
2065 Logger::println("delegate");
2052 e->val = LLVM_DtoCompareDelegate(op,l->mem,r->mem); 2066 e->val = LLVM_DtoCompareDelegate(op,l->mem,r->mem);
2053 } 2067 }
2054 else 2068 else
2055 { 2069 {
2056 assert(0 && "Unsupported EqualExp type"); 2070 assert(0 && "Unsupported EqualExp type");