[Lldb-commits] [lldb] d97e9f1 - [lldb] Simplify ObjectFile::FindPlugin (NFC)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Wed Dec 23 14:06:49 PST 2020


Author: Jonas Devlieghere
Date: 2020-12-23T14:06:40-08:00
New Revision: d97e9f1a3d8510de036f8fec68cfd5330c9f050c

URL: https://github.com/llvm/llvm-project/commit/d97e9f1a3d8510de036f8fec68cfd5330c9f050c
DIFF: https://github.com/llvm/llvm-project/commit/d97e9f1a3d8510de036f8fec68cfd5330c9f050c.diff

LOG: [lldb] Simplify ObjectFile::FindPlugin (NFC)

Use early return to reduce the levels of indentation. Extract logic to
find object in container into helper function.

Added: 
    

Modified: 
    lldb/source/Symbol/ObjectFile.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/source/Symbol/ObjectFile.cpp b/lldb/source/Symbol/ObjectFile.cpp
index ffe57121391f..f5dcbc5467f7 100644
--- a/lldb/source/Symbol/ObjectFile.cpp
+++ b/lldb/source/Symbol/ObjectFile.cpp
@@ -28,141 +28,121 @@ using namespace lldb_private;
 
 char ObjectFile::ID;
 
+static ObjectFileSP
+CreateObjectFromContainer(const lldb::ModuleSP &module_sp, const FileSpec *file,
+                          lldb::offset_t file_offset, lldb::offset_t file_size,
+                          DataBufferSP &data_sp, lldb::offset_t &data_offset) {
+  ObjectContainerCreateInstance callback;
+  for (uint32_t idx = 0;
+       (callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(
+            idx)) != nullptr;
+       ++idx) {
+    std::unique_ptr<ObjectContainer> object_container_up(callback(
+        module_sp, data_sp, data_offset, file, file_offset, file_size));
+    if (object_container_up)
+      return object_container_up->GetObjectFile(file);
+  }
+  return {};
+}
+
 ObjectFileSP
 ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp, const FileSpec *file,
                        lldb::offset_t file_offset, lldb::offset_t file_size,
                        DataBufferSP &data_sp, lldb::offset_t &data_offset) {
-  ObjectFileSP object_file_sp;
-
-  if (module_sp) {
-    LLDB_SCOPED_TIMERF(
-        "ObjectFile::FindPlugin (module = %s, file = %p, file_offset = "
-        "0x%8.8" PRIx64 ", file_size = 0x%8.8" PRIx64 ")",
-        module_sp->GetFileSpec().GetPath().c_str(),
-        static_cast<const void *>(file), static_cast<uint64_t>(file_offset),
-        static_cast<uint64_t>(file_size));
-    if (file) {
-      FileSpec archive_file;
-      ObjectContainerCreateInstance create_object_container_callback;
-
-      if (!data_sp) {
-        const bool file_exists = FileSystem::Instance().Exists(*file);
-        // We have an object name which most likely means we have a .o file in
-        // a static archive (.a file). Try and see if we have a cached archive
-        // first without reading any data first
-        if (file_exists && module_sp->GetObjectName()) {
-          for (uint32_t idx = 0;
-               (create_object_container_callback =
-                    PluginManager::GetObjectContainerCreateCallbackAtIndex(
-                        idx)) != nullptr;
-               ++idx) {
-            std::unique_ptr<ObjectContainer> object_container_up(
-                create_object_container_callback(module_sp, data_sp,
-                                                 data_offset, file, file_offset,
-                                                 file_size));
-
-            if (object_container_up)
-              object_file_sp = object_container_up->GetObjectFile(file);
-
-            if (object_file_sp.get())
-              return object_file_sp;
-          }
-        }
-        // Ok, we didn't find any containers that have a named object, now lets
-        // read the first 512 bytes from the file so the object file and object
-        // container plug-ins can use these bytes to see if they can parse this
-        // file.
-        if (file_size > 0) {
-          data_sp = FileSystem::Instance().CreateDataBuffer(file->GetPath(),
-                                                            512, file_offset);
-          data_offset = 0;
-        }
-      }
+  LLDB_SCOPED_TIMERF(
+      "ObjectFile::FindPlugin (module = %s, file = %p, file_offset = "
+      "0x%8.8" PRIx64 ", file_size = 0x%8.8" PRIx64 ")",
+      module_sp->GetFileSpec().GetPath().c_str(),
+      static_cast<const void *>(file), static_cast<uint64_t>(file_offset),
+      static_cast<uint64_t>(file_size));
+
+  if (!module_sp)
+    return {};
+
+  if (!file)
+    return {};
+
+  if (!data_sp) {
+    const bool file_exists = FileSystem::Instance().Exists(*file);
+    // We have an object name which most likely means we have a .o file in
+    // a static archive (.a file). Try and see if we have a cached archive
+    // first without reading any data first
+    if (file_exists && module_sp->GetObjectName()) {
+      ObjectFileSP object_file_sp = CreateObjectFromContainer(
+          module_sp, file, file_offset, file_size, data_sp, data_offset);
+      if (object_file_sp)
+        return object_file_sp;
+    }
+    // Ok, we didn't find any containers that have a named object, now lets
+    // read the first 512 bytes from the file so the object file and object
+    // container plug-ins can use these bytes to see if they can parse this
+    // file.
+    if (file_size > 0) {
+      data_sp = FileSystem::Instance().CreateDataBuffer(file->GetPath(), 512,
+                                                        file_offset);
+      data_offset = 0;
+    }
+  }
 
-      if (!data_sp || data_sp->GetByteSize() == 0) {
-        // Check for archive file with format "/path/to/archive.a(object.o)"
-        llvm::SmallString<256> path_with_object;
-        module_sp->GetFileSpec().GetPath(path_with_object);
-
-        ConstString archive_object;
-        const bool must_exist = true;
-        if (ObjectFile::SplitArchivePathWithObject(
-                path_with_object, archive_file, archive_object, must_exist)) {
-          file_size = FileSystem::Instance().GetByteSize(archive_file);
-          if (file_size > 0) {
-            file = &archive_file;
-            module_sp->SetFileSpecAndObjectName(archive_file, archive_object);
-            // Check if this is a object container by iterating through all
-            // object container plugin instances and then trying to get an
-            // object file from the container plugins since we had a name.
-            // Also, don't read
-            // ANY data in case there is data cached in the container plug-ins
-            // (like BSD archives caching the contained objects within an
-            // file).
-            for (uint32_t idx = 0;
-                 (create_object_container_callback =
-                      PluginManager::GetObjectContainerCreateCallbackAtIndex(
-                          idx)) != nullptr;
-                 ++idx) {
-              std::unique_ptr<ObjectContainer> object_container_up(
-                  create_object_container_callback(module_sp, data_sp,
-                                                   data_offset, file,
-                                                   file_offset, file_size));
-
-              if (object_container_up)
-                object_file_sp = object_container_up->GetObjectFile(file);
-
-              if (object_file_sp.get())
-                return object_file_sp;
-            }
-            // We failed to find any cached object files in the container plug-
-            // ins, so lets read the first 512 bytes and try again below...
-            data_sp = FileSystem::Instance().CreateDataBuffer(
-                archive_file.GetPath(), 512, file_offset);
-          }
-        }
+  if (!data_sp || data_sp->GetByteSize() == 0) {
+    // Check for archive file with format "/path/to/archive.a(object.o)"
+    llvm::SmallString<256> path_with_object;
+    module_sp->GetFileSpec().GetPath(path_with_object);
+
+    FileSpec archive_file;
+    ConstString archive_object;
+    const bool must_exist = true;
+    if (ObjectFile::SplitArchivePathWithObject(path_with_object, archive_file,
+                                               archive_object, must_exist)) {
+      file_size = FileSystem::Instance().GetByteSize(archive_file);
+      if (file_size > 0) {
+        file = &archive_file;
+        module_sp->SetFileSpecAndObjectName(archive_file, archive_object);
+        // Check if this is a object container by iterating through all
+        // object container plugin instances and then trying to get an
+        // object file from the container plugins since we had a name.
+        // Also, don't read
+        // ANY data in case there is data cached in the container plug-ins
+        // (like BSD archives caching the contained objects within an
+        // file).
+        ObjectFileSP object_file_sp = CreateObjectFromContainer(
+            module_sp, file, file_offset, file_size, data_sp, data_offset);
+        if (object_file_sp)
+          return object_file_sp;
+        // We failed to find any cached object files in the container plug-
+        // ins, so lets read the first 512 bytes and try again below...
+        data_sp = FileSystem::Instance().CreateDataBuffer(
+            archive_file.GetPath(), 512, file_offset);
       }
+    }
+  }
 
-      if (data_sp && data_sp->GetByteSize() > 0) {
-        // Check if this is a normal object file by iterating through all
-        // object file plugin instances.
-        ObjectFileCreateInstance create_object_file_callback;
-        for (uint32_t idx = 0;
-             (create_object_file_callback =
-                  PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) !=
-             nullptr;
-             ++idx) {
-          object_file_sp.reset(create_object_file_callback(
-              module_sp, data_sp, data_offset, file, file_offset, file_size));
-          if (object_file_sp.get())
-            return object_file_sp;
-        }
-
-        // Check if this is a object container by iterating through all object
-        // container plugin instances and then trying to get an object file
-        // from the container.
-        for (uint32_t idx = 0;
-             (create_object_container_callback =
-                  PluginManager::GetObjectContainerCreateCallbackAtIndex(
-                      idx)) != nullptr;
-             ++idx) {
-          std::unique_ptr<ObjectContainer> object_container_up(
-              create_object_container_callback(module_sp, data_sp, data_offset,
-                                               file, file_offset, file_size));
-
-          if (object_container_up)
-            object_file_sp = object_container_up->GetObjectFile(file);
-
-          if (object_file_sp.get())
-            return object_file_sp;
-        }
-      }
+  if (data_sp && data_sp->GetByteSize() > 0) {
+    // Check if this is a normal object file by iterating through all
+    // object file plugin instances.
+    ObjectFileCreateInstance callback;
+    for (uint32_t idx = 0;
+         (callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) !=
+         nullptr;
+         ++idx) {
+      ObjectFileSP object_file_sp(callback(module_sp, data_sp, data_offset,
+                                           file, file_offset, file_size));
+      if (object_file_sp.get())
+        return object_file_sp;
     }
+
+    // Check if this is a object container by iterating through all object
+    // container plugin instances and then trying to get an object file
+    // from the container.
+    ObjectFileSP object_file_sp = CreateObjectFromContainer(
+        module_sp, file, file_offset, file_size, data_sp, data_offset);
+    if (object_file_sp)
+      return object_file_sp;
   }
+
   // We didn't find it, so clear our shared pointer in case it contains
   // anything and return an empty shared pointer
-  object_file_sp.reset();
-  return object_file_sp;
+  return {};
 }
 
 ObjectFileSP ObjectFile::FindPlugin(const lldb::ModuleSP &module_sp,


        


More information about the lldb-commits mailing list