forked from OSchip/llvm-project
[ObjectContainerBSDArchive] Simplify a few things (NFC)
Differential revision: https://reviews.llvm.org/D64661 llvm-svn: 365950
This commit is contained in:
parent
411fa4c0df
commit
69de1bbe32
|
@ -41,18 +41,18 @@ using namespace lldb;
|
|||
using namespace lldb_private;
|
||||
|
||||
ObjectContainerBSDArchive::Object::Object()
|
||||
: ar_name(), ar_date(0), ar_uid(0), ar_gid(0), ar_mode(0), ar_size(0),
|
||||
ar_file_offset(0), ar_file_size(0) {}
|
||||
: ar_name(), modification_time(0), uid(0), gid(0), mode(0), size(0),
|
||||
file_offset(0), file_size(0) {}
|
||||
|
||||
void ObjectContainerBSDArchive::Object::Clear() {
|
||||
ar_name.Clear();
|
||||
ar_date = 0;
|
||||
ar_uid = 0;
|
||||
ar_gid = 0;
|
||||
ar_mode = 0;
|
||||
ar_size = 0;
|
||||
ar_file_offset = 0;
|
||||
ar_file_size = 0;
|
||||
modification_time = 0;
|
||||
uid = 0;
|
||||
gid = 0;
|
||||
mode = 0;
|
||||
size = 0;
|
||||
file_offset = 0;
|
||||
file_size = 0;
|
||||
}
|
||||
|
||||
lldb::offset_t
|
||||
|
@ -102,19 +102,19 @@ ObjectContainerBSDArchive::Object::Extract(const DataExtractor &data,
|
|||
}
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 12), 12);
|
||||
ar_date = strtoul(str.c_str(), &err, 10);
|
||||
modification_time = strtoul(str.c_str(), &err, 10);
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 6), 6);
|
||||
ar_uid = strtoul(str.c_str(), &err, 10);
|
||||
uid = strtoul(str.c_str(), &err, 10);
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 6), 6);
|
||||
ar_gid = strtoul(str.c_str(), &err, 10);
|
||||
gid = strtoul(str.c_str(), &err, 10);
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 8), 8);
|
||||
ar_mode = strtoul(str.c_str(), &err, 8);
|
||||
mode = strtoul(str.c_str(), &err, 8);
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 10), 10);
|
||||
ar_size = strtoul(str.c_str(), &err, 10);
|
||||
size = strtoul(str.c_str(), &err, 10);
|
||||
|
||||
str.assign((const char *)data.GetData(&offset, 2), 2);
|
||||
if (str == ARFMAG) {
|
||||
|
@ -126,8 +126,8 @@ ObjectContainerBSDArchive::Object::Extract(const DataExtractor &data,
|
|||
str.assign((const char *)ar_name_ptr, ar_name_len);
|
||||
ar_name.SetCString(str.c_str());
|
||||
}
|
||||
ar_file_offset = offset;
|
||||
ar_file_size = ar_size - ar_name_len;
|
||||
file_offset = offset;
|
||||
file_size = size - ar_name_len;
|
||||
return offset;
|
||||
}
|
||||
return LLDB_INVALID_OFFSET;
|
||||
|
@ -137,8 +137,8 @@ ObjectContainerBSDArchive::Archive::Archive(const lldb_private::ArchSpec &arch,
|
|||
const llvm::sys::TimePoint<> &time,
|
||||
lldb::offset_t file_offset,
|
||||
lldb_private::DataExtractor &data)
|
||||
: m_arch(arch), m_time(time), m_file_offset(file_offset), m_objects(),
|
||||
m_data(data) {}
|
||||
: m_arch(arch), m_modification_time(time), m_file_offset(file_offset),
|
||||
m_objects(), m_data(data) {}
|
||||
|
||||
ObjectContainerBSDArchive::Archive::~Archive() {}
|
||||
|
||||
|
@ -157,7 +157,7 @@ size_t ObjectContainerBSDArchive::Archive::ParseObjects() {
|
|||
m_objects.push_back(obj);
|
||||
// Insert all of the C strings out of order for now...
|
||||
m_object_name_to_index_map.Append(obj.ar_name, obj_idx);
|
||||
offset += obj.ar_file_size;
|
||||
offset += obj.file_size;
|
||||
obj.Clear();
|
||||
} while (data.ValidOffset(offset));
|
||||
|
||||
|
@ -169,27 +169,27 @@ size_t ObjectContainerBSDArchive::Archive::ParseObjects() {
|
|||
|
||||
ObjectContainerBSDArchive::Object *
|
||||
ObjectContainerBSDArchive::Archive::FindObject(
|
||||
ConstString object_name,
|
||||
const llvm::sys::TimePoint<> &object_mod_time) {
|
||||
ConstString object_name, const llvm::sys::TimePoint<> &object_mod_time) {
|
||||
const ObjectNameToIndexMap::Entry *match =
|
||||
m_object_name_to_index_map.FindFirstValueForName(object_name);
|
||||
if (match) {
|
||||
if (object_mod_time != llvm::sys::TimePoint<>()) {
|
||||
const uint64_t object_date = llvm::sys::toTimeT(object_mod_time);
|
||||
if (m_objects[match->value].ar_date == object_date)
|
||||
return &m_objects[match->value];
|
||||
const ObjectNameToIndexMap::Entry *next_match =
|
||||
m_object_name_to_index_map.FindNextValueForName(match);
|
||||
while (next_match) {
|
||||
if (m_objects[next_match->value].ar_date == object_date)
|
||||
return &m_objects[next_match->value];
|
||||
next_match =
|
||||
m_object_name_to_index_map.FindNextValueForName(next_match);
|
||||
}
|
||||
} else {
|
||||
return &m_objects[match->value];
|
||||
}
|
||||
if (!match)
|
||||
return nullptr;
|
||||
if (object_mod_time == llvm::sys::TimePoint<>())
|
||||
return &m_objects[match->value];
|
||||
|
||||
const uint64_t object_modification_date = llvm::sys::toTimeT(object_mod_time);
|
||||
if (m_objects[match->value].modification_time == object_modification_date)
|
||||
return &m_objects[match->value];
|
||||
|
||||
const ObjectNameToIndexMap::Entry *next_match =
|
||||
m_object_name_to_index_map.FindNextValueForName(match);
|
||||
while (next_match) {
|
||||
if (m_objects[next_match->value].modification_time ==
|
||||
object_modification_date)
|
||||
return &m_objects[next_match->value];
|
||||
next_match = m_object_name_to_index_map.FindNextValueForName(next_match);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
@ -425,11 +425,10 @@ ObjectFileSP ObjectContainerBSDArchive::GetObjectFile(const FileSpec *file) {
|
|||
Object *object = m_archive_sp->FindObject(
|
||||
module_sp->GetObjectName(), module_sp->GetObjectModificationTime());
|
||||
if (object) {
|
||||
lldb::offset_t data_offset = object->ar_file_offset;
|
||||
lldb::offset_t data_offset = object->file_offset;
|
||||
return ObjectFile::FindPlugin(
|
||||
module_sp, file, m_offset + object->ar_file_offset,
|
||||
object->ar_file_size, m_archive_sp->GetData().GetSharedDataBuffer(),
|
||||
data_offset);
|
||||
module_sp, file, m_offset + object->file_offset, object->file_size,
|
||||
m_archive_sp->GetData().GetSharedDataBuffer(), data_offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -478,16 +477,15 @@ size_t ObjectContainerBSDArchive::GetModuleSpecifications(
|
|||
const Object *object = archive_sp->GetObjectAtIndex(idx);
|
||||
if (object) {
|
||||
const lldb::offset_t object_file_offset =
|
||||
file_offset + object->ar_file_offset;
|
||||
if (object->ar_file_offset < file_size &&
|
||||
file_size > object_file_offset) {
|
||||
file_offset + object->file_offset;
|
||||
if (object->file_offset < file_size && file_size > object_file_offset) {
|
||||
if (ObjectFile::GetModuleSpecifications(
|
||||
file, object_file_offset, file_size - object_file_offset,
|
||||
specs)) {
|
||||
ModuleSpec &spec =
|
||||
specs.GetModuleSpecRefAtIndex(specs.GetSize() - 1);
|
||||
llvm::sys::TimePoint<> object_mod_time(
|
||||
std::chrono::seconds(object->ar_date));
|
||||
std::chrono::seconds(object->modification_time));
|
||||
spec.GetObjectName() = object->ar_name;
|
||||
spec.SetObjectOffset(object_file_offset);
|
||||
spec.SetObjectSize(file_size - object_file_offset);
|
||||
|
|
|
@ -80,20 +80,29 @@ protected:
|
|||
|
||||
lldb::offset_t Extract(const lldb_private::DataExtractor &data,
|
||||
lldb::offset_t offset);
|
||||
/// Object name in the archive.
|
||||
lldb_private::ConstString ar_name;
|
||||
|
||||
lldb_private::ConstString ar_name; // name
|
||||
uint32_t ar_date; // modification time
|
||||
uint16_t ar_uid; // user id
|
||||
uint16_t ar_gid; // group id
|
||||
uint16_t ar_mode; // octal file permissions
|
||||
uint32_t ar_size; // size in bytes
|
||||
lldb::offset_t ar_file_offset; // file offset in bytes from the beginning of
|
||||
// the file of the object data
|
||||
lldb::offset_t ar_file_size; // length of the object data
|
||||
/// Object modification time in the archive.
|
||||
uint32_t modification_time;
|
||||
|
||||
typedef std::vector<Object> collection;
|
||||
typedef collection::iterator iterator;
|
||||
typedef collection::const_iterator const_iterator;
|
||||
/// Object user id in the archive.
|
||||
uint16_t uid;
|
||||
|
||||
/// Object group id in the archive.
|
||||
uint16_t gid;
|
||||
|
||||
/// Object octal file permissions in the archive.
|
||||
uint16_t mode;
|
||||
|
||||
/// Object size in bytes in the archive.
|
||||
uint32_t size;
|
||||
|
||||
/// File offset in bytes from the beginning of the file of the object data.
|
||||
lldb::offset_t file_offset;
|
||||
|
||||
/// Length of the object data.
|
||||
lldb::offset_t file_size;
|
||||
};
|
||||
|
||||
class Archive {
|
||||
|
@ -135,7 +144,9 @@ protected:
|
|||
|
||||
lldb::offset_t GetFileOffset() const { return m_file_offset; }
|
||||
|
||||
const llvm::sys::TimePoint<> &GetModificationTime() { return m_time; }
|
||||
const llvm::sys::TimePoint<> &GetModificationTime() {
|
||||
return m_modification_time;
|
||||
}
|
||||
|
||||
const lldb_private::ArchSpec &GetArchitecture() const { return m_arch; }
|
||||
|
||||
|
@ -149,9 +160,9 @@ protected:
|
|||
typedef lldb_private::UniqueCStringMap<uint32_t> ObjectNameToIndexMap;
|
||||
// Member Variables
|
||||
lldb_private::ArchSpec m_arch;
|
||||
llvm::sys::TimePoint<> m_time;
|
||||
llvm::sys::TimePoint<> m_modification_time;
|
||||
lldb::offset_t m_file_offset;
|
||||
Object::collection m_objects;
|
||||
std::vector<Object> m_objects;
|
||||
ObjectNameToIndexMap m_object_name_to_index_map;
|
||||
lldb_private::DataExtractor m_data; ///< The data for this object container
|
||||
///so we don't lose data if the .a files
|
||||
|
|
Loading…
Reference in New Issue