diff --git a/lib/Bytecode/Archive/Archive.cpp b/lib/Bytecode/Archive/Archive.cpp
index d299694..1c0b205 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 @@
   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 86d2827..7a918a9 100644
--- a/lib/Bytecode/Archive/ArchiveInternals.h
+++ b/lib/Bytecode/Archive/ArchiveInternals.h
@@ -65,9 +65,18 @@
     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 63b5fe9..ea1495e 100644
--- a/lib/Bytecode/Reader/ReaderWrappers.cpp
+++ b/lib/Bytecode/Reader/ReaderWrappers.cpp
@@ -254,70 +254,3 @@
   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;
-}
