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