Index: lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
diff --git a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
index 2eba5bb0cfe6ba200ea7ae58291e479a3d88a08e..195fd81fc820012acfedbf3f733c692823593bfb 100644 |
--- a/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
+++ b/lib/Bitcode/NaCl/Reader/NaClBitstreamReader.cpp |
@@ -9,14 +9,41 @@ |
//===----------------------------------------------------------------------===// |
#include "llvm/Bitcode/NaCl/NaClBitstreamReader.h" |
+#include "llvm/Support/Format.h" |
#include "llvm/Support/raw_ostream.h" |
using namespace llvm; |
+std::string NaClBitstreamReader::getBitAddress(uint64_t Bit, |
+ unsigned MinByteWidth) { |
+ std::string Buffer; |
+ raw_string_ostream Stream(Buffer); |
+ Stream << '%' << MinByteWidth << PRIu64 << ":%u"; |
+ Stream.flush(); |
+ std::string FormatString(Buffer); |
+ Buffer.clear(); |
+ Stream << format(FormatString.c_str(), |
+ (Bit / 8), |
+ static_cast<unsigned>(Bit % 8)); |
+ return Stream.str(); |
+} |
+ |
//===----------------------------------------------------------------------===// |
// NaClBitstreamCursor implementation |
//===----------------------------------------------------------------------===// |
+void NaClBitstreamCursor::ErrorHandler:: |
+Fatal(const std::string &ErrorMessage) const { |
+ // Default implementation is simply print message, and the bit where |
+ // the error occurred. |
+ std::string Buffer; |
+ raw_string_ostream StrBuf(Buffer); |
+ StrBuf << "Error(" |
+ << NaClBitstreamReader::getBitAddress(Cursor.GetCurrentBitNo()) |
+ << "): " << ErrorMessage; |
+ report_fatal_error(StrBuf.str()); |
+} |
+ |
void NaClBitstreamCursor::freeState() { |
// Free all the Abbrevs. |
for (size_t i = 0, e = CurAbbrevs.size(); i != e; ++i) |
@@ -32,6 +59,20 @@ void NaClBitstreamCursor::freeState() { |
BlockScope.clear(); |
} |
+void NaClBitstreamCursor::reportInvalidAbbrevNumber(unsigned AbbrevNo) const { |
+ std::string Buffer; |
+ raw_string_ostream StrBuf(Buffer); |
+ StrBuf << "Invalid abbreviation # " << AbbrevNo << " defined for record"; |
+ ErrHandler->Fatal(StrBuf.str()); |
+} |
+ |
+void NaClBitstreamCursor::reportInvalidJumpToBit(uint64_t BitNo) const { |
+ std::string Buffer; |
+ raw_string_ostream StrBuf(Buffer); |
+ StrBuf << "Invalid jump to bit " << BitNo; |
+ ErrHandler->Fatal(StrBuf.str()); |
+} |
+ |
/// EnterSubBlock - Having read the ENTER_SUBBLOCK abbrevid, enter |
/// the block, and return true if the block has an error. |
bool NaClBitstreamCursor::EnterSubBlock(unsigned BlockID, unsigned *NumWordsP) { |
@@ -66,7 +107,8 @@ void NaClBitstreamCursor::skipAbbreviatedField(const NaClBitCodeAbbrevOp &Op) { |
// Decode the value as we are commanded. |
switch (Op.getEncoding()) { |
case NaClBitCodeAbbrevOp::Literal: |
- report_fatal_error("Not to be used with literals!"); |
+ llvm_unreachable("Not to be used with literals!"); |
+ break; |
case NaClBitCodeAbbrevOp::Fixed: |
(void)Read((unsigned)Op.getValue()); |
break; |
@@ -74,7 +116,8 @@ void NaClBitstreamCursor::skipAbbreviatedField(const NaClBitCodeAbbrevOp &Op) { |
(void)ReadVBR64((unsigned)Op.getValue()); |
break; |
case NaClBitCodeAbbrevOp::Array: |
- report_fatal_error("Bad array abbreviation encoding!"); |
+ llvm_unreachable("Bad array abbreviation encoding!"); |
+ break; |
case NaClBitCodeAbbrevOp::Char6: |
(void)Read(6); |
break; |
@@ -147,13 +190,15 @@ uint64_t NaClBitstreamCursor::readArrayAbbreviatedField( |
// Decode the value as we are commanded. |
switch (Op.getEncoding()) { |
case NaClBitCodeAbbrevOp::Literal: |
- report_fatal_error("Not to be used with literals!"); |
+ llvm_unreachable("Not to be used with literals!"); |
+ break; |
case NaClBitCodeAbbrevOp::Fixed: |
return Read((unsigned)Op.getValue()); |
case NaClBitCodeAbbrevOp::VBR: |
return ReadVBR64((unsigned)Op.getValue()); |
case NaClBitCodeAbbrevOp::Array: |
- report_fatal_error("Bad array abbreviation encoding!"); |
+ llvm_unreachable("Bad array abbreviation encoding!"); |
+ break; |
case NaClBitCodeAbbrevOp::Char6: |
return NaClBitCodeAbbrevOp::DecodeChar6(Read(6)); |
} |
@@ -178,17 +223,14 @@ unsigned NaClBitstreamCursor::readRecord(unsigned AbbrevID, |
return Code; |
} |
+ // Read code. |
const NaClBitCodeAbbrev *Abbv = getAbbrev(AbbrevID); |
- unsigned NumOperands = Abbv->getNumOperandInfos(); |
- assert(NumOperands > 0 && "Too few operands for abbreviation!"); |
- |
uint64_t Value; |
- |
- // Read code. |
unsigned Code; |
if (readRecordAbbrevField(Abbv->getOperandInfo(0), Value)) { |
// Array found, use to read all elements. |
- assert(Value > 0 && "No code found for record!"); |
+ if (Value == 0) |
+ ErrHandler->Fatal("No code found for record!"); |
const NaClBitCodeAbbrevOp &Op = Abbv->getOperandInfo(1); |
Code = readArrayAbbreviatedField(Op); |
readArrayAbbrev(Op, Value - 1, Vals); |
@@ -197,6 +239,7 @@ unsigned NaClBitstreamCursor::readRecord(unsigned AbbrevID, |
Code = Value; |
// Read arguments. |
+ unsigned NumOperands = Abbv->getNumOperandInfos(); |
for (unsigned i = 1; i != NumOperands; ++i) { |
if (readRecordAbbrevField(Abbv->getOperandInfo(i), Value)) { |
++i; |
@@ -209,21 +252,18 @@ unsigned NaClBitstreamCursor::readRecord(unsigned AbbrevID, |
} |
-namespace { |
- |
-static NaClBitCodeAbbrevOp::Encoding getEncoding(uint64_t Encoding) { |
- if (!NaClBitCodeAbbrevOp::isValidEncoding(Encoding)) { |
+NaClBitCodeAbbrevOp::Encoding NaClBitstreamCursor:: |
+getEncoding(uint64_t Value) { |
+ if (!NaClBitCodeAbbrevOp::isValidEncoding(Value)) { |
std::string Buffer; |
raw_string_ostream StrBuf(Buffer); |
- StrBuf << "Invalid abbreviation encoding " << Encoding |
- << "specified in bitcode file"; |
- report_fatal_error(StrBuf.str()); |
+ StrBuf << "Invalid abbreviation encoding specified in bitcode file: " |
+ << Value; |
+ ErrHandler->Fatal(StrBuf.str()); |
} |
- return NaClBitCodeAbbrevOp::Encoding(Encoding); |
+ return NaClBitCodeAbbrevOp::Encoding(Value); |
} |
-} // end of anonymous space. |
- |
void NaClBitstreamCursor::ReadAbbrevRecord(bool IsLocal, |
NaClAbbrevListener *Listener) { |
NaClBitCodeAbbrev *Abbv = new NaClBitCodeAbbrev(); |