From 85a0f87636c7107e5ebb34f57fb3444dc27ff52d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 14 Jan 2004 23:35:21 +0000 Subject: [PATCH] Version 1.2 now supports encoding strings as a special case, to avoid having to emit all of those sbyte constants. llvm-svn: 10863 --- lib/Bytecode/Reader/ConstantReader.cpp | 39 ++++++++++++++++++++++++++ lib/Bytecode/Reader/Reader.cpp | 7 +++-- lib/Bytecode/Reader/ReaderInternals.h | 3 ++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/Bytecode/Reader/ConstantReader.cpp b/lib/Bytecode/Reader/ConstantReader.cpp index 660566b2664..5fb62dae20c 100644 --- a/lib/Bytecode/Reader/ConstantReader.cpp +++ b/lib/Bytecode/Reader/ConstantReader.cpp @@ -298,6 +298,42 @@ void BytecodeParser::ParseGlobalTypes(const unsigned char *&Buf, 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(Ty)) + throw std::string("String constant data invalid!"); + + const ArrayType *ATy = cast(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 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, const unsigned char *EndBuf, ValueTable &Tab, @@ -310,6 +346,9 @@ void BytecodeParser::ParseConstantPool(const unsigned char *&Buf, if (Typ == Type::TypeTyID) { BCR_TRACE(3, "Type: 'type' NumEntries: " << NumEntries << "\n"); parseTypeConstants(Buf, EndBuf, TypeTab, NumEntries); + } else if (Typ == Type::VoidTyID) { + assert(&Tab == &ModuleValues && "Cannot read strings in functions!"); + parseStringConstants(Buf, EndBuf, NumEntries, Tab); } else { BCR_TRACE(3, "Type: '" << *getType(Typ) << "' NumEntries: " << NumEntries << "\n"); diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index a0b40be6e39..7a6fa875114 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -552,8 +552,8 @@ void BytecodeParser::ParseVersionInfo(const unsigned char *&Buf, switch (RevisionNum) { 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 - // having internal and external. + // Version #2 only supported 4 linkage types. It didn't support weak + // linkage. hasExtendedLinkageSpecs = false; hasOldStyleVarargs = true; hasVarArgCallPadding = true; @@ -561,8 +561,11 @@ void BytecodeParser::ParseVersionInfo(const unsigned char *&Buf, case 0: // LLVM 1.0, 1.1 release version // Compared to rev #2, we added support for weak linkage, a more dense // encoding, and better varargs support. + + // Base LLVM 1.0 bytecode format. break; case 1: // LLVM 1.2 release version + // LLVM 1.2 added explicit support for emitting strings efficiently. break; default: diff --git a/lib/Bytecode/Reader/ReaderInternals.h b/lib/Bytecode/Reader/ReaderInternals.h index b1d9c605f78..54a38e457b4 100644 --- a/lib/Bytecode/Reader/ReaderInternals.h +++ b/lib/Bytecode/Reader/ReaderInternals.h @@ -177,6 +177,9 @@ private: TypeValuesListTy &Tab, unsigned NumEntries); const Type *parseTypeConstant(const unsigned char *&Buf, 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); const Type *getType(unsigned ID);