#include "lldb/Symbol/CompactUnwindInfo.h"
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/Section.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/UnwindPlan.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/DataBufferHeap.h"
#include "lldb/Utility/LLDBLog.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/StreamString.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <memory>
usingnamespacelldb;
usingnamespacelldb_private;
namespace lldb_private {
FLAGS_ANONYMOUS_ENUM(){ … };
FLAGS_ANONYMOUS_ENUM(){ … };
enum { … };
FLAGS_ANONYMOUS_ENUM(){ … };
enum { … };
FLAGS_ANONYMOUS_ENUM(){ … };
FLAGS_ANONYMOUS_ENUM(){ … };
}
#ifndef UNWIND_SECOND_LEVEL_REGULAR
#define UNWIND_SECOND_LEVEL_REGULAR …
#endif
#ifndef UNWIND_SECOND_LEVEL_COMPRESSED
#define UNWIND_SECOND_LEVEL_COMPRESSED …
#endif
#ifndef UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET
#define UNWIND_INFO_COMPRESSED_ENTRY_FUNC_OFFSET(entry) …
#endif
#ifndef UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX
#define UNWIND_INFO_COMPRESSED_ENTRY_ENCODING_INDEX(entry) …
#endif
#define EXTRACT_BITS(value, mask) …
CompactUnwindInfo::CompactUnwindInfo(ObjectFile &objfile, SectionSP §ion_sp)
: … { … }
CompactUnwindInfo::~CompactUnwindInfo() = default;
bool CompactUnwindInfo::GetUnwindPlan(Target &target, Address addr,
UnwindPlan &unwind_plan) { … }
bool CompactUnwindInfo::IsValid(const ProcessSP &process_sp) { … }
void CompactUnwindInfo::ScanIndex(const ProcessSP &process_sp) { … }
uint32_t CompactUnwindInfo::GetLSDAForFunctionOffset(uint32_t lsda_offset,
uint32_t lsda_count,
uint32_t function_offset) { … }
lldb::offset_t CompactUnwindInfo::BinarySearchRegularSecondPage(
uint32_t entry_page_offset, uint32_t entry_count, uint32_t function_offset,
uint32_t *entry_func_start_offset, uint32_t *entry_func_end_offset) { … }
uint32_t CompactUnwindInfo::BinarySearchCompressedSecondPage(
uint32_t entry_page_offset, uint32_t entry_count,
uint32_t function_offset_to_find, uint32_t function_offset_base,
uint32_t *entry_func_start_offset, uint32_t *entry_func_end_offset) { … }
bool CompactUnwindInfo::GetCompactUnwindInfoForFunction(
Target &target, Address address, FunctionInfo &unwind_info) { … }
enum x86_64_eh_regnum { … };
uint32_t translate_to_eh_frame_regnum_x86_64(uint32_t unwind_regno) { … }
bool CompactUnwindInfo::CreateUnwindPlan_x86_64(Target &target,
FunctionInfo &function_info,
UnwindPlan &unwind_plan,
Address pc_or_function_start) { … }
enum i386_eh_regnum { … };
uint32_t translate_to_eh_frame_regnum_i386(uint32_t unwind_regno) { … }
bool CompactUnwindInfo::CreateUnwindPlan_i386(Target &target,
FunctionInfo &function_info,
UnwindPlan &unwind_plan,
Address pc_or_function_start) { … }
enum arm64_eh_regnum { … };
enum arm_eh_regnum { … };
bool CompactUnwindInfo::CreateUnwindPlan_arm64(Target &target,
FunctionInfo &function_info,
UnwindPlan &unwind_plan,
Address pc_or_function_start) { … }
bool CompactUnwindInfo::CreateUnwindPlan_armv7(Target &target,
FunctionInfo &function_info,
UnwindPlan &unwind_plan,
Address pc_or_function_start) { … }