diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-06 23:17:23 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-06 23:17:23 +0000 |
commit | 17f52c5c4617e6e1853fa7ac9335b277a90be7f4 (patch) | |
tree | d0afda75ef0a06af8201397ef86292e8b4480b7b /lib/Bytecode/Reader | |
parent | 2334e6d908eccb00dcb5ef5f5a8b70a1b85525f1 (diff) |
Add support for compressed bytecode
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17535 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Reader')
-rw-r--r-- | lib/Bytecode/Reader/Reader.cpp | 43 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.h | 17 |
2 files changed, 55 insertions, 5 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index 3501d87758..bedfa7eea7 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -24,6 +24,7 @@ #include "llvm/SymbolTable.h" #include "llvm/Bytecode/Format.h" #include "llvm/Support/GetElementPtrTypeIterator.h" +#include "llvm/Support/Compressor.h" #include "llvm/ADT/StringExtras.h" #include <sstream> #include <algorithm> @@ -2152,6 +2153,22 @@ void BytecodeReader::ParseModule() { error("Function declared, but bytecode stream ended before definition"); } +static unsigned GetUncompressionBuffer(char*&buff, unsigned& sz, void* ctxt){ + BytecodeReader::BufferInfo* bi = + reinterpret_cast<BytecodeReader::BufferInfo*>(ctxt); + unsigned new_size = bi->size * 2; + if (bi->buff == 0 ) { + buff = bi->buff = (char*) malloc(new_size); + sz = new_size; + } else { + bi->buff = (char*) ::realloc(bi->buff, new_size); + buff = bi->buff + bi->size; + sz = bi->size; + } + bi->size = new_size; + return (bi->buff == 0 ? 1 : 0); +} + /// This function completely parses a bytecode buffer given by the \p Buf /// and \p Length parameters. void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, @@ -2167,9 +2184,25 @@ void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, if (Handler) Handler->handleStart(TheModule, Length); // Read and check signature... - unsigned Sig = read_uint(); - if (Sig != ('l' | ('l' << 8) | ('v' << 16) | ('m' << 24))) { - error("Invalid bytecode signature: " + utostr(Sig)); + bool compressed = + (Buf[0] == 0xEC && Buf[1] == 0xEC && Buf[2] == 0xF6 && Buf[3] == 0xED); + + if (compressed) { + bi.size = Length * 2;; + // Bytecode is compressed, have to decompress it first. + unsigned uncompressedLength = Compressor::decompress((char*)Buf+4,Length-4, + GetUncompressionBuffer, (void*) &bi); + + At = MemStart = BlockStart = Buf = (BufPtr) bi.buff; + MemEnd = BlockEnd = Buf + uncompressedLength; + + } else { + if (!(Buf[0] == 'l' && Buf[1] == 'l' && Buf[2] == 'v' && Buf[3] == 'm')) + error("Invalid bytecode signature: " + + utohexstr(Buf[0]) + utohexstr(Buf[1]) + utohexstr(Buf[2]) + + utohexstr(Buf[3])); + else + At += 4; // skip the bytes } // Tell the handler we're starting a module @@ -2215,6 +2248,8 @@ void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, freeState(); delete TheModule; TheModule = 0; + if (bi.buff != 0 ) + ::free(bi.buff); throw; } catch (...) { std::string msg("Unknown Exception Occurred"); @@ -2222,6 +2257,8 @@ void BytecodeReader::ParseBytecode(BufPtr Buf, unsigned Length, freeState(); delete TheModule; TheModule = 0; + if (bi.buff != 0 ) + ::free(bi.buff); throw msg; } } diff --git a/lib/Bytecode/Reader/Reader.h b/lib/Bytecode/Reader/Reader.h index 89d079d3f6..49d81733b8 100644 --- a/lib/Bytecode/Reader/Reader.h +++ b/lib/Bytecode/Reader/Reader.h @@ -47,10 +47,14 @@ public: BytecodeReader( BytecodeHandler* h = 0 ) { - Handler = h; + Handler = h; } - ~BytecodeReader() { freeState(); } + ~BytecodeReader() { + freeState(); + if (bi.buff != 0) + ::free(bi.buff); + } /// @} /// @name Types @@ -63,6 +67,13 @@ public: /// @brief The type used for a vector of potentially abstract types typedef std::vector<PATypeHolder> TypeListTy; + /// @brief An internal buffer object used for handling decompression + struct BufferInfo { + char* buff; + unsigned size; + BufferInfo() { buff = 0; size = 0; } + }; + /// This type provides a vector of Value* via the User class for /// storage of Values that have been constructed when reading the /// bytecode. Because of forward referencing, constant replacement @@ -235,6 +246,8 @@ protected: /// @name Data /// @{ private: + BufferInfo bi; ///< Buffer info for decompression + BufPtr MemStart; ///< Start of the memory buffer BufPtr MemEnd; ///< End of the memory buffer BufPtr BlockStart; ///< Start of current block being parsed |