ABIMacOSX_arm.h revision 263367
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 20class ABIMacOSX_arm : public lldb_private::ABI 21{ 22public: 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 42protected: 43 virtual lldb::ValueObjectSP 44 GetReturnValueObjectImpl (lldb_private::Thread &thread, 45 lldb_private::ClangASTType &ast_type) const; 46 47public: 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 58 StackUsesFrames () 59 { 60 return true; 61 } 62 63 virtual bool 64 CallFrameAddressIsValid (lldb::addr_t cfa) 65 { 66 // Make sure the stack call frame addresses are are 4 byte aligned 67 if (cfa & (4ull - 1ull)) 68 return false; // Not 4 byte aligned 69 if (cfa == 0) 70 return false; // Zero is not a valid stack address 71 return true; 72 } 73 74 virtual bool 75 CodeAddressIsValid (lldb::addr_t pc) 76 { 77 // Just make sure the address is a valid 32 bit address. Bit zero 78 // might be set due to Thumb function calls, so don't enforce 2 byte 79 // alignment 80 return pc <= UINT32_MAX; 81 } 82 83 virtual lldb::addr_t 84 FixCodeAddress (lldb::addr_t pc) 85 { 86 // ARM uses bit zero to signify a code address is thumb, so we must 87 // strip bit zero in any code addresses. 88 return pc & ~(lldb::addr_t)1; 89 } 90 91 virtual bool 92 FunctionCallsChangeCFA () 93 { 94 return false; 95 } 96 97 virtual const lldb_private::RegisterInfo * 98 GetRegisterInfoArray (uint32_t &count); 99 100 //------------------------------------------------------------------ 101 // Static Functions 102 //------------------------------------------------------------------ 103 static void 104 Initialize(); 105 106 static void 107 Terminate(); 108 109 static lldb::ABISP 110 CreateInstance (const lldb_private::ArchSpec &arch); 111 112 static lldb_private::ConstString 113 GetPluginNameStatic(); 114 115 //------------------------------------------------------------------ 116 // PluginInterface protocol 117 //------------------------------------------------------------------ 118 virtual lldb_private::ConstString 119 GetPluginName(); 120 121 virtual uint32_t 122 GetPluginVersion(); 123 124protected: 125private: 126 ABIMacOSX_arm() : 127 lldb_private::ABI() 128 { 129 // Call CreateInstance instead. 130 } 131}; 132 133#endif // liblldb_ABIMacOSX_arm_h_ 134