Skip to content

Commit

Permalink
[lldb] Simplify ObjectFile::FindPlugin (NFC)
Browse files Browse the repository at this point in the history
Use early return to reduce the levels of indentation. Extract logic to
find object in container into helper function.
  • Loading branch information
JDevlieghere committed Dec 23, 2020
1 parent 74b3ace commit d97e9f1
Showing 1 changed file with 104 additions and 124 deletions.
228 changes: 104 additions & 124 deletions lldb/source/Symbol/ObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit d97e9f1

Please sign in to comment.