Mercurial > projects > ldc
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"); |