10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//===-- ABIMacOSX_arm.h ----------------------------------------*- C++ -*-===// 20529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// 30529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// The LLVM Compiler Infrastructure 40529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This file is distributed under the University of Illinois Open Source 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// License. See LICENSE.TXT for details. 70529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// 80529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch//===----------------------------------------------------------------------===// 90529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef liblldb_ABIMacOSX_arm_h_ 110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define liblldb_ABIMacOSX_arm_h_ 120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// C Includes 140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// C++ Includes 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Other libraries and framework includes 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Project includes 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "lldb/lldb-private.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "lldb/Target/ABI.h" 19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass ABIMacOSX_arm : public lldb_private::ABI 21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles){ 220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic: 230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ~ABIMacOSX_arm() { } 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual size_t 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetRedZoneSize () const; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrepareTrivialCall (lldb_private::Thread &thread, 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t sp, 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t func_addr, 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t returnAddress, 330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t *arg1_ptr = NULL, 340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t *arg2_ptr = NULL, 350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t *arg3_ptr = NULL, 360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t *arg4_ptr = NULL, 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) lldb::addr_t *arg5_ptr = NULL, 380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb::addr_t *arg6_ptr = NULL) const; 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetArgumentValues (lldb_private::Thread &thread, 420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb_private::ValueList &values) const; 430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual lldb_private::Error 450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value); 460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochprotected: 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual lldb::ValueObjectSP 490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetReturnValueObjectImpl (lldb_private::Thread &thread, 500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb_private::ClangASTType &ast_type) const; 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic: 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan); 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool 570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan); 580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info); 610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch StackUsesFrames () 640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CallFrameAddressIsValid (lldb::addr_t cfa) 700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Make sure the stack call frame addresses are are 4 byte aligned 720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (cfa & (4ull - 1ull)) 730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; // Not 4 byte aligned 740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (cfa == 0) 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; // Zero is not a valid stack address 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CodeAddressIsValid (lldb::addr_t pc) 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Just make sure the address is a valid 32 bit address. Bit zero 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // might be set due to Thumb function calls, so don't enforce 2 byte 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // alignment 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return pc <= UINT32_MAX; 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual lldb::addr_t 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FixCodeAddress (lldb::addr_t pc) 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // ARM uses bit zero to signify a code address is thumb, so we must 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // strip bit zero in any code addresses. 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return pc & ~(lldb::addr_t)1; 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FunctionCallsChangeCFA () 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch { 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return false; 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual const lldb_private::RegisterInfo * 103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetRegisterInfoArray (uint32_t &count); 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) //------------------------------------------------------------------ 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Static Functions 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) //------------------------------------------------------------------ 108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static void 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Initialize(); 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static void 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Terminate(); 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static lldb::ABISP 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateInstance (const lldb_private::ArchSpec &arch); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static lldb_private::ConstString 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GetPluginNameStatic(); 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch //------------------------------------------------------------------ 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // PluginInterface protocol 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch //------------------------------------------------------------------ 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual lldb_private::ConstString 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetPluginName(); 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual uint32_t 127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GetPluginVersion(); 1280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)protected: 1300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochprivate: 1310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ABIMacOSX_arm() : 1320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch lldb_private::ABI() 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) { 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Call CreateInstance instead. 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // liblldb_ABIMacOSX_arm_h_ 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch