Mercurial > projects > ldc
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 |