Improve the bitcode reader's handling of constant strings to use

ConstantDataArray::getString direction, instead of "boxing" each
byte into a ConstantInt and using ConstantArray::get.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149805 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2012-02-05 02:41:35 +00:00
parent 521a255693
commit 2237f84735

View File

@ -1092,33 +1092,17 @@ bool BitcodeReader::ParseConstants() {
} }
break; break;
} }
case bitc::CST_CODE_STRING: { // STRING: [values] case bitc::CST_CODE_STRING: // STRING: [values]
if (Record.empty())
return Error("Invalid CST_AGGREGATE record");
ArrayType *ATy = cast<ArrayType>(CurTy);
Type *EltTy = ATy->getElementType();
unsigned Size = Record.size();
SmallVector<Constant*, 16> Elts;
for (unsigned i = 0; i != Size; ++i)
Elts.push_back(ConstantInt::get(EltTy, Record[i]));
V = ConstantArray::get(ATy, Elts);
break;
}
case bitc::CST_CODE_CSTRING: { // CSTRING: [values] case bitc::CST_CODE_CSTRING: { // CSTRING: [values]
if (Record.empty()) if (Record.empty())
return Error("Invalid CST_AGGREGATE record"); return Error("Invalid CST_STRING record");
ArrayType *ATy = cast<ArrayType>(CurTy);
Type *EltTy = ATy->getElementType();
unsigned Size = Record.size(); unsigned Size = Record.size();
SmallVector<Constant*, 16> Elts; SmallString<16> Elts;
for (unsigned i = 0; i != Size; ++i) for (unsigned i = 0; i != Size; ++i)
Elts.push_back(ConstantInt::get(EltTy, Record[i])); Elts.push_back(Record[i]);
Elts.push_back(Constant::getNullValue(EltTy)); V = ConstantDataArray::getString(Context, Elts,
V = ConstantArray::get(ATy, Elts); BitCode == bitc::CST_CODE_CSTRING);
break; break;
} }
case bitc::CST_CODE_DATA: {// DATA: [n x value] case bitc::CST_CODE_DATA: {// DATA: [n x value]