comparison gen/tollvm.cpp @ 98:6789050b5ad1 trunk

[svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references. Now uses the DMD _adEq(void[], void[], TypeInfo) runtime function for array equality comparison.
author lindquist
date Wed, 14 Nov 2007 23:39:10 +0100
parents c4e161556a21
children a676a7743642
comparison
equal deleted inserted replaced
97:c4e161556a21 98:6789050b5ad1
816 llvm::Value* DtoGEP(llvm::Value* ptr, llvm::Value* i0, llvm::Value* i1, const std::string& var, llvm::BasicBlock* bb) 816 llvm::Value* DtoGEP(llvm::Value* ptr, llvm::Value* i0, llvm::Value* i1, const std::string& var, llvm::BasicBlock* bb)
817 { 817 {
818 std::vector<llvm::Value*> v(2); 818 std::vector<llvm::Value*> v(2);
819 v[0] = i0; 819 v[0] = i0;
820 v[1] = i1; 820 v[1] = i1;
821 Logger::cout() << "DtoGEP: " << *ptr << '\n'; 821 //Logger::cout() << "DtoGEP: " << *ptr << '\n';
822 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb()); 822 return new llvm::GetElementPtrInst(ptr, v.begin(), v.end(), var, bb?bb:gIR->scopebb());
823 } 823 }
824 824
825 ////////////////////////////////////////////////////////////////////////////////////////// 825 //////////////////////////////////////////////////////////////////////////////////////////
826 826
827 llvm::Value* DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb) 827 llvm::Value* DtoGEP(llvm::Value* ptr, const std::vector<unsigned>& src, const std::string& var, llvm::BasicBlock* bb)
828 { 828 {
829 size_t n = src.size(); 829 size_t n = src.size();
830 std::vector<llvm::Value*> dst(n); 830 std::vector<llvm::Value*> dst(n, NULL);
831 std::ostream& ostr = Logger::cout(); 831 //std::ostream& ostr = Logger::cout();
832 ostr << "indices for '" << *ptr << "':"; 832 //ostr << "indices for '" << *ptr << "':";
833 for (size_t i=0; i<n; ++i) 833 for (size_t i=0; i<n; ++i)
834 { 834 {
835 ostr << ' ' << i; 835 //ostr << ' ' << i;
836 dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false); 836 dst[i] = llvm::ConstantInt::get(llvm::Type::Int32Ty, src[i], false);
837 } 837 }
838 ostr << '\n'; 838 //ostr << '\n';*/
839 return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb()); 839 return new llvm::GetElementPtrInst(ptr, dst.begin(), dst.end(), var, bb?bb:gIR->scopebb());
840 } 840 }
841 841
842 ////////////////////////////////////////////////////////////////////////////////////////// 842 //////////////////////////////////////////////////////////////////////////////////////////
843 843
1421 1421
1422 DValue* DtoCastClass(DValue* val, Type* _to) 1422 DValue* DtoCastClass(DValue* val, Type* _to)
1423 { 1423 {
1424 const llvm::Type* tolltype = DtoType(_to); 1424 const llvm::Type* tolltype = DtoType(_to);
1425 Type* to = DtoDType(_to); 1425 Type* to = DtoDType(_to);
1426 assert(to->ty == Tclass); 1426 assert(to->ty == Tclass || to->ty == Tpointer);
1427 llvm::Value* rval = new llvm::BitCastInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); 1427 llvm::Value* rval = new llvm::BitCastInst(val->getRVal(), tolltype, "tmp", gIR->scopebb());
1428 return new DImValue(_to, rval); 1428 return new DImValue(_to, rval);
1429 } 1429 }
1430 1430
1431 DValue* DtoCastArray(DValue* u, Type* to) 1431 DValue* DtoCastArray(DValue* u, Type* to)
1626 return false; 1626 return false;
1627 } 1627 }
1628 1628
1629 llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t) 1629 llvm::Value* DtoBitCast(llvm::Value* v, const llvm::Type* t)
1630 { 1630 {
1631 if (v->getType() == t)
1632 return v;
1631 return gIR->ir->CreateBitCast(v, t, "tmp"); 1633 return gIR->ir->CreateBitCast(v, t, "tmp");
1632 } 1634 }
1633 1635
1634 const llvm::PointerType* isaPointer(llvm::Value* v) 1636 const llvm::PointerType* isaPointer(llvm::Value* v)
1635 { 1637 {