From f36c7b860de5cae1ffc817fce430210e942a0bf7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 7 Feb 2007 23:53:17 +0000 Subject: 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 --- lib/Archive/Archive.cpp | 70 +++++++++++++++++++++++++++++++++++++++++- lib/Archive/ArchiveInternals.h | 13 ++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) (limited to 'lib/Archive') diff --git a/lib/Archive/Archive.cpp b/lib/Archive/Archive.cpp index d299694..1c0b205 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& 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& 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& 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 86d2827..7a918a9 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& symbols, + BCDecompressor_t *BCDC, std::string* ErrMsg); + + ModuleProvider* GetBytecodeSymbols(const unsigned char*Buffer,unsigned Length, + const std::string& ModuleID, + std::vector& symbols, + BCDecompressor_t *BCDC, + std::string* ErrMsg); } #endif -- cgit v1.1