124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DWARFDebugAranges.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
10144188bc458a35997d2f2e52206ab69747439073Greg Clayton#ifndef SymbolFileDWARF_DWARFDebugAranges_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define SymbolFileDWARF_DWARFDebugAranges_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DWARFDebugArangeSet.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <list>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16257663e753af15633e48c7b00eb7b5880168090bGreg Clayton#include "lldb/Core/RangeMap.h"
17257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SymbolFileDWARF;
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DWARFDebugAranges
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22257663e753af15633e48c7b00eb7b5880168090bGreg Claytonprotected:
23be42123fa214b039b86ad152bd21d910db7a7af2Greg Clayton    typedef lldb_private::RangeDataArray<dw_addr_t, uint32_t, dw_offset_t, 1> RangeToDIE;
24257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
26257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    typedef RangeToDIE::Entry Range;
27257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    typedef std::vector<RangeToDIE::Entry> RangeColl;
28257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
29257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    DWARFDebugAranges();
30257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
31257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    void
32257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Clear()
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        m_aranges.Clear();
35257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    }
36257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
37257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    bool
38257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Extract(const lldb_private::DataExtractor &debug_aranges_data);
39257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
40257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    bool
41257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Generate(SymbolFileDWARF* dwarf2Data);
42178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
43178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton                // Use append range multiple times and then call sort
44257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    void
45257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    AppendRange (dw_offset_t cu_offset,
46257663e753af15633e48c7b00eb7b5880168090bGreg Clayton                 dw_addr_t low_pc,
47257663e753af15633e48c7b00eb7b5880168090bGreg Clayton                 dw_addr_t high_pc);
48257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
49257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    void
50257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Sort (bool minimize);
51257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
52257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    const Range*
53257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    RangeAtIndex(uint32_t idx) const
54257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    {
55257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        return m_aranges.GetEntryAtIndex (idx);
56257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    }
57257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
58257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    void
59257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Dump (lldb_private::Log *log) const;
60257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
61257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    dw_offset_t
62257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    FindAddress(dw_addr_t address) const;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    bool
65257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    IsEmpty() const
66257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    {
67257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        return m_aranges.IsEmpty();
68257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    }
6936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t
70257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    GetNumRanges() const
71257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    {
72bc36a861b8e0b2f2dde34f27c9fa9629a357d598Greg Clayton        return m_aranges.GetSize();
73257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    }
74257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
75257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    dw_offset_t
76257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    OffsetAtIndex(uint32_t idx) const
77257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    {
78257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        const Range *range = m_aranges.GetEntryAtIndex (idx);
79257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        if (range)
80257663e753af15633e48c7b00eb7b5880168090bGreg Clayton            return range->data;
81257663e753af15633e48c7b00eb7b5880168090bGreg Clayton        return DW_INVALID_OFFSET;
82257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    }
83257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
84257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    static void
85257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    Dump(SymbolFileDWARF* dwarf2Data, lldb_private::Stream *s);
86257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
89257663e753af15633e48c7b00eb7b5880168090bGreg Clayton
90257663e753af15633e48c7b00eb7b5880168090bGreg Clayton    RangeToDIE m_aranges;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // SymbolFileDWARF_DWARFDebugAranges_h_
95