124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ObjectContainerBSDArchive.h -----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_ObjectContainerBSDArchive_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ObjectContainerBSDArchive_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectContainer.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ArchSpec.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ConstString.h" 175f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UniqueCStringMap.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/TimeValue.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ObjectContainerBSDArchive : 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public lldb_private::ObjectContainer 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Static Functions 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Initialize(); 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Terminate(); 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 350e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static lldb_private::ConstString 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginNameStatic(); 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const char * 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb_private::ObjectContainer * 423508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton CreateInstance (const lldb::ModuleSP &module_sp, 43cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::DataBufferSP& data_sp, 44cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::FileSpec *file, 46cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t offset, 47cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton static size_t 5036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton GetModuleSpecifications (const lldb_private::FileSpec& file, 5136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::DataBufferSP& data_sp, 5236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t data_offset, 5336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t file_offset, 5436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t length, 5536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb_private::ModuleSpecList &specs); 5636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static bool 58db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton MagicBytesMatch (const lldb_private::DataExtractor &data); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Member Functions 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ObjectContainerBSDArchive (const lldb::ModuleSP &module_sp, 64cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::DataBufferSP& data_sp, 65cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::FileSpec *file, 67cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t offset, 68cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~ObjectContainerBSDArchive(); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseHeader (); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76e40b6424d9e49306392bec4b44060da36414c382Greg Clayton virtual size_t 77e40b6424d9e49306392bec4b44060da36414c382Greg Clayton GetNumObjects () const 78e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 79e40b6424d9e49306392bec4b44060da36414c382Greg Clayton if (m_archive_sp) 80e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_archive_sp->GetNumObjects(); 81e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return 0; 82e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Dump (lldb_private::Stream *s) const; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86e40b6424d9e49306392bec4b44060da36414c382Greg Clayton virtual lldb::ObjectFileSP 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetObjectFile (const lldb_private::FileSpec *file); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // PluginInterface protocol 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton virtual lldb_private::ConstString 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginName(); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginVersion(); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Object 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Object(); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Clear(); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t 10836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Extract (const lldb_private::DataExtractor& data, lldb::offset_t offset); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::ConstString ar_name; // name 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t ar_date; // modification time 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t ar_uid; // user id 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t ar_gid; // group id 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint16_t ar_mode; // octal file permissions 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t ar_size; // size in bytes 11636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t ar_file_offset; // file offset in bytes from the beginning of the file of the object data 11736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t ar_file_size; // length of the object data 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<Object> collection; 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::iterator iterator; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::const_iterator const_iterator; 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class Archive 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 127102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton typedef std::shared_ptr<Archive> shared_ptr; 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static Map & 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetArchiveCache (); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static lldb_private::Mutex & 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetArchiveCacheMutex (); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static Archive::shared_ptr 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FindCachedArchive (const lldb_private::FileSpec &file, 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::ArchSpec &arch, 1397980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton const lldb_private::TimeValue &mod_time, 1407980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t file_offset); 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static Archive::shared_ptr 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ParseAndCacheArchiveForFile (const lldb_private::FileSpec &file, 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::ArchSpec &arch, 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::TimeValue &mod_time, 1467980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t file_offset, 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::DataExtractor &data); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Archive (const lldb_private::ArchSpec &arch, 150cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const lldb_private::TimeValue &mod_time, 1517980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t file_offset, 152cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb_private::DataExtractor &data); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~Archive (); 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t 157e40b6424d9e49306392bec4b44060da36414c382Greg Clayton GetNumObjects () const 158e40b6424d9e49306392bec4b44060da36414c382Greg Clayton { 159e40b6424d9e49306392bec4b44060da36414c382Greg Clayton return m_objects.size(); 160e40b6424d9e49306392bec4b44060da36414c382Greg Clayton } 161e40b6424d9e49306392bec4b44060da36414c382Greg Clayton 1627980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton const Object * 1637980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton GetObjectAtIndex (size_t idx) 1647980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton { 1657980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton if (idx < m_objects.size()) 1667980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton return &m_objects[idx]; 1677980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton return NULL; 1687980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton } 1697980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton 170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton size_t 171cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton ParseObjects (); 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Object * 1740e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton FindObject (const lldb_private::ConstString &object_name, 1750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton const lldb_private::TimeValue &object_mod_time); 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1777980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t 1787980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton GetFileOffset () const 1797980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton { 1807980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton return m_file_offset; 1817980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton } 1827980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::TimeValue & 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetModificationTime() 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_time; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb_private::ArchSpec & 1907980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton GetArchitecture () const 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1947980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton 1957980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton void 1967980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton SetArchitecture (const lldb_private::ArchSpec &arch) 1977980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton { 1987980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton m_arch = arch; 1997980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton } 2007980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton 201e40b6424d9e49306392bec4b44060da36414c382Greg Clayton bool 202e40b6424d9e49306392bec4b44060da36414c382Greg Clayton HasNoExternalReferences() const; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 204cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb_private::DataExtractor & 205cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton GetData () 206cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 207cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton return m_data; 208cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 209cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner protected: 21136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton typedef lldb_private::UniqueCStringMap<uint32_t> ObjectNameToIndexMap; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //---------------------------------------------------------------------- 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Member Variables 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //---------------------------------------------------------------------- 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::ArchSpec m_arch; 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb_private::TimeValue m_time; 2177980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton lldb::offset_t m_file_offset; 218843327854a86a1d44f03b838767575ccba8bb77aGreg Clayton Object::collection m_objects; 21936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton ObjectNameToIndexMap m_object_name_to_index_map; 220cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb_private::DataExtractor m_data; ///< The data for this object container so we don't lose data if the .a files gets modified 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetArchive (Archive::shared_ptr &archive_sp); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Archive::shared_ptr m_archive_sp; 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_ObjectContainerBSDArchive_h_ 230