[lld] r217285 - FileArchive cleanup

Rui Ueyama ruiu at google.com
Fri Sep 5 15:06:07 PDT 2014


Author: ruiu
Date: Fri Sep  5 17:06:07 2014
New Revision: 217285

URL: http://llvm.org/viewvc/llvm-project?rev=217285&view=rev
Log:
FileArchive cleanup

Moved code used only by isDataSymbol from find to isDataSymbol member
function. Also changed the return type of isDataSymbol because
previously "if (isDataSymbol(...))" meant "if it is *not* a data symbol"
which is opposite from what you'd expect.

Modified:
    lld/trunk/lib/ReaderWriter/FileArchive.cpp

Modified: lld/trunk/lib/ReaderWriter/FileArchive.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/FileArchive.cpp?rev=217285&r1=217284&r2=217285&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/FileArchive.cpp (original)
+++ lld/trunk/lib/ReaderWriter/FileArchive.cpp Fri Sep  5 17:06:07 2014
@@ -55,19 +55,8 @@ public:
     const char *memberStart = ci->getBuffer().data();
     if (_membersInstantiated.count(memberStart))
       return nullptr;
-
-    if (dataSymbolOnly) {
-      ErrorOr<llvm::MemoryBufferRef> buffOrErr = ci->getMemoryBufferRef();
-      if (buffOrErr.getError())
-        return nullptr;
-
-      llvm::MemoryBufferRef mb = buffOrErr.get();
-      std::unique_ptr<MemoryBuffer> buff(MemoryBuffer::getMemBuffer(
-          mb.getBuffer(), mb.getBufferIdentifier(), false));
-
-      if (isDataSymbol(std::move(buff), name))
-        return nullptr;
-    }
+    if (dataSymbolOnly && !isDataSymbol(ci, name))
+      return nullptr;
 
     std::vector<std::unique_ptr<File>> result;
     if (instantiateMember(ci, result))
@@ -156,14 +145,19 @@ protected:
     return std::error_code();
   }
 
-  // Parses the given memory buffer as an object file, and returns success error
+  // Parses the given memory buffer as an object file, and returns true
   // code if the given symbol is a data symbol. If the symbol is not a data
-  // symbol or does not exist, returns a failure.
-  std::error_code isDataSymbol(std::unique_ptr<MemoryBuffer> mb,
-                               StringRef symbol) const {
+  // symbol or does not exist, returns false.
+  bool isDataSymbol(Archive::child_iterator member, StringRef symbol) const {
+    ErrorOr<llvm::MemoryBufferRef> buf = member->getMemoryBufferRef();
+    if (buf.getError())
+      return false;
+    std::unique_ptr<MemoryBuffer> mb(MemoryBuffer::getMemBuffer(
+        buf.get().getBuffer(), buf.get().getBufferIdentifier(), false));
+
     auto objOrErr(ObjectFile::createObjectFile(mb->getMemBufferRef()));
-    if (auto ec = objOrErr.getError())
-      return ec;
+    if (objOrErr.getError())
+      return false;
     std::unique_ptr<ObjectFile> obj = std::move(objOrErr.get());
     SymbolRef::Type symtype;
     uint32_t symflags;
@@ -173,8 +167,8 @@ protected:
 
     for (symbol_iterator i = ibegin; i != iend; ++i) {
       // Get symbol name
-      if (std::error_code ec = i->getName(symbolname))
-        return ec;
+      if (i->getName(symbolname))
+        return false;
       if (symbolname != symbol)
         continue;
 
@@ -185,13 +179,13 @@ protected:
         continue;
 
       // Get Symbol Type
-      if (std::error_code ec = i->getType(symtype))
-        return ec;
+      if (i->getType(symtype))
+        return false;
 
       if (symtype == SymbolRef::ST_Data)
-        return std::error_code();
+        return true;
     }
-    return object_error::parse_failed;
+    return false;
   }
 
 private:





More information about the llvm-commits mailing list