[llvm-commits] CVS: llvm/lib/Bytecode/Archive/ArchiveReader.cpp

Chris Lattner lattner at cs.uiuc.edu
Thu Sep 22 23:23:09 PDT 2005



Changes in directory llvm/lib/Bytecode/Archive:

ArchiveReader.cpp updated: 1.41 -> 1.42
---
Log message:

speed up Archive::isBytecodeArchive in the case when the archive doesn't have
an llvm-ranlib symtab.  This speeds up gccld -native on an almost empty .o file
from 1.63s to 0.18s.


---
Diffs of the changes:  (+24 -18)

 ArchiveReader.cpp |   42 ++++++++++++++++++++++++------------------
 1 files changed, 24 insertions(+), 18 deletions(-)


Index: llvm/lib/Bytecode/Archive/ArchiveReader.cpp
diff -u llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.41 llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.42
--- llvm/lib/Bytecode/Archive/ArchiveReader.cpp:1.41	Thu Jul  7 18:21:43 2005
+++ llvm/lib/Bytecode/Archive/ArchiveReader.cpp	Fri Sep 23 01:22:58 2005
@@ -504,19 +504,15 @@
   }
 }
 
-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() )
+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;
+  // 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();
@@ -524,11 +520,21 @@
   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();
+  // Scan the archive, trying to load a bytecode member.  We only load one to
+  // see if this works.
+  for (iterator I = begin(), E = end(); I != E; ++I) {
+    if (!I->isBytecode() && !I->isCompressedBytecode())
+      continue;
+    
+    std::string FullMemberName = 
+      archPath.toString() + "(" + I->getPath().toString() + ")";
+    Module* M = ParseBytecodeBuffer((const unsigned char*)I->getData(),
+                                    I->getSize(), FullMemberName);
+    if (!M)
+      return false;  // Couldn't parse bytecode, not a bytecode archive.
+    delete M;
+    return true;
+  }
+  
+  return false;
 }






More information about the llvm-commits mailing list