SectionLoadList.h revision 269024
1//===-- SectionLoadList.h -----------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_SectionLoadList_h_
11#define liblldb_SectionLoadList_h_
12
13// C Includes
14// C++ Includes
15#include <map>
16
17// Other libraries and framework includes
18#include "llvm/ADT/DenseMap.h"
19// Project includes
20#include "lldb/lldb-public.h"
21#include "lldb/Host/Mutex.h"
22
23namespace lldb_private {
24
25class SectionLoadList
26{
27public:
28    //------------------------------------------------------------------
29    // Constructors and Destructors
30    //------------------------------------------------------------------
31    SectionLoadList () :
32        m_addr_to_sect (),
33        m_sect_to_addr (),
34        m_mutex (Mutex::eMutexTypeRecursive)
35
36    {
37    }
38
39    SectionLoadList (const SectionLoadList& rhs);
40
41    ~SectionLoadList()
42    {
43        // Call clear since this takes a lock and clears the section load list
44        // in case another thread is currently using this section load list
45        Clear();
46    }
47
48    void
49    operator=(const SectionLoadList &rhs);
50
51    bool
52    IsEmpty() const;
53
54    void
55    Clear ();
56
57    lldb::addr_t
58    GetSectionLoadAddress (const lldb::SectionSP &section_sp) const;
59
60    bool
61    ResolveLoadAddress (lldb::addr_t load_addr, Address &so_addr) const;
62
63    bool
64    SetSectionLoadAddress (const lldb::SectionSP &section_sp, lldb::addr_t load_addr, bool warn_multiple = false);
65
66    // The old load address should be specified when unloading to ensure we get
67    // the correct instance of the section as a shared library could be loaded
68    // at more than one location.
69    bool
70    SetSectionUnloaded (const lldb::SectionSP &section_sp, lldb::addr_t load_addr);
71
72    // Unload all instances of a section. This function can be used on systems
73    // that don't support multiple copies of the same shared library to be
74    // loaded at the same time.
75    size_t
76    SetSectionUnloaded (const lldb::SectionSP &section_sp);
77
78    void
79    Dump (Stream &s, Target *target);
80
81protected:
82    typedef std::map<lldb::addr_t, lldb::SectionSP> addr_to_sect_collection;
83    typedef llvm::DenseMap<const Section *, lldb::addr_t> sect_to_addr_collection;
84    addr_to_sect_collection m_addr_to_sect;
85    sect_to_addr_collection m_sect_to_addr;
86    mutable Mutex m_mutex;
87};
88
89} // namespace lldb_private
90
91#endif  // liblldb_SectionLoadList_h_
92