149ce8969d3154e1560106cfe530444c09410f217Greg Clayton//===-- ModuleSpec.h --------------------------------------------*- C++ -*-===//
249ce8969d3154e1560106cfe530444c09410f217Greg Clayton//
349ce8969d3154e1560106cfe530444c09410f217Greg Clayton//                     The LLVM Compiler Infrastructure
449ce8969d3154e1560106cfe530444c09410f217Greg Clayton//
549ce8969d3154e1560106cfe530444c09410f217Greg Clayton// This file is distributed under the University of Illinois Open Source
649ce8969d3154e1560106cfe530444c09410f217Greg Clayton// License. See LICENSE.TXT for details.
749ce8969d3154e1560106cfe530444c09410f217Greg Clayton//
849ce8969d3154e1560106cfe530444c09410f217Greg Clayton//===----------------------------------------------------------------------===//
949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#ifndef liblldb_ModuleSpec_h_
1149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#define liblldb_ModuleSpec_h_
1249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ArchSpec.h"
14f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton#include "lldb/Core/Stream.h"
1549ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/UUID.h"
1649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Host/FileSpec.h"
1749ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Target/PathMappingList.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1949ce8969d3154e1560106cfe530444c09410f217Greg Claytonnamespace lldb_private {
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
2149ce8969d3154e1560106cfe530444c09410f217Greg Claytonclass ModuleSpec
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
2349ce8969d3154e1560106cfe530444c09410f217Greg Claytonpublic:
2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleSpec () :
2549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_file (),
2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_platform_file (),
2749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_symbol_file (),
2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_arch (),
2949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_uuid (),
3049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_name (),
3149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_offset (0),
320e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time (),
3349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_source_mappings ()
3449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
3549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
3649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
3749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleSpec (const FileSpec &file_spec) :
3849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_file (file_spec),
3949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_platform_file (),
4049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_symbol_file (),
4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_arch (),
4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_uuid (),
4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_name (),
4449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_offset (0),
450e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time (),
4649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_source_mappings ()
4749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
4849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
4949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
5049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleSpec (const FileSpec &file_spec, const ArchSpec &arch) :
5149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_file (file_spec),
5249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_platform_file (),
5349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_symbol_file (),
5449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_arch (arch),
5549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_uuid (),
5649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_name (),
5749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_offset (0),
580e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time (),
5949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_source_mappings ()
6049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
6149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
6249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
6349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleSpec (const ModuleSpec &rhs) :
6449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_file (rhs.m_file),
6549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_platform_file (rhs.m_platform_file),
6649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_symbol_file (rhs.m_symbol_file),
6749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_arch (rhs.m_arch),
6849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_uuid (rhs.m_uuid),
6949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_name (rhs.m_object_name),
7049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_offset (rhs.m_object_offset),
710e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time (rhs.m_object_mod_time),
7249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_source_mappings (rhs.m_source_mappings)
7349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
7449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
7549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
7649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ModuleSpec &
7749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    operator = (const ModuleSpec &rhs)
7849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
7949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (this != &rhs)
8049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        {
8149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_file = rhs.m_file;
8249ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_platform_file = rhs.m_platform_file;
8349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_symbol_file = rhs.m_symbol_file;
8449ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_arch = rhs.m_arch;
8549ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_uuid = rhs.m_uuid;
8649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_object_name = rhs.m_object_name;
8749ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_object_offset = rhs.m_object_offset;
880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton            m_object_mod_time = rhs.m_object_mod_time;
8949ce8969d3154e1560106cfe530444c09410f217Greg Clayton            m_source_mappings = rhs.m_source_mappings;
9049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        }
9149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return *this;
9249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
9349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
9449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec *
9549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetFileSpecPtr ()
9649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
9749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_file)
9849ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_file;
9949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
10049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
10149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
10249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec *
10349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetFileSpecPtr () const
10449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
10549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_file)
10649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_file;
10749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
10849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
10949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
11049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec &
11149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetFileSpec ()
11249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
11349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_file;
11449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
11549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec &
11649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetFileSpec () const
11749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
11849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_file;
11949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
12049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
12149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec *
12249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetPlatformFileSpecPtr ()
12349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
12449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_platform_file)
12549ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_platform_file;
12649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
12749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
12849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
12949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec *
13049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetPlatformFileSpecPtr () const
13149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
13249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_platform_file)
13349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_platform_file;
13449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
13549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
13649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
13749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec &
13849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetPlatformFileSpec ()
13949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
14049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_platform_file;
14149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
14249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
14349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec &
14449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetPlatformFileSpec () const
14549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
14649ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_platform_file;
14749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
14849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
14949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec *
15049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetSymbolFileSpecPtr ()
15149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
15249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_symbol_file)
15349ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_symbol_file;
15449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
15549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
15649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
15749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec *
15849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetSymbolFileSpecPtr () const
15949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
16049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_symbol_file)
16149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_symbol_file;
16249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
16349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
16449ce8969d3154e1560106cfe530444c09410f217Greg Clayton
16549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec &
16649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetSymbolFileSpec ()
16749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
16849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_symbol_file;
16949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
17049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
17149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const FileSpec &
17249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetSymbolFileSpec () const
17349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
17449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_symbol_file;
17549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
17649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
17749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
17849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ArchSpec *
17949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetArchitecturePtr ()
18049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
18149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_arch.IsValid())
18249ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_arch;
18349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
18449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
18549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
18649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const ArchSpec *
18749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetArchitecturePtr () const
18849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
18949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_arch.IsValid())
19049ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_arch;
19149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
19249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
19349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
19449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ArchSpec &
19549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetArchitecture ()
19649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
19749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_arch;
19849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
19949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
20049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const ArchSpec &
20149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetArchitecture () const
20249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
20349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_arch;
20449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
20549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
20649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    UUID *
20749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetUUIDPtr ()
20849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
20949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_uuid.IsValid())
21049ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_uuid;
21149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
21249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
21349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
21449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const UUID *
21549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetUUIDPtr () const
21649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
21749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        if (m_uuid.IsValid())
21849ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return &m_uuid;
21949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return NULL;
22049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
22149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
22249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    UUID &
22349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetUUID ()
22449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
22549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_uuid;
22649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
22749ce8969d3154e1560106cfe530444c09410f217Greg Clayton
22849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const UUID &
22949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetUUID () const
23049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
23149ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_uuid;
23249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
23349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
23449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ConstString &
23549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetObjectName ()
23649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
23749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_object_name;
23849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
23949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
24049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    const ConstString &
24149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetObjectName () const
24249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
24349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_object_name;
24449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
24549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
24649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    uint64_t
24749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetObjectOffset () const
24849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
24949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_object_offset;
25049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
25149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
25249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    void
25349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    SetObjectOffset (uint64_t object_offset)
25449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
25549ce8969d3154e1560106cfe530444c09410f217Greg Clayton        m_object_offset = object_offset;
25649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
2570e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
2580e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    TimeValue &
2590e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    GetObjectModificationTime ()
2600e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
2610e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return m_object_mod_time;
2620e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
2630e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
2640e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    const TimeValue &
2650e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    GetObjectModificationTime () const
2660e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    {
2670e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        return m_object_mod_time;
2680e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    }
26949ce8969d3154e1560106cfe530444c09410f217Greg Clayton
27049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    PathMappingList &
27149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetSourceMappingList () const
27249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
27349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        return m_source_mappings;
27449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
27549ce8969d3154e1560106cfe530444c09410f217Greg Clayton
27636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    void
27736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    Clear ()
27836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
27936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_file.Clear();
28036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_platform_file.Clear();
28136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_symbol_file.Clear();
28236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_arch.Clear();
28336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_uuid.Clear();
28436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_object_name.Clear();
28536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_object_offset = 0;
28636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_source_mappings.Clear(false);
2870e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time.Clear();
28836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
28936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
290f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
291f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    operator bool () const
292f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
293f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_file)
294f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
295f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_platform_file)
296f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
297f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_symbol_file)
298f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
299f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_arch.IsValid())
300f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
301f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_uuid.IsValid())
302f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
303f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_object_name)
304f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
305f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_object_mod_time.IsValid())
306f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return true;
307f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        return false;
308f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
309f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
310f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    void
311f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    Dump (Stream &strm)
312f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
313f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        bool dumped_something = false;
314f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_file)
315f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
316f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("file = '");
317f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm << m_file;
318f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("'");
319f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
320f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
321f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_platform_file)
322f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
323f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (dumped_something)
324f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                strm.PutCString(", ");
325f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("platform_file = '");
326f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm << m_platform_file;
327f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("'");
328f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
329f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
330f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_symbol_file)
331f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
332f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (dumped_something)
333f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                strm.PutCString(", ");
334f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("symbol_file = '");
335f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm << m_symbol_file;
336f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("'");
337f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
338f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
339f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_arch.IsValid())
340f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
341f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (dumped_something)
342f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                strm.PutCString(", ");
343f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.Printf("arch = %s", m_arch.GetTriple().str().c_str());
344f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
345f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
346f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_uuid.IsValid())
347f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
348f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (dumped_something)
349f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                strm.PutCString(", ");
350f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.PutCString("uuid = ");
351f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            m_uuid.Dump(&strm);
352f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
353f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
354f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (m_object_name)
355f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
356f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (dumped_something)
357f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                strm.PutCString(", ");
358f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.Printf("object_name = %s", m_object_name.GetCString());
359f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            dumped_something = true;
360f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
3617980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        if (m_object_offset > 0)
3627980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        {
3637980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            if (dumped_something)
3647980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton                strm.PutCString(", ");
3657980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            strm.Printf("object_offset = 0x%" PRIx64, m_object_offset);
3667980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            dumped_something = true;
3677980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        }
3687980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        if (m_object_mod_time.IsValid())
3697980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        {
3707980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            if (dumped_something)
3717980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton                strm.PutCString(", ");
3727980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            strm.Printf("object_mod_time = 0x%" PRIx64, m_object_mod_time.GetAsSecondsSinceJan1_1970());
3737980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton            dumped_something = true;
3747980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        }
375f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
376f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
377f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    bool
378f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    Matches (const ModuleSpec &match_module_spec, bool exact_arch_match) const
379f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
380f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetUUIDPtr() && match_module_spec.GetUUID() != GetUUID())
381f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return false;
382f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetObjectName() && match_module_spec.GetObjectName() != GetObjectName())
383f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            return false;
384f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetFileSpecPtr())
385f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
386f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            const FileSpec &fspec = match_module_spec.GetFileSpec();
387f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (!FileSpec::Equal(fspec, GetFileSpec(), fspec.GetDirectory().IsEmpty() == false))
388f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                return false;
389f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
390f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetPlatformFileSpecPtr())
391f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
392f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            const FileSpec &fspec = match_module_spec.GetPlatformFileSpec();
393f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (!FileSpec::Equal(fspec, GetPlatformFileSpec(), fspec.GetDirectory().IsEmpty() == false))
394f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                return false;
395f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
396f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
397f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetSymbolFileSpecPtr())
398f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
399f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            const FileSpec &fspec = match_module_spec.GetSymbolFileSpec();
400f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (!FileSpec::Equal(fspec, GetSymbolFileSpec(), fspec.GetDirectory().IsEmpty() == false))
401f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                return false;
402f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
403f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
404f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (match_module_spec.GetArchitecturePtr())
405f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
406f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (exact_arch_match)
407f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            {
408f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                if (!GetArchitecture().IsExactMatch(match_module_spec.GetArchitecture()))
409f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                    return false;
410f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            }
411f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            else
412f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            {
413f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                if (!GetArchitecture().IsCompatibleMatch(match_module_spec.GetArchitecture()))
414f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                    return false;
415f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            }
416f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
417f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        return true;
418f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
419f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
42049ce8969d3154e1560106cfe530444c09410f217Greg Claytonprotected:
42149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec m_file;
42249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec m_platform_file;
42349ce8969d3154e1560106cfe530444c09410f217Greg Clayton    FileSpec m_symbol_file;
42449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ArchSpec m_arch;
42549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    UUID m_uuid;
42649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    ConstString m_object_name;
42749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    uint64_t m_object_offset;
4280e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    TimeValue m_object_mod_time;
42949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    mutable PathMappingList m_source_mappings;
43049ce8969d3154e1560106cfe530444c09410f217Greg Clayton};
43149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
43236b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonclass ModuleSpecList
43336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{
43436b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonpublic:
43536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    ModuleSpecList () :
43636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_specs(),
43736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_mutex(Mutex::eMutexTypeRecursive)
43836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
43936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
44036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
44136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    ModuleSpecList (const ModuleSpecList &rhs) :
44236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_specs(),
44336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_mutex(Mutex::eMutexTypeRecursive)
44436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
44536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker lhs_locker(m_mutex);
44636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker rhs_locker(rhs.m_mutex);
44736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_specs = rhs.m_specs;
44836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
44936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
45036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    ~ModuleSpecList ()
45136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
45236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
453f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
454f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    ModuleSpecList &
455f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    operator = (const ModuleSpecList &rhs)
456f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
457f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (this != &rhs)
458f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
459f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            Mutex::Locker lhs_locker(m_mutex);
460f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            Mutex::Locker rhs_locker(rhs.m_mutex);
461f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            m_specs = rhs.m_specs;
462f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
463f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        return *this;
464f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
465f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
46636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    size_t
46736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    GetSize() const
46836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
46936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker locker(m_mutex);
47036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        return m_specs.size();
47136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
47236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
47336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    void
47436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    Clear ()
47536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
47636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker locker(m_mutex);
47736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_specs.clear();
47836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
47936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
48036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    void
48136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    Append (const ModuleSpec &spec)
48236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
48336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker locker(m_mutex);
48436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        m_specs.push_back (spec);
48536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
486f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
487f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    void
488f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    Append (const ModuleSpecList &rhs)
489f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
490f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        Mutex::Locker lhs_locker(m_mutex);
491f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        Mutex::Locker rhs_locker(rhs.m_mutex);
492f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        m_specs.insert(m_specs.end(), rhs.m_specs.begin(), rhs.m_specs.end());
493f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
494f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
4957980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    // The index "i" must be valid and this can't be used in
4967980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    // multi-threaded code as no mutex lock is taken.
4977980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    ModuleSpec &
4987980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    GetModuleSpecRefAtIndex (size_t i)
4997980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    {
5007980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton        return m_specs[i];
5017980d35608225dc71b3dd946d4c3aea85bc24e85Greg Clayton    }
50236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    bool
50336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    GetModuleSpecAtIndex (size_t i, ModuleSpec &module_spec) const
50436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
50536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker locker(m_mutex);
50636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        if (i < m_specs.size())
50736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        {
50836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            module_spec = m_specs[i];
50936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            return true;
51036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        }
51136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        module_spec.Clear();
51236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        return false;
51336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
51436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
515f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
51636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    bool
51736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    FindMatchingModuleSpec (const ModuleSpec &module_spec, ModuleSpec &match_module_spec) const
51836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    {
51936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        Mutex::Locker locker(m_mutex);
520f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        bool exact_arch_match = true;
52136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        for (auto spec: m_specs)
52236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        {
523f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (spec.Matches(module_spec, exact_arch_match))
524f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            {
525f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                match_module_spec = spec;
526f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                return true;
527f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            }
52836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        }
52936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
53036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        // If there was an architecture, retry with a compatible arch
531f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (module_spec.GetArchitecturePtr())
53236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        {
533f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            exact_arch_match = false;
53436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            for (auto spec: m_specs)
53536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            {
536f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                if (spec.Matches(module_spec, exact_arch_match))
537f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                {
538f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                    match_module_spec = spec;
539f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                    return true;
540f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                }
54136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton            }
54236b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        }
54336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        match_module_spec.Clear();
54436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton        return false;
54536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    }
546f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
547f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    size_t
548f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    FindMatchingModuleSpecs (const ModuleSpec &module_spec, ModuleSpecList &matching_list) const
549f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
550f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        Mutex::Locker locker(m_mutex);
551f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        bool exact_arch_match = true;
552f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        const size_t initial_match_count = matching_list.GetSize();
553f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        for (auto spec: m_specs)
554f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
555f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            if (spec.Matches(module_spec, exact_arch_match))
556f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                matching_list.Append (spec);
557f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
558f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
559f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        // If there was an architecture, retry with a compatible arch if no matches were found
560f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        if (module_spec.GetArchitecturePtr() && (initial_match_count == matching_list.GetSize()))
561f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
562f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            exact_arch_match = false;
563f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            for (auto spec: m_specs)
564f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            {
565f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                if (spec.Matches(module_spec, exact_arch_match))
566f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton                    matching_list.Append (spec);
567f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            }
568f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
569f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        return matching_list.GetSize() - initial_match_count;
570f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
571f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton
572f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    void
573f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    Dump (Stream &strm)
574f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    {
575f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        Mutex::Locker locker(m_mutex);
576f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        uint32_t idx = 0;
577f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        for (auto spec: m_specs)
578f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        {
579f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.Printf("[%u] ", idx);
580f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            spec.Dump (strm);
581f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            strm.EOL();
582f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton            ++idx;
583f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton        }
584f9215bae3f7f76ad98bace0097821a12415690c5Greg Clayton    }
58536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
58636b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonprotected:
58736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    typedef std::vector<ModuleSpec> collection; ///< The module collection type.
58836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    collection m_specs; ///< The collection of modules.
58936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton    mutable Mutex m_mutex;
59036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton};
59136b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton
59249ce8969d3154e1560106cfe530444c09410f217Greg Clayton} // namespace lldb_private
59349ce8969d3154e1560106cfe530444c09410f217Greg Clayton
59449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#endif  // liblldb_ModuleSpec_h_
595