mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-01 21:03:54 +00:00
[opaque pointer type] Bitcode support for explicit type parameter on the gep operator
This happened to be fairly easy to support backwards compatibility based on the number of operands (old format had an even number, new format has one more operand so an odd number). test/Bitcode/old-aliases.ll already appears to test old gep operators (if I remove the backwards compatibility in the BitcodeReader, this and another test fail) so I'm not adding extra test coverage here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232216 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
75cc2505da
commit
1f48a55e86
@ -400,6 +400,11 @@ public:
|
||||
return getPointerOperand()->getType();
|
||||
}
|
||||
|
||||
Type *getSourceElementType() const {
|
||||
return cast<SequentialType>(getPointerOperandType()->getScalarType())
|
||||
->getElementType();
|
||||
}
|
||||
|
||||
/// Method to return the address space of the pointer operand.
|
||||
unsigned getPointerAddressSpace() const {
|
||||
return getPointerOperandType()->getPointerAddressSpace();
|
||||
|
@ -1955,19 +1955,25 @@ std::error_code BitcodeReader::ParseConstants() {
|
||||
}
|
||||
case bitc::CST_CODE_CE_INBOUNDS_GEP:
|
||||
case bitc::CST_CODE_CE_GEP: { // CE_GEP: [n x operands]
|
||||
if (Record.size() & 1)
|
||||
return Error("Invalid record");
|
||||
unsigned OpNum = 0;
|
||||
Type *PointeeType = nullptr;
|
||||
if (Record.size() % 2)
|
||||
PointeeType = getTypeByID(Record[OpNum++]);
|
||||
SmallVector<Constant*, 16> Elts;
|
||||
for (unsigned i = 0, e = Record.size(); i != e; i += 2) {
|
||||
Type *ElTy = getTypeByID(Record[i]);
|
||||
while (OpNum != Record.size()) {
|
||||
Type *ElTy = getTypeByID(Record[OpNum++]);
|
||||
if (!ElTy)
|
||||
return Error("Invalid record");
|
||||
Elts.push_back(ValueList.getConstantFwdRef(Record[i+1], ElTy));
|
||||
Elts.push_back(ValueList.getConstantFwdRef(Record[OpNum++], ElTy));
|
||||
}
|
||||
|
||||
ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end());
|
||||
V = ConstantExpr::getGetElementPtr(Elts[0], Indices,
|
||||
BitCode ==
|
||||
bitc::CST_CODE_CE_INBOUNDS_GEP);
|
||||
if (PointeeType &&
|
||||
PointeeType != cast<GEPOperator>(V)->getSourceElementType())
|
||||
return Error("Invalid record");
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_CE_SELECT: { // CE_SELECT: [opval#, opval#, opval#]
|
||||
|
@ -1522,15 +1522,18 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,
|
||||
Record.push_back(Flags);
|
||||
}
|
||||
break;
|
||||
case Instruction::GetElementPtr:
|
||||
case Instruction::GetElementPtr: {
|
||||
Code = bitc::CST_CODE_CE_GEP;
|
||||
if (cast<GEPOperator>(C)->isInBounds())
|
||||
const auto *GO = cast<GEPOperator>(C);
|
||||
if (GO->isInBounds())
|
||||
Code = bitc::CST_CODE_CE_INBOUNDS_GEP;
|
||||
Record.push_back(VE.getTypeID(GO->getSourceElementType()));
|
||||
for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) {
|
||||
Record.push_back(VE.getTypeID(C->getOperand(i)->getType()));
|
||||
Record.push_back(VE.getValueID(C->getOperand(i)));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Instruction::Select:
|
||||
Code = bitc::CST_CODE_CE_SELECT;
|
||||
Record.push_back(VE.getValueID(C->getOperand(0)));
|
||||
|
Loading…
x
Reference in New Issue
Block a user