ObjectContainerBSDArchive.h revision 321369
1254721Semaste//===-- ObjectContainerBSDArchive.h -----------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_ObjectContainerBSDArchive_h_ 11254721Semaste#define liblldb_ObjectContainerBSDArchive_h_ 12254721Semaste 13296417Sdim// Project includes 14254721Semaste#include "lldb/Core/ArchSpec.h" 15314564Sdim#include "lldb/Core/UniqueCStringMap.h" 16314564Sdim#include "lldb/Symbol/ObjectContainer.h" 17321369Sdim#include "lldb/Utility/ConstString.h" 18321369Sdim#include "lldb/Utility/FileSpec.h" 19254721Semaste 20314564Sdim// Other libraries and framework includes 21314564Sdim#include "llvm/Support/Chrono.h" 22314564Sdim 23314564Sdim// C Includes 24314564Sdim// C++ Includes 25321369Sdim#include <map> 26321369Sdim#include <memory> 27314564Sdim#include <mutex> 28314564Sdim 29314564Sdimclass ObjectContainerBSDArchive : public lldb_private::ObjectContainer { 30254721Semastepublic: 31314564Sdim ObjectContainerBSDArchive(const lldb::ModuleSP &module_sp, 32314564Sdim lldb::DataBufferSP &data_sp, 33314564Sdim lldb::offset_t data_offset, 34314564Sdim const lldb_private::FileSpec *file, 35314564Sdim lldb::offset_t offset, lldb::offset_t length); 36254721Semaste 37314564Sdim ~ObjectContainerBSDArchive() override; 38296417Sdim 39314564Sdim //------------------------------------------------------------------ 40314564Sdim // Static Functions 41314564Sdim //------------------------------------------------------------------ 42314564Sdim static void Initialize(); 43254721Semaste 44314564Sdim static void Terminate(); 45254721Semaste 46314564Sdim static lldb_private::ConstString GetPluginNameStatic(); 47254721Semaste 48314564Sdim static const char *GetPluginDescriptionStatic(); 49254721Semaste 50314564Sdim static lldb_private::ObjectContainer * 51314564Sdim CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 52314564Sdim lldb::offset_t data_offset, const lldb_private::FileSpec *file, 53314564Sdim lldb::offset_t offset, lldb::offset_t length); 54254721Semaste 55314564Sdim static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 56314564Sdim lldb::DataBufferSP &data_sp, 57314564Sdim lldb::offset_t data_offset, 58314564Sdim lldb::offset_t file_offset, 59314564Sdim lldb::offset_t length, 60314564Sdim lldb_private::ModuleSpecList &specs); 61254721Semaste 62314564Sdim static bool MagicBytesMatch(const lldb_private::DataExtractor &data); 63254721Semaste 64314564Sdim //------------------------------------------------------------------ 65314564Sdim // Member Functions 66314564Sdim //------------------------------------------------------------------ 67314564Sdim bool ParseHeader() override; 68254721Semaste 69314564Sdim size_t GetNumObjects() const override { 70314564Sdim if (m_archive_sp) 71314564Sdim return m_archive_sp->GetNumObjects(); 72314564Sdim return 0; 73314564Sdim } 74254721Semaste 75314564Sdim void Dump(lldb_private::Stream *s) const override; 76254721Semaste 77314564Sdim lldb::ObjectFileSP GetObjectFile(const lldb_private::FileSpec *file) override; 78296417Sdim 79314564Sdim //------------------------------------------------------------------ 80314564Sdim // PluginInterface protocol 81314564Sdim //------------------------------------------------------------------ 82314564Sdim lldb_private::ConstString GetPluginName() override; 83254721Semaste 84314564Sdim uint32_t GetPluginVersion() override; 85254721Semaste 86254721Semasteprotected: 87314564Sdim struct Object { 88314564Sdim Object(); 89254721Semaste 90314564Sdim void Clear(); 91254721Semaste 92314564Sdim lldb::offset_t Extract(const lldb_private::DataExtractor &data, 93314564Sdim lldb::offset_t offset); 94254721Semaste 95314564Sdim lldb_private::ConstString ar_name; // name 96314564Sdim uint32_t ar_date; // modification time 97314564Sdim uint16_t ar_uid; // user id 98314564Sdim uint16_t ar_gid; // group id 99314564Sdim uint16_t ar_mode; // octal file permissions 100314564Sdim uint32_t ar_size; // size in bytes 101314564Sdim lldb::offset_t ar_file_offset; // file offset in bytes from the beginning of 102314564Sdim // the file of the object data 103314564Sdim lldb::offset_t ar_file_size; // length of the object data 104254721Semaste 105314564Sdim typedef std::vector<Object> collection; 106314564Sdim typedef collection::iterator iterator; 107314564Sdim typedef collection::const_iterator const_iterator; 108314564Sdim }; 109254721Semaste 110314564Sdim class Archive { 111314564Sdim public: 112314564Sdim typedef std::shared_ptr<Archive> shared_ptr; 113314564Sdim typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map; 114254721Semaste 115314564Sdim Archive(const lldb_private::ArchSpec &arch, 116314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset, 117314564Sdim lldb_private::DataExtractor &data); 118296417Sdim 119314564Sdim ~Archive(); 120296417Sdim 121314564Sdim static Map &GetArchiveCache(); 122254721Semaste 123314564Sdim static std::recursive_mutex &GetArchiveCacheMutex(); 124254721Semaste 125314564Sdim static Archive::shared_ptr FindCachedArchive( 126314564Sdim const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, 127314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset); 128254721Semaste 129314564Sdim static Archive::shared_ptr ParseAndCacheArchiveForFile( 130314564Sdim const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, 131314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset, 132314564Sdim lldb_private::DataExtractor &data); 133254721Semaste 134314564Sdim size_t GetNumObjects() const { return m_objects.size(); } 135254721Semaste 136314564Sdim const Object *GetObjectAtIndex(size_t idx) { 137314564Sdim if (idx < m_objects.size()) 138314564Sdim return &m_objects[idx]; 139314564Sdim return NULL; 140314564Sdim } 141254721Semaste 142314564Sdim size_t ParseObjects(); 143254721Semaste 144314564Sdim Object *FindObject(const lldb_private::ConstString &object_name, 145314564Sdim const llvm::sys::TimePoint<> &object_mod_time); 146254721Semaste 147314564Sdim lldb::offset_t GetFileOffset() const { return m_file_offset; } 148254721Semaste 149314564Sdim const llvm::sys::TimePoint<> &GetModificationTime() { return m_time; } 150254721Semaste 151314564Sdim const lldb_private::ArchSpec &GetArchitecture() const { return m_arch; } 152254721Semaste 153314564Sdim void SetArchitecture(const lldb_private::ArchSpec &arch) { m_arch = arch; } 154254721Semaste 155314564Sdim bool HasNoExternalReferences() const; 156254721Semaste 157314564Sdim lldb_private::DataExtractor &GetData() { return m_data; } 158254721Semaste 159314564Sdim protected: 160314564Sdim typedef lldb_private::UniqueCStringMap<uint32_t> ObjectNameToIndexMap; 161314564Sdim //---------------------------------------------------------------------- 162314564Sdim // Member Variables 163314564Sdim //---------------------------------------------------------------------- 164314564Sdim lldb_private::ArchSpec m_arch; 165314564Sdim llvm::sys::TimePoint<> m_time; 166314564Sdim lldb::offset_t m_file_offset; 167314564Sdim Object::collection m_objects; 168314564Sdim ObjectNameToIndexMap m_object_name_to_index_map; 169314564Sdim lldb_private::DataExtractor m_data; ///< The data for this object container 170314564Sdim ///so we don't lose data if the .a files 171314564Sdim ///gets modified 172314564Sdim }; 173254721Semaste 174314564Sdim void SetArchive(Archive::shared_ptr &archive_sp); 175254721Semaste 176314564Sdim Archive::shared_ptr m_archive_sp; 177254721Semaste}; 178254721Semaste 179296417Sdim#endif // liblldb_ObjectContainerBSDArchive_h_ 180