diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-19 20:06:13 +0000 |
| commit | c0981da47d5696fe36474fcf86b4ce03ae3ff818 (patch) | |
| tree | f42add1021b9f2ac6a69ac7cf6c4499962739a45 /llvm/lib/Bitcode/Reader | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'llvm/lib/Bitcode/Reader')
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp | 62 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 277 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 215 |
3 files changed, 292 insertions, 262 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp index f577d3886e01..2723105b092f 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeAnalyzer.cpp @@ -529,10 +529,9 @@ Error BitcodeAnalyzer::decodeMetadataStringsBlob(StringRef Indent, if (R.AtEndOfStream()) return reportError("bad length"); - Expected<uint32_t> MaybeSize = R.ReadVBR(6); - if (!MaybeSize) - return MaybeSize.takeError(); - uint32_t Size = MaybeSize.get(); + uint32_t Size; + if (Error E = R.ReadVBR(6).moveInto(Size)) + return E; if (Strings.size() < Size) return reportError("truncated chars"); @@ -555,11 +554,8 @@ BitcodeAnalyzer::BitcodeAnalyzer(StringRef Buffer, Error BitcodeAnalyzer::analyze(Optional<BCDumpOptions> O, Optional<StringRef> CheckHash) { - Expected<CurStreamTypeType> MaybeType = analyzeHeader(O, Stream); - if (!MaybeType) - return MaybeType.takeError(); - else - CurStreamType = *MaybeType; + if (Error E = analyzeHeader(O, Stream).moveInto(CurStreamType)) + return E; Stream.setBlockInfo(&BlockInfo); @@ -567,9 +563,8 @@ Error BitcodeAnalyzer::analyze(Optional<BCDumpOptions> O, // The block info must be a top-level block. if (BlockInfoStream) { BitstreamCursor BlockInfoCursor(*BlockInfoStream); - Expected<CurStreamTypeType> H = analyzeHeader(O, BlockInfoCursor); - if (!H) - return H.takeError(); + if (Error E = analyzeHeader(O, BlockInfoCursor).takeError()) + return E; while (!BlockInfoCursor.AtEndOfStream()) { Expected<unsigned> MaybeCode = BlockInfoCursor.ReadCode(); @@ -582,12 +577,11 @@ Error BitcodeAnalyzer::analyze(Optional<BCDumpOptions> O, if (!MaybeBlockID) return MaybeBlockID.takeError(); if (MaybeBlockID.get() == bitc::BLOCKINFO_BLOCK_ID) { - Expected<Optional<BitstreamBlockInfo>> MaybeNewBlockInfo = - BlockInfoCursor.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true); - if (!MaybeNewBlockInfo) - return MaybeNewBlockInfo.takeError(); - Optional<BitstreamBlockInfo> NewBlockInfo = - std::move(MaybeNewBlockInfo.get()); + Optional<BitstreamBlockInfo> NewBlockInfo; + if (Error E = + BlockInfoCursor.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true) + .moveInto(NewBlockInfo)) + return E; if (!NewBlockInfo) return reportError("Malformed BlockInfoBlock in block info file"); BlockInfo = std::move(*NewBlockInfo); @@ -744,22 +738,20 @@ Error BitcodeAnalyzer::parseBlock(unsigned BlockID, unsigned IndentLevel, // BLOCKINFO is a special part of the stream. bool DumpRecords = O.hasValue(); if (BlockID == bitc::BLOCKINFO_BLOCK_ID) { - if (O) + if (O && !O->DumpBlockinfo) O->OS << Indent << "<BLOCKINFO_BLOCK/>\n"; - Expected<Optional<BitstreamBlockInfo>> MaybeNewBlockInfo = - Stream.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true); - if (!MaybeNewBlockInfo) - return MaybeNewBlockInfo.takeError(); - Optional<BitstreamBlockInfo> NewBlockInfo = - std::move(MaybeNewBlockInfo.get()); + Optional<BitstreamBlockInfo> NewBlockInfo; + if (Error E = Stream.ReadBlockInfoBlock(/*ReadBlockInfoNames=*/true) + .moveInto(NewBlockInfo)) + return E; if (!NewBlockInfo) return reportError("Malformed BlockInfoBlock"); BlockInfo = std::move(*NewBlockInfo); if (Error Err = Stream.JumpToBit(BlockBitStart)) return Err; // It's not really interesting to dump the contents of the blockinfo - // block. - DumpRecords = false; + // block, so only do it if the user explicitly requests it. + DumpRecords = O && O->DumpBlockinfo; } unsigned NumWords = 0; @@ -796,11 +788,10 @@ Error BitcodeAnalyzer::parseBlock(unsigned BlockID, unsigned IndentLevel, uint64_t RecordStartBit = Stream.GetCurrentBitNo(); - Expected<BitstreamEntry> MaybeEntry = - Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = Stream.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs) + .moveInto(Entry)) + return E; switch (Entry.Kind) { case BitstreamEntry::Error: @@ -847,10 +838,9 @@ Error BitcodeAnalyzer::parseBlock(unsigned BlockID, unsigned IndentLevel, StringRef Blob; uint64_t CurrentRecordPos = Stream.GetCurrentBitNo(); - Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record, &Blob); - if (!MaybeCode) - return MaybeCode.takeError(); - unsigned Code = MaybeCode.get(); + unsigned Code; + if (Error E = Stream.readRecord(Entry.ID, Record, &Blob).moveInto(Code)) + return E; // Increment the # occurrences of this code. if (BlockStats.CodeFreq.size() <= Code) diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index d5e366c21f7d..c568461e62b0 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -41,7 +41,6 @@ #include "llvm/IR/GVMaterializer.h" #include "llvm/IR/GlobalAlias.h" #include "llvm/IR/GlobalIFunc.h" -#include "llvm/IR/GlobalIndirectSymbol.h" #include "llvm/IR/GlobalObject.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/GlobalVariable.h" @@ -180,10 +179,8 @@ static Expected<std::string> readIdentificationBlock(BitstreamCursor &Stream) { while (true) { BitstreamEntry Entry; - if (Expected<BitstreamEntry> Res = Stream.advance()) - Entry = Res.get(); - else - return Res.takeError(); + if (Error E = Stream.advance().moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { default: @@ -227,10 +224,8 @@ static Expected<std::string> readIdentificationCode(BitstreamCursor &Stream) { return ""; BitstreamEntry Entry; - if (Expected<BitstreamEntry> Res = Stream.advance()) - Entry = std::move(Res.get()); - else - return Res.takeError(); + if (Error E = Stream.advance().moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::EndBlock: @@ -246,10 +241,9 @@ static Expected<std::string> readIdentificationCode(BitstreamCursor &Stream) { return std::move(Err); continue; case BitstreamEntry::Record: - if (Expected<unsigned> Skipped = Stream.skipRecord(Entry.ID)) - continue; - else - return Skipped.takeError(); + if (Error E = Stream.skipRecord(Entry.ID).takeError()) + return std::move(E); + continue; } } } @@ -306,10 +300,8 @@ static Expected<bool> hasObjCCategory(BitstreamCursor &Stream) { // need to understand them all. while (true) { BitstreamEntry Entry; - if (Expected<BitstreamEntry> Res = Stream.advance()) - Entry = std::move(Res.get()); - else - return Res.takeError(); + if (Error E = Stream.advance().moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::Error: @@ -327,10 +319,9 @@ static Expected<bool> hasObjCCategory(BitstreamCursor &Stream) { continue; case BitstreamEntry::Record: - if (Expected<unsigned> Skipped = Stream.skipRecord(Entry.ID)) - continue; - else - return Skipped.takeError(); + if (Error E = Stream.skipRecord(Entry.ID).takeError()) + return std::move(E); + continue; } } } @@ -500,10 +491,15 @@ class BitcodeReader : public BitcodeReaderBase, public GVMaterializer { SmallVector<Instruction *, 64> InstructionList; std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits; - std::vector<std::pair<GlobalIndirectSymbol *, unsigned>> IndirectSymbolInits; - std::vector<std::pair<Function *, unsigned>> FunctionPrefixes; - std::vector<std::pair<Function *, unsigned>> FunctionPrologues; - std::vector<std::pair<Function *, unsigned>> FunctionPersonalityFns; + std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits; + + struct FunctionOperandInfo { + Function *F; + unsigned PersonalityFn; + unsigned Prefix; + unsigned Prologue; + }; + std::vector<FunctionOperandInfo> FunctionOperands; /// The set of attributes by index. Index zero in the file is for null, and /// is thus not represented here. As such all indices are off by one. @@ -933,6 +929,9 @@ static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags) { Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1; Flags.NoInline = (RawFlags >> 4) & 0x1; Flags.AlwaysInline = (RawFlags >> 5) & 0x1; + Flags.NoUnwind = (RawFlags >> 6) & 0x1; + Flags.MayThrow = (RawFlags >> 7) & 0x1; + Flags.HasUnknownCall = (RawFlags >> 8) & 0x1; return Flags; } @@ -1388,6 +1387,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) { return Attribute::Cold; case bitc::ATTR_KIND_CONVERGENT: return Attribute::Convergent; + case bitc::ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION: + return Attribute::DisableSanitizerInstrumentation; case bitc::ATTR_KIND_ELEMENTTYPE: return Attribute::ElementType; case bitc::ATTR_KIND_INACCESSIBLEMEM_ONLY: @@ -1785,6 +1786,9 @@ Error BitcodeReader::parseTypeTableBody() { case bitc::TYPE_CODE_OPAQUE_POINTER: { // OPAQUE_POINTER: [addrspace] if (Record.size() != 1) return error("Invalid record"); + if (Context.supportsTypedPointers()) + return error( + "Opaque pointers are only supported in -opaque-pointers mode"); unsigned AddressSpace = Record[0]; ResultTy = PointerType::get(Context, AddressSpace); break; @@ -1913,7 +1917,7 @@ Error BitcodeReader::parseTypeTableBody() { if (Record[0] == 0) return error("Invalid vector length"); ResultTy = getTypeByID(Record[1]); - if (!ResultTy || !StructType::isValidElementType(ResultTy)) + if (!ResultTy || !VectorType::isValidElementType(ResultTy)) return error("Invalid type"); bool Scalable = Record.size() > 2 ? Record[2] : false; ResultTy = VectorType::get(ResultTy, Record[0], Scalable); @@ -2240,17 +2244,12 @@ uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) { /// Resolve all of the initializers for global values and aliases that we can. Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() { std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist; - std::vector<std::pair<GlobalIndirectSymbol *, unsigned>> - IndirectSymbolInitWorklist; - std::vector<std::pair<Function *, unsigned>> FunctionPrefixWorklist; - std::vector<std::pair<Function *, unsigned>> FunctionPrologueWorklist; - std::vector<std::pair<Function *, unsigned>> FunctionPersonalityFnWorklist; + std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist; + std::vector<FunctionOperandInfo> FunctionOperandWorklist; GlobalInitWorklist.swap(GlobalInits); IndirectSymbolInitWorklist.swap(IndirectSymbolInits); - FunctionPrefixWorklist.swap(FunctionPrefixes); - FunctionPrologueWorklist.swap(FunctionPrologues); - FunctionPersonalityFnWorklist.swap(FunctionPersonalityFns); + FunctionOperandWorklist.swap(FunctionOperands); while (!GlobalInitWorklist.empty()) { unsigned ValID = GlobalInitWorklist.back().second; @@ -2274,51 +2273,59 @@ Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() { Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID]); if (!C) return error("Expected a constant"); - GlobalIndirectSymbol *GIS = IndirectSymbolInitWorklist.back().first; - if (isa<GlobalAlias>(GIS) && C->getType() != GIS->getType()) - return error("Alias and aliasee types don't match"); - GIS->setIndirectSymbol(C); + GlobalValue *GV = IndirectSymbolInitWorklist.back().first; + if (auto *GA = dyn_cast<GlobalAlias>(GV)) { + if (C->getType() != GV->getType()) + return error("Alias and aliasee types don't match"); + GA->setAliasee(C); + } else if (auto *GI = dyn_cast<GlobalIFunc>(GV)) { + Type *ResolverFTy = + GlobalIFunc::getResolverFunctionType(GI->getValueType()); + // Transparently fix up the type for compatiblity with older bitcode + GI->setResolver( + ConstantExpr::getBitCast(C, ResolverFTy->getPointerTo())); + } else { + return error("Expected an alias or an ifunc"); + } } IndirectSymbolInitWorklist.pop_back(); } - while (!FunctionPrefixWorklist.empty()) { - unsigned ValID = FunctionPrefixWorklist.back().second; - if (ValID >= ValueList.size()) { - FunctionPrefixes.push_back(FunctionPrefixWorklist.back()); - } else { - if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) - FunctionPrefixWorklist.back().first->setPrefixData(C); - else - return error("Expected a constant"); + while (!FunctionOperandWorklist.empty()) { + FunctionOperandInfo &Info = FunctionOperandWorklist.back(); + if (Info.PersonalityFn) { + unsigned ValID = Info.PersonalityFn - 1; + if (ValID < ValueList.size()) { + if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) + Info.F->setPersonalityFn(C); + else + return error("Expected a constant"); + Info.PersonalityFn = 0; + } } - FunctionPrefixWorklist.pop_back(); - } - - while (!FunctionPrologueWorklist.empty()) { - unsigned ValID = FunctionPrologueWorklist.back().second; - if (ValID >= ValueList.size()) { - FunctionPrologues.push_back(FunctionPrologueWorklist.back()); - } else { - if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) - FunctionPrologueWorklist.back().first->setPrologueData(C); - else - return error("Expected a constant"); + if (Info.Prefix) { + unsigned ValID = Info.Prefix - 1; + if (ValID < ValueList.size()) { + if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) + Info.F->setPrefixData(C); + else + return error("Expected a constant"); + Info.Prefix = 0; + } } - FunctionPrologueWorklist.pop_back(); - } - - while (!FunctionPersonalityFnWorklist.empty()) { - unsigned ValID = FunctionPersonalityFnWorklist.back().second; - if (ValID >= ValueList.size()) { - FunctionPersonalityFns.push_back(FunctionPersonalityFnWorklist.back()); - } else { - if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) - FunctionPersonalityFnWorklist.back().first->setPersonalityFn(C); - else - return error("Expected a constant"); + if (Info.Prologue) { + unsigned ValID = Info.Prologue - 1; + if (ValID < ValueList.size()) { + if (Constant *C = dyn_cast_or_null<Constant>(ValueList[ValID])) + Info.F->setPrologueData(C); + else + return error("Expected a constant"); + Info.Prologue = 0; + } } - FunctionPersonalityFnWorklist.pop_back(); + if (Info.PersonalityFn || Info.Prefix || Info.Prologue) + FunctionOperands.push_back(Info); + FunctionOperandWorklist.pop_back(); } return Error::success(); @@ -2351,6 +2358,15 @@ Error BitcodeReader::parseConstants() { unsigned CstNo; }; std::vector<DelayedShufTy> DelayedShuffles; + struct DelayedSelTy { + Type *OpTy; + uint64_t Op0Idx; + uint64_t Op1Idx; + uint64_t Op2Idx; + unsigned CstNo; + }; + std::vector<DelayedSelTy> DelayedSelectors; + while (true) { Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); if (!MaybeEntry) @@ -2387,6 +2403,27 @@ Error BitcodeReader::parseConstants() { Value *V = ConstantExpr::getShuffleVector(Op0, Op1, Mask); ValueList.assignValue(V, CstNo); } + for (auto &DelayedSelector : DelayedSelectors) { + Type *OpTy = DelayedSelector.OpTy; + Type *SelectorTy = Type::getInt1Ty(Context); + uint64_t Op0Idx = DelayedSelector.Op0Idx; + uint64_t Op1Idx = DelayedSelector.Op1Idx; + uint64_t Op2Idx = DelayedSelector.Op2Idx; + uint64_t CstNo = DelayedSelector.CstNo; + Constant *Op1 = ValueList.getConstantFwdRef(Op1Idx, OpTy); + Constant *Op2 = ValueList.getConstantFwdRef(Op2Idx, OpTy); + // The selector might be an i1 or an <n x i1> + // Get the type from the ValueList before getting a forward ref. + if (VectorType *VTy = dyn_cast<VectorType>(OpTy)) { + Value *V = ValueList[Op0Idx]; + assert(V); + if (SelectorTy != V->getType()) + SelectorTy = VectorType::get(SelectorTy, VTy->getElementCount()); + } + Constant *Op0 = ValueList.getConstantFwdRef(Op0Idx, SelectorTy); + Value *V = ConstantExpr::getSelect(Op0, Op1, Op2); + ValueList.assignValue(V, CstNo); + } if (NextCstNo != ValueList.size()) return error("Invalid constant reference"); @@ -2683,21 +2720,11 @@ Error BitcodeReader::parseConstants() { if (Record.size() < 3) return error("Invalid record"); - Type *SelectorTy = Type::getInt1Ty(Context); - - // The selector might be an i1, an <n x i1>, or a <vscale x n x i1> - // Get the type from the ValueList before getting a forward ref. - if (VectorType *VTy = dyn_cast<VectorType>(CurTy)) - if (Value *V = ValueList[Record[0]]) - if (SelectorTy != V->getType()) - SelectorTy = VectorType::get(SelectorTy, - VTy->getElementCount()); - - V = ConstantExpr::getSelect(ValueList.getConstantFwdRef(Record[0], - SelectorTy), - ValueList.getConstantFwdRef(Record[1],CurTy), - ValueList.getConstantFwdRef(Record[2],CurTy)); - break; + DelayedSelectors.push_back( + {CurTy, Record[0], Record[1], Record[2], NextCstNo}); + (void)ValueList.getConstantFwdRef(NextCstNo, CurTy); + ++NextCstNo; + continue; } case bitc::CST_CODE_CE_EXTRACTELT : { // CE_EXTRACTELT: [opty, opval, opty, opval] @@ -3091,8 +3118,7 @@ Error BitcodeReader::globalCleanup() { // Force deallocation of memory for these vectors to favor the client that // want lazy deserialization. std::vector<std::pair<GlobalVariable *, unsigned>>().swap(GlobalInits); - std::vector<std::pair<GlobalIndirectSymbol *, unsigned>>().swap( - IndirectSymbolInits); + std::vector<std::pair<GlobalValue *, unsigned>>().swap(IndirectSymbolInits); return Error::success(); } @@ -3270,7 +3296,7 @@ Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) { } if (Record.size() > 12) { - auto AS = getAttributes(Record[12]).getFnAttributes(); + auto AS = getAttributes(Record[12]).getFnAttrs(); NewGV->setAttributes(AS); } @@ -3383,8 +3409,10 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) { if (Record.size() > 9) UnnamedAddr = getDecodedUnnamedAddrType(Record[9]); Func->setUnnamedAddr(UnnamedAddr); - if (Record.size() > 10 && Record[10] != 0) - FunctionPrologues.push_back(std::make_pair(Func, Record[10] - 1)); + + FunctionOperandInfo OperandInfo = {Func, 0, 0, 0}; + if (Record.size() > 10) + OperandInfo.Prologue = Record[10]; if (Record.size() > 11) Func->setDLLStorageClass(getDecodedDLLStorageClass(Record[11])); @@ -3401,11 +3429,11 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) { Func->setComdat(reinterpret_cast<Comdat *>(1)); } - if (Record.size() > 13 && Record[13] != 0) - FunctionPrefixes.push_back(std::make_pair(Func, Record[13] - 1)); + if (Record.size() > 13) + OperandInfo.Prefix = Record[13]; - if (Record.size() > 14 && Record[14] != 0) - FunctionPersonalityFns.push_back(std::make_pair(Func, Record[14] - 1)); + if (Record.size() > 14) + OperandInfo.PersonalityFn = Record[14]; if (Record.size() > 15) { Func->setDSOLocal(getDecodedDSOLocal(Record[15])); @@ -3423,6 +3451,9 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) { ValueList.push_back(Func); + if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue) + FunctionOperands.push_back(OperandInfo); + // If this is a function with a body, remember the prototype we are // creating now, so that we can match up the body with them later. if (!isProto) { @@ -3467,7 +3498,7 @@ Error BitcodeReader::parseGlobalIndirectSymbolRecord( auto Val = Record[OpNum++]; auto Linkage = Record[OpNum++]; - GlobalIndirectSymbol *NewGA; + GlobalValue *NewGA; if (BitCode == bitc::MODULE_CODE_ALIAS || BitCode == bitc::MODULE_CODE_ALIAS_OLD) NewGA = GlobalAlias::create(Ty, AddrSpace, getDecodedLinkage(Linkage), Name, @@ -4898,8 +4929,10 @@ Error BitcodeReader::parseFunctionBody(Function *F) { Type *OpTy = getTypeByID(Record[1]); Value *Size = getFnValueByID(Record[2], OpTy); MaybeAlign Align; - if (Error Err = - parseAlignmentValue(Bitfield::get<APV::Align>(Rec), Align)) { + uint64_t AlignExp = + Bitfield::get<APV::AlignLower>(Rec) | + (Bitfield::get<APV::AlignUpper>(Rec) << APV::AlignLower::Bits); + if (Error Err = parseAlignmentValue(AlignExp, Align)) { return Err; } if (!Ty || !Size) @@ -5505,21 +5538,16 @@ Error BitcodeReader::materialize(GlobalValue *GV) { // Upgrade any old intrinsic calls in the function. for (auto &I : UpgradedIntrinsics) { - for (auto UI = I.first->materialized_user_begin(), UE = I.first->user_end(); - UI != UE;) { - User *U = *UI; - ++UI; + for (User *U : llvm::make_early_inc_range(I.first->materialized_users())) if (CallInst *CI = dyn_cast<CallInst>(U)) UpgradeIntrinsicCall(CI, I.second); - } } // Update calls to the remangled intrinsics for (auto &I : RemangledIntrinsics) - for (auto UI = I.first->materialized_user_begin(), UE = I.first->user_end(); - UI != UE;) + for (User *U : llvm::make_early_inc_range(I.first->materialized_users())) // Don't expect any other users than call sites - cast<CallBase>(*UI++)->setCalledFunction(I.second); + cast<CallBase>(U)->setCalledFunction(I.second); // Finish fn->subprogram upgrade for materialized functions. if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(F)) @@ -5567,9 +5595,8 @@ Error BitcodeReader::materialize(GlobalValue *GV) { // Remove incompatible attributes on function calls. if (auto *CI = dyn_cast<CallBase>(&I)) { - CI->removeAttributes(AttributeList::ReturnIndex, - AttributeFuncs::typeIncompatible( - CI->getFunctionType()->getReturnType())); + CI->removeRetAttrs(AttributeFuncs::typeIncompatible( + CI->getFunctionType()->getReturnType())); for (unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo) CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible( @@ -6742,10 +6769,9 @@ llvm::getBitcodeFileContents(MemoryBufferRef Buffer) { continue; } case BitstreamEntry::Record: - if (Expected<unsigned> StreamFailed = Stream.skipRecord(Entry.ID)) - continue; - else - return StreamFailed.takeError(); + if (Error E = Stream.skipRecord(Entry.ID).takeError()) + return std::move(E); + continue; } } } @@ -6768,12 +6794,9 @@ BitcodeModule::getModuleImpl(LLVMContext &Context, bool MaterializeAll, if (IdentificationBit != -1ull) { if (Error JumpFailed = Stream.JumpToBit(IdentificationBit)) return std::move(JumpFailed); - Expected<std::string> ProducerIdentificationOrErr = - readIdentificationBlock(Stream); - if (!ProducerIdentificationOrErr) - return ProducerIdentificationOrErr.takeError(); - - ProducerIdentification = *ProducerIdentificationOrErr; + if (Error E = + readIdentificationBlock(Stream).moveInto(ProducerIdentification)) + return std::move(E); } if (Error JumpFailed = Stream.JumpToBit(ModuleBit)) @@ -6847,10 +6870,9 @@ static Expected<bool> getEnableSplitLTOUnitFlag(BitstreamCursor &Stream, SmallVector<uint64_t, 64> Record; while (true) { - Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. @@ -6895,10 +6917,9 @@ Expected<BitcodeLTOInfo> BitcodeModule::getLTOInfo() { return std::move(Err); while (true) { - Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); - if (!MaybeEntry) - return MaybeEntry.takeError(); - llvm::BitstreamEntry Entry = MaybeEntry.get(); + llvm::BitstreamEntry Entry; + if (Error E = Stream.advance().moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::Error: diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index 8493eb7a28b2..6df5a4a64d51 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -21,8 +21,8 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" #include "llvm/Bitcode/BitcodeReader.h" -#include "llvm/Bitstream/BitstreamReader.h" #include "llvm/Bitcode/LLVMBitCodes.h" +#include "llvm/Bitstream/BitstreamReader.h" #include "llvm/IR/Argument.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/AutoUpgrade.h" @@ -40,7 +40,6 @@ #include "llvm/IR/GVMaterializer.h" #include "llvm/IR/GlobalAlias.h" #include "llvm/IR/GlobalIFunc.h" -#include "llvm/IR/GlobalIndirectSymbol.h" #include "llvm/IR/GlobalObject.h" #include "llvm/IR/GlobalValue.h" #include "llvm/IR/GlobalVariable.h" @@ -363,7 +362,8 @@ class PlaceholderQueue { public: ~PlaceholderQueue() { - assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed"); + assert(empty() && + "PlaceholderQueue hasn't been flushed before being destroyed"); } bool empty() const { return PHs.empty(); } DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID); @@ -546,7 +546,7 @@ class MetadataLoader::MetadataLoaderImpl { if (auto *DDI = dyn_cast<DbgDeclareInst>(&I)) if (auto *DIExpr = DDI->getExpression()) if (DIExpr->startsWithDeref() && - dyn_cast_or_null<Argument>(DDI->getAddress())) { + isa_and_nonnull<Argument>(DDI->getAddress())) { SmallVector<uint64_t, 8> Ops; Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end()); @@ -604,7 +604,7 @@ class MetadataLoader::MetadataLoaderImpl { // If the expression is malformed, make sure we don't // copy more elements than we should. HistoricSize = std::min(SubExpr.size(), HistoricSize); - ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1); + ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1); switch (SubExpr.front()) { case dwarf::DW_OP_plus: @@ -698,11 +698,12 @@ MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { // Get the abbrevs, and preload record positions to make them lazy-loadable. while (true) { uint64_t SavedPos = IndexCursor.GetCurrentBitNo(); - Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks( - BitstreamCursor::AF_DontPopBlockAtEnd); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = + IndexCursor + .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) + .moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. @@ -715,10 +716,9 @@ MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { // The interesting case. ++NumMDRecordLoaded; uint64_t CurrentPos = IndexCursor.GetCurrentBitNo(); - Expected<unsigned> MaybeCode = IndexCursor.skipRecord(Entry.ID); - if (!MaybeCode) - return MaybeCode.takeError(); - unsigned Code = MaybeCode.get(); + unsigned Code; + if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code)) + return std::move(E); switch (Code) { case bitc::METADATA_STRINGS: { // Rewind and parse the strings. @@ -905,11 +905,12 @@ Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() { if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos)) return std::move(Err); while (true) { - Expected<BitstreamEntry> MaybeEntry = TempCursor.advanceSkippingSubblocks( - BitstreamCursor::AF_DontPopBlockAtEnd); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = + TempCursor + .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) + .moveInto(Entry)) + return std::move(E); switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. @@ -1025,10 +1026,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) { // Read all the records. while (true) { - Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) + return E; switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. @@ -1081,22 +1081,22 @@ void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata( if (Error Err = IndexCursor.JumpToBit( GlobalMetadataBitPosIndex[ID - MDStringRef.size()])) report_fatal_error("lazyLoadOneMetadata failed jumping: " + - toString(std::move(Err))); - Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks(); - if (!MaybeEntry) + Twine(toString(std::move(Err)))); + BitstreamEntry Entry; + if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry)) // FIXME this drops the error on the floor. report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " + - toString(MaybeEntry.takeError())); - BitstreamEntry Entry = MaybeEntry.get(); + Twine(toString(std::move(E)))); ++NumMDRecordLoaded; if (Expected<unsigned> MaybeCode = IndexCursor.readRecord(Entry.ID, Record, &Blob)) { if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID)) report_fatal_error("Can't lazyload MD, parseOneMetadata: " + - toString(std::move(Err))); + Twine(toString(std::move(Err)))); } else - report_fatal_error("Can't lazyload MD: " + toString(MaybeCode.takeError())); + report_fatal_error("Can't lazyload MD: " + + Twine(toString(MaybeCode.takeError()))); } /// Ensure that all forward-references and placeholders are resolved. @@ -1193,10 +1193,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( // Read name of the named metadata. SmallString<8> Name(Record.begin(), Record.end()); Record.clear(); - Expected<unsigned> MaybeCode = Stream.ReadCode(); - if (!MaybeCode) - return MaybeCode.takeError(); - Code = MaybeCode.get(); + if (Error E = Stream.ReadCode().moveInto(Code)) + return E; ++NumMDRecordLoaded; if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) { @@ -1411,8 +1409,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( return error("Invalid record"); IsDistinct = Record[0]; - DINode::DIFlags Flags = (Record.size() > 6) ? - static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero; + DINode::DIFlags Flags = (Record.size() > 6) + ? static_cast<DINode::DIFlags>(Record[6]) + : DINode::FlagZero; MetadataList.assignValue( GET_OR_DISTINCT(DIBasicType, @@ -1437,7 +1436,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( break; } case bitc::METADATA_DERIVED_TYPE: { - if (Record.size() < 12 || Record.size() > 13) + if (Record.size() < 12 || Record.size() > 14) return error("Invalid record"); // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means @@ -1446,6 +1445,10 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( if (Record.size() > 12 && Record[12]) DWARFAddressSpace = Record[12] - 1; + Metadata *Annotations = nullptr; + if (Record.size() > 13 && Record[13]) + Annotations = getMDOrNull(Record[13]); + IsDistinct = Record[0]; DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); MetadataList.assignValue( @@ -1455,13 +1458,13 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( getDITypeRefOrNull(Record[5]), getDITypeRefOrNull(Record[6]), Record[7], Record[8], Record[9], DWARFAddressSpace, Flags, - getDITypeRefOrNull(Record[11]))), + getDITypeRefOrNull(Record[11]), Annotations)), NextMetadataNo); NextMetadataNo++; break; } case bitc::METADATA_COMPOSITE_TYPE: { - if (Record.size() < 16 || Record.size() > 21) + if (Record.size() < 16 || Record.size() > 22) return error("Invalid record"); // If we have a UUID and this is not a forward declaration, lookup the @@ -1489,6 +1492,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( Metadata *Associated = nullptr; Metadata *Allocated = nullptr; Metadata *Rank = nullptr; + Metadata *Annotations = nullptr; auto *Identifier = getMDString(Record[15]); // If this module is being parsed so that it can be ThinLTO imported // into another module, composite types only need to be imported @@ -1520,6 +1524,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( if (Record.size() > 20) { Rank = getMDOrNull(Record[20]); } + if (Record.size() > 21) { + Annotations = getMDOrNull(Record[21]); + } } DICompositeType *CT = nullptr; if (Identifier) @@ -1527,7 +1534,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( Context, *Identifier, Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams, Discriminator, DataLocation, Associated, - Allocated, Rank); + Allocated, Rank, Annotations); // Create a node if we didn't get a lazy ODR type. if (!CT) @@ -1536,7 +1543,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams, Identifier, Discriminator, DataLocation, Associated, - Allocated, Rank)); + Allocated, Rank, Annotations)); if (!IsNotUsedInTypeRef && Identifier) MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT)); @@ -1665,9 +1672,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( SPFlags |= DISubprogram::SPFlagMainSubprogram; else if (!HasSPFlags) SPFlags = DISubprogram::toSPFlags( - /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], - /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], - /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag); + /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], + /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], + /*DIFlagMainSubprogram=*/HasOldMainSubprogramFlag); // All definitions should be distinct. IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition); @@ -1685,6 +1692,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( bool HasFn = false; bool HasThisAdj = true; bool HasThrownTypes = true; + bool HasAnnotations = false; unsigned OffsetA = 0; unsigned OffsetB = 0; if (!HasSPFlags) { @@ -1696,29 +1704,33 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( } HasThisAdj = Record.size() >= 20; HasThrownTypes = Record.size() >= 21; + } else { + HasAnnotations = Record.size() >= 19; } Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]); DISubprogram *SP = GET_OR_DISTINCT( DISubprogram, (Context, - getDITypeRefOrNull(Record[1]), // scope - getMDString(Record[2]), // name - getMDString(Record[3]), // linkageName - getMDOrNull(Record[4]), // file - Record[5], // line - getMDOrNull(Record[6]), // type - Record[7 + OffsetA], // scopeLine - getDITypeRefOrNull(Record[8 + OffsetA]), // containingType - Record[10 + OffsetA], // virtualIndex - HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment - Flags, // flags - SPFlags, // SPFlags - HasUnit ? CUorFn : nullptr, // unit - getMDOrNull(Record[13 + OffsetB]), // templateParams - getMDOrNull(Record[14 + OffsetB]), // declaration - getMDOrNull(Record[15 + OffsetB]), // retainedNodes + getDITypeRefOrNull(Record[1]), // scope + getMDString(Record[2]), // name + getMDString(Record[3]), // linkageName + getMDOrNull(Record[4]), // file + Record[5], // line + getMDOrNull(Record[6]), // type + Record[7 + OffsetA], // scopeLine + getDITypeRefOrNull(Record[8 + OffsetA]), // containingType + Record[10 + OffsetA], // virtualIndex + HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment + Flags, // flags + SPFlags, // SPFlags + HasUnit ? CUorFn : nullptr, // unit + getMDOrNull(Record[13 + OffsetB]), // templateParams + getMDOrNull(Record[14 + OffsetB]), // declaration + getMDOrNull(Record[15 + OffsetB]), // retainedNodes HasThrownTypes ? getMDOrNull(Record[17 + OffsetB]) - : nullptr // thrownTypes + : nullptr, // thrownTypes + HasAnnotations ? getMDOrNull(Record[18 + OffsetB]) + : nullptr // annotations )); MetadataList.assignValue(SP, NextMetadataNo); NextMetadataNo++; @@ -1860,13 +1872,18 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( unsigned Version = Record[0] >> 1; if (Version == 2) { + Metadata *Annotations = nullptr; + if (Record.size() > 12) + Annotations = getMDOrNull(Record[12]); + MetadataList.assignValue( - GET_OR_DISTINCT( - DIGlobalVariable, - (Context, getMDOrNull(Record[1]), getMDString(Record[2]), - getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], - getDITypeRefOrNull(Record[6]), Record[7], Record[8], - getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])), + GET_OR_DISTINCT(DIGlobalVariable, + (Context, getMDOrNull(Record[1]), + getMDString(Record[2]), getMDString(Record[3]), + getMDOrNull(Record[4]), Record[5], + getDITypeRefOrNull(Record[6]), Record[7], Record[8], + getMDOrNull(Record[9]), getMDOrNull(Record[10]), + Record[11], Annotations)), NextMetadataNo); NextMetadataNo++; @@ -1874,12 +1891,12 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( // No upgrade necessary. A null field will be introduced to indicate // that no parameter information is available. MetadataList.assignValue( - GET_OR_DISTINCT(DIGlobalVariable, - (Context, getMDOrNull(Record[1]), - getMDString(Record[2]), getMDString(Record[3]), - getMDOrNull(Record[4]), Record[5], - getDITypeRefOrNull(Record[6]), Record[7], Record[8], - getMDOrNull(Record[10]), nullptr, Record[11])), + GET_OR_DISTINCT( + DIGlobalVariable, + (Context, getMDOrNull(Record[1]), getMDString(Record[2]), + getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], + getDITypeRefOrNull(Record[6]), Record[7], Record[8], + getMDOrNull(Record[10]), nullptr, Record[11], nullptr)), NextMetadataNo); NextMetadataNo++; @@ -1912,7 +1929,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( (Context, getMDOrNull(Record[1]), getMDString(Record[2]), getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], getDITypeRefOrNull(Record[6]), Record[7], Record[8], - getMDOrNull(Record[10]), nullptr, AlignInBits)); + getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr)); DIGlobalVariableExpression *DGVE = nullptr; if (Attach || Expr) @@ -1942,18 +1959,22 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( bool HasTag = !HasAlignment && Record.size() > 8; DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]); uint32_t AlignInBits = 0; + Metadata *Annotations = nullptr; if (HasAlignment) { - if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max()) + if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) return error("Alignment value is too large"); - AlignInBits = Record[8 + HasTag]; + AlignInBits = Record[8]; + if (Record.size() > 9) + Annotations = getMDOrNull(Record[9]); } + MetadataList.assignValue( GET_OR_DISTINCT(DILocalVariable, (Context, getMDOrNull(Record[1 + HasTag]), getMDString(Record[2 + HasTag]), getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag], getDITypeRefOrNull(Record[5 + HasTag]), - Record[6 + HasTag], Flags, AlignInBits)), + Record[6 + HasTag], Flags, AlignInBits, Annotations)), NextMetadataNo); NextMetadataNo++; break; @@ -1964,10 +1985,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( IsDistinct = Record[0] & 1; MetadataList.assignValue( - GET_OR_DISTINCT(DILabel, - (Context, getMDOrNull(Record[1]), - getMDString(Record[2]), - getMDOrNull(Record[3]), Record[4])), + GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]), + getMDString(Record[2]), + getMDOrNull(Record[3]), Record[4])), NextMetadataNo); NextMetadataNo++; break; @@ -1984,8 +2004,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( if (Error Err = upgradeDIExpression(Version, Elts, Buffer)) return Err; - MetadataList.assignValue( - GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo); + MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)), + NextMetadataNo); NextMetadataNo++; break; } @@ -2020,17 +2040,19 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( break; } case bitc::METADATA_IMPORTED_ENTITY: { - if (Record.size() != 6 && Record.size() != 7) + if (Record.size() < 6 && Record.size() > 8) return error("Invalid record"); IsDistinct = Record[0]; - bool HasFile = (Record.size() == 7); + bool HasFile = (Record.size() >= 7); + bool HasElements = (Record.size() >= 8); MetadataList.assignValue( GET_OR_DISTINCT(DIImportedEntity, (Context, Record[1], getMDOrNull(Record[2]), getDITypeRefOrNull(Record[3]), HasFile ? getMDOrNull(Record[6]) : nullptr, - HasFile ? Record[4] : 0, getMDString(Record[5]))), + HasFile ? Record[4] : 0, getMDString(Record[5]), + HasElements ? getMDOrNull(Record[7]) : nullptr)), NextMetadataNo); NextMetadataNo++; break; @@ -2121,10 +2143,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings( if (R.AtEndOfStream()) return error("Invalid record: metadata strings bad length"); - Expected<uint32_t> MaybeSize = R.ReadVBR(6); - if (!MaybeSize) - return MaybeSize.takeError(); - uint32_t Size = MaybeSize.get(); + uint32_t Size; + if (Error E = R.ReadVBR(6).moveInto(Size)) + return E; if (Strings.size() < Size) return error("Invalid record: metadata strings truncated chars"); @@ -2161,10 +2182,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment( PlaceholderQueue Placeholders; while (true) { - Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) + return E; switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. @@ -2265,10 +2285,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() { // Read all the records. while (true) { - Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); - if (!MaybeEntry) - return MaybeEntry.takeError(); - BitstreamEntry Entry = MaybeEntry.get(); + BitstreamEntry Entry; + if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) + return E; switch (Entry.Kind) { case BitstreamEntry::SubBlock: // Handled for us already. |
