diff options
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 365cf5f..4a77f8c 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -5085,7 +5085,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { } case bitc::FUNC_CODE_INST_CMPXCHG: { // CMPXCHG: [ptrty, ptr, cmp, val, vol, success_ordering, synchscope, - // failure_ordering, weak] + // failure_ordering, weak, align?] const size_t NumRecords = Record.size(); unsigned OpNum = 0; Value *Ptr = nullptr; @@ -5100,10 +5100,14 @@ Error BitcodeReader::parseFunctionBody(Function *F) { return error("Invalid record"); Value *Val = nullptr; - if (popValue(Record, OpNum, NextValueNo, Cmp->getType(), Val) || - NumRecords < OpNum + 3 || NumRecords > OpNum + 5) + if (popValue(Record, OpNum, NextValueNo, Cmp->getType(), Val)) + return error("Invalid record"); + + if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6) return error("Invalid record"); + const bool IsVol = Record[OpNum]; + const AtomicOrdering SuccessOrdering = getDecodedOrdering(Record[OpNum + 1]); if (SuccessOrdering == AtomicOrdering::NotAtomic || @@ -5118,14 +5122,23 @@ Error BitcodeReader::parseFunctionBody(Function *F) { const AtomicOrdering FailureOrdering = getDecodedOrdering(Record[OpNum + 3]); - const Align Alignment( - TheModule->getDataLayout().getTypeStoreSize(Cmp->getType())); + const bool IsWeak = Record[OpNum + 4]; + + MaybeAlign Alignment; - I = new AtomicCmpXchgInst(Ptr, Cmp, Val, Alignment, SuccessOrdering, + if (NumRecords == (OpNum + 6)) { + if (Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment)) + return Err; + } + if (!Alignment) + Alignment = + Align(TheModule->getDataLayout().getTypeStoreSize(Cmp->getType())); + + I = new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering, FailureOrdering, SSID); FullTy = StructType::get(Context, {FullTy, Type::getInt1Ty(Context)}); - cast<AtomicCmpXchgInst>(I)->setVolatile(Record[OpNum]); - cast<AtomicCmpXchgInst>(I)->setWeak(Record[OpNum + 4]); + cast<AtomicCmpXchgInst>(I)->setVolatile(IsVol); + cast<AtomicCmpXchgInst>(I)->setWeak(IsWeak); InstructionList.push_back(I); break; |