1//===-- Section.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_Section_h_
11#define liblldb_Section_h_
12
13#include "lldb/lldb-private.h"
14#include "lldb/Core/AddressRange.h"
15#include "lldb/Core/Flags.h"
16#include "lldb/Core/ModuleChild.h"
17#include "lldb/Core/ConstString.h"
18#include "lldb/Core/RangeMap.h"
19#include "lldb/Core/UserID.h"
20#include "lldb/Core/VMRange.h"
21#include "lldb/Symbol/ObjectFile.h"
22#include <limits.h>
23
24namespace lldb_private {
25
26class SectionList
27{
28public:
29    typedef std::vector<lldb::SectionSP>  collection;
30    typedef collection::iterator        iterator;
31    typedef collection::const_iterator  const_iterator;
32
33    SectionList();
34
35    ~SectionList();
36
37    SectionList &
38    operator =(const SectionList& rhs);
39
40    size_t
41    AddSection (const lldb::SectionSP& section_sp);
42
43    size_t
44    AddUniqueSection (const lldb::SectionSP& section_sp);
45
46    size_t
47    FindSectionIndex (const Section* sect);
48
49    bool
50    ContainsSection(lldb::user_id_t sect_id) const;
51
52    void
53    Dump (Stream *s, Target *target, bool show_header, uint32_t depth) const;
54
55    lldb::SectionSP
56    FindSectionByName (const ConstString &section_dstr) const;
57
58    lldb::SectionSP
59    FindSectionByID (lldb::user_id_t sect_id) const;
60
61    lldb::SectionSP
62    FindSectionByType (lldb::SectionType sect_type, bool check_children, size_t start_idx = 0) const;
63
64    lldb::SectionSP
65    FindSectionContainingFileAddress (lldb::addr_t addr, uint32_t depth = UINT32_MAX) const;
66
67    bool
68    GetSectionData (const DataExtractor& module_data, DataExtractor& section_data) const;
69
70    // Get the number of sections in this list only
71    size_t
72    GetSize () const
73    {
74        return m_sections.size();
75    }
76
77    // Get the number of sections in this list, and any contained child sections
78    size_t
79    GetNumSections (uint32_t depth) const;
80
81    bool
82    ReplaceSection (lldb::user_id_t sect_id, const lldb::SectionSP& section_sp, uint32_t depth = UINT32_MAX);
83
84    // Warning, this can be slow as it's removing items from a std::vector.
85    bool
86    DeleteSection (size_t idx);
87
88    lldb::SectionSP
89    GetSectionAtIndex (size_t idx) const;
90
91    size_t
92    Slide (lldb::addr_t slide_amount, bool slide_children);
93
94    void
95    Clear ()
96    {
97        m_sections.clear();
98    }
99
100protected:
101    collection  m_sections;
102};
103
104
105class Section :
106    public std::enable_shared_from_this<Section>,
107    public ModuleChild,
108    public UserID,
109    public Flags
110{
111public:
112    // Create a root section (one that has no parent)
113    Section (const lldb::ModuleSP &module_sp,
114             ObjectFile *obj_file,
115             lldb::user_id_t sect_id,
116             const ConstString &name,
117             lldb::SectionType sect_type,
118             lldb::addr_t file_vm_addr,
119             lldb::addr_t vm_size,
120             lldb::offset_t file_offset,
121             lldb::offset_t file_size,
122             uint32_t flags);
123
124    // Create a section that is a child of parent_section_sp
125    Section (const lldb::SectionSP &parent_section_sp,    // NULL for top level sections, non-NULL for child sections
126             const lldb::ModuleSP &module_sp,
127             ObjectFile *obj_file,
128             lldb::user_id_t sect_id,
129             const ConstString &name,
130             lldb::SectionType sect_type,
131             lldb::addr_t file_vm_addr,
132             lldb::addr_t vm_size,
133             lldb::offset_t file_offset,
134             lldb::offset_t file_size,
135             uint32_t flags);
136
137    ~Section ();
138
139    static int
140    Compare (const Section& a, const Section& b);
141
142    bool
143    ContainsFileAddress (lldb::addr_t vm_addr) const;
144
145    SectionList&
146    GetChildren ()
147    {
148        return m_children;
149    }
150
151    const SectionList&
152    GetChildren () const
153    {
154        return m_children;
155    }
156
157    void
158    Dump (Stream *s, Target *target, uint32_t depth) const;
159
160    void
161    DumpName (Stream *s) const;
162
163    lldb::addr_t
164    GetLoadBaseAddress (Target *target) const;
165
166    bool
167    ResolveContainedAddress (lldb::addr_t offset, Address &so_addr) const;
168
169    lldb::offset_t
170    GetFileOffset () const
171    {
172        return m_file_offset;
173    }
174
175    void
176    SetFileOffset (lldb::offset_t file_offset)
177    {
178        m_file_offset = file_offset;
179    }
180
181    lldb::offset_t
182    GetFileSize () const
183    {
184        return m_file_size;
185    }
186
187    void
188    SetFileSize (lldb::offset_t file_size)
189    {
190        m_file_size = file_size;
191    }
192
193    lldb::addr_t
194    GetFileAddress () const;
195
196    lldb::addr_t
197    GetOffset () const;
198
199
200    lldb::addr_t
201    GetByteSize () const
202    {
203        return m_byte_size;
204    }
205
206    void
207    SetByteSize (lldb::addr_t byte_size)
208    {
209        m_byte_size = byte_size;
210    }
211
212    bool
213    IsFake() const
214    {
215        return m_fake;
216    }
217
218    void
219    SetIsFake(bool fake)
220    {
221        m_fake = fake;
222    }
223
224    bool
225    IsEncrypted () const
226    {
227        return m_encrypted;
228    }
229
230    void
231    SetIsEncrypted (bool b)
232    {
233        m_encrypted = b;
234    }
235
236    bool
237    IsDescendant (const Section *section);
238
239    const ConstString&
240    GetName () const
241    {
242        return m_name;
243    }
244
245    bool
246    Slide (lldb::addr_t slide_amount, bool slide_children);
247
248
249    lldb::SectionType
250    GetType () const
251    {
252        return m_type;
253    }
254
255    lldb::SectionSP
256    GetParent () const
257    {
258        return m_parent_wp.lock();
259    }
260
261    bool
262    IsThreadSpecific () const
263    {
264        return m_thread_specific;
265    }
266
267    void
268    SetIsThreadSpecific (bool b)
269    {
270        m_thread_specific = b;
271    }
272
273    ObjectFile *
274    GetObjectFile ()
275    {
276        return m_obj_file;
277    }
278    const ObjectFile *
279    GetObjectFile () const
280    {
281        return m_obj_file;
282    }
283
284
285protected:
286
287    ObjectFile      *m_obj_file;        // The object file that data for this section should be read from
288    lldb::SectionType m_type;           // The type of this section
289    lldb::SectionWP m_parent_wp;        // Weak pointer to parent section
290    ConstString     m_name;             // Name of this section
291    lldb::addr_t    m_file_addr;        // The absolute file virtual address range of this section if m_parent == NULL,
292                                        // offset from parent file virtual address if m_parent != NULL
293    lldb::addr_t    m_byte_size;        // Size in bytes that this section will occupy in memory at runtime
294    lldb::offset_t  m_file_offset;      // Object file offset (if any)
295    lldb::offset_t  m_file_size;        // Object file size (can be smaller than m_byte_size for zero filled sections...)
296    SectionList     m_children;         // Child sections
297    bool            m_fake:1,           // If true, then this section only can contain the address if one of its
298                                        // children contains an address. This allows for gaps between the children
299                                        // that are contained in the address range for this section, but do not produce
300                                        // hits unless the children contain the address.
301                    m_encrypted:1,      // Set to true if the contents are encrypted
302                    m_thread_specific:1;// This section is thread specific
303private:
304    DISALLOW_COPY_AND_ASSIGN (Section);
305};
306
307
308} // namespace lldb_private
309
310#endif  // liblldb_Section_h_
311