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