diff options
Diffstat (limited to 'llvm/lib/Bitcode/Reader')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 32 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.h | 6 |
2 files changed, 18 insertions, 20 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 66426c83c66..e5dfa723b04 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1635,11 +1635,14 @@ std::error_code BitcodeReader::ParseConstants() { } else { // Otherwise insert a placeholder and remember it so it can be inserted // when the function is parsed. - BB = BasicBlock::Create(Context); auto &FwdBBs = BasicBlockFwdRefs[Fn]; if (FwdBBs.empty()) BasicBlockFwdRefQueue.push_back(Fn); - FwdBBs.emplace_back(BBID, BB); + if (FwdBBs.size() < BBID + 1) + FwdBBs.resize(BBID + 1); + if (!FwdBBs[BBID]) + FwdBBs[BBID] = BasicBlock::Create(Context); + BB = FwdBBs[BBID]; } V = BlockAddress::get(Fn, BB); break; @@ -2392,24 +2395,19 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) { FunctionBBs[i] = BasicBlock::Create(Context, "", F); } else { auto &BBRefs = BBFRI->second; - std::sort(BBRefs.begin(), BBRefs.end(), - [](const std::pair<unsigned, BasicBlock *> &LHS, - const std::pair<unsigned, BasicBlock *> &RHS) { - return LHS.first < RHS.first; - }); - unsigned R = 0, RE = BBRefs.size(); - for (unsigned I = 0, E = FunctionBBs.size(); I != E; ++I) - if (R != RE && BBRefs[R].first == I) { - assert(I != 0 && "Invalid reference to entry block"); - BasicBlock *BB = BBRefs[R++].second; - BB->insertInto(F); - FunctionBBs[I] = BB; + // Check for invalid basic block references. + if (BBRefs.size() > FunctionBBs.size()) + return Error(BitcodeError::InvalidID); + assert(!BBRefs.empty() && "Unexpected empty array"); + assert(!BBRefs.front() && "Invalid reference to entry block"); + for (unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size(); I != E; + ++I) + if (I < RE && BBRefs[I]) { + BBRefs[I]->insertInto(F); + FunctionBBs[I] = BBRefs[I]; } else { FunctionBBs[I] = BasicBlock::Create(Context, "", F); } - // Check for invalid basic block references. - if (R != RE) - return Error(BitcodeError::InvalidID); // Erase from the table. BasicBlockFwdRefs.erase(BBFRI); diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.h b/llvm/lib/Bitcode/Reader/BitcodeReader.h index 5bbcaf4c614..6d4e0a2dfe9 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.h +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.h @@ -181,9 +181,9 @@ class BitcodeReader : public GVMaterializer { DenseMap<Function*, uint64_t> DeferredFunctionInfo; /// These are basic blocks forward-referenced by block addresses. They are - /// inserted lazily into functions when they're loaded. - typedef std::pair<unsigned, BasicBlock *> BasicBlockRefTy; - DenseMap<Function *, std::vector<BasicBlockRefTy>> BasicBlockFwdRefs; + /// inserted lazily into functions when they're loaded. The basic block ID is + /// its index into the vector. + DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs; std::deque<Function *> BasicBlockFwdRefQueue; /// UseRelativeIDs - Indicates that we are using a new encoding for |