comparison gen/toir.cpp @ 1545:7fcb72d518f6

More factory methods moved to LLVMContext
author Benjamin Kramer <benny.kra@gmail.com>
date Wed, 15 Jul 2009 18:09:41 +0200
parents 61f12f4651b5
children a326f145a57b
comparison
equal deleted inserted replaced
1544:8863cf7236e6 1545:7fcb72d518f6
286 Logger::print("IntegerExp::toConstElem: %s @ %s\n", toChars(), type->toChars()); 286 Logger::print("IntegerExp::toConstElem: %s @ %s\n", toChars(), type->toChars());
287 LOG_SCOPE; 287 LOG_SCOPE;
288 const LLType* t = DtoType(type); 288 const LLType* t = DtoType(type);
289 if (isaPointer(t)) { 289 if (isaPointer(t)) {
290 Logger::println("pointer"); 290 Logger::println("pointer");
291 LLConstant* i = llvm::ConstantInt::get(DtoSize_t(),(uint64_t)value,false); 291 LLConstant* i = gIR->context().getConstantInt(DtoSize_t(),(uint64_t)value,false);
292 return llvm::ConstantExpr::getIntToPtr(i, t); 292 return llvm::ConstantExpr::getIntToPtr(i, t);
293 } 293 }
294 assert(llvm::isa<LLIntegerType>(t)); 294 assert(llvm::isa<LLIntegerType>(t));
295 LLConstant* c = llvm::ConstantInt::get(t,(uint64_t)value,!type->isunsigned()); 295 LLConstant* c = gIR->context().getConstantInt(t,(uint64_t)value,!type->isunsigned());
296 assert(c); 296 assert(c);
297 if (Logger::enabled()) 297 if (Logger::enabled())
298 Logger::cout() << "value = " << *c << '\n'; 298 Logger::cout() << "value = " << *c << '\n';
299 return c; 299 return c;
300 } 300 }
400 400
401 LLConstant* _init; 401 LLConstant* _init;
402 if (cty->size() == 1) { 402 if (cty->size() == 1) {
403 uint8_t* str = (uint8_t*)string; 403 uint8_t* str = (uint8_t*)string;
404 std::string cont((char*)str, len); 404 std::string cont((char*)str, len);
405 _init = llvm::ConstantArray::get(cont,true); 405 _init = gIR->context().getConstantArray(cont,true);
406 } 406 }
407 else if (cty->size() == 2) { 407 else if (cty->size() == 2) {
408 uint16_t* str = (uint16_t*)string; 408 uint16_t* str = (uint16_t*)string;
409 std::vector<LLConstant*> vals; 409 std::vector<LLConstant*> vals;
410 vals.reserve(len+1); 410 vals.reserve(len+1);
411 for(size_t i=0; i<len; ++i) { 411 for(size_t i=0; i<len; ++i) {
412 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));; 412 vals.push_back(gIR->context().getConstantInt(ct, str[i], false));;
413 } 413 }
414 vals.push_back(llvm::ConstantInt::get(ct, 0, false)); 414 vals.push_back(gIR->context().getConstantInt(ct, 0, false));
415 _init = llvm::ConstantArray::get(at,vals); 415 _init = llvm::ConstantArray::get(at,vals);
416 } 416 }
417 else if (cty->size() == 4) { 417 else if (cty->size() == 4) {
418 uint32_t* str = (uint32_t*)string; 418 uint32_t* str = (uint32_t*)string;
419 std::vector<LLConstant*> vals; 419 std::vector<LLConstant*> vals;
420 vals.reserve(len+1); 420 vals.reserve(len+1);
421 for(size_t i=0; i<len; ++i) { 421 for(size_t i=0; i<len; ++i) {
422 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));; 422 vals.push_back(gIR->context().getConstantInt(ct, str[i], false));;
423 } 423 }
424 vals.push_back(llvm::ConstantInt::get(ct, 0, false)); 424 vals.push_back(gIR->context().getConstantInt(ct, 0, false));
425 _init = llvm::ConstantArray::get(at,vals); 425 _init = llvm::ConstantArray::get(at,vals);
426 } 426 }
427 else 427 else
428 assert(0); 428 assert(0);
429 429
430 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage; 430 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
431 if (Logger::enabled()) 431 if (Logger::enabled())
432 Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n'; 432 Logger::cout() << "type: " << *at << "\ninit: " << *_init << '\n';
433 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,at,true,_linkage,_init,".str"); 433 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,at,true,_linkage,_init,".str");
434 434
435 llvm::ConstantInt* zero = llvm::ConstantInt::get(LLType::Int32Ty, 0, false); 435 llvm::ConstantInt* zero = gIR->context().getConstantInt(LLType::Int32Ty, 0, false);
436 LLConstant* idxs[2] = { zero, zero }; 436 LLConstant* idxs[2] = { zero, zero };
437 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); 437 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
438 438
439 if (dtype->ty == Tarray) { 439 if (dtype->ty == Tarray) {
440 LLConstant* clen = llvm::ConstantInt::get(DtoSize_t(),len,false); 440 LLConstant* clen = gIR->context().getConstantInt(DtoSize_t(),len,false);
441 return new DImValue(type, DtoConstSlice(clen, arrptr)); 441 return new DImValue(type, DtoConstSlice(clen, arrptr));
442 } 442 }
443 else if (dtype->ty == Tsarray) { 443 else if (dtype->ty == Tsarray) {
444 const LLType* dstType = getPtrToType(LLArrayType::get(ct, len)); 444 const LLType* dstType = getPtrToType(LLArrayType::get(ct, len));
445 LLValue* emem = (gvar->getType() == dstType) ? gvar : DtoBitCast(gvar, dstType); 445 LLValue* emem = (gvar->getType() == dstType) ? gvar : DtoBitCast(gvar, dstType);
471 471
472 LLConstant* _init; 472 LLConstant* _init;
473 if (cty->size() == 1) { 473 if (cty->size() == 1) {
474 uint8_t* str = (uint8_t*)string; 474 uint8_t* str = (uint8_t*)string;
475 std::string cont((char*)str, len); 475 std::string cont((char*)str, len);
476 _init = llvm::ConstantArray::get(cont, nullterm); 476 _init = gIR->context().getConstantArray(cont, nullterm);
477 } 477 }
478 else if (cty->size() == 2) { 478 else if (cty->size() == 2) {
479 uint16_t* str = (uint16_t*)string; 479 uint16_t* str = (uint16_t*)string;
480 std::vector<LLConstant*> vals; 480 std::vector<LLConstant*> vals;
481 vals.reserve(len+1); 481 vals.reserve(len+1);
482 for(size_t i=0; i<len; ++i) { 482 for(size_t i=0; i<len; ++i) {
483 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));; 483 vals.push_back(gIR->context().getConstantInt(ct, str[i], false));;
484 } 484 }
485 if (nullterm) 485 if (nullterm)
486 vals.push_back(llvm::ConstantInt::get(ct, 0, false)); 486 vals.push_back(gIR->context().getConstantInt(ct, 0, false));
487 _init = llvm::ConstantArray::get(at,vals); 487 _init = llvm::ConstantArray::get(at,vals);
488 } 488 }
489 else if (cty->size() == 4) { 489 else if (cty->size() == 4) {
490 uint32_t* str = (uint32_t*)string; 490 uint32_t* str = (uint32_t*)string;
491 std::vector<LLConstant*> vals; 491 std::vector<LLConstant*> vals;
492 vals.reserve(len+1); 492 vals.reserve(len+1);
493 for(size_t i=0; i<len; ++i) { 493 for(size_t i=0; i<len; ++i) {
494 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));; 494 vals.push_back(gIR->context().getConstantInt(ct, str[i], false));;
495 } 495 }
496 if (nullterm) 496 if (nullterm)
497 vals.push_back(llvm::ConstantInt::get(ct, 0, false)); 497 vals.push_back(gIR->context().getConstantInt(ct, 0, false));
498 _init = llvm::ConstantArray::get(at,vals); 498 _init = llvm::ConstantArray::get(at,vals);
499 } 499 }
500 else 500 else
501 assert(0); 501 assert(0);
502 502
506 } 506 }
507 507
508 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage; 508 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;
509 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,_init->getType(),true,_linkage,_init,".str"); 509 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(*gIR->module,_init->getType(),true,_linkage,_init,".str");
510 510
511 llvm::ConstantInt* zero = llvm::ConstantInt::get(LLType::Int32Ty, 0, false); 511 llvm::ConstantInt* zero = gIR->context().getConstantInt(LLType::Int32Ty, 0, false);
512 LLConstant* idxs[2] = { zero, zero }; 512 LLConstant* idxs[2] = { zero, zero };
513 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2); 513 LLConstant* arrptr = llvm::ConstantExpr::getGetElementPtr(gvar,idxs,2);
514 514
515 if (t->ty == Tpointer) { 515 if (t->ty == Tpointer) {
516 return arrptr; 516 return arrptr;
517 } 517 }
518 else if (t->ty == Tarray) { 518 else if (t->ty == Tarray) {
519 LLConstant* clen = llvm::ConstantInt::get(DtoSize_t(),len,false); 519 LLConstant* clen = gIR->context().getConstantInt(DtoSize_t(),len,false);
520 return DtoConstSlice(clen, arrptr); 520 return DtoConstSlice(clen, arrptr);
521 } 521 }
522 522
523 assert(0); 523 assert(0);
524 return NULL; 524 return NULL;
1523 Type* e2type = e2->type->toBasetype(); 1523 Type* e2type = e2->type->toBasetype();
1524 1524
1525 if (e1type->isintegral()) 1525 if (e1type->isintegral())
1526 { 1526 {
1527 assert(e2type->isintegral()); 1527 assert(e2type->isintegral());
1528 LLValue* one = llvm::ConstantInt::get(val->getType(), 1, !e2type->isunsigned()); 1528 LLValue* one = gIR->context().getConstantInt(val->getType(), 1, !e2type->isunsigned());
1529 if (op == TOKplusplus) { 1529 if (op == TOKplusplus) {
1530 post = llvm::BinaryOperator::CreateAdd(val,one,"tmp",p->scopebb()); 1530 post = llvm::BinaryOperator::CreateAdd(val,one,"tmp",p->scopebb());
1531 } 1531 }
1532 else if (op == TOKminusminus) { 1532 else if (op == TOKminusminus) {
1533 post = llvm::BinaryOperator::CreateSub(val,one,"tmp",p->scopebb()); 1533 post = llvm::BinaryOperator::CreateSub(val,one,"tmp",p->scopebb());
1534 } 1534 }
1535 } 1535 }
1536 else if (e1type->ty == Tpointer) 1536 else if (e1type->ty == Tpointer)
1537 { 1537 {
1538 assert(e2type->isintegral()); 1538 assert(e2type->isintegral());
1539 LLConstant* minusone = llvm::ConstantInt::get(DtoSize_t(),(uint64_t)-1,true); 1539 LLConstant* minusone = gIR->context().getConstantInt(DtoSize_t(),(uint64_t)-1,true);
1540 LLConstant* plusone = llvm::ConstantInt::get(DtoSize_t(),(uint64_t)1,false); 1540 LLConstant* plusone = gIR->context().getConstantInt(DtoSize_t(),(uint64_t)1,false);
1541 LLConstant* whichone = (op == TOKplusplus) ? plusone : minusone; 1541 LLConstant* whichone = (op == TOKplusplus) ? plusone : minusone;
1542 post = llvm::GetElementPtrInst::Create(val, whichone, "tmp", p->scopebb()); 1542 post = llvm::GetElementPtrInst::Create(val, whichone, "tmp", p->scopebb());
1543 } 1543 }
1544 else if (e1type->isfloating()) 1544 else if (e1type->isfloating())
1545 { 1545 {
2144 LOG_SCOPE; 2144 LOG_SCOPE;
2145 2145
2146 DValue* u = e1->toElem(p); 2146 DValue* u = e1->toElem(p);
2147 2147
2148 LLValue* value = u->getRVal(); 2148 LLValue* value = u->getRVal();
2149 LLValue* minusone = llvm::ConstantInt::get(value->getType(), (uint64_t)-1, true); 2149 LLValue* minusone = gIR->context().getConstantInt(value->getType(), (uint64_t)-1, true);
2150 value = llvm::BinaryOperator::Create(llvm::Instruction::Xor, value, minusone, "tmp", p->scopebb()); 2150 value = llvm::BinaryOperator::Create(llvm::Instruction::Xor, value, minusone, "tmp", p->scopebb());
2151 2151
2152 return new DImValue(type, value); 2152 return new DImValue(type, value);
2153 } 2153 }
2154 2154
2499 std::vector<LLConstant*> constvals(values.size(), NULL); 2499 std::vector<LLConstant*> constvals(values.size(), NULL);
2500 for (size_t i = 0; i < values.size(); ++i) 2500 for (size_t i = 0; i < values.size(); ++i)
2501 constvals[i] = llvm::cast<LLConstant>(values[i]); 2501 constvals[i] = llvm::cast<LLConstant>(values[i]);
2502 2502
2503 // return constant struct 2503 // return constant struct
2504 return LLConstantStruct::get(constvals, sd->ir.irStruct->packed); 2504 return gIR->context().getConstantStruct(constvals, sd->ir.irStruct->packed);
2505 } 2505 }
2506 2506
2507 ////////////////////////////////////////////////////////////////////////////////////////// 2507 //////////////////////////////////////////////////////////////////////////////////////////
2508 2508
2509 DValue* InExp::toElem(IRState* p) 2509 DValue* InExp::toElem(IRState* p)