From e07c15c734fcac9f6a82ae20a93b18799d6ca992 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 6 May 2007 06:18:07 +0000 Subject: add bitcode support git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36856 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Archive/ArchiveReader.cpp | 48 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) (limited to 'lib/Archive/ArchiveReader.cpp') diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp index 58b1e20ca6..209db77ee0 100644 --- a/lib/Archive/ArchiveReader.cpp +++ b/lib/Archive/ArchiveReader.cpp @@ -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 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 @@ Archive::parseMemberHeader(const char*& At, const char* End, std::string* error) // 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 @@ Archive::getAllModules(std::vector& Modules, std::string* ErrMessage) { 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 @@ Archive::findModuleDefiningSymbol(const std::string& symbol, // 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 @@ bool Archive::isBytecodeArchive() { 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; -- cgit v1.2.3-18-g5258