1 //===-- ABIMacOSX_arm.h ----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_ABIMacOSX_arm_h_ 11 #define liblldb_ABIMacOSX_arm_h_ 12 13 // C Includes 14 // C++ Includes 15 // Other libraries and framework includes 16 // Project includes 17 #include "lldb/lldb-private.h" 18 #include "lldb/Target/ABI.h" 19 20 class ABIMacOSX_arm : public lldb_private::ABI 21 { 22 public: ~ABIMacOSX_arm()23 ~ABIMacOSX_arm() { } 24 25 virtual size_t 26 GetRedZoneSize () const; 27 28 virtual bool 29 PrepareTrivialCall (lldb_private::Thread &thread, 30 lldb::addr_t sp, 31 lldb::addr_t func_addr, 32 lldb::addr_t returnAddress, 33 llvm::ArrayRef<lldb::addr_t> args) const; 34 35 virtual bool 36 GetArgumentValues (lldb_private::Thread &thread, 37 lldb_private::ValueList &values) const; 38 39 virtual lldb_private::Error 40 SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value); 41 42 protected: 43 virtual lldb::ValueObjectSP 44 GetReturnValueObjectImpl (lldb_private::Thread &thread, 45 lldb_private::ClangASTType &ast_type) const; 46 47 public: 48 virtual bool 49 CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan); 50 51 virtual bool 52 CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan); 53 54 virtual bool 55 RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info); 56 57 virtual bool CallFrameAddressIsValid(lldb::addr_t cfa)58 CallFrameAddressIsValid (lldb::addr_t cfa) 59 { 60 // Make sure the stack call frame addresses are are 4 byte aligned 61 if (cfa & (4ull - 1ull)) 62 return false; // Not 4 byte aligned 63 if (cfa == 0) 64 return false; // Zero is not a valid stack address 65 return true; 66 } 67 68 virtual bool CodeAddressIsValid(lldb::addr_t pc)69 CodeAddressIsValid (lldb::addr_t pc) 70 { 71 // Just make sure the address is a valid 32 bit address. Bit zero 72 // might be set due to Thumb function calls, so don't enforce 2 byte 73 // alignment 74 return pc <= UINT32_MAX; 75 } 76 77 virtual lldb::addr_t FixCodeAddress(lldb::addr_t pc)78 FixCodeAddress (lldb::addr_t pc) 79 { 80 // ARM uses bit zero to signify a code address is thumb, so we must 81 // strip bit zero in any code addresses. 82 return pc & ~(lldb::addr_t)1; 83 } 84 85 virtual const lldb_private::RegisterInfo * 86 GetRegisterInfoArray (uint32_t &count); 87 88 //------------------------------------------------------------------ 89 // Static Functions 90 //------------------------------------------------------------------ 91 static void 92 Initialize(); 93 94 static void 95 Terminate(); 96 97 static lldb::ABISP 98 CreateInstance (const lldb_private::ArchSpec &arch); 99 100 static lldb_private::ConstString 101 GetPluginNameStatic(); 102 103 //------------------------------------------------------------------ 104 // PluginInterface protocol 105 //------------------------------------------------------------------ 106 virtual lldb_private::ConstString 107 GetPluginName(); 108 109 virtual uint32_t 110 GetPluginVersion(); 111 112 protected: 113 private: ABIMacOSX_arm()114 ABIMacOSX_arm() : 115 lldb_private::ABI() 116 { 117 // Call CreateInstance instead. 118 } 119 }; 120 121 #endif // liblldb_ABIMacOSX_arm_h_ 122