push bytecode decompressor out through APIs. Now the bytecode reader
api's look like this:
ModuleProvider *getBytecodeModuleProvider(
const std::string &Filename, ///< Name of file to be read
BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer,
std::string* ErrMsg = 0, ///< Optional error message holder
BytecodeHandler* H = 0 ///< Optional handler for reader events
);
This is ugly, but allows a client to say:
getBytecodeModuleProvider("foo", 0);
If they do this, there is no dependency on the compression libraries, saving
codesize.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34012 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Archive/Archive.cpp b/lib/Archive/Archive.cpp
index 3bbc49d..d299694 100644
--- a/lib/Archive/Archive.cpp
+++ b/lib/Archive/Archive.cpp
@@ -138,10 +138,10 @@
// Archive constructor - this is the only constructor that gets used for the
// Archive class. Everything else (default,copy) is deprecated. This just
// initializes and maps the file into memory, if requested.
-Archive::Archive(const sys::Path& filename)
+Archive::Archive(const sys::Path& filename, BCDecompressor_t *BCDC)
: archPath(filename), members(), mapfile(0), base(0), symTab(), strtab(),
- symTabSize(0), firstFileOffset(0), modules(), foreignST(0)
-{
+ symTabSize(0), firstFileOffset(0), modules(), foreignST(0),
+ Decompressor(BCDC) {
}
bool
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp
index 82ff9ed..67b6549 100644
--- a/lib/Archive/ArchiveReader.cpp
+++ b/lib/Archive/ArchiveReader.cpp
@@ -13,8 +13,8 @@
#include "ArchiveInternals.h"
#include "llvm/Bytecode/Reader.h"
+#include "llvm/Support/Compressor.h"
#include <memory>
-
using namespace llvm;
/// Read a variable-bit-rate encoded unsigned integer
@@ -351,7 +351,9 @@
std::string FullMemberName = archPath.toString() +
"(" + I->getPath().toString() + ")";
Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(),
- I->getSize(), FullMemberName, ErrMessage);
+ I->getSize(), FullMemberName,
+ Compressor::decompressToNewBuffer,
+ ErrMessage);
if (!M)
return true;
@@ -486,7 +488,7 @@
mbr->getPath().toString() + ")";
ModuleProvider* mp = getBytecodeBufferModuleProvider(
(const unsigned char*) mbr->getData(), mbr->getSize(),
- FullMemberName, ErrMsg, 0);
+ FullMemberName, Decompressor, ErrMsg, 0);
if (!mp)
return 0;
@@ -500,8 +502,7 @@
bool
Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
std::set<ModuleProvider*>& result,
- std::string* error)
-{
+ std::string* error) {
if (!mapfile || !base) {
if (error)
*error = "Empty archive invalid for finding modules defining symbols";
@@ -533,8 +534,10 @@
std::vector<std::string> symbols;
std::string FullMemberName = archPath.toString() + "(" +
mbr->getPath().toString() + ")";
- ModuleProvider* MP = GetBytecodeSymbols((const unsigned char*)At,
- mbr->getSize(), FullMemberName, symbols, error);
+ ModuleProvider* MP =
+ GetBytecodeSymbols((const unsigned char*)At, mbr->getSize(),
+ FullMemberName, symbols,
+ Compressor::decompressToNewBuffer, error);
if (MP) {
// Insert the module's symbols into the symbol table
diff --git a/lib/Archive/ArchiveWriter.cpp b/lib/Archive/ArchiveWriter.cpp
index 9f4e797..ff8c5f0 100644
--- a/lib/Archive/ArchiveWriter.cpp
+++ b/lib/Archive/ArchiveWriter.cpp
@@ -225,8 +225,10 @@
std::string FullMemberName = archPath.toString() + "(" +
member.getPath().toString()
+ ")";
- ModuleProvider* MP = GetBytecodeSymbols(
- (const unsigned char*)data,fSize,FullMemberName, symbols, ErrMsg);
+ ModuleProvider* MP =
+ GetBytecodeSymbols((const unsigned char*)data,fSize,
+ FullMemberName, symbols,
+ Compressor::decompressToNewBuffer, ErrMsg);
// If the bytecode parsed successfully
if ( MP ) {