mirror of
https://github.com/ldc-developers/ldc.git
synced 2025-05-06 02:45:25 +03:00
[svn r192] Fixed: String literals as constant expression was broken for utf16/32.
This commit is contained in:
parent
c31af3dc2d
commit
50db9be203
2 changed files with 36 additions and 6 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
40
gen/toir.cpp
40
gen/toir.cpp
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue