diff options
Diffstat (limited to 'lib/Bytecode/Reader')
-rw-r--r-- | lib/Bytecode/Reader/Reader.cpp | 23 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.h | 7 |
2 files changed, 22 insertions, 8 deletions
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index 9ca641932a..85a890dbc4 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -72,12 +72,14 @@ inline void BytecodeReader::checkPastBlockEnd(const char * block_name) { /// Align the buffer position to a 32 bit boundary inline void BytecodeReader::align32() { - BufPtr Save = At; - At = (const unsigned char *)((unsigned long)(At+3) & (~3UL)); - if (At > Save) - if (Handler) Handler->handleAlignment(At - Save); - if (At > BlockEnd) - error("Ran out of data while aligning!"); + if (hasAlignment) { + BufPtr Save = At; + At = (const unsigned char *)((unsigned long)(At+3) & (~3UL)); + if (At > Save) + if (Handler) Handler->handleAlignment(At - Save); + if (At > BlockEnd) + error("Ran out of data while aligning!"); + } } /// Read a whole unsigned integer @@ -1886,6 +1888,7 @@ void BytecodeReader::ParseVersionInfo() { hasLongBlockHeaders = false; has32BitTypes = false; hasNoDependentLibraries = false; + hasAlignment = false; switch (RevisionNum) { case 0: // LLVM 1.0, 1.1 release version @@ -1937,6 +1940,14 @@ void BytecodeReader::ParseVersionInfo() { // FALL THROUGH case 3: // LLVM 1.3 release version + /// LLVM 1.3 and earlier caused alignment bytes to be written on some block + /// boundaries and at the end of some strings. In extreme cases (e.g. lots + /// of GEP references to a constant array), this can increase the file size + /// by 30% or more. In version 1.4 alignment is done away with completely. + hasAlignment = true; + + // FALL THROUGH + case 4: break; default: diff --git a/lib/Bytecode/Reader/Reader.h b/lib/Bytecode/Reader/Reader.h index ad8b2655b7..5e7a439d7d 100644 --- a/lib/Bytecode/Reader/Reader.h +++ b/lib/Bytecode/Reader/Reader.h @@ -293,8 +293,11 @@ private: /// features, for use in future versions of LLVM. bool hasNoDependentLibraries; - /// LLVM 1.2 and earlier encoded the file version as part of the module block - /// but this information may be needed to + /// LLVM 1.3 and earlier caused blocks and other fields to start on 32-bit + /// aligned boundaries. This can lead to as much as 30% bytecode size overhead + /// in various corner cases (lots of long instructions). In LLVM 1.4, + /// alignment of bytecode fields was done away with completely. + bool hasAlignment; /// CompactionTypes - If a compaction table is active in the current function, /// this is the mapping that it contains. We keep track of what resolved type |