Implement an isBytecodeArchive method to determine if an archive contains
authorReid Spencer <rspencer@reidspencer.com>
Sat, 26 Feb 2005 22:00:32 +0000 (22:00 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sat, 26 Feb 2005 22:00:32 +0000 (22:00 +0000)
bytecode file members or not.
Patch Contributed By Adam Treat

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20338 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bytecode/Archive.h
lib/Archive/ArchiveReader.cpp
lib/Bytecode/Archive/ArchiveReader.cpp

index 102bb5c507aa194315708fcb32659617ddb447e1..3805d0b249fd4107ecf25c1c8e6ca329cc728bfc 100644 (file)
@@ -414,6 +414,15 @@ class Archive {
       std::set<std::string>& symbols,     ///< Symbols to be sought
       std::set<ModuleProvider*>& modules  ///< The modules matching \p symbols
     );
+    
+    /// This method determines whether the archive is a properly formed llvm 
+    /// bytecode archive.  It first makes sure the symbol table has been loaded 
+    /// and has a non-zero size.  If it does, then it is an archive.  If not, 
+    /// then it tries to load all the bytecode modules of the archive.  Finally, 
+    /// it returns whether it was successfull.
+    /// @returns true if the archive is a proper llvm bytecode archive
+    /// @brief Determine whether the archive is a proper llvm bytecode archive.
+    bool isBytecodeArchive();
 
   /// @}
   /// @name Mutators
index 56b42ffdb2e521815391c0069d63b7bdfc400cd4..7eab19d11db0291b99b57208295fc8064eff46ed 100644 (file)
@@ -503,3 +503,32 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
     }
   }
 }
+
+bool
+Archive::isBytecodeArchive()
+{
+  //Make sure the symTab has been loaded...
+  //in most cases this should have been done
+  //when the archive was constructed, but still, 
+  //this is just in case.
+  if ( !symTab.size() )
+    loadSymbolTable();
+
+  //Now that we know it's been loaded, return true
+  //if it has a size  
+  if ( symTab.size() ) return true;
+
+  //We still can't be sure it isn't a bytecode archive
+  loadArchive();
+
+  std::vector<Module *> Modules;
+  std::string ErrorMessage;
+
+  //If getAllModules gives an error then this isn't a proper
+  //bytecode archive
+  if ( getAllModules( Modules, &ErrorMessage ) ) return false;
+
+  //Finally, if we find any bytecode modules then this is a proper
+  //bytecode archive
+  return Modules.size();
+}
index 56b42ffdb2e521815391c0069d63b7bdfc400cd4..7eab19d11db0291b99b57208295fc8064eff46ed 100644 (file)
@@ -503,3 +503,32 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
     }
   }
 }
+
+bool
+Archive::isBytecodeArchive()
+{
+  //Make sure the symTab has been loaded...
+  //in most cases this should have been done
+  //when the archive was constructed, but still, 
+  //this is just in case.
+  if ( !symTab.size() )
+    loadSymbolTable();
+
+  //Now that we know it's been loaded, return true
+  //if it has a size  
+  if ( symTab.size() ) return true;
+
+  //We still can't be sure it isn't a bytecode archive
+  loadArchive();
+
+  std::vector<Module *> Modules;
+  std::string ErrorMessage;
+
+  //If getAllModules gives an error then this isn't a proper
+  //bytecode archive
+  if ( getAllModules( Modules, &ErrorMessage ) ) return false;
+
+  //Finally, if we find any bytecode modules then this is a proper
+  //bytecode archive
+  return Modules.size();
+}