aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Reader/ConstantReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bytecode/Reader/ConstantReader.cpp')
-rw-r--r--lib/Bytecode/Reader/ConstantReader.cpp95
1 files changed, 35 insertions, 60 deletions
diff --git a/lib/Bytecode/Reader/ConstantReader.cpp b/lib/Bytecode/Reader/ConstantReader.cpp
index 5fb62dae20..c1e9588230 100644
--- a/lib/Bytecode/Reader/ConstantReader.cpp
+++ b/lib/Bytecode/Reader/ConstantReader.cpp
@@ -23,8 +23,7 @@ using namespace llvm;
const Type *BytecodeParser::parseTypeConstant(const unsigned char *&Buf,
const unsigned char *EndBuf) {
- unsigned PrimType;
- if (read_vbr(Buf, EndBuf, PrimType)) throw Error_readvbr;
+ unsigned PrimType = read_vbr_uint(Buf, EndBuf);
const Type *Val = 0;
if ((Val = Type::getPrimitiveType((Type::PrimitiveID)PrimType)))
@@ -32,18 +31,13 @@ const Type *BytecodeParser::parseTypeConstant(const unsigned char *&Buf,
switch (PrimType) {
case Type::FunctionTyID: {
- unsigned Typ;
- if (read_vbr(Buf, EndBuf, Typ)) return Val;
- const Type *RetType = getType(Typ);
+ const Type *RetType = getType(read_vbr_uint(Buf, EndBuf));
- unsigned NumParams;
- if (read_vbr(Buf, EndBuf, NumParams)) return Val;
+ unsigned NumParams = read_vbr_uint(Buf, EndBuf);
std::vector<const Type*> Params;
- while (NumParams--) {
- if (read_vbr(Buf, EndBuf, Typ)) return Val;
- Params.push_back(getType(Typ));
- }
+ while (NumParams--)
+ Params.push_back(getType(read_vbr_uint(Buf, EndBuf)));
bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
if (isVarArg) Params.pop_back();
@@ -51,32 +45,27 @@ const Type *BytecodeParser::parseTypeConstant(const unsigned char *&Buf,
return FunctionType::get(RetType, Params, isVarArg);
}
case Type::ArrayTyID: {
- unsigned ElTyp;
- if (read_vbr(Buf, EndBuf, ElTyp)) return Val;
+ unsigned ElTyp = read_vbr_uint(Buf, EndBuf);
const Type *ElementType = getType(ElTyp);
- unsigned NumElements;
- if (read_vbr(Buf, EndBuf, NumElements)) return Val;
+ unsigned NumElements = read_vbr_uint(Buf, EndBuf);
BCR_TRACE(5, "Array Type Constant #" << ElTyp << " size="
<< NumElements << "\n");
return ArrayType::get(ElementType, NumElements);
}
case Type::StructTyID: {
- unsigned Typ;
std::vector<const Type*> Elements;
-
- if (read_vbr(Buf, EndBuf, Typ)) return Val;
+ unsigned Typ = read_vbr_uint(Buf, EndBuf);
while (Typ) { // List is terminated by void/0 typeid
Elements.push_back(getType(Typ));
- if (read_vbr(Buf, EndBuf, Typ)) return Val;
+ Typ = read_vbr_uint(Buf, EndBuf);
}
return StructType::get(Elements);
}
case Type::PointerTyID: {
- unsigned ElTyp;
- if (read_vbr(Buf, EndBuf, ElTyp)) return Val;
+ unsigned ElTyp = read_vbr_uint(Buf, EndBuf);
BCR_TRACE(5, "Pointer Type Constant #" << ElTyp << "\n");
return PointerType::get(getType(ElTyp));
}
@@ -154,20 +143,19 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
// We must check for a ConstantExpr before switching by type because
// a ConstantExpr can be of any type, and has no explicit value.
//
- unsigned isExprNumArgs; // 0 if not expr; numArgs if is expr
- if (read_vbr(Buf, EndBuf, isExprNumArgs)) throw Error_readvbr;
+ // 0 if not expr; numArgs if is expr
+ unsigned isExprNumArgs = read_vbr_uint(Buf, EndBuf);
+
if (isExprNumArgs) {
// FIXME: Encoding of constant exprs could be much more compact!
- unsigned Opcode;
std::vector<Constant*> ArgVec;
ArgVec.reserve(isExprNumArgs);
- if (read_vbr(Buf, EndBuf, Opcode)) throw Error_readvbr;
-
+ unsigned Opcode = read_vbr_uint(Buf, EndBuf);
+
// Read the slot number and types of each of the arguments
for (unsigned i = 0; i != isExprNumArgs; ++i) {
- unsigned ArgValSlot, ArgTypeSlot;
- if (read_vbr(Buf, EndBuf, ArgValSlot)) throw Error_readvbr;
- if (read_vbr(Buf, EndBuf, ArgTypeSlot)) throw Error_readvbr;
+ unsigned ArgValSlot = read_vbr_uint(Buf, EndBuf);
+ unsigned ArgTypeSlot = read_vbr_uint(Buf, EndBuf);
BCR_TRACE(4, "CE Arg " << i << ": Type: '" << *getType(ArgTypeSlot)
<< "' slot: " << ArgValSlot << "\n");
@@ -191,8 +179,7 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
const Type *Ty = getType(TypeID);
switch (Ty->getPrimitiveID()) {
case Type::BoolTyID: {
- unsigned Val;
- if (read_vbr(Buf, EndBuf, Val)) throw Error_readvbr;
+ unsigned Val = read_vbr_uint(Buf, EndBuf);
if (Val != 0 && Val != 1) throw std::string("Invalid boolean value read.");
return ConstantBool::get(Val == 1);
}
@@ -200,25 +187,21 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
case Type::UByteTyID: // Unsigned integer types...
case Type::UShortTyID:
case Type::UIntTyID: {
- unsigned Val;
- if (read_vbr(Buf, EndBuf, Val)) throw Error_readvbr;
+ unsigned Val = read_vbr_uint(Buf, EndBuf);
if (!ConstantUInt::isValueValidForType(Ty, Val))
throw std::string("Invalid unsigned byte/short/int read.");
return ConstantUInt::get(Ty, Val);
}
case Type::ULongTyID: {
- uint64_t Val;
- if (read_vbr(Buf, EndBuf, Val)) throw Error_readvbr;
- return ConstantUInt::get(Ty, Val);
+ return ConstantUInt::get(Ty, read_vbr_uint64(Buf, EndBuf));
}
case Type::SByteTyID: // Signed integer types...
case Type::ShortTyID:
case Type::IntTyID: {
case Type::LongTyID:
- int64_t Val;
- if (read_vbr(Buf, EndBuf, Val)) throw Error_readvbr;
+ int64_t Val = read_vbr_int64(Buf, EndBuf);
if (!ConstantSInt::isValueValidForType(Ty, Val))
throw std::string("Invalid signed byte/short/int/long read.");
return ConstantSInt::get(Ty, Val);
@@ -226,13 +209,13 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
case Type::FloatTyID: {
float F;
- if (input_data(Buf, EndBuf, &F, &F+1)) throw Error_inputdata;
+ input_data(Buf, EndBuf, &F, &F+1);
return ConstantFP::get(Ty, F);
}
case Type::DoubleTyID: {
double Val;
- if (input_data(Buf, EndBuf, &Val, &Val+1)) throw Error_inputdata;
+ input_data(Buf, EndBuf, &Val, &Val+1);
return ConstantFP::get(Ty, Val);
}
@@ -244,11 +227,10 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
unsigned NumElements = AT->getNumElements();
unsigned TypeSlot = getTypeSlot(AT->getElementType());
std::vector<Constant*> Elements;
- while (NumElements--) { // Read all of the elements of the constant.
- unsigned Slot;
- if (read_vbr(Buf, EndBuf, Slot)) throw Error_readvbr;
- Elements.push_back(getConstantValue(TypeSlot, Slot));
- }
+ Elements.reserve(NumElements);
+ while (NumElements--) // Read all of the elements of the constant.
+ Elements.push_back(getConstantValue(TypeSlot,
+ read_vbr_uint(Buf, EndBuf)));
return ConstantArray::get(AT, Elements);
}
@@ -257,19 +239,16 @@ Constant *BytecodeParser::parseConstantValue(const unsigned char *&Buf,
const StructType::ElementTypes &ET = ST->getElementTypes();
std::vector<Constant *> Elements;
- for (unsigned i = 0; i < ET.size(); ++i) {
- unsigned Slot;
- if (read_vbr(Buf, EndBuf, Slot)) throw Error_readvbr;
- Elements.push_back(getConstantValue(ET[i], Slot));
- }
+ Elements.reserve(ET.size());
+ for (unsigned i = 0; i != ET.size(); ++i)
+ Elements.push_back(getConstantValue(ET[i], read_vbr_uint(Buf, EndBuf)));
return ConstantStruct::get(ST, Elements);
}
case Type::PointerTyID: { // ConstantPointerRef value...
const PointerType *PT = cast<PointerType>(Ty);
- unsigned Slot;
- if (read_vbr(Buf, EndBuf, Slot)) throw Error_readvbr;
+ unsigned Slot = read_vbr_uint(Buf, EndBuf);
BCR_TRACE(4, "CPR: Type: '" << Ty << "' slot: " << Slot << "\n");
// Check to see if we have already read this global variable...
@@ -301,9 +280,8 @@ void BytecodeParser::ParseGlobalTypes(const unsigned char *&Buf,
void BytecodeParser::parseStringConstants(const unsigned char *&Buf,
const unsigned char *EndBuf,
unsigned NumEntries, ValueTable &Tab){
- unsigned Typ;
for (; NumEntries; --NumEntries) {
- if (read_vbr(Buf, EndBuf, Typ)) throw Error_readvbr;
+ unsigned Typ = read_vbr_uint(Buf, EndBuf);
const Type *Ty = getType(Typ);
if (!isa<ArrayType>(Ty))
throw std::string("String constant data invalid!");
@@ -315,8 +293,7 @@ void BytecodeParser::parseStringConstants(const unsigned char *&Buf,
// Read character data. The type tells us how long the string is.
char Data[ATy->getNumElements()];
- if (input_data(Buf, EndBuf, Data, Data+ATy->getNumElements()))
- throw Error_inputdata;
+ input_data(Buf, EndBuf, Data, Data+ATy->getNumElements());
std::vector<Constant*> Elements(ATy->getNumElements());
if (ATy->getElementType() == Type::SByteTy)
@@ -339,10 +316,8 @@ void BytecodeParser::ParseConstantPool(const unsigned char *&Buf,
ValueTable &Tab,
TypeValuesListTy &TypeTab) {
while (Buf < EndBuf) {
- unsigned NumEntries, Typ;
-
- if (read_vbr(Buf, EndBuf, NumEntries) ||
- read_vbr(Buf, EndBuf, Typ)) throw Error_readvbr;
+ unsigned NumEntries = read_vbr_uint(Buf, EndBuf);
+ unsigned Typ = read_vbr_uint(Buf, EndBuf);
if (Typ == Type::TypeTyID) {
BCR_TRACE(3, "Type: 'type' NumEntries: " << NumEntries << "\n");
parseTypeConstants(Buf, EndBuf, TypeTab, NumEntries);