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
diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp
index 4beb2b0..21a1490 100644
--- a/lib/Bytecode/Reader/InstructionReader.cpp
+++ b/lib/Bytecode/Reader/InstructionReader.cpp
@@ -36,9 +36,7 @@
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 @@
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;
}
}