10b57cec5SDimitry Andric //===-- ArmUnwindInfo.h -----------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #ifndef LLDB_SYMBOL_ARMUNWINDINFO_H 100b57cec5SDimitry Andric #define LLDB_SYMBOL_ARMUNWINDINFO_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h" 130b57cec5SDimitry Andric #include "lldb/Utility/DataExtractor.h" 140b57cec5SDimitry Andric #include "lldb/Utility/RangeMap.h" 150b57cec5SDimitry Andric #include "lldb/lldb-private.h" 160b57cec5SDimitry Andric #include <vector> 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric /* 190b57cec5SDimitry Andric * Unwind information reader and parser for the ARM exception handling ABI 200b57cec5SDimitry Andric * 210b57cec5SDimitry Andric * Implemented based on: 220b57cec5SDimitry Andric * Exception Handling ABI for the ARM Architecture 230b57cec5SDimitry Andric * Document number: ARM IHI 0038A (current through ABI r2.09) 240b57cec5SDimitry Andric * Date of Issue: 25th January 2007, reissued 30th November 2012 250b57cec5SDimitry Andric * http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038a/IHI0038A_ehabi.pdf 260b57cec5SDimitry Andric */ 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric namespace lldb_private { 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric class ArmUnwindInfo { 310b57cec5SDimitry Andric public: 320b57cec5SDimitry Andric ArmUnwindInfo(ObjectFile &objfile, lldb::SectionSP &arm_exidx, 330b57cec5SDimitry Andric lldb::SectionSP &arm_extab); 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric ~ArmUnwindInfo(); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric bool GetUnwindPlan(Target &target, const Address &addr, 380b57cec5SDimitry Andric UnwindPlan &unwind_plan); 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric private: 410b57cec5SDimitry Andric struct ArmExidxEntry { 420b57cec5SDimitry Andric ArmExidxEntry(uint32_t f, lldb::addr_t a, uint32_t d); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric bool operator<(const ArmExidxEntry &other) const; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric uint32_t file_address; 470b57cec5SDimitry Andric lldb::addr_t address; 480b57cec5SDimitry Andric uint32_t data; 490b57cec5SDimitry Andric }; 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric const uint8_t *GetExceptionHandlingTableEntry(const Address &addr); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric uint8_t GetByteAtOffset(const uint32_t *data, uint16_t offset) const; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric uint64_t GetULEB128(const uint32_t *data, uint16_t &offset, 560b57cec5SDimitry Andric uint16_t max_offset) const; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric const lldb::ByteOrder m_byte_order; 590b57cec5SDimitry Andric lldb::SectionSP m_arm_exidx_sp; // .ARM.exidx section 600b57cec5SDimitry Andric lldb::SectionSP m_arm_extab_sp; // .ARM.extab section 610b57cec5SDimitry Andric DataExtractor m_arm_exidx_data; // .ARM.exidx section data 620b57cec5SDimitry Andric DataExtractor m_arm_extab_data; // .ARM.extab section data 630b57cec5SDimitry Andric std::vector<ArmExidxEntry> m_exidx_entries; 640b57cec5SDimitry Andric }; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric } // namespace lldb_private 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric #endif // LLDB_SYMBOL_ARMUNWINDINFO_H 69