comparison gen/toir.cpp @ 1571:8d086d552909

IntegerType is now contextifed. Requires llvm >= 78969. resistor says this will be the last context API change :)
author Benjamin Kramer <benny.kra@gmail.com>
date Fri, 14 Aug 2009 00:39:18 +0200
parents 755abafbf25d
children 30bdcfb8299e
comparison
equal deleted inserted replaced
1570:ab03cfb3a212 1571:8d086d552909
406 406
407 LLConstant* _init; 407 LLConstant* _init;
408 if (cty->size() == 1) { 408 if (cty->size() == 1) {
409 uint8_t* str = (uint8_t*)string; 409 uint8_t* str = (uint8_t*)string;
410 std::string cont((char*)str, len); 410 std::string cont((char*)str, len);
411 _init = LLConstantArray::get(cont,true); 411 _init = LLConstantArray::get(p->context(), cont, true);
412 } 412 }
413 else if (cty->size() == 2) { 413 else if (cty->size() == 2) {
414 uint16_t* str = (uint16_t*)string; 414 uint16_t* str = (uint16_t*)string;
415 std::vector<LLConstant*> vals; 415 std::vector<LLConstant*> vals;
416 vals.reserve(len+1); 416 vals.reserve(len+1);
436 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage; 436 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
437 if (Logger::enabled()) 437 if (Logger::enabled())
438 Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n'; 438 Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n';
439 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,at,true,_linkage,_init,".str"); 439 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,at,true,_linkage,_init,".str");
440 440
441 llvm::ConstantInt* zero = LLConstantInt::get(LLType::Int32Ty, 0, false); 441 llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
442 LLConstant* idxs[2] = { zero, zero }; 442 LLConstant* idxs[2] = { zero, zero };
443 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); 443 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
444 444
445 if (dtype->ty == Tarray) { 445 if (dtype->ty == Tarray) {
446 LLConstant* clen = LLConstantInt::get(DtoSize_t(),len,false); 446 LLConstant* clen = LLConstantInt::get(DtoSize_t(),len,false);
477 477
478 LLConstant* _init; 478 LLConstant* _init;
479 if (cty->size() == 1) { 479 if (cty->size() == 1) {
480 uint8_t* str = (uint8_t*)string; 480 uint8_t* str = (uint8_t*)string;
481 std::string cont((char*)str, len); 481 std::string cont((char*)str, len);
482 _init = LLConstantArray::get(cont, nullterm); 482 _init = LLConstantArray::get(p->context(), cont, nullterm);
483 } 483 }
484 else if (cty->size() == 2) { 484 else if (cty->size() == 2) {
485 uint16_t* str = (uint16_t*)string; 485 uint16_t* str = (uint16_t*)string;
486 std::vector<LLConstant*> vals; 486 std::vector<LLConstant*> vals;
487 vals.reserve(len+1); 487 vals.reserve(len+1);
512 } 512 }
513 513
514 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage; 514 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
515 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,_init->getType(),true,_linkage,_init,".str"); 515 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,_init->getType(),true,_linkage,_init,".str");
516 516
517 llvm::ConstantInt* zero = LLConstantInt::get(LLType::Int32Ty, 0, false); 517 llvm::ConstantInt* zero = LLConstantInt::get(LLType::getInt32Ty(gIR->context()), 0, false);
518 LLConstant* idxs[2] = { zero, zero }; 518 LLConstant* idxs[2] = { zero, zero };
519 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); 519 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
520 520
521 if (t->ty == Tpointer) { 521 if (t->ty == Tpointer) {
522 return arrptr; 522 return arrptr;
816 else if (fndecl->llvmInternal == LLVMalloca) { 816 else if (fndecl->llvmInternal == LLVMalloca) {
817 Expression* exp = (Expression*)arguments->data[0]; 817 Expression* exp = (Expression*)arguments->data[0];
818 DValue* expv = exp->toElem(p); 818 DValue* expv = exp->toElem(p);
819 if (expv->getType()->toBasetype()->ty != Tint32) 819 if (expv->getType()->toBasetype()->ty != Tint32)
820 expv = DtoCast(loc, expv, Type::tint32); 820 expv = DtoCast(loc, expv, Type::tint32);
821 return new DImValue(type, p->ir->CreateAlloca(LLType::Int8Ty, expv->getRVal(), ".alloca")); 821 return new DImValue(type, p->ir->CreateAlloca(LLType::getInt8Ty(gIR->context()), expv->getRVal(), ".alloca"));
822 } 822 }
823 } 823 }
824 824
825 return DtoCallFunction(loc, type, fnval, arguments); 825 return DtoCallFunction(loc, type, fnval, arguments);
826 } 826 }
1781 } 1781 }
1782 else 1782 else
1783 { 1783 {
1784 // create basic blocks 1784 // create basic blocks
1785 llvm::BasicBlock* oldend = p->scopeend(); 1785 llvm::BasicBlock* oldend = p->scopeend();
1786 llvm::BasicBlock* assertbb = llvm::BasicBlock::Create("assert", p->topfunc(), oldend); 1786 llvm::BasicBlock* assertbb = llvm::BasicBlock::Create(gIR->context(), "assert", p->topfunc(), oldend);
1787 llvm::BasicBlock* endbb = llvm::BasicBlock::Create("noassert", p->topfunc(), oldend); 1787 llvm::BasicBlock* endbb = llvm::BasicBlock::Create(gIR->context(), "noassert", p->topfunc(), oldend);
1788 1788
1789 // test condition 1789 // test condition
1790 LLValue* condval = DtoCast(loc, cond, Type::tbool)->getRVal(); 1790 LLValue* condval = DtoCast(loc, cond, Type::tbool)->getRVal();
1791 1791
1792 // branch 1792 // branch
1829 LOG_SCOPE; 1829 LOG_SCOPE;
1830 1830
1831 DValue* u = e1->toElem(p); 1831 DValue* u = e1->toElem(p);
1832 1832
1833 llvm::BasicBlock* oldend = p->scopeend(); 1833 llvm::BasicBlock* oldend = p->scopeend();
1834 llvm::BasicBlock* andand = llvm::BasicBlock::Create("andand", gIR->topfunc(), oldend); 1834 llvm::BasicBlock* andand = llvm::BasicBlock::Create(gIR->context(), "andand", gIR->topfunc(), oldend);
1835 llvm::BasicBlock* andandend = llvm::BasicBlock::Create("andandend", gIR->topfunc(), oldend); 1835 llvm::BasicBlock* andandend = llvm::BasicBlock::Create(gIR->context(), "andandend", gIR->topfunc(), oldend);
1836 1836
1837 LLValue* ubool = DtoCast(loc, u, Type::tbool)->getRVal(); 1837 LLValue* ubool = DtoCast(loc, u, Type::tbool)->getRVal();
1838 1838
1839 llvm::BasicBlock* oldblock = p->scopebb(); 1839 llvm::BasicBlock* oldblock = p->scopebb();
1840 llvm::BranchInst::Create(andand,andandend,ubool,p->scopebb()); 1840 llvm::BranchInst::Create(andand,andandend,ubool,p->scopebb());
1855 LLValue* resval = 0; 1855 LLValue* resval = 0;
1856 if (ubool == vbool || !vbool) { 1856 if (ubool == vbool || !vbool) {
1857 // No need to create a PHI node. 1857 // No need to create a PHI node.
1858 resval = ubool; 1858 resval = ubool;
1859 } else { 1859 } else {
1860 llvm::PHINode* phi = p->ir->CreatePHI(LLType::Int1Ty, "andandval"); 1860 llvm::PHINode* phi = p->ir->CreatePHI(LLType::getInt1Ty(gIR->context()), "andandval");
1861 // If we jumped over evaluation of the right-hand side, 1861 // If we jumped over evaluation of the right-hand side,
1862 // the result is false. Otherwise it's the value of the right-hand side. 1862 // the result is false. Otherwise it's the value of the right-hand side.
1863 phi->addIncoming(LLConstantInt::getFalse(gIR->context()), oldblock); 1863 phi->addIncoming(LLConstantInt::getFalse(gIR->context()), oldblock);
1864 phi->addIncoming(vbool, newblock); 1864 phi->addIncoming(vbool, newblock);
1865 resval = phi; 1865 resval = phi;
1876 LOG_SCOPE; 1876 LOG_SCOPE;
1877 1877
1878 DValue* u = e1->toElem(p); 1878 DValue* u = e1->toElem(p);
1879 1879
1880 llvm::BasicBlock* oldend = p->scopeend(); 1880 llvm::BasicBlock* oldend = p->scopeend();
1881 llvm::BasicBlock* oror = llvm::BasicBlock::Create("oror", gIR->topfunc(), oldend); 1881 llvm::BasicBlock* oror = llvm::BasicBlock::Create(gIR->context(), "oror", gIR->topfunc(), oldend);
1882 llvm::BasicBlock* ororend = llvm::BasicBlock::Create("ororend", gIR->topfunc(), oldend); 1882 llvm::BasicBlock* ororend = llvm::BasicBlock::Create(gIR->context(), "ororend", gIR->topfunc(), oldend);
1883 1883
1884 LLValue* ubool = DtoCast(loc, u, Type::tbool)->getRVal(); 1884 LLValue* ubool = DtoCast(loc, u, Type::tbool)->getRVal();
1885 1885
1886 llvm::BasicBlock* oldblock = p->scopebb(); 1886 llvm::BasicBlock* oldblock = p->scopebb();
1887 llvm::BranchInst::Create(ororend,oror,ubool,p->scopebb()); 1887 llvm::BranchInst::Create(ororend,oror,ubool,p->scopebb());
1902 LLValue* resval = 0; 1902 LLValue* resval = 0;
1903 if (ubool == vbool || !vbool) { 1903 if (ubool == vbool || !vbool) {
1904 // No need to create a PHI node. 1904 // No need to create a PHI node.
1905 resval = ubool; 1905 resval = ubool;
1906 } else { 1906 } else {
1907 llvm::PHINode* phi = p->ir->CreatePHI(LLType::Int1Ty, "ororval"); 1907 llvm::PHINode* phi = p->ir->CreatePHI(LLType::getInt1Ty(gIR->context()), "ororval");
1908 // If we jumped over evaluation of the right-hand side, 1908 // If we jumped over evaluation of the right-hand side,
1909 // the result is true. Otherwise, it's the value of the right-hand side. 1909 // the result is true. Otherwise, it's the value of the right-hand side.
1910 phi->addIncoming(LLConstantInt::getTrue(gIR->context()), oldblock); 1910 phi->addIncoming(LLConstantInt::getTrue(gIR->context()), oldblock);
1911 phi->addIncoming(vbool, newblock); 1911 phi->addIncoming(vbool, newblock);
1912 resval = phi; 1912 resval = phi;
1968 1968
1969 // this terminated the basicblock, start a new one 1969 // this terminated the basicblock, start a new one
1970 // this is sensible, since someone might goto behind the assert 1970 // this is sensible, since someone might goto behind the assert
1971 // and prevents compiler errors if a terminator follows the assert 1971 // and prevents compiler errors if a terminator follows the assert
1972 llvm::BasicBlock* oldend = gIR->scopeend(); 1972 llvm::BasicBlock* oldend = gIR->scopeend();
1973 llvm::BasicBlock* bb = llvm::BasicBlock::Create("afterhalt", p->topfunc(), oldend); 1973 llvm::BasicBlock* bb = llvm::BasicBlock::Create(gIR->context(), "afterhalt", p->topfunc(), oldend);
1974 p->scope() = IRScope(bb,oldend); 1974 p->scope() = IRScope(bb,oldend);
1975 1975
1976 return 0; 1976 return 0;
1977 } 1977 }
1978 1978
1984 LOG_SCOPE; 1984 LOG_SCOPE;
1985 1985
1986 if(func->isStatic()) 1986 if(func->isStatic())
1987 error("can't take delegate of static function %s, it does not require a context ptr", func->toChars()); 1987 error("can't take delegate of static function %s, it does not require a context ptr", func->toChars());
1988 1988
1989 const LLPointerType* int8ptrty = getPtrToType(LLType::Int8Ty); 1989 const LLPointerType* int8ptrty = getPtrToType(LLType::getInt8Ty(gIR->context()));
1990 1990
1991 assert(type->toBasetype()->ty == Tdelegate); 1991 assert(type->toBasetype()->ty == Tdelegate);
1992 const LLType* dgty = DtoType(type); 1992 const LLType* dgty = DtoType(type);
1993 1993
1994 DValue* u = e1->toElem(p); 1994 DValue* u = e1->toElem(p);
2126 } else { 2126 } else {
2127 dvv = new DConstValue(type, getNullValue(DtoTypeNotVoid(dtype))); 2127 dvv = new DConstValue(type, getNullValue(DtoTypeNotVoid(dtype)));
2128 } 2128 }
2129 2129
2130 llvm::BasicBlock* oldend = p->scopeend(); 2130 llvm::BasicBlock* oldend = p->scopeend();
2131 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create("condtrue", gIR->topfunc(), oldend); 2131 llvm::BasicBlock* condtrue = llvm::BasicBlock::Create(gIR->context(), "condtrue", gIR->topfunc(), oldend);
2132 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create("condfalse", gIR->topfunc(), oldend); 2132 llvm::BasicBlock* condfalse = llvm::BasicBlock::Create(gIR->context(), "condfalse", gIR->topfunc(), oldend);
2133 llvm::BasicBlock* condend = llvm::BasicBlock::Create("condend", gIR->topfunc(), oldend); 2133 llvm::BasicBlock* condend = llvm::BasicBlock::Create(gIR->context(), "condend", gIR->topfunc(), oldend);
2134 2134
2135 DValue* c = econd->toElem(p); 2135 DValue* c = econd->toElem(p);
2136 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal(); 2136 LLValue* cond_val = DtoCast(loc, c, Type::tbool)->getRVal();
2137 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb()); 2137 llvm::BranchInst::Create(condtrue,condfalse,cond_val,p->scopebb());
2138 2138