mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
[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:
@ -3574,12 +3574,21 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Op;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Op) ||
|
||||
OpNum+2 != Record.size())
|
||||
(OpNum + 2 != Record.size() && OpNum + 3 != Record.size()))
|
||||
return Error("Invalid record");
|
||||
|
||||
Type *Ty = nullptr;
|
||||
if (OpNum + 3 == Record.size())
|
||||
Ty = getTypeByID(Record[OpNum++]);
|
||||
|
||||
unsigned Align;
|
||||
if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align))
|
||||
return EC;
|
||||
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);
|
||||
break;
|
||||
}
|
||||
@ -3588,9 +3597,13 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Op;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Op) ||
|
||||
OpNum+4 != Record.size())
|
||||
(OpNum + 4 != Record.size() && OpNum + 5 != Record.size()))
|
||||
return Error("Invalid record");
|
||||
|
||||
Type *Ty = nullptr;
|
||||
if (OpNum + 5 == Record.size())
|
||||
Ty = getTypeByID(Record[OpNum++]);
|
||||
|
||||
AtomicOrdering Ordering = GetDecodedOrdering(Record[OpNum+2]);
|
||||
if (Ordering == NotAtomic || Ordering == Release ||
|
||||
Ordering == AcquireRelease)
|
||||
@ -3603,6 +3616,10 @@ std::error_code BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (std::error_code EC = parseAlignmentValue(Record[OpNum], Align))
|
||||
return EC;
|
||||
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);
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user