mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-17 04:24:00 +00:00
Change encoding of instruction operands in bitcode binaries to be relative
to the instruction position. The old encoding would give an absolute ID which counts up within a function, and only resets at the next function. I.e., Instead of having: ... = icmp eq i32 n-1, n-2 br i1 ..., label %bb1, label %bb2 it will now be roughly: ... = icmp eq i32 1, 2 br i1 1, label %bb1, label %bb2 This makes it so that ids remain relatively small and can be encoded in fewer bits. With this encoding, forward reference operands will be given negative-valued IDs. Use signed VBRs for the most common case of forward references, which is phi instructions. To retain backward compatibility we bump the bitcode version from 0 to 1 to distinguish between the different encodings. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165739 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -891,9 +891,9 @@ bool BitcodeReader::ParseMetadata() {
|
||||
}
|
||||
}
|
||||
|
||||
/// DecodeSignRotatedValue - Decode a signed value stored with the sign bit in
|
||||
/// decodeSignRotatedValue - Decode a signed value stored with the sign bit in
|
||||
/// the LSB for dense VBR encoding.
|
||||
static uint64_t DecodeSignRotatedValue(uint64_t V) {
|
||||
uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
|
||||
if ((V & 1) == 0)
|
||||
return V >> 1;
|
||||
if (V != 1)
|
||||
@ -943,7 +943,7 @@ bool BitcodeReader::ResolveGlobalAndAliasInits() {
|
||||
static APInt ReadWideAPInt(ArrayRef<uint64_t> Vals, unsigned TypeBits) {
|
||||
SmallVector<uint64_t, 8> Words(Vals.size());
|
||||
std::transform(Vals.begin(), Vals.end(), Words.begin(),
|
||||
DecodeSignRotatedValue);
|
||||
BitcodeReader::decodeSignRotatedValue);
|
||||
|
||||
return APInt(TypeBits, Words);
|
||||
}
|
||||
@ -997,7 +997,7 @@ bool BitcodeReader::ParseConstants() {
|
||||
case bitc::CST_CODE_INTEGER: // INTEGER: [intval]
|
||||
if (!CurTy->isIntegerTy() || Record.empty())
|
||||
return Error("Invalid CST_INTEGER record");
|
||||
V = ConstantInt::get(CurTy, DecodeSignRotatedValue(Record[0]));
|
||||
V = ConstantInt::get(CurTy, decodeSignRotatedValue(Record[0]));
|
||||
break;
|
||||
case bitc::CST_CODE_WIDE_INTEGER: {// WIDE_INTEGER: [n x intval]
|
||||
if (!CurTy->isIntegerTy() || Record.empty())
|
||||
@ -1524,13 +1524,22 @@ bool BitcodeReader::ParseModule(bool Resume) {
|
||||
// Read a record.
|
||||
switch (Stream.ReadRecord(Code, Record)) {
|
||||
default: break; // Default behavior, ignore unknown content.
|
||||
case bitc::MODULE_CODE_VERSION: // VERSION: [version#]
|
||||
case bitc::MODULE_CODE_VERSION: { // VERSION: [version#]
|
||||
if (Record.size() < 1)
|
||||
return Error("Malformed MODULE_CODE_VERSION");
|
||||
// Only version #0 is supported so far.
|
||||
if (Record[0] != 0)
|
||||
return Error("Unknown bitstream version!");
|
||||
// Only version #0 and #1 are supported so far.
|
||||
unsigned module_version = Record[0];
|
||||
switch (module_version) {
|
||||
default: return Error("Unknown bitstream version!");
|
||||
case 0:
|
||||
UseRelativeIDs = false;
|
||||
break;
|
||||
case 1:
|
||||
UseRelativeIDs = true;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N]
|
||||
std::string S;
|
||||
if (ConvertToString(Record, 0, S))
|
||||
@ -1797,13 +1806,6 @@ bool BitcodeReader::ParseModuleTriple(std::string &Triple) {
|
||||
// Read a record.
|
||||
switch (Stream.ReadRecord(Code, Record)) {
|
||||
default: break; // Default behavior, ignore unknown content.
|
||||
case bitc::MODULE_CODE_VERSION: // VERSION: [version#]
|
||||
if (Record.size() < 1)
|
||||
return Error("Malformed MODULE_CODE_VERSION");
|
||||
// Only version #0 is supported so far.
|
||||
if (Record[0] != 0)
|
||||
return Error("Unknown bitstream version!");
|
||||
break;
|
||||
case bitc::MODULE_CODE_TRIPLE: { // TRIPLE: [strchr x N]
|
||||
std::string S;
|
||||
if (ConvertToString(Record, 0, S))
|
||||
@ -2016,7 +2018,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *LHS, *RHS;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, LHS) ||
|
||||
getValue(Record, OpNum, LHS->getType(), RHS) ||
|
||||
popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) ||
|
||||
OpNum+1 > Record.size())
|
||||
return Error("Invalid BINOP record");
|
||||
|
||||
@ -2131,8 +2133,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *TrueVal, *FalseVal, *Cond;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) ||
|
||||
getValue(Record, OpNum, TrueVal->getType(), FalseVal) ||
|
||||
getValue(Record, OpNum, Type::getInt1Ty(Context), Cond))
|
||||
popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) ||
|
||||
popValue(Record, OpNum, NextValueNo, Type::getInt1Ty(Context), Cond))
|
||||
return Error("Invalid SELECT record");
|
||||
|
||||
I = SelectInst::Create(Cond, TrueVal, FalseVal);
|
||||
@ -2146,7 +2148,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *TrueVal, *FalseVal, *Cond;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal) ||
|
||||
getValue(Record, OpNum, TrueVal->getType(), FalseVal) ||
|
||||
popValue(Record, OpNum, NextValueNo, TrueVal->getType(), FalseVal) ||
|
||||
getValueTypePair(Record, OpNum, NextValueNo, Cond))
|
||||
return Error("Invalid SELECT record");
|
||||
|
||||
@ -2171,7 +2173,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Vec, *Idx;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Vec) ||
|
||||
getValue(Record, OpNum, Type::getInt32Ty(Context), Idx))
|
||||
popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx))
|
||||
return Error("Invalid EXTRACTELT record");
|
||||
I = ExtractElementInst::Create(Vec, Idx);
|
||||
InstructionList.push_back(I);
|
||||
@ -2182,9 +2184,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Vec, *Elt, *Idx;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Vec) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<VectorType>(Vec->getType())->getElementType(), Elt) ||
|
||||
getValue(Record, OpNum, Type::getInt32Ty(Context), Idx))
|
||||
popValue(Record, OpNum, NextValueNo, Type::getInt32Ty(Context), Idx))
|
||||
return Error("Invalid INSERTELT record");
|
||||
I = InsertElementInst::Create(Vec, Elt, Idx);
|
||||
InstructionList.push_back(I);
|
||||
@ -2195,7 +2197,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Vec1, *Vec2, *Mask;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Vec1) ||
|
||||
getValue(Record, OpNum, Vec1->getType(), Vec2))
|
||||
popValue(Record, OpNum, NextValueNo, Vec1->getType(), Vec2))
|
||||
return Error("Invalid SHUFFLEVEC record");
|
||||
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Mask))
|
||||
@ -2215,7 +2217,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *LHS, *RHS;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, LHS) ||
|
||||
getValue(Record, OpNum, LHS->getType(), RHS) ||
|
||||
popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) ||
|
||||
OpNum+1 != Record.size())
|
||||
return Error("Invalid CMP record");
|
||||
|
||||
@ -2260,7 +2262,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
}
|
||||
else {
|
||||
BasicBlock *FalseDest = getBasicBlock(Record[1]);
|
||||
Value *Cond = getFnValueByID(Record[2], Type::getInt1Ty(Context));
|
||||
Value *Cond = getValue(Record, 2, NextValueNo,
|
||||
Type::getInt1Ty(Context));
|
||||
if (FalseDest == 0 || Cond == 0)
|
||||
return Error("Invalid BR record");
|
||||
I = BranchInst::Create(TrueDest, FalseDest, Cond);
|
||||
@ -2276,7 +2279,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
Type *OpTy = getTypeByID(Record[1]);
|
||||
unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth();
|
||||
|
||||
Value *Cond = getFnValueByID(Record[2], OpTy);
|
||||
Value *Cond = getValue(Record, 2, NextValueNo, OpTy);
|
||||
BasicBlock *Default = getBasicBlock(Record[3]);
|
||||
if (OpTy == 0 || Cond == 0 || Default == 0)
|
||||
return Error("Invalid SWITCH record");
|
||||
@ -2331,7 +2334,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (Record.size() < 3 || (Record.size() & 1) == 0)
|
||||
return Error("Invalid SWITCH record");
|
||||
Type *OpTy = getTypeByID(Record[0]);
|
||||
Value *Cond = getFnValueByID(Record[1], OpTy);
|
||||
Value *Cond = getValue(Record, 1, NextValueNo, OpTy);
|
||||
BasicBlock *Default = getBasicBlock(Record[2]);
|
||||
if (OpTy == 0 || Cond == 0 || Default == 0)
|
||||
return Error("Invalid SWITCH record");
|
||||
@ -2355,7 +2358,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (Record.size() < 2)
|
||||
return Error("Invalid INDIRECTBR record");
|
||||
Type *OpTy = getTypeByID(Record[0]);
|
||||
Value *Address = getFnValueByID(Record[1], OpTy);
|
||||
Value *Address = getValue(Record, 1, NextValueNo, OpTy);
|
||||
if (OpTy == 0 || Address == 0)
|
||||
return Error("Invalid INDIRECTBR record");
|
||||
unsigned NumDests = Record.size()-2;
|
||||
@ -2397,7 +2400,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
|
||||
SmallVector<Value*, 16> Ops;
|
||||
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
|
||||
Ops.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
|
||||
Ops.push_back(getValue(Record, OpNum, NextValueNo,
|
||||
FTy->getParamType(i)));
|
||||
if (Ops.back() == 0) return Error("Invalid INVOKE record");
|
||||
}
|
||||
|
||||
@ -2444,7 +2448,14 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
InstructionList.push_back(PN);
|
||||
|
||||
for (unsigned i = 0, e = Record.size()-1; i != e; i += 2) {
|
||||
Value *V = getFnValueByID(Record[1+i], Ty);
|
||||
Value *V;
|
||||
// With the new function encoding, it is possible that operands have
|
||||
// negative IDs (for forward references). Use a signed VBR
|
||||
// representation to keep the encoding small.
|
||||
if (UseRelativeIDs)
|
||||
V = getValueSigned(Record, 1+i, NextValueNo, Ty);
|
||||
else
|
||||
V = getValue(Record, 1+i, NextValueNo, Ty);
|
||||
BasicBlock *BB = getBasicBlock(Record[2+i]);
|
||||
if (!V || !BB) return Error("Invalid PHI record");
|
||||
PN->addIncoming(V, BB);
|
||||
@ -2542,7 +2553,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Val, *Ptr;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(Ptr->getType())->getElementType(), Val) ||
|
||||
OpNum+2 != Record.size())
|
||||
return Error("Invalid STORE record");
|
||||
@ -2556,7 +2567,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Val, *Ptr;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(Ptr->getType())->getElementType(), Val) ||
|
||||
OpNum+4 != Record.size())
|
||||
return Error("Invalid STOREATOMIC record");
|
||||
@ -2579,9 +2590,9 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Ptr, *Cmp, *New;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(Ptr->getType())->getElementType(), Cmp) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(Ptr->getType())->getElementType(), New) ||
|
||||
OpNum+3 != Record.size())
|
||||
return Error("Invalid CMPXCHG record");
|
||||
@ -2599,7 +2610,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
unsigned OpNum = 0;
|
||||
Value *Ptr, *Val;
|
||||
if (getValueTypePair(Record, OpNum, NextValueNo, Ptr) ||
|
||||
getValue(Record, OpNum,
|
||||
popValue(Record, OpNum, NextValueNo,
|
||||
cast<PointerType>(Ptr->getType())->getElementType(), Val) ||
|
||||
OpNum+4 != Record.size())
|
||||
return Error("Invalid ATOMICRMW record");
|
||||
@ -2653,7 +2664,8 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (FTy->getParamType(i)->isLabelTy())
|
||||
Args.push_back(getBasicBlock(Record[OpNum]));
|
||||
else
|
||||
Args.push_back(getFnValueByID(Record[OpNum], FTy->getParamType(i)));
|
||||
Args.push_back(getValue(Record, OpNum, NextValueNo,
|
||||
FTy->getParamType(i)));
|
||||
if (Args.back() == 0) return Error("Invalid CALL record");
|
||||
}
|
||||
|
||||
@ -2682,7 +2694,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
if (Record.size() < 3)
|
||||
return Error("Invalid VAARG record");
|
||||
Type *OpTy = getTypeByID(Record[0]);
|
||||
Value *Op = getFnValueByID(Record[1], OpTy);
|
||||
Value *Op = getValue(Record, 1, NextValueNo, OpTy);
|
||||
Type *ResTy = getTypeByID(Record[2]);
|
||||
if (!OpTy || !Op || !ResTy)
|
||||
return Error("Invalid VAARG record");
|
||||
|
Reference in New Issue
Block a user