Change all of the bytecode reader primitives to throw exceptions instead of

returning error codes.  Because they don't return an error code, they can
return the value read, which simplifies the code and makes the reader more
efficient (yaay!).

Also eliminate the special case code for little endian machines.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10871 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2004-01-15 06:13:09 +00:00
parent c8434e3d71
commit 7969dc2bec
5 changed files with 129 additions and 242 deletions

View File

@ -36,9 +36,7 @@ namespace {
RawInst::RawInst(const unsigned char *&Buf, const unsigned char *EndBuf,
std::vector<unsigned> &Args) {
unsigned Op, Typ;
if (read(Buf, EndBuf, Op))
throw std::string("Error reading from buffer.");
unsigned Op = read(Buf, EndBuf);
// bits Instruction format: Common to all formats
// --------------------------
@ -85,25 +83,19 @@ RawInst::RawInst(const unsigned char *&Buf, const unsigned char *EndBuf,
break;
case 0:
Buf -= 4; // Hrm, try this again...
if (read_vbr(Buf, EndBuf, Opcode))
throw std::string("Error reading from buffer.");
Opcode = read_vbr_uint(Buf, EndBuf);
Opcode >>= 2;
if (read_vbr(Buf, EndBuf, Type))
throw std::string("Error reading from buffer.");
Type = read_vbr_uint(Buf, EndBuf);
unsigned NumOperands;
if (read_vbr(Buf, EndBuf, NumOperands))
throw std::string("Error reading from buffer.");
unsigned NumOperands = read_vbr_uint(Buf, EndBuf);
Args.resize(NumOperands);
if (NumOperands == 0)
throw std::string("Zero-argument instruction found; this is invalid.");
for (unsigned i = 0; i != NumOperands; ++i)
if (read_vbr(Buf, EndBuf, Args[i]))
throw std::string("Error reading from buffer");
if (align32(Buf, EndBuf))
throw std::string("Unaligned bytecode buffer.");
Args[i] = read_vbr_uint(Buf, EndBuf);
align32(Buf, EndBuf);
break;
}
}