diff options
Diffstat (limited to 'include/lldb/Symbol/FuncUnwinders.h')
-rw-r--r-- | include/lldb/Symbol/FuncUnwinders.h | 231 |
1 files changed, 113 insertions, 118 deletions
diff --git a/include/lldb/Symbol/FuncUnwinders.h b/include/lldb/Symbol/FuncUnwinders.h index 6d5991cc2b33..a5b9b801e033 100644 --- a/include/lldb/Symbol/FuncUnwinders.h +++ b/include/lldb/Symbol/FuncUnwinders.h @@ -5,157 +5,152 @@ #include <vector> #include "lldb/Core/AddressRange.h" -#include "lldb/Core/ArchSpec.h" #include "lldb/Core/AddressRange.h" +#include "lldb/Core/ArchSpec.h" namespace lldb_private { class UnwindTable; -class FuncUnwinders -{ +class FuncUnwinders { public: - // FuncUnwinders objects are used to track UnwindPlans for a function - // (named or not - really just an address range) - - // We'll record four different UnwindPlans for each address range: - // - // 1. Unwinding from a call site (a valid exception throw location) - // This is often sourced from the eh_frame exception handling info - // 2. Unwinding from a non-call site (any location in the function) - // This is often done by analyzing the function prologue assembly - // language instructions - // 3. A fast unwind method for this function which only retrieves a - // limited set of registers necessary to walk the stack - // 4. An architectural default unwind plan when none of the above are - // available for some reason. + // FuncUnwinders objects are used to track UnwindPlans for a function + // (named or not - really just an address range) - // Additionally, FuncUnwinds object can be asked where the prologue - // instructions are finished for migrating breakpoints past the - // stack frame setup instructions when we don't have line table information. + // We'll record four different UnwindPlans for each address range: + // + // 1. Unwinding from a call site (a valid exception throw location) + // This is often sourced from the eh_frame exception handling info + // 2. Unwinding from a non-call site (any location in the function) + // This is often done by analyzing the function prologue assembly + // language instructions + // 3. A fast unwind method for this function which only retrieves a + // limited set of registers necessary to walk the stack + // 4. An architectural default unwind plan when none of the above are + // available for some reason. - FuncUnwinders (lldb_private::UnwindTable& unwind_table, AddressRange range); + // Additionally, FuncUnwinds object can be asked where the prologue + // instructions are finished for migrating breakpoints past the + // stack frame setup instructions when we don't have line table information. - ~FuncUnwinders (); + FuncUnwinders(lldb_private::UnwindTable &unwind_table, AddressRange range); - // current_offset is the byte offset into the function. - // 0 means no instructions have executed yet. -1 means the offset is unknown. - // On architectures where the pc points to the next instruction that will execute, this - // offset value will have already been decremented by 1 to stay within the bounds of the - // correct function body. - lldb::UnwindPlanSP - GetUnwindPlanAtCallSite (Target &target, int current_offset); + ~FuncUnwinders(); - lldb::UnwindPlanSP - GetUnwindPlanAtNonCallSite (Target& target, lldb_private::Thread& thread, int current_offset); + // current_offset is the byte offset into the function. + // 0 means no instructions have executed yet. -1 means the offset is unknown. + // On architectures where the pc points to the next instruction that will + // execute, this + // offset value will have already been decremented by 1 to stay within the + // bounds of the + // correct function body. + lldb::UnwindPlanSP GetUnwindPlanAtCallSite(Target &target, + int current_offset); - lldb::UnwindPlanSP - GetUnwindPlanFastUnwind (Target& target, lldb_private::Thread& thread); + lldb::UnwindPlanSP GetUnwindPlanAtNonCallSite(Target &target, + lldb_private::Thread &thread, + int current_offset); - lldb::UnwindPlanSP - GetUnwindPlanArchitectureDefault (lldb_private::Thread& thread); + lldb::UnwindPlanSP GetUnwindPlanFastUnwind(Target &target, + lldb_private::Thread &thread); - lldb::UnwindPlanSP - GetUnwindPlanArchitectureDefaultAtFunctionEntry (lldb_private::Thread& thread); + lldb::UnwindPlanSP + GetUnwindPlanArchitectureDefault(lldb_private::Thread &thread); - Address& - GetFirstNonPrologueInsn (Target& target); + lldb::UnwindPlanSP + GetUnwindPlanArchitectureDefaultAtFunctionEntry(lldb_private::Thread &thread); - const Address& - GetFunctionStartAddress () const; + Address &GetFirstNonPrologueInsn(Target &target); - bool - ContainsAddress (const Address& addr) const - { - return m_range.ContainsFileAddress (addr); - } + const Address &GetFunctionStartAddress() const; - // A function may have a Language Specific Data Area specified -- a block of data in - // the object file which is used in the processing of an exception throw / catch. - // If any of the UnwindPlans have the address of the LSDA region for this function, - // this will return it. - Address - GetLSDAAddress (Target &target); + bool ContainsAddress(const Address &addr) const { + return m_range.ContainsFileAddress(addr); + } - // A function may have a Personality Routine associated with it -- used in the - // processing of throwing an exception. If any of the UnwindPlans have the - // address of the personality routine, this will return it. Read the target-pointer - // at this address to get the personality function address. - Address - GetPersonalityRoutinePtrAddress (Target &target); + // A function may have a Language Specific Data Area specified -- a block of + // data in + // the object file which is used in the processing of an exception throw / + // catch. + // If any of the UnwindPlans have the address of the LSDA region for this + // function, + // this will return it. + Address GetLSDAAddress(Target &target); + // A function may have a Personality Routine associated with it -- used in the + // processing of throwing an exception. If any of the UnwindPlans have the + // address of the personality routine, this will return it. Read the + // target-pointer + // at this address to get the personality function address. + Address GetPersonalityRoutinePtrAddress(Target &target); + // The following methods to retrieve specific unwind plans should rarely be + // used. + // Instead, clients should ask for the *behavior* they are looking for, using + // one + // of the above UnwindPlan retrieval methods. - // The following methods to retrieve specific unwind plans should rarely be used. - // Instead, clients should ask for the *behavior* they are looking for, using one - // of the above UnwindPlan retrieval methods. + lldb::UnwindPlanSP GetAssemblyUnwindPlan(Target &target, Thread &thread, + int current_offset); - lldb::UnwindPlanSP - GetAssemblyUnwindPlan (Target &target, Thread &thread, int current_offset); + lldb::UnwindPlanSP GetEHFrameUnwindPlan(Target &target, int current_offset); - lldb::UnwindPlanSP - GetEHFrameUnwindPlan (Target &target, int current_offset); + lldb::UnwindPlanSP GetEHFrameAugmentedUnwindPlan(Target &target, + Thread &thread, + int current_offset); - lldb::UnwindPlanSP - GetEHFrameAugmentedUnwindPlan (Target &target, Thread &thread, int current_offset); + lldb::UnwindPlanSP GetCompactUnwindUnwindPlan(Target &target, + int current_offset); - lldb::UnwindPlanSP - GetCompactUnwindUnwindPlan (Target &target, int current_offset); + lldb::UnwindPlanSP GetArmUnwindUnwindPlan(Target &target, int current_offset); - lldb::UnwindPlanSP - GetArmUnwindUnwindPlan (Target &target, int current_offset); + lldb::UnwindPlanSP GetArchDefaultUnwindPlan(Thread &thread); - lldb::UnwindPlanSP - GetArchDefaultUnwindPlan (Thread &thread); - - lldb::UnwindPlanSP - GetArchDefaultAtFuncEntryUnwindPlan (Thread &thread); + lldb::UnwindPlanSP GetArchDefaultAtFuncEntryUnwindPlan(Thread &thread); private: - - lldb::UnwindAssemblySP - GetUnwindAssemblyProfiler (Target& target); - - // Do a simplistic comparison for the register restore rule for getting - // the caller's pc value on two UnwindPlans -- returns LazyBoolYes if - // they have the same unwind rule for the pc, LazyBoolNo if they do not - // have the same unwind rule for the pc, and LazyBoolCalculate if it was - // unable to determine this for some reason. - lldb_private::LazyBool - CompareUnwindPlansForIdenticalInitialPCLocation (Thread& thread, const lldb::UnwindPlanSP &a, const lldb::UnwindPlanSP &b); - - UnwindTable& m_unwind_table; - AddressRange m_range; - - std::recursive_mutex m_mutex; - - lldb::UnwindPlanSP m_unwind_plan_assembly_sp; - lldb::UnwindPlanSP m_unwind_plan_eh_frame_sp; - lldb::UnwindPlanSP m_unwind_plan_eh_frame_augmented_sp; // augmented by assembly inspection so it's valid everywhere - std::vector<lldb::UnwindPlanSP> m_unwind_plan_compact_unwind; - lldb::UnwindPlanSP m_unwind_plan_arm_unwind_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; - - // Fetching the UnwindPlans can be expensive - if we've already attempted - // to get one & failed, don't try again. - bool m_tried_unwind_plan_assembly:1, - m_tried_unwind_plan_eh_frame:1, - m_tried_unwind_plan_eh_frame_augmented:1, - m_tried_unwind_plan_compact_unwind:1, - m_tried_unwind_plan_arm_unwind: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); + lldb::UnwindAssemblySP GetUnwindAssemblyProfiler(Target &target); + + // Do a simplistic comparison for the register restore rule for getting + // the caller's pc value on two UnwindPlans -- returns LazyBoolYes if + // they have the same unwind rule for the pc, LazyBoolNo if they do not + // have the same unwind rule for the pc, and LazyBoolCalculate if it was + // unable to determine this for some reason. + lldb_private::LazyBool CompareUnwindPlansForIdenticalInitialPCLocation( + Thread &thread, const lldb::UnwindPlanSP &a, const lldb::UnwindPlanSP &b); + + UnwindTable &m_unwind_table; + AddressRange m_range; + + std::recursive_mutex m_mutex; + + lldb::UnwindPlanSP m_unwind_plan_assembly_sp; + lldb::UnwindPlanSP m_unwind_plan_eh_frame_sp; + lldb::UnwindPlanSP m_unwind_plan_eh_frame_augmented_sp; // augmented by + // assembly inspection + // so it's valid + // everywhere + std::vector<lldb::UnwindPlanSP> m_unwind_plan_compact_unwind; + lldb::UnwindPlanSP m_unwind_plan_arm_unwind_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; + + // Fetching the UnwindPlans can be expensive - if we've already attempted + // to get one & failed, don't try again. + bool m_tried_unwind_plan_assembly : 1, m_tried_unwind_plan_eh_frame : 1, + m_tried_unwind_plan_eh_frame_augmented : 1, + m_tried_unwind_plan_compact_unwind : 1, + m_tried_unwind_plan_arm_unwind : 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); }; // class FuncUnwinders } // namespace lldb_private - -#endif //liblldb_FuncUnwinders_h +#endif // liblldb_FuncUnwinders_h |