diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index e01cf501b8841..fa7a3b214e463 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -73,6 +73,7 @@ #include "llvm/Support/MathExtras.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/ModRef.h" +#include "llvm/Support/SwapByteOrder.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Triple.h" #include @@ -3449,86 +3450,23 @@ Error BitcodeReader::parseConstants() { if (Record.empty()) return error("Invalid data record"); - Type *EltTy; - if (auto *Array = dyn_cast(CurTy)) - EltTy = Array->getElementType(); - else - EltTy = cast(CurTy)->getElementType(); - if (EltTy->isIntegerTy(8)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::get(Context, Elts); - else - V = ConstantDataArray::get(Context, Elts); - } else if (EltTy->isIntegerTy(16)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::get(Context, Elts); - else - V = ConstantDataArray::get(Context, Elts); - } else if (EltTy->isIntegerTy(32)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::get(Context, Elts); - else - V = ConstantDataArray::get(Context, Elts); - } else if (EltTy->isIntegerTy(64)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::get(Context, Elts); - else - V = ConstantDataArray::get(Context, Elts); - } else if (EltTy->isByteTy(8)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getByte(EltTy, Elts); - else - V = ConstantDataArray::getByte(EltTy, Elts); - } else if (EltTy->isByteTy(16)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getByte(EltTy, Elts); - else - V = ConstantDataArray::getByte(EltTy, Elts); - } else if (EltTy->isByteTy(32)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getByte(EltTy, Elts); - else - V = ConstantDataArray::getByte(EltTy, Elts); - } else if (EltTy->isByteTy(64)) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getByte(EltTy, Elts); - else - V = ConstantDataArray::getByte(EltTy, Elts); - } else if (EltTy->isHalfTy()) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getFP(EltTy, Elts); - else - V = ConstantDataArray::getFP(EltTy, Elts); - } else if (EltTy->isBFloatTy()) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getFP(EltTy, Elts); - else - V = ConstantDataArray::getFP(EltTy, Elts); - } else if (EltTy->isFloatTy()) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getFP(EltTy, Elts); - else - V = ConstantDataArray::getFP(EltTy, Elts); - } else if (EltTy->isDoubleTy()) { - SmallVector Elts(Record.begin(), Record.end()); - if (isa(CurTy)) - V = ConstantDataVector::getFP(EltTy, Elts); - else - V = ConstantDataArray::getFP(EltTy, Elts); - } else { + Type *EltTy = CurTy->getContainedType(0); + if (!ConstantDataSequential::isElementTypeCompatible(EltTy)) return error("Invalid type for value"); + + const unsigned EltBytes = EltTy->getScalarSizeInBits() / 8; + SmallString<128> RawData; + RawData.reserve(Record.size() * EltBytes); + for (uint64_t Val : Record) { + const char *Src = reinterpret_cast(&Val); + if constexpr (sys::IsBigEndianHost) + Src += sizeof(uint64_t) - EltBytes; + RawData.append(Src, Src + EltBytes); } + + V = isa(CurTy) + ? ConstantDataVector::getRaw(RawData.str(), Record.size(), EltTy) + : ConstantDataArray::getRaw(RawData.str(), Record.size(), EltTy); break; } case bitc::CST_CODE_CE_UNOP: { // CE_UNOP: [opcode, opval]