used to do this because we needed to find the shared pointer for a .o file when the .o file's module was needed in a SymbolContext since the module in a symbol context was a shared pointer. Now that we are using intrusive pointers we don't have this limitation anymore since any instrusive shared pointer can be made from a pointer to an object all on its own. Also switched over to having the Module and SymbolVendor use shared pointers to their object files as had a leak on MacOSX when the SymbolVendor's object file wasn't the same as the Module's (debug info in a stand along file (dSYM file)). Now everything will correctly clean itself up when the module goes away after an executable gets rebuilt. Now we correctly get rid of .o files that are used with the DWARF with debug map executables on subsequent runs since the only shared pointer to the object files in from the DWARF symbol file debug map parser, and when the module gets replaced, it destroys to old one along with all .o files. Also added a small optimization when using BSD archives where we will remove old BSD containers from the shared list when they are outdated. llvm-svn: 140002
191 lines
5.5 KiB
C++
191 lines
5.5 KiB
C++
//===-- ObjectContainerBSDArchive.h -----------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_ObjectContainerBSDArchive_h_
|
|
#define liblldb_ObjectContainerBSDArchive_h_
|
|
|
|
#include "lldb/Symbol/ObjectContainer.h"
|
|
|
|
#include "lldb/Core/ArchSpec.h"
|
|
#include "lldb/Core/ConstString.h"
|
|
#include "lldb/Host/FileSpec.h"
|
|
#include "lldb/Core/UniqueCStringMap.h"
|
|
#include "lldb/Host/TimeValue.h"
|
|
|
|
class ObjectContainerBSDArchive :
|
|
public lldb_private::ObjectContainer
|
|
{
|
|
public:
|
|
|
|
//------------------------------------------------------------------
|
|
// Static Functions
|
|
//------------------------------------------------------------------
|
|
static void
|
|
Initialize();
|
|
|
|
static void
|
|
Terminate();
|
|
|
|
static const char *
|
|
GetPluginNameStatic();
|
|
|
|
static const char *
|
|
GetPluginDescriptionStatic();
|
|
|
|
static lldb_private::ObjectContainer *
|
|
CreateInstance (lldb_private::Module* module,
|
|
lldb::DataBufferSP& dataSP,
|
|
const lldb_private::FileSpec *file,
|
|
lldb::addr_t offset,
|
|
lldb::addr_t length);
|
|
|
|
static bool
|
|
MagicBytesMatch (lldb::DataBufferSP& dataSP);
|
|
|
|
//------------------------------------------------------------------
|
|
// Member Functions
|
|
//------------------------------------------------------------------
|
|
ObjectContainerBSDArchive (lldb_private::Module* module,
|
|
lldb::DataBufferSP& dataSP,
|
|
const lldb_private::FileSpec *file,
|
|
lldb::addr_t offset,
|
|
lldb::addr_t length);
|
|
|
|
virtual
|
|
~ObjectContainerBSDArchive();
|
|
|
|
virtual bool
|
|
ParseHeader ();
|
|
|
|
virtual size_t
|
|
GetNumObjects () const
|
|
{
|
|
if (m_archive_sp)
|
|
return m_archive_sp->GetNumObjects();
|
|
return 0;
|
|
}
|
|
virtual void
|
|
Dump (lldb_private::Stream *s) const;
|
|
|
|
virtual lldb::ObjectFileSP
|
|
GetObjectFile (const lldb_private::FileSpec *file);
|
|
|
|
//------------------------------------------------------------------
|
|
// PluginInterface protocol
|
|
//------------------------------------------------------------------
|
|
virtual const char *
|
|
GetPluginName();
|
|
|
|
virtual const char *
|
|
GetShortPluginName();
|
|
|
|
virtual uint32_t
|
|
GetPluginVersion();
|
|
|
|
protected:
|
|
|
|
struct Object
|
|
{
|
|
Object();
|
|
|
|
void
|
|
Clear();
|
|
|
|
uint32_t
|
|
Extract (const lldb_private::DataExtractor& data, uint32_t offset);
|
|
|
|
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
|
|
uint32_t ar_file_offset; // file offset in bytes from the beginning of the file of the object data
|
|
uint32_t ar_file_size; // length of the object data
|
|
lldb::ObjectFileSP object_file_sp;
|
|
|
|
typedef std::vector<Object> collection;
|
|
typedef collection::iterator iterator;
|
|
typedef collection::const_iterator const_iterator;
|
|
};
|
|
|
|
class Archive
|
|
{
|
|
public:
|
|
typedef lldb::SharedPtr<Archive>::Type shared_ptr;
|
|
typedef std::multimap<lldb_private::FileSpec, shared_ptr> Map;
|
|
|
|
static Map &
|
|
GetArchiveCache ();
|
|
|
|
static lldb_private::Mutex &
|
|
GetArchiveCacheMutex ();
|
|
|
|
static Archive::shared_ptr
|
|
FindCachedArchive (const lldb_private::FileSpec &file,
|
|
const lldb_private::ArchSpec &arch,
|
|
const lldb_private::TimeValue &mod_time);
|
|
|
|
static Archive::shared_ptr
|
|
ParseAndCacheArchiveForFile (const lldb_private::FileSpec &file,
|
|
const lldb_private::ArchSpec &arch,
|
|
const lldb_private::TimeValue &mod_time,
|
|
lldb_private::DataExtractor &data);
|
|
|
|
Archive (const lldb_private::ArchSpec &arch,
|
|
const lldb_private::TimeValue &mod_time);
|
|
|
|
~Archive ();
|
|
|
|
size_t
|
|
GetNumObjects () const
|
|
{
|
|
return m_objects.size();
|
|
}
|
|
|
|
size_t
|
|
ParseObjects (lldb_private::DataExtractor &data);
|
|
|
|
Object *
|
|
FindObject (const lldb_private::ConstString &object_name);
|
|
|
|
const lldb_private::TimeValue &
|
|
GetModificationTime()
|
|
{
|
|
return m_time;
|
|
}
|
|
|
|
const lldb_private::ArchSpec &
|
|
GetArchitecture ()
|
|
{
|
|
return m_arch;
|
|
}
|
|
|
|
bool
|
|
HasNoExternalReferences() const;
|
|
|
|
protected:
|
|
|
|
//----------------------------------------------------------------------
|
|
// Member Variables
|
|
//----------------------------------------------------------------------
|
|
lldb_private::ArchSpec m_arch;
|
|
lldb_private::TimeValue m_time;
|
|
Object::collection m_objects;
|
|
lldb_private::UniqueCStringMap<uint32_t> m_object_name_to_index_map;
|
|
};
|
|
|
|
void
|
|
SetArchive (Archive::shared_ptr &archive_sp);
|
|
|
|
Archive::shared_ptr m_archive_sp;
|
|
};
|
|
|
|
#endif // liblldb_ObjectContainerBSDArchive_h_
|