15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===-- DWARFDebugAranges.h -------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SymbolFileDWARF_DWARFDebugAranges_h_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SymbolFileDWARF_DWARFDebugAranges_h_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "DWARFDebugArangeSet.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <list>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "lldb/Core/RangeMap.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SymbolFileDWARF;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DWARFDebugAranges
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef lldb_private::RangeDataArray<dw_addr_t, uint32_t, dw_offset_t, 1> RangeToDIE;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    typedef RangeToDIE::Entry Range;
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    typedef std::vector<RangeToDIE::Entry> RangeColl;
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    DWARFDebugAranges();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clear()
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_aranges.Clear();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Extract(const lldb_private::DataExtractor &debug_aranges_data);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Generate(SymbolFileDWARF* dwarf2Data);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                // Use append range multiple times and then call sort
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AppendRange (dw_offset_t cu_offset,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 dw_addr_t low_pc,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 dw_addr_t high_pc);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Sort (bool minimize);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Range*
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RangeAtIndex(uint32_t idx) const
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_aranges.GetEntryAtIndex (idx);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dump (lldb_private::Log *log) const;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dw_offset_t
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FindAddress(dw_addr_t address) const;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsEmpty() const
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_aranges.IsEmpty();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetNumRanges() const
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_aranges.GetSize();
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dw_offset_t
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OffsetAtIndex(uint32_t idx) const
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const Range *range = m_aranges.GetEntryAtIndex (idx);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (range)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return range->data;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return DW_INVALID_OFFSET;
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    static void
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Dump(SymbolFileDWARF* dwarf2Data, lldb_private::Stream *s);
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RangeToDIE m_aranges;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // SymbolFileDWARF_DWARFDebugAranges_h_
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)