aboutsummaryrefslogtreecommitdiff
path: root/lib/Bytecode/Reader/ReaderWrappers.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-11-14 22:00:48 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-11-14 22:00:48 +0000
commit565ff3d4484aeb5845252ccd2cd998aa8846a39f (patch)
tree62984a95e584f885304a86d14da9c0397aa76da6 /lib/Bytecode/Reader/ReaderWrappers.cpp
parentd3539b8a5ef399114e8187a839f0b49225abc002 (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.cpp67
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