Add wrappers to get defined symbols from bytecode
authorReid Spencer <rspencer@reidspencer.com>
Sun, 14 Nov 2004 22:00:48 +0000 (22:00 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sun, 14 Nov 2004 22:00:48 +0000 (22:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17770 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Reader/ReaderWrappers.cpp

index b70c3ef4a335a281d66e378675de25888ae4e8f6..de2fd030e8bb9ce28d893801e30c1c9688a159c9 100644 (file)
@@ -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