comparison gen/toir.c @ 34:4648206ca213 trunk

[svn r38] * resizing dynamic arrays support * throw is replaced with assert(0) * catch is ignored * better foreach support * various bugfixes
author lindquist
date Tue, 09 Oct 2007 02:50:00 +0200
parents a86fe7496b58
children c0967c4b2a74
comparison
equal deleted inserted replaced
33:bc641b23a714 34:4648206ca213
116 { 116 {
117 tid->toObjFile(); 117 tid->toObjFile();
118 e->mem = tid->llvmValue; 118 e->mem = tid->llvmValue;
119 e->type = elem::VAR; 119 e->type = elem::VAR;
120 } 120 }
121 else 121 else {
122 assert(0 && "only magic supported is typeinfo"); 122 Logger::println("unsupported: %s\n", vd->toChars());
123 assert(0 && "only magic supported is typeinfo");
124 }
123 } 125 }
124 return e; 126 return e;
125 } 127 }
126 128
127 // function parameter 129 // function parameter
329 331
330 p->lvals.push_back(l->mem); 332 p->lvals.push_back(l->mem);
331 elem* r = e2->toElem(p); 333 elem* r = e2->toElem(p);
332 p->lvals.pop_back(); 334 p->lvals.pop_back();
333 335
336 if (l->type == elem::ARRAYLEN)
337 {
338 LLVM_DtoResizeDynArray(l->mem, r->getValue());
339 delete r;
340 delete l;
341 return 0;
342 }
343
334 // handle function argument - allocate temp storage for it :/ annoying 344 // handle function argument - allocate temp storage for it :/ annoying
335 if (l->mem == 0) { 345 if (l->mem == 0) {
336 LLVM_DtoGiveArgumentStorage(l); 346 assert(l->val);
347 if (llvm::isa<llvm::Argument>(l->val))
348 LLVM_DtoGiveArgumentStorage(l);
349 else {
350 Logger::cout() << "here it comes... " << *l->val << '\n';
351 assert(0);
352 }
337 } 353 }
338 //e->val = l->store(r->getValue()); 354 //e->val = l->store(r->getValue());
339 355
340 TY e1ty = e1->type->ty; 356 TY e1ty = e1->type->ty;
341 TY e2ty = e2->type->ty; 357 TY e2ty = e2->type->ty;
1824 t = LLVM_DtoType(newtype->next); 1840 t = LLVM_DtoType(newtype->next);
1825 assert(arguments); 1841 assert(arguments);
1826 if (arguments->dim == 1) { 1842 if (arguments->dim == 1) {
1827 elem* sz = ((Expression*)arguments->data[0])->toElem(p); 1843 elem* sz = ((Expression*)arguments->data[0])->toElem(p);
1828 llvm::Value* dimval = sz->getValue(); 1844 llvm::Value* dimval = sz->getValue();
1829 llvm::Value* usedimval = dimval; 1845 /*llvm::Value* usedimval = dimval;
1830 if (dimval->getType() != llvm::Type::Int32Ty) 1846 if (dimval->getType() != llvm::Type::Int32Ty)
1831 usedimval = new llvm::TruncInst(dimval, llvm::Type::Int32Ty,"tmp",p->scopebb()); 1847 usedimval = new llvm::TruncInst(dimval, llvm::Type::Int32Ty,"tmp",p->scopebb());*/
1832 e->mem = new llvm::MallocInst(t,usedimval,"tmp",p->scopebb()); 1848
1833 1849 //e->mem = LLVM_DtoRealloc(0,t);
1834 LLVM_DtoSetArray(p->toplval(), dimval, e->mem); 1850 //new llvm::MallocInst(t,usedimval,"tmp",p->scopebb());
1851
1852 //LLVM_DtoSetArray(p->toplval(), dimval, e->mem);
1853
1854 LLVM_DtoNewDynArray(p->toplval(), dimval, t);
1835 delete sz; 1855 delete sz;
1836 } 1856 }
1837 else { 1857 else {
1838 assert(0); 1858 assert(0);
1839 } 1859 }
1946 LOG_SCOPE; 1966 LOG_SCOPE;
1947 1967
1948 elem* e = new elem; 1968 elem* e = new elem;
1949 elem* u = e1->toElem(p); 1969 elem* u = e1->toElem(p);
1950 1970
1951 llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); 1971 if (p->inLvalue)
1952 llvm::Value* ptr = LLVM_DtoGEP(u->mem,zero,zero,"tmp",p->scopebb()); 1972 {
1953 e->val = new llvm::LoadInst(ptr, "tmp", p->scopebb()); 1973 e->mem = u->mem;
1954 e->type = elem::VAL; 1974 e->type = elem::ARRAYLEN;
1955 1975 }
1976 else
1977 {
1978 llvm::Value* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);
1979 llvm::Value* ptr = LLVM_DtoGEP(u->mem,zero,zero,"tmp",p->scopebb());
1980 e->val = new llvm::LoadInst(ptr, "tmp", p->scopebb());
1981 e->type = elem::VAL;
1982 }
1956 delete u; 1983 delete u;
1957 1984
1958 return e; 1985 return e;
1959 } 1986 }
1960 1987
1963 elem* AssertExp::toElem(IRState* p) 1990 elem* AssertExp::toElem(IRState* p)
1964 { 1991 {
1965 Logger::print("AssertExp::toElem: %s | %s\n", toChars(), type->toChars()); 1992 Logger::print("AssertExp::toElem: %s | %s\n", toChars(), type->toChars());
1966 LOG_SCOPE; 1993 LOG_SCOPE;
1967 1994
1968 elem* e = new elem;
1969 elem* u = e1->toElem(p); 1995 elem* u = e1->toElem(p);
1970 elem* m = msg ? msg->toElem(p) : 0; 1996 elem* m = msg ? msg->toElem(p) : NULL;
1971 1997
1972 std::vector<llvm::Value*> llargs; 1998 llvm::Value* loca = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
1973 llargs.resize(3); 1999 LLVM_DtoAssert(u->getValue(), loca, m ? m->val : NULL);
1974 llargs[0] = LLVM_DtoBoolean(u->getValue()); 2000
1975 llargs[1] = llvm::ConstantInt::get(llvm::Type::Int32Ty, loc.linnum, false);
1976 llargs[2] = m ? m->val : llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty));
1977
1978 delete m; 2001 delete m;
1979 delete u; 2002 delete u;
1980 2003
1981 //Logger::cout() << *llargs[0] << '|' << *llargs[1] << '\n'; 2004 return new elem;
1982
1983 llvm::Function* fn = LLVM_D_GetRuntimeFunction(p->module, "_d_assert");
1984 assert(fn);
1985 llvm::CallInst* call = new llvm::CallInst(fn, llargs.begin(), llargs.end(), "", p->scopebb());
1986 call->setCallingConv(llvm::CallingConv::C);
1987
1988 return e;
1989 } 2005 }
1990 2006
1991 ////////////////////////////////////////////////////////////////////////////////////////// 2007 //////////////////////////////////////////////////////////////////////////////////////////
1992 2008
1993 elem* NotExp::toElem(IRState* p) 2009 elem* NotExp::toElem(IRState* p)