From b5491378b16c8f0fc9fa001dffc249acec9037fc Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 23 Apr 2007 18:58:34 +0000 Subject: [PATCH] implement reading of abbrevs, and writing of abbreviated global varrs. llvm-svn: 36367 --- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 9 ++++++--- llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 10 +++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index f464e33f6a03..ba4ba8db80ee 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -94,7 +94,8 @@ bool BitcodeReader::ParseTypeTable(BitstreamReader &Stream) { } if (Code == bitc::DEFINE_ABBREV) { - assert(0 && "Abbrevs not implemented yet!"); + Stream.ReadAbbrevRecord(); + continue; } // Read a record. @@ -231,7 +232,8 @@ bool BitcodeReader::ParseTypeSymbolTable(BitstreamReader &Stream) { } if (Code == bitc::DEFINE_ABBREV) { - assert(0 && "Abbrevs not implemented yet!"); + Stream.ReadAbbrevRecord(); + continue; } // Read a record. @@ -294,7 +296,8 @@ bool BitcodeReader::ParseModule(BitstreamReader &Stream, } if (Code == bitc::DEFINE_ABBREV) { - assert(0 && "Abbrevs not implemented yet!"); + Stream.ReadAbbrevRecord(); + continue; } // Read a record. diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index d78ea29b5646..633036e5a923 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -204,9 +204,11 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE, // compute the maximum alignment value. std::map SectionMap; unsigned MaxAlignment = 0; + unsigned MaxGlobalType = 0; for (Module::const_global_iterator GV = M->global_begin(),E = M->global_end(); GV != E; ++GV) { MaxAlignment = std::max(MaxAlignment, GV->getAlignment()); + MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV->getType())); if (!GV->hasSection()) continue; // Give section names unique ID's. @@ -229,10 +231,12 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE, // Emit abbrev for globals, now that we know # sections and max alignment. unsigned SimpleGVarAbbrev = 0; - if (!M->global_empty() && 0) { + if (!M->global_empty()) { // Add an abbrev for common globals with no visibility or thread localness. BitCodeAbbrev *Abbv = new BitCodeAbbrev(); Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR)); + Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, + Log2_32_Ceil(MaxGlobalType+1))); Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 1)); // Constant. Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer. Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, 3)); // Linkage. @@ -241,7 +245,7 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE, else { unsigned MaxEncAlignment = Log2_32(MaxAlignment)+1; Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::FixedWidth, - Log2_32_Ceil(MaxEncAlignment))); + Log2_32_Ceil(MaxEncAlignment+1))); } if (SectionMap.empty()) // Section. Abbv->Add(BitCodeAbbrevOp(0)); @@ -300,7 +304,7 @@ static void WriteModuleInfo(const Module *M, const ValueEnumerator &VE, /// WriteModule - Emit the specified module to the bitstream. static void WriteModule(const Module *M, BitstreamWriter &Stream) { - Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 2); + Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3); // Emit the version number if it is non-zero. if (CurVersion) {