[svn r192] Fixed: String literals as constant expression was broken for utf16/32.

This commit is contained in:
Tomas Lindquist Olsen 2008-05-07 00:58:36 +02:00
parent c31af3dc2d
commit 50db9be203
2 changed files with 36 additions and 6 deletions

View file

@ -340,8 +340,10 @@ llvm::Constant* DtoConstArrayInitializer(ArrayInitializer* arrinit)
assert(v); assert(v);
inits[i] = v; inits[i] = v;
Logger::cout() << "llval: " << *v << '\n';
} }
Logger::println("building constant array");
const llvm::ArrayType* arrty = llvm::ArrayType::get(elemty,tdim); const llvm::ArrayType* arrty = llvm::ArrayType::get(elemty,tdim);
llvm::Constant* constarr = llvm::ConstantArray::get(arrty, inits); llvm::Constant* constarr = llvm::ConstantArray::get(arrty, inits);

View file

@ -490,15 +490,43 @@ llvm::Constant* StringExp::toConstElem(IRState* p)
Logger::print("StringExp::toConstElem: %s | %s\n", toChars(), type->toChars()); Logger::print("StringExp::toConstElem: %s | %s\n", toChars(), type->toChars());
LOG_SCOPE; LOG_SCOPE;
uint8_t* str = (uint8_t*)string;
std::string cont((char*)str, len);
Type* t = DtoDType(type); Type* t = DtoDType(type);
Type* cty = DtoDType(t->next);
if (t->ty == Tsarray) { bool nullterm = (t->ty != Tsarray);
return llvm::ConstantArray::get(cont,false); size_t endlen = nullterm ? len+1 : len;
const llvm::Type* ct = DtoType(cty);
const llvm::ArrayType* at = llvm::ArrayType::get(ct,endlen);
llvm::Constant* _init;
if (cty->ty == Tchar || cty->ty == Tvoid) {
uint8_t* str = (uint8_t*)string;
std::string cont((char*)str, len);
_init = llvm::ConstantArray::get(cont, nullterm);
} }
llvm::Constant* _init = llvm::ConstantArray::get(cont,true); else if (cty->ty == Twchar) {
uint16_t* str = (uint16_t*)string;
std::vector<llvm::Constant*> vals;
for(size_t i=0; i<len; ++i) {
vals.push_back(llvm::ConstantInt::get(ct, str[i], false));;
}
if (nullterm)
vals.push_back(llvm::ConstantInt::get(ct, 0, false));
_init = llvm::ConstantArray::get(at,vals);
}
else if (cty->ty == Tdchar) {
uint32_t* str = (uint32_t*)string;
std::vector<llvm::Constant*> vals;
for(size_t i=0; i<len; ++i) {
vals.push_back(llvm::ConstantInt::get(ct, str[i], false));;
}
if (nullterm)
vals.push_back(llvm::ConstantInt::get(ct, 0, false));
_init = llvm::ConstantArray::get(at,vals);
}
else
assert(0);
llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage; llvm::GlobalValue::LinkageTypes _linkage = llvm::GlobalValue::InternalLinkage;//WeakLinkage;
llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,"stringliteral",gIR->module); llvm::GlobalVariable* gvar = new llvm::GlobalVariable(_init->getType(),true,_linkage,_init,"stringliteral",gIR->module);