ObjectContainerBSDArchive.h revision 327952
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 13314564Sdim#include "lldb/Core/UniqueCStringMap.h" 14314564Sdim#include "lldb/Symbol/ObjectContainer.h" 15327952Sdim#include "lldb/Utility/ArchSpec.h" 16321369Sdim#include "lldb/Utility/ConstString.h" 17321369Sdim#include "lldb/Utility/FileSpec.h" 18254721Semaste 19314564Sdim// Other libraries and framework includes 20314564Sdim#include "llvm/Support/Chrono.h" 21314564Sdim 22314564Sdim// C Includes 23314564Sdim// C++ Includes 24321369Sdim#include <map> 25321369Sdim#include <memory> 26314564Sdim#include <mutex> 27314564Sdim 28314564Sdimclass ObjectContainerBSDArchive : public lldb_private::ObjectContainer { 29254721Semastepublic: 30314564Sdim ObjectContainerBSDArchive(const lldb::ModuleSP &module_sp, 31314564Sdim lldb::DataBufferSP &data_sp, 32314564Sdim lldb::offset_t data_offset, 33314564Sdim const lldb_private::FileSpec *file, 34314564Sdim lldb::offset_t offset, lldb::offset_t length); 35254721Semaste 36314564Sdim ~ObjectContainerBSDArchive() override; 37296417Sdim 38314564Sdim //------------------------------------------------------------------ 39314564Sdim // Static Functions 40314564Sdim //------------------------------------------------------------------ 41314564Sdim static void Initialize(); 42254721Semaste 43314564Sdim static void Terminate(); 44254721Semaste 45314564Sdim static lldb_private::ConstString GetPluginNameStatic(); 46254721Semaste 47314564Sdim static const char *GetPluginDescriptionStatic(); 48254721Semaste 49314564Sdim static lldb_private::ObjectContainer * 50314564Sdim CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 51314564Sdim lldb::offset_t data_offset, const lldb_private::FileSpec *file, 52314564Sdim lldb::offset_t offset, lldb::offset_t length); 53254721Semaste 54314564Sdim static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 55314564Sdim lldb::DataBufferSP &data_sp, 56314564Sdim lldb::offset_t data_offset, 57314564Sdim lldb::offset_t file_offset, 58314564Sdim lldb::offset_t length, 59314564Sdim lldb_private::ModuleSpecList &specs); 60254721Semaste 61314564Sdim static bool MagicBytesMatch(const lldb_private::DataExtractor &data); 62254721Semaste 63314564Sdim //------------------------------------------------------------------ 64314564Sdim // Member Functions 65314564Sdim //------------------------------------------------------------------ 66314564Sdim bool ParseHeader() override; 67254721Semaste 68314564Sdim size_t GetNumObjects() const override { 69314564Sdim if (m_archive_sp) 70314564Sdim return m_archive_sp->GetNumObjects(); 71314564Sdim return 0; 72314564Sdim } 73254721Semaste 74314564Sdim void Dump(lldb_private::Stream *s) const override; 75254721Semaste 76314564Sdim lldb::ObjectFileSP GetObjectFile(const lldb_private::FileSpec *file) override; 77296417Sdim 78314564Sdim //------------------------------------------------------------------ 79314564Sdim // PluginInterface protocol 80314564Sdim //------------------------------------------------------------------ 81314564Sdim lldb_private::ConstString GetPluginName() override; 82254721Semaste 83314564Sdim uint32_t GetPluginVersion() override; 84254721Semaste 85254721Semasteprotected: 86314564Sdim struct Object { 87314564Sdim Object(); 88254721Semaste 89314564Sdim void Clear(); 90254721Semaste 91314564Sdim lldb::offset_t Extract(const lldb_private::DataExtractor &data, 92314564Sdim lldb::offset_t offset); 93254721Semaste 94314564Sdim lldb_private::ConstString ar_name; // name 95314564Sdim uint32_t ar_date; // modification time 96314564Sdim uint16_t ar_uid; // user id 97314564Sdim uint16_t ar_gid; // group id 98314564Sdim uint16_t ar_mode; // octal file permissions 99314564Sdim uint32_t ar_size; // size in bytes 100314564Sdim lldb::offset_t ar_file_offset; // file offset in bytes from the beginning of 101314564Sdim // the file of the object data 102314564Sdim lldb::offset_t ar_file_size; // length of the object data 103254721Semaste 104314564Sdim typedef std::vector<Object> collection; 105314564Sdim typedef collection::iterator iterator; 106314564Sdim typedef collection::const_iterator const_iterator; 107314564Sdim }; 108254721Semaste 109314564Sdim class Archive { 110314564Sdim public: 111314564Sdim typedef std::shared_ptr<Archive> shared_ptr; 112314564Sdim typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map; 113254721Semaste 114314564Sdim Archive(const lldb_private::ArchSpec &arch, 115314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset, 116314564Sdim lldb_private::DataExtractor &data); 117296417Sdim 118314564Sdim ~Archive(); 119296417Sdim 120314564Sdim static Map &GetArchiveCache(); 121254721Semaste 122314564Sdim static std::recursive_mutex &GetArchiveCacheMutex(); 123254721Semaste 124314564Sdim static Archive::shared_ptr FindCachedArchive( 125314564Sdim const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, 126314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset); 127254721Semaste 128314564Sdim static Archive::shared_ptr ParseAndCacheArchiveForFile( 129314564Sdim const lldb_private::FileSpec &file, const lldb_private::ArchSpec &arch, 130314564Sdim const llvm::sys::TimePoint<> &mod_time, lldb::offset_t file_offset, 131314564Sdim lldb_private::DataExtractor &data); 132254721Semaste 133314564Sdim size_t GetNumObjects() const { return m_objects.size(); } 134254721Semaste 135314564Sdim const Object *GetObjectAtIndex(size_t idx) { 136314564Sdim if (idx < m_objects.size()) 137314564Sdim return &m_objects[idx]; 138314564Sdim return NULL; 139314564Sdim } 140254721Semaste 141314564Sdim size_t ParseObjects(); 142254721Semaste 143314564Sdim Object *FindObject(const lldb_private::ConstString &object_name, 144314564Sdim const llvm::sys::TimePoint<> &object_mod_time); 145254721Semaste 146314564Sdim lldb::offset_t GetFileOffset() const { return m_file_offset; } 147254721Semaste 148314564Sdim const llvm::sys::TimePoint<> &GetModificationTime() { return m_time; } 149254721Semaste 150314564Sdim const lldb_private::ArchSpec &GetArchitecture() const { return m_arch; } 151254721Semaste 152314564Sdim void SetArchitecture(const lldb_private::ArchSpec &arch) { m_arch = arch; } 153254721Semaste 154314564Sdim bool HasNoExternalReferences() const; 155254721Semaste 156314564Sdim lldb_private::DataExtractor &GetData() { return m_data; } 157254721Semaste 158314564Sdim protected: 159314564Sdim typedef lldb_private::UniqueCStringMap<uint32_t> ObjectNameToIndexMap; 160314564Sdim //---------------------------------------------------------------------- 161314564Sdim // Member Variables 162314564Sdim //---------------------------------------------------------------------- 163314564Sdim lldb_private::ArchSpec m_arch; 164314564Sdim llvm::sys::TimePoint<> m_time; 165314564Sdim lldb::offset_t m_file_offset; 166314564Sdim Object::collection m_objects; 167314564Sdim ObjectNameToIndexMap m_object_name_to_index_map; 168314564Sdim lldb_private::DataExtractor m_data; ///< The data for this object container 169314564Sdim ///so we don't lose data if the .a files 170314564Sdim ///gets modified 171314564Sdim }; 172254721Semaste 173314564Sdim void SetArchive(Archive::shared_ptr &archive_sp); 174254721Semaste 175314564Sdim Archive::shared_ptr m_archive_sp; 176254721Semaste}; 177254721Semaste 178296417Sdim#endif // liblldb_ObjectContainerBSDArchive_h_ 179