forked from OSchip/llvm-project
Version 1.2 now supports encoding strings as a special case, to avoid having
to emit all of those sbyte constants. llvm-svn: 10863
This commit is contained in:
parent
de36304453
commit
394afe0f90
|
@ -298,6 +298,42 @@ void BytecodeParser::ParseGlobalTypes(const unsigned char *&Buf,
|
||||||
ParseConstantPool(Buf, EndBuf, T, ModuleTypeValues);
|
ParseConstantPool(Buf, EndBuf, T, ModuleTypeValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
const Type *Ty = getType(Typ);
|
||||||
|
if (!isa<ArrayType>(Ty))
|
||||||
|
throw std::string("String constant data invalid!");
|
||||||
|
|
||||||
|
const ArrayType *ATy = cast<ArrayType>(Ty);
|
||||||
|
if (ATy->getElementType() != Type::SByteTy &&
|
||||||
|
ATy->getElementType() != Type::UByteTy)
|
||||||
|
throw std::string("String constant data invalid!");
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
|
||||||
|
std::vector<Constant*> Elements(ATy->getNumElements());
|
||||||
|
if (ATy->getElementType() == Type::SByteTy)
|
||||||
|
for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i)
|
||||||
|
Elements[i] = ConstantSInt::get(Type::SByteTy, Data[i]);
|
||||||
|
else
|
||||||
|
for (unsigned i = 0, e = ATy->getNumElements(); i != e; ++i)
|
||||||
|
Elements[i] = ConstantSInt::get(Type::UByteTy, Data[i]);
|
||||||
|
|
||||||
|
// Create the constant, inserting it as needed.
|
||||||
|
Constant *C = ConstantArray::get(ATy, Elements);
|
||||||
|
unsigned Slot = insertValue(C, Typ, Tab);
|
||||||
|
ResolveReferencesToConstant(C, Slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void BytecodeParser::ParseConstantPool(const unsigned char *&Buf,
|
void BytecodeParser::ParseConstantPool(const unsigned char *&Buf,
|
||||||
const unsigned char *EndBuf,
|
const unsigned char *EndBuf,
|
||||||
ValueTable &Tab,
|
ValueTable &Tab,
|
||||||
|
@ -310,6 +346,9 @@ void BytecodeParser::ParseConstantPool(const unsigned char *&Buf,
|
||||||
if (Typ == Type::TypeTyID) {
|
if (Typ == Type::TypeTyID) {
|
||||||
BCR_TRACE(3, "Type: 'type' NumEntries: " << NumEntries << "\n");
|
BCR_TRACE(3, "Type: 'type' NumEntries: " << NumEntries << "\n");
|
||||||
parseTypeConstants(Buf, EndBuf, TypeTab, NumEntries);
|
parseTypeConstants(Buf, EndBuf, TypeTab, NumEntries);
|
||||||
|
} else if (Typ == Type::VoidTyID) {
|
||||||
|
assert(&Tab == &ModuleValues && "Cannot read strings in functions!");
|
||||||
|
parseStringConstants(Buf, EndBuf, NumEntries, Tab);
|
||||||
} else {
|
} else {
|
||||||
BCR_TRACE(3, "Type: '" << *getType(Typ) << "' NumEntries: "
|
BCR_TRACE(3, "Type: '" << *getType(Typ) << "' NumEntries: "
|
||||||
<< NumEntries << "\n");
|
<< NumEntries << "\n");
|
||||||
|
|
|
@ -552,8 +552,8 @@ void BytecodeParser::ParseVersionInfo(const unsigned char *&Buf,
|
||||||
|
|
||||||
switch (RevisionNum) {
|
switch (RevisionNum) {
|
||||||
case 2: // LLVM pre-1.0 release: will be deleted on the next rev
|
case 2: // LLVM pre-1.0 release: will be deleted on the next rev
|
||||||
// Version #2 added information about all 4 linkage types instead of just
|
// Version #2 only supported 4 linkage types. It didn't support weak
|
||||||
// having internal and external.
|
// linkage.
|
||||||
hasExtendedLinkageSpecs = false;
|
hasExtendedLinkageSpecs = false;
|
||||||
hasOldStyleVarargs = true;
|
hasOldStyleVarargs = true;
|
||||||
hasVarArgCallPadding = true;
|
hasVarArgCallPadding = true;
|
||||||
|
@ -561,8 +561,11 @@ void BytecodeParser::ParseVersionInfo(const unsigned char *&Buf,
|
||||||
case 0: // LLVM 1.0, 1.1 release version
|
case 0: // LLVM 1.0, 1.1 release version
|
||||||
// Compared to rev #2, we added support for weak linkage, a more dense
|
// Compared to rev #2, we added support for weak linkage, a more dense
|
||||||
// encoding, and better varargs support.
|
// encoding, and better varargs support.
|
||||||
|
|
||||||
|
// Base LLVM 1.0 bytecode format.
|
||||||
break;
|
break;
|
||||||
case 1: // LLVM 1.2 release version
|
case 1: // LLVM 1.2 release version
|
||||||
|
// LLVM 1.2 added explicit support for emitting strings efficiently.
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -177,6 +177,9 @@ private:
|
||||||
TypeValuesListTy &Tab, unsigned NumEntries);
|
TypeValuesListTy &Tab, unsigned NumEntries);
|
||||||
const Type *parseTypeConstant(const unsigned char *&Buf,
|
const Type *parseTypeConstant(const unsigned char *&Buf,
|
||||||
const unsigned char *EndBuf);
|
const unsigned char *EndBuf);
|
||||||
|
void parseStringConstants(const unsigned char *&Buf,
|
||||||
|
const unsigned char *EndBuf,
|
||||||
|
unsigned NumEntries, ValueTable &Tab);
|
||||||
|
|
||||||
Value *getValue(unsigned TypeID, unsigned num, bool Create = true);
|
Value *getValue(unsigned TypeID, unsigned num, bool Create = true);
|
||||||
const Type *getType(unsigned ID);
|
const Type *getType(unsigned ID);
|
||||||
|
|
Loading…
Reference in New Issue