[opaque pointer type] bitcode support for explicit type parameter to the load instruction

Summary:
I've taken my best guess at this, but I've cargo culted in places & so
explanations/corrections would be great.

This seems to pass all the tests (check-all, covering clang and llvm) so I
believe that pretty well exercises both the backwards compatibility and common
(same version) compatibility given the number of checked in bitcode files we
already have. Is that a reasonable approach to testing here? Would some more
explicit tests be desired?

1) is this the right way to do back-compat in this case (looking at the number
  of entries in the bitcode record to disambiguate between the old schema and
  the new?)

2) I don't quite understand the logarithm logic to choose the encoding type of
  the type parameter in the abbreviation description, but I found another
  instruction doing the same thing & it seems to work. Is that the right
  approach?

Reviewers: dexonsmith

Differential Revision: http://reviews.llvm.org/D7655

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230414 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie 2015-02-25 01:07:20 +00:00
parent f8d179ba76
commit 5e2e6f2855
2 changed files with 22 additions and 2 deletions

View File

@ -3574,12 +3574,21 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
unsigned OpNum = 0; unsigned OpNum = 0;
Value *Op; Value *Op;
if (getValueTypePair(Record, OpNum, NextValueNo, Op) || if (getValueTypePair(Record, OpNum, NextValueNo, Op) ||
OpNum+2 != Record.size()) (OpNum + 2 != Record.size() && OpNum + 3 != Record.size()))
return Error("Invalid record"); return Error("Invalid record");
Type *Ty = nullptr;
if (OpNum + 3 == Record.size())
Ty = getTypeByID(Record[OpNum++]);
unsigned Align; unsigned Align;
if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align))
return EC; return EC;
I = new LoadInst(Op, "", Record[OpNum+1], Align); I = new LoadInst(Op, "", Record[OpNum+1], Align);
assert((!Ty || Ty == I->getType()) &&
"Explicit type doesn't match pointee type of the first operand");
InstructionList.push_back(I); InstructionList.push_back(I);
break; break;
} }
@ -3588,9 +3597,13 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
unsigned OpNum = 0; unsigned OpNum = 0;
Value *Op; Value *Op;
if (getValueTypePair(Record, OpNum, NextValueNo, Op) || if (getValueTypePair(Record, OpNum, NextValueNo, Op) ||
OpNum+4 != Record.size()) (OpNum + 4 != Record.size() && OpNum + 5 != Record.size()))
return Error("Invalid record"); return Error("Invalid record");
Type *Ty = nullptr;
if (OpNum + 5 == Record.size())
Ty = getTypeByID(Record[OpNum++]);
AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]); AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]);
if (Ordering == NotAtomic || Ordering == Release || if (Ordering == NotAtomic || Ordering == Release ||
Ordering == AcquireRelease) Ordering == AcquireRelease)
@ -3603,6 +3616,10 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align)) if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align))
return EC; return EC;
I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope); I = new LoadInst(Op, "", Record[OpNum+1], Align, Ordering, SynchScope);
assert((!Ty || Ty == I->getType()) &&
"Explicit type doesn't match pointee type of the first operand");
InstructionList.push_back(I); InstructionList.push_back(I);
break; break;
} }

View File

@ -1871,6 +1871,7 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) // ptr if (!PushValueAndType(I.getOperand(0), InstID, Vals, VE)) // ptr
AbbrevToUse = FUNCTION_INST_LOAD_ABBREV; AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
} }
Vals.push_back(VE.getTypeID(I.getType()));
Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1); Vals.push_back(Log2_32(cast<LoadInst>(I).getAlignment())+1);
Vals.push_back(cast<LoadInst>(I).isVolatile()); Vals.push_back(cast<LoadInst>(I).isVolatile());
if (cast<LoadInst>(I).isAtomic()) { if (cast<LoadInst>(I).isAtomic()) {
@ -2223,6 +2224,8 @@ static void WriteBlockInfo(const ValueEnumerator &VE, BitstreamWriter &Stream) {
BitCodeAbbrev *Abbv = new BitCodeAbbrev(); BitCodeAbbrev *Abbv = new BitCodeAbbrev();
Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD)); Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty
VE.computeBitsRequiredForTypeIndicies()));
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align
Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile
if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID,