mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Rejected r156374: Ordinary PR1255 patch. Due to clang-x86_64-debian-fnt buildbot failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@156377 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -28,10 +28,6 @@
|
||||
#include "llvm/OperandTraits.h"
|
||||
using namespace llvm;
|
||||
|
||||
enum {
|
||||
SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex
|
||||
};
|
||||
|
||||
void BitcodeReader::materializeForwardReferencedFunctions() {
|
||||
while (!BlockAddrFwdRefs.empty()) {
|
||||
Function *F = BlockAddrFwdRefs.begin()->first;
|
||||
@ -981,17 +977,6 @@ bool BitcodeReader::ResolveGlobalAndAliasInits() {
|
||||
return false;
|
||||
}
|
||||
|
||||
template <typename intty>
|
||||
APInt ReadWideAPInt(const intty *Vals, unsigned ActiveWords,
|
||||
unsigned TypeBits) {
|
||||
SmallVector<uint64_t, 8> Words;
|
||||
Words.resize(ActiveWords);
|
||||
for (unsigned i = 0; i != ActiveWords; ++i)
|
||||
Words[i] = DecodeSignRotatedValue(Vals[i]);
|
||||
|
||||
return APInt(TypeBits, Words);
|
||||
}
|
||||
|
||||
bool BitcodeReader::ParseConstants() {
|
||||
if (Stream.EnterSubBlock(bitc::CONSTANTS_BLOCK_ID))
|
||||
return Error("Malformed block record");
|
||||
@ -1048,11 +1033,13 @@ bool BitcodeReader::ParseConstants() {
|
||||
return Error("Invalid WIDE_INTEGER record");
|
||||
|
||||
unsigned NumWords = Record.size();
|
||||
|
||||
APInt VInt = ReadWideAPInt(&Record[0], NumWords,
|
||||
cast<IntegerType>(CurTy)->getBitWidth());
|
||||
V = ConstantInt::get(Context, VInt);
|
||||
|
||||
SmallVector<uint64_t, 8> Words;
|
||||
Words.resize(NumWords);
|
||||
for (unsigned i = 0; i != NumWords; ++i)
|
||||
Words[i] = DecodeSignRotatedValue(Record[i]);
|
||||
V = ConstantInt::get(Context,
|
||||
APInt(cast<IntegerType>(CurTy)->getBitWidth(),
|
||||
Words));
|
||||
break;
|
||||
}
|
||||
case bitc::CST_CODE_FLOAT: { // FLOAT: [fpval]
|
||||
@ -2284,61 +2271,6 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
|
||||
break;
|
||||
}
|
||||
case bitc::FUNC_CODE_INST_SWITCH: { // SWITCH: [opty, op0, op1, ...]
|
||||
// Check magic
|
||||
if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
|
||||
// New SwitchInst format with case ranges.
|
||||
|
||||
Type *OpTy = getTypeByID(Record[1]);
|
||||
unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth();
|
||||
|
||||
Value *Cond = getFnValueByID(Record[2], OpTy);
|
||||
BasicBlock *Default = getBasicBlock(Record[3]);
|
||||
if (OpTy == 0 || Cond == 0 || Default == 0)
|
||||
return Error("Invalid SWITCH record");
|
||||
|
||||
unsigned NumCases = Record[4];
|
||||
|
||||
SwitchInst *SI = SwitchInst::Create(Cond, Default, NumCases);
|
||||
|
||||
unsigned CurIdx = 5;
|
||||
for (unsigned i = 0; i != NumCases; ++i) {
|
||||
CRSBuilder CaseBuilder;
|
||||
unsigned NumItems = Record[CurIdx++];
|
||||
for (unsigned ci = 0; ci != NumItems; ++ci) {
|
||||
bool isSingleNumber = Record[CurIdx++];
|
||||
|
||||
APInt Low;
|
||||
unsigned ActiveWords = 1;
|
||||
if (ValueBitWidth > 64)
|
||||
ActiveWords = Record[CurIdx++];
|
||||
Low = ReadWideAPInt(&Record[CurIdx], ActiveWords, ValueBitWidth);
|
||||
CurIdx += ActiveWords;
|
||||
|
||||
if (!isSingleNumber) {
|
||||
ActiveWords = 1;
|
||||
if (ValueBitWidth > 64)
|
||||
ActiveWords = Record[CurIdx++];
|
||||
APInt High =
|
||||
ReadWideAPInt(&Record[CurIdx], ActiveWords, ValueBitWidth);
|
||||
CaseBuilder.add(cast<ConstantInt>(ConstantInt::get(OpTy, Low)),
|
||||
cast<ConstantInt>(ConstantInt::get(OpTy, High)));
|
||||
CurIdx += ActiveWords;
|
||||
} else
|
||||
CaseBuilder.add(cast<ConstantInt>(ConstantInt::get(OpTy, Low)));
|
||||
}
|
||||
BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
|
||||
ConstantRangesSet Case = CaseBuilder.getCase();
|
||||
SI->addCase(Case, DestBB);
|
||||
}
|
||||
uint16_t Hash = SI->Hash();
|
||||
if (Hash != (Record[0] & 0xFFFF))
|
||||
return Error("Invalid SWITCH record");
|
||||
I = SI;
|
||||
break;
|
||||
}
|
||||
|
||||
// Old SwitchInst format without case ranges.
|
||||
|
||||
if (Record.size() < 3 || (Record.size() & 1) == 0)
|
||||
return Error("Invalid SWITCH record");
|
||||
Type *OpTy = getTypeByID(Record[0]);
|
||||
|
@ -62,10 +62,7 @@ enum {
|
||||
FUNCTION_INST_CAST_ABBREV,
|
||||
FUNCTION_INST_RET_VOID_ABBREV,
|
||||
FUNCTION_INST_RET_VAL_ABBREV,
|
||||
FUNCTION_INST_UNREACHABLE_ABBREV,
|
||||
|
||||
// SwitchInst Magic
|
||||
SWITCH_INST_MAGIC = 0x4B5 // May 2012 => 1205 => Hex
|
||||
FUNCTION_INST_UNREACHABLE_ABBREV
|
||||
};
|
||||
|
||||
static unsigned GetEncodedCastOpcode(unsigned Opcode) {
|
||||
@ -722,42 +719,6 @@ static void WriteModuleMetadataStore(const Module *M, BitstreamWriter &Stream) {
|
||||
Stream.ExitBlock();
|
||||
}
|
||||
|
||||
template <typename intty>
|
||||
static void EmitAPInt(SmallVectorImpl<intty> &Vals,
|
||||
unsigned &Code, unsigned &AbbrevToUse, const APInt &Val,
|
||||
bool EmitSizeForWideNumbers = false
|
||||
) {
|
||||
if (Val.getBitWidth() <= 64) {
|
||||
uint64_t V = Val.getSExtValue();
|
||||
if ((int64_t)V >= 0)
|
||||
Vals.push_back(V << 1);
|
||||
else
|
||||
Vals.push_back((-V << 1) | 1);
|
||||
Code = bitc::CST_CODE_INTEGER;
|
||||
AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
|
||||
} else {
|
||||
// Wide integers, > 64 bits in size.
|
||||
// We have an arbitrary precision integer value to write whose
|
||||
// bit width is > 64. However, in canonical unsigned integer
|
||||
// format it is likely that the high bits are going to be zero.
|
||||
// So, we only write the number of active words.
|
||||
unsigned NWords = Val.getActiveWords();
|
||||
|
||||
if (EmitSizeForWideNumbers)
|
||||
Vals.push_back(NWords);
|
||||
|
||||
const uint64_t *RawWords = Val.getRawData();
|
||||
for (unsigned i = 0; i != NWords; ++i) {
|
||||
int64_t V = RawWords[i];
|
||||
if (V >= 0)
|
||||
Vals.push_back(V << 1);
|
||||
else
|
||||
Vals.push_back((-V << 1) | 1);
|
||||
}
|
||||
Code = bitc::CST_CODE_WIDE_INTEGER;
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteConstants(unsigned FirstVal, unsigned LastVal,
|
||||
const ValueEnumerator &VE,
|
||||
BitstreamWriter &Stream, bool isGlobal) {
|
||||
@ -840,7 +801,30 @@ static void WriteConstants(unsigned FirstVal, unsigned LastVal,
|
||||
} else if (isa<UndefValue>(C)) {
|
||||
Code = bitc::CST_CODE_UNDEF;
|
||||
} else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {
|
||||
EmitAPInt(Record, Code, AbbrevToUse, IV->getValue());
|
||||
if (IV->getBitWidth() <= 64) {
|
||||
uint64_t V = IV->getSExtValue();
|
||||
if ((int64_t)V >= 0)
|
||||
Record.push_back(V << 1);
|
||||
else
|
||||
Record.push_back((-V << 1) | 1);
|
||||
Code = bitc::CST_CODE_INTEGER;
|
||||
AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
|
||||
} else { // Wide integers, > 64 bits in size.
|
||||
// We have an arbitrary precision integer value to write whose
|
||||
// bit width is > 64. However, in canonical unsigned integer
|
||||
// format it is likely that the high bits are going to be zero.
|
||||
// So, we only write the number of active words.
|
||||
unsigned NWords = IV->getValue().getActiveWords();
|
||||
const uint64_t *RawWords = IV->getValue().getRawData();
|
||||
for (unsigned i = 0; i != NWords; ++i) {
|
||||
int64_t V = RawWords[i];
|
||||
if (V >= 0)
|
||||
Record.push_back(V << 1);
|
||||
else
|
||||
Record.push_back((-V << 1) | 1);
|
||||
}
|
||||
Code = bitc::CST_CODE_WIDE_INTEGER;
|
||||
}
|
||||
} else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
|
||||
Code = bitc::CST_CODE_FLOAT;
|
||||
Type *Ty = CFP->getType();
|
||||
@ -1155,31 +1139,12 @@ static void WriteInstruction(const Instruction &I, unsigned InstID,
|
||||
{
|
||||
Code = bitc::FUNC_CODE_INST_SWITCH;
|
||||
SwitchInst &SI = cast<SwitchInst>(I);
|
||||
|
||||
uint32_t SwitchRecordHeader = SI.Hash() | (SWITCH_INST_MAGIC << 16);
|
||||
Vals.push_back(SwitchRecordHeader);
|
||||
|
||||
Vals.push_back(VE.getTypeID(SI.getCondition()->getType()));
|
||||
Vals.push_back(VE.getValueID(SI.getCondition()));
|
||||
Vals.push_back(VE.getValueID(SI.getDefaultDest()));
|
||||
Vals.push_back(SI.getNumCases());
|
||||
for (SwitchInst::CaseIt i = SI.case_begin(), e = SI.case_end();
|
||||
i != e; ++i) {
|
||||
ConstantRangesSet CRS = i.getCaseValueEx();
|
||||
Vals.push_back(CRS.getNumItems());
|
||||
for (unsigned ri = 0, rn = CRS.getNumItems(); ri != rn; ++ri) {
|
||||
ConstantRangesSet::Range r = CRS.getItem(ri);
|
||||
|
||||
Vals.push_back(CRS.isSingleNumber(ri));
|
||||
|
||||
const APInt &Low = r.Low->getValue();
|
||||
const APInt &High = r.High->getValue();
|
||||
unsigned Code, Abbrev; // will unused.
|
||||
|
||||
EmitAPInt(Vals, Code, Abbrev, Low, true);
|
||||
if (r.Low != r.High)
|
||||
EmitAPInt(Vals, Code, Abbrev, High, true);
|
||||
}
|
||||
Vals.push_back(VE.getValueID(i.getCaseValue()));
|
||||
Vals.push_back(VE.getValueID(i.getCaseSuccessor()));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user