Changes in directory llvm/lib/Bytecode/Archive:
ArchiveReader.cpp updated: 1.50 -> 1.51 ArchiveWriter.cpp updated: 1.37 -> 1.38 --- Log message: add bitcode support --- Diffs of the changes: (+44 -50) ArchiveReader.cpp | 48 +++++++++++++++++++++++++++++++++++++++++------- ArchiveWriter.cpp | 46 +++------------------------------------------- 2 files changed, 44 insertions(+), 50 deletions(-) Index: llvm/lib/Bytecode/Archive/ArchiveReader.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.50 llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.51 --- llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.50 Wed Apr 4 01:31:04 2007 +++ llvm/lib/Bytecode/Archive/ArchiveReader.cpp Sun May 6 01:18:07 2007 @@ -13,10 +13,14 @@ #include "ArchiveInternals.h" #include "llvm/Bytecode/Reader.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/Compressor.h" +#include "llvm/Support/MemoryBuffer.h" #include <memory> using namespace llvm; +static bool Bitcode = false; + /// Read a variable-bit-rate encoded unsigned integer inline unsigned readInteger(const char*&At, const char*End){ unsigned Shift = 0; @@ -205,6 +209,7 @@ // Determine if this is a bytecode file switch (sys::IdentifyFileType(At, 4)) { + case sys::Bitcode_FileType: case sys::Bytecode_FileType: flags |= ArchiveMember::BytecodeFlag; break; @@ -350,10 +355,21 @@ if (I->isBytecode() || I->isCompressedBytecode()) { std::string FullMemberName = archPath.toString() + "(" + I->getPath().toString() + ")"; - Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), - I->getSize(), FullMemberName, - Compressor::decompressToNewBuffer, - ErrMessage); + Module *M; + + if (Bitcode) { + MemoryBuffer *Buffer = + MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); + memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize()); + + M = ParseBitcodeFile(Buffer, ErrMessage); + delete Buffer; + } else { + M = ParseBytecodeBuffer((const unsigned char*)I->getData(), + I->getSize(), FullMemberName, + Compressor::decompressToNewBuffer, + ErrMessage); + } if (!M) return true; @@ -486,7 +502,15 @@ // Now, load the bytecode module to get the ModuleProvider std::string FullMemberName = archPath.toString() + "(" + mbr->getPath().toString() + ")"; - ModuleProvider* mp = getBytecodeBufferModuleProvider( + ModuleProvider* mp; + if (Bitcode) { + MemoryBuffer *Buffer =MemoryBuffer::getNewMemBuffer(mbr->getSize(), + FullMemberName.c_str()); + memcpy((char*)Buffer->getBufferStart(), mbr->getData(), mbr->getSize()); + + mp = getBitcodeModuleProvider(Buffer, ErrMsg); + } else + mp = getBytecodeBufferModuleProvider( (const unsigned char*) mbr->getData(), mbr->getSize(), FullMemberName, Decompressor, ErrMsg, 0); if (!mp) @@ -612,8 +636,18 @@ std::string FullMemberName = archPath.toString() + "(" + I->getPath().toString() + ")"; - Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(), - I->getSize(), FullMemberName); + Module *M; + + if (Bitcode) { + MemoryBuffer *Buffer = + MemoryBuffer::getNewMemBuffer(I->getSize(), FullMemberName.c_str()); + memcpy((char*)Buffer->getBufferStart(), I->getData(), I->getSize()); + M = ParseBitcodeFile(Buffer); + delete Buffer; + } else { + M = ParseBytecodeBuffer((const unsigned char*)I->getData(), + I->getSize(), FullMemberName); + } if (!M) return false; // Couldn't parse bytecode, not a bytecode archive. delete M; Index: llvm/lib/Bytecode/Archive/ArchiveWriter.cpp diff -u llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.37 llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.38 --- llvm/lib/Bytecode/Archive/ArchiveWriter.cpp:1.37 Wed Apr 4 01:31:04 2007 +++ llvm/lib/Bytecode/Archive/ArchiveWriter.cpp Sun May 6 01:18:07 2007 @@ -13,6 +13,7 @@ #include "ArchiveInternals.h" #include "llvm/Bytecode/Reader.h" +#include "llvm/Bitcode/ReaderWriter.h" #include "llvm/Support/Compressor.h" #include "llvm/System/Signals.h" #include "llvm/System/Process.h" @@ -178,6 +179,7 @@ std::string magic; mbr->path.getMagicNumber(magic,4); switch (sys::IdentifyFileType(magic.c_str(),4)) { + case sys::Bitcode_FileType: case sys::Bytecode_FileType: flags |= ArchiveMember::BytecodeFlag; break; @@ -261,40 +263,7 @@ } } - // Determine if we actually should compress this member - bool willCompress = - (ShouldCompress && - !member.isCompressed() && - !member.isCompressedBytecode() && - !member.isLLVMSymbolTable() && - !member.isSVR4SymbolTable() && - !member.isBSD4SymbolTable()); - - // Perform the compression. Note that if the file is uncompressed bytecode - // then we turn the file into compressed bytecode rather than treating it as - // compressed data. This is necessary since it allows us to determine that the - // file contains bytecode instead of looking like a regular compressed data - // member. A compressed bytecode file has its content compressed but has a - // magic number of "llvc". This acounts for the +/-4 arithmetic in the code - // below. - int hdrSize; - if (willCompress) { - char* output = 0; - if (member.isBytecode()) { - data +=4; - fSize -= 4; - } - fSize = Compressor::compressToNewBuffer(data,fSize,output,ErrMsg); - if (fSize == 0) - return true; - data = output; - if (member.isBytecode()) - hdrSize = -fSize-4; - else - hdrSize = -fSize; - } else { - hdrSize = fSize; - } + int hdrSize = fSize; // Compute the fields of the header ArchiveMemberHeader Hdr; @@ -309,10 +278,6 @@ member.getPath().toString().length()); } - // Make sure we write the compressed bytecode magic number if we should. - if (willCompress && member.isBytecode()) - ARFile.write("llvc",4); - // Write the (possibly compressed) member's content to the file. ARFile.write(data,fSize); @@ -320,11 +285,6 @@ if ((ARFile.tellp() & 1) == 1) ARFile << ARFILE_PAD; - // Free the compressed data, if necessary - if (willCompress) { - free((void*)data); - } - // Close the mapped file if it was opened if (mFile != 0) { mFile->close(); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits