diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-14 22:00:48 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-14 22:00:48 +0000 |
commit | 565ff3d4484aeb5845252ccd2cd998aa8846a39f (patch) | |
tree | 62984a95e584f885304a86d14da9c0397aa76da6 /lib/Bytecode/Reader/ReaderWrappers.cpp | |
parent | d3539b8a5ef399114e8187a839f0b49225abc002 (diff) |
Add wrappers to get defined symbols from bytecode
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17770 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bytecode/Reader/ReaderWrappers.cpp')
-rw-r--r-- | lib/Bytecode/Reader/ReaderWrappers.cpp | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/lib/Bytecode/Reader/ReaderWrappers.cpp b/lib/Bytecode/Reader/ReaderWrappers.cpp index b70c3ef4a3..de2fd030e8 100644 --- a/lib/Bytecode/Reader/ReaderWrappers.cpp +++ b/lib/Bytecode/Reader/ReaderWrappers.cpp @@ -346,6 +346,30 @@ bool llvm::GetBytecodeDependentLibraries(const std::string &fname, } } +namespace { +void getSymbols(Module*M, std::vector<std::string>& symbols) { + // Loop over global variables + for (Module::giterator GI = M->gbegin(), GE=M->gend(); GI != GE; ++GI) { + if (GI->hasInitializer()) { + std::string name ( GI->getName() ); + if (!name.empty()) { + symbols.push_back(name); + } + } + } + + //Loop over functions + for (Module::iterator FI = M->begin(), FE=M->end(); FI != FE; ++FI) { + if (!FI->isExternal()) { + std::string name ( FI->getName() ); + if (!name.empty()) { + symbols.push_back(name); + } + } + } +} +} + // Get just the externally visible defined symbols from the bytecode bool llvm::GetBytecodeSymbols(const sys::Path& fName, std::vector<std::string>& symbols) { @@ -355,25 +379,8 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName, // Get the module from the provider Module* M = AMP->releaseModule(); - // Loop over global variables - for (Module::giterator GI = M->gbegin(), GE=M->gend(); GI != GE; ++GI) { - if (GI->hasInitializer()) { - std::string name ( GI->getName() ); - if (!name.empty()) { - symbols.push_back(name); - } - } - } - - //Loop over functions - for (Module::iterator FI = M->begin(), FE=M->end(); FI != FE; ++FI) { - if (!FI->isExternal()) { - std::string name ( FI->getName() ); - if (!name.empty()) { - symbols.push_back(name); - } - } - } + // Get the symbols + getSymbols(M, symbols); // Done with the module delete M; @@ -384,4 +391,26 @@ bool llvm::GetBytecodeSymbols(const sys::Path& fName, } } +bool llvm::GetBytecodeSymbols(const unsigned char*Buffer, unsigned Length, + const std::string& ModuleID, + std::vector<std::string>& symbols) { + + try { + std::auto_ptr<ModuleProvider> + AMP(getBytecodeBufferModuleProvider(Buffer, Length, ModuleID)); + + // Get the module from the provider + Module* M = AMP->releaseModule(); + + // Get the symbols + getSymbols(M, symbols); + + // Done with the module + delete M; + return true; + + } catch (...) { + return false; + } +} // vim: sw=2 ai |