[llvm-branch-commits] [lldb] d97e9f1 - [lldb] Simplify ObjectFile::FindPlugin (NFC)
Jonas Devlieghere via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Dec 23 14:11:25 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 llvm-branch-commits
mailing list