#ifndef liblldb_FuncUnwinders_h
#define liblldb_FuncUnwinders_h
#include <memory>
#include "lldb/Core/AddressRange.h"
#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/AddressRange.h"
#include "lldb/Host/Mutex.h"
namespace lldb_private {
class UnwindTable;
class FuncUnwinders
{
public:
FuncUnwinders (lldb_private::UnwindTable& unwind_table, lldb_private::UnwindAssembly *assembly_profiler, AddressRange range);
~FuncUnwinders ();
lldb::UnwindPlanSP
GetUnwindPlanAtCallSite (int current_offset);
lldb::UnwindPlanSP
GetUnwindPlanAtNonCallSite (lldb_private::Thread& thread);
lldb::UnwindPlanSP
GetUnwindPlanFastUnwind (lldb_private::Thread& Thread);
lldb::UnwindPlanSP
GetUnwindPlanArchitectureDefault (lldb_private::Thread& thread);
lldb::UnwindPlanSP
GetUnwindPlanArchitectureDefaultAtFunctionEntry (lldb_private::Thread& thread);
Address&
GetFirstNonPrologueInsn (Target& target);
const Address&
GetFunctionStartAddress () const;
bool
ContainsAddress (const Address& addr) const
{
return m_range.ContainsFileAddress (addr);
}
void
InvalidateNonCallSiteUnwindPlan (lldb_private::Thread& Thread);
private:
UnwindTable& m_unwind_table;
UnwindAssembly *m_assembly_profiler;
AddressRange m_range;
Mutex m_mutex;
lldb::UnwindPlanSP m_unwind_plan_call_site_sp;
lldb::UnwindPlanSP m_unwind_plan_non_call_site_sp;
lldb::UnwindPlanSP m_unwind_plan_fast_sp;
lldb::UnwindPlanSP m_unwind_plan_arch_default_sp;
lldb::UnwindPlanSP m_unwind_plan_arch_default_at_func_entry_sp;
bool m_tried_unwind_at_call_site:1,
m_tried_unwind_at_non_call_site:1,
m_tried_unwind_fast:1,
m_tried_unwind_arch_default:1,
m_tried_unwind_arch_default_at_func_entry:1;
Address m_first_non_prologue_insn;
DISALLOW_COPY_AND_ASSIGN (FuncUnwinders);
};
}
#endif //liblldb_FuncUnwinders_h