diff options
author | Chris Lattner <sabre@nondot.org> | 2007-02-07 23:53:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-02-07 23:53:17 +0000 |
commit | f36c7b860de5cae1ffc817fce430210e942a0bf7 (patch) | |
tree | 54e6e949ae1bab5397a3060cbc674a448847bf2d | |
parent | 7cf7c2b703e648cdf1184d406bd53a65050be212 (diff) |
move archive-specific stuff out of bcreader into archive library.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34022 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Bytecode/Reader.h | 30 | ||||
-rw-r--r-- | lib/Archive/Archive.cpp | 70 | ||||
-rw-r--r-- | lib/Archive/ArchiveInternals.h | 13 | ||||
-rw-r--r-- | lib/Bytecode/Archive/Archive.cpp | 70 | ||||
-rw-r--r-- | lib/Bytecode/Archive/ArchiveInternals.h | 13 | ||||
-rw-r--r-- | lib/Bytecode/Reader/ReaderWrappers.cpp | 67 |
6 files changed, 160 insertions, 103 deletions
diff --git a/include/llvm/Bytecode/Reader.h b/include/llvm/Bytecode/Reader.h index e33e3101d4..f4c575bf16 100644 --- a/include/llvm/Bytecode/Reader.h +++ b/include/llvm/Bytecode/Reader.h @@ -81,36 +81,6 @@ Module* ParseBytecodeBuffer( std::string *ErrMsg = 0 ///< Optional place to return an error message ); - -/// This function will read only the necessary parts of a bytecode file in order -/// to obtain a list of externally visible global symbols that the bytecode -/// module defines. This is used for archiving and linking when only the list -/// of symbols the module defines is needed. -/// @returns true on error, false otherwise -/// @brief Get a bytecode file's externally visibile defined global symbols. -bool GetBytecodeSymbols( - const sys::Path& fileName, ///< Filename to read bytecode from - std::vector<std::string>& syms, ///< Vector to return symbols in - BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, - std::string* ErrMsg = 0 ///< Optional error message holder -); - -/// This function will read only the necessary parts of a bytecode buffer in -/// order to obtain a list of externally visible global symbols that the -/// bytecode module defines. This is used for archiving and linking when only -/// the list of symbols the module defines is needed and the bytecode is -/// already in memory. -/// @returns the ModuleProvider on success, 0 if the bytecode can't be parsed -/// @brief Get a bytecode file's externally visibile defined global symbols. -ModuleProvider* GetBytecodeSymbols( - const unsigned char*Buffer, ///< The buffer to be parsed - unsigned Length, ///< The length of \p Buffer - const std::string& ModuleID, ///< An identifier for the module - std::vector<std::string>& symbols, ///< The symbols defined in the module - BCDecompressor_t *BCDC = Compressor::decompressToNewBuffer, - std::string* ErrMsg = 0 ///< Optional error message holder -); - } // End llvm namespace #endif diff --git a/lib/Archive/Archive.cpp b/lib/Archive/Archive.cpp index d299694383..1c0b205e9e 100644 --- a/lib/Archive/Archive.cpp +++ b/lib/Archive/Archive.cpp @@ -14,8 +14,9 @@ #include "ArchiveInternals.h" #include "llvm/ModuleProvider.h" +#include "llvm/Module.h" +#include "llvm/Bytecode/Reader.h" #include "llvm/System/Process.h" - using namespace llvm; // getMemberSize - compute the actual physical size of the file member as seen @@ -190,3 +191,70 @@ Archive::~Archive() { cleanUpMemory(); } + + +static void getSymbols(Module*M, std::vector<std::string>& symbols) { + // Loop over global variables + for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) + if (!GI->isDeclaration() && !GI->hasInternalLinkage()) + if (!GI->getName().empty()) + symbols.push_back(GI->getName()); + + // Loop over functions. + for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) + if (!FI->isDeclaration() && !FI->hasInternalLinkage()) + if (!FI->getName().empty()) + symbols.push_back(FI->getName()); +} + +// Get just the externally visible defined symbols from the bytecode +bool llvm::GetBytecodeSymbols(const sys::Path& fName, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); + if (!MP) + return true; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return true; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. + delete MP; + return true; +} + +ModuleProvider* +llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, + const std::string& ModuleID, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + // Get the module provider + ModuleProvider* MP = + getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); + if (!MP) + return 0; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return 0; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. Note that ModuleProvider will delete the + // Module when it is deleted. Also note that its the caller's responsibility + // to delete the ModuleProvider. + return MP; +} diff --git a/lib/Archive/ArchiveInternals.h b/lib/Archive/ArchiveInternals.h index 86d2827009..7a918a9653 100644 --- a/lib/Archive/ArchiveInternals.h +++ b/lib/Archive/ArchiveInternals.h @@ -65,9 +65,18 @@ namespace llvm { bool checkSignature() { return 0 == memcmp(fmag, ARFILE_MEMBER_MAGIC,2); } - }; - + + // Get just the externally visible defined symbols from the bytecode + bool GetBytecodeSymbols(const sys::Path& fName, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg); + + ModuleProvider* GetBytecodeSymbols(const unsigned char*Buffer,unsigned Length, + const std::string& ModuleID, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg); } #endif diff --git a/lib/Bytecode/Archive/Archive.cpp b/lib/Bytecode/Archive/Archive.cpp index d299694383..1c0b205e9e 100644 --- a/lib/Bytecode/Archive/Archive.cpp +++ b/lib/Bytecode/Archive/Archive.cpp @@ -14,8 +14,9 @@ #include "ArchiveInternals.h" #include "llvm/ModuleProvider.h" +#include "llvm/Module.h" +#include "llvm/Bytecode/Reader.h" #include "llvm/System/Process.h" - using namespace llvm; // getMemberSize - compute the actual physical size of the file member as seen @@ -190,3 +191,70 @@ Archive::~Archive() { cleanUpMemory(); } + + +static void getSymbols(Module*M, std::vector<std::string>& symbols) { + // Loop over global variables + for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) + if (!GI->isDeclaration() && !GI->hasInternalLinkage()) + if (!GI->getName().empty()) + symbols.push_back(GI->getName()); + + // Loop over functions. + for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) + if (!FI->isDeclaration() && !FI->hasInternalLinkage()) + if (!FI->getName().empty()) + symbols.push_back(FI->getName()); +} + +// Get just the externally visible defined symbols from the bytecode +bool llvm::GetBytecodeSymbols(const sys::Path& fName, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); + if (!MP) + return true; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return true; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. + delete MP; + return true; +} + +ModuleProvider* +llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, + const std::string& ModuleID, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg) { + // Get the module provider + ModuleProvider* MP = + getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); + if (!MP) + return 0; + + // Get the module from the provider + Module* M = MP->materializeModule(); + if (M == 0) { + delete MP; + return 0; + } + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module. Note that ModuleProvider will delete the + // Module when it is deleted. Also note that its the caller's responsibility + // to delete the ModuleProvider. + return MP; +} diff --git a/lib/Bytecode/Archive/ArchiveInternals.h b/lib/Bytecode/Archive/ArchiveInternals.h index 86d2827009..7a918a9653 100644 --- a/lib/Bytecode/Archive/ArchiveInternals.h +++ b/lib/Bytecode/Archive/ArchiveInternals.h @@ -65,9 +65,18 @@ namespace llvm { bool checkSignature() { return 0 == memcmp(fmag, ARFILE_MEMBER_MAGIC,2); } - }; - + + // Get just the externally visible defined symbols from the bytecode + bool GetBytecodeSymbols(const sys::Path& fName, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg); + + ModuleProvider* GetBytecodeSymbols(const unsigned char*Buffer,unsigned Length, + const std::string& ModuleID, + std::vector<std::string>& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg); } #endif diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp index 63b5fe9b67..ea1495ecc5 100644 --- a/lib/Bytecode/Reader/ReaderWrappers.cpp +++ b/lib/Bytecode/Reader/ReaderWrappers.cpp @@ -254,70 +254,3 @@ Module *llvm::ParseBytecodeFile(const std::string &Filename, delete MP; return M; } - - -static void getSymbols(Module*M, std::vector<std::string>& symbols) { - // Loop over global variables - for (Module::global_iterator GI = M->global_begin(), GE=M->global_end(); GI != GE; ++GI) - if (!GI->isDeclaration() && !GI->hasInternalLinkage()) - if (!GI->getName().empty()) - symbols.push_back(GI->getName()); - - // Loop over functions. - for (Module::iterator FI = M->begin(), FE = M->end(); FI != FE; ++FI) - if (!FI->isDeclaration() && !FI->hasInternalLinkage()) - if (!FI->getName().empty()) - symbols.push_back(FI->getName()); -} - -// Get just the externally visible defined symbols from the bytecode -bool llvm::GetBytecodeSymbols(const sys::Path& fName, - std::vector<std::string>& symbols, - BCDecompressor_t *BCDC, - std::string* ErrMsg) { - ModuleProvider *MP = getBytecodeModuleProvider(fName.toString(), BCDC,ErrMsg); - if (!MP) - return true; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; - return true; - } - - // Get the symbols - getSymbols(M, symbols); - - // Done with the module. - delete MP; - return true; -} - -ModuleProvider* -llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, - const std::string& ModuleID, - std::vector<std::string>& symbols, - BCDecompressor_t *BCDC, - std::string* ErrMsg) { - // Get the module provider - ModuleProvider* MP = - getBytecodeBufferModuleProvider(Buffer, Length, ModuleID, BCDC, ErrMsg, 0); - if (!MP) - return 0; - - // Get the module from the provider - Module* M = MP->materializeModule(); - if (M == 0) { - delete MP; - return 0; - } - - // Get the symbols - getSymbols(M, symbols); - - // Done with the module. Note that ModuleProvider will delete the - // Module when it is deleted. Also note that its the caller's responsibility - // to delete the ModuleProvider. - return MP; -} |