comparison gen/toir.cpp @ 176:a074a5ff709c trunk

[svn r192] Fixed: String literals as constant expression was broken for utf16/32.
author lindquist
date Wed, 07 May 2008 00:58:36 +0200
parents c44e6a711885
children cea8dcfa76df
comparison
equal deleted inserted replaced
175:c44e6a711885 176:a074a5ff709c
488 llvm::Constant* StringExp::toConstElem(IRState* p) 488 llvm::Constant* StringExp::toConstElem(IRState* p)
489 { 489 {
490 Logger::print("StringExp::toConstElem: %s | %s\n", toChars(), type->toChars()); 490 Logger::print("StringExp::toConstElem: %s | %s\n", toChars(), type->toChars());
491 LOG_SCOPE; 491 LOG_SCOPE;
492 492
493 uint8_t* str = (uint8_t*)string;
494 std::string cont((char*)str, len);
495
496 Type* t = DtoDType(type); 493 Type* t = DtoDType(type);
497 494 Type* cty = DtoDType(t->next);
498 if (t->ty == Tsarray) { 495
499 return llvm::ConstantArray::get(cont,false); 496 bool nullterm = (t->ty != Tsarray);
500 } 497 size_t endlen = nullterm ? len+1 : len;
501 llvm::Constant* _init = llvm::ConstantArray::get(cont,true); 498
499 const llvm::Type* ct = DtoType(cty);
500 const llvm::ArrayType* at = llvm::ArrayType::get(ct,endlen);
501
502 llvm::Constant* _init;
503 if (cty->ty == Tchar || cty->ty == Tvoid) {
504 uint8_t* str = (uint8_t*)string;
505 std::string cont((char*)str, len);
506 _init = llvm::ConstantArray::get(cont, nullterm);
507 }
508 else if (cty->ty == Twchar) {
509 uint16_t* str = (uint16_t*)string;
510 std::vector<llvm::Constant*> vals;
511 for(size_t i=0; i<len; ++i) {
512 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));;
513 }
514 if (nullterm)
515 vals.push_back(llvm::ConstantInt::get(ct, 0, false));
516 _init = llvm::ConstantArray::get(at,vals);
517 }
518 else if (cty->ty == Tdchar) {
519 uint32_t* str = (uint32_t*)string;
520 std::vector<llvm::Constant*> vals;
521 for(size_t i=0; i<len; ++i) {
522 vals.push_back(llvm::ConstantInt::get(ct, str[i], false));;
523 }
524 if (nullterm)
525 vals.push_back(llvm::ConstantInt::get(ct, 0, false));
526 _init = llvm::ConstantArray::get(at,vals);
527 }
528 else
529 assert(0);
502 530
503 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage; 531 llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage;
504 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,"stringliteral",gIR->module); 532 llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,"stringliteral",gIR->module);
505 533
506 llvm::ConstantInt* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false); 534 llvm::ConstantInt* zero = llvm::ConstantInt::get(llvm::Type::Int32Ty, 0, false);