1 //===-- ABISysV_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_ABISysV_arm_h_ 11 #define liblldb_ABISysV_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 ABISysV_arm : public lldb_private::ABI 21 { 22 public: ~ABISysV_arm()23 ~ABISysV_arm() { } 24 25 size_t 26 GetRedZoneSize () const override; 27 28 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 override; 34 35 bool 36 GetArgumentValues (lldb_private::Thread &thread, 37 lldb_private::ValueList &values) const override; 38 39 lldb_private::Error 40 SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override; 41 42 protected: 43 lldb::ValueObjectSP 44 GetReturnValueObjectImpl (lldb_private::Thread &thread, 45 lldb_private::ClangASTType &ast_type) const override; 46 47 public: 48 bool 49 CreateFunctionEntryUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override; 50 51 bool 52 CreateDefaultUnwindPlan (lldb_private::UnwindPlan &unwind_plan) override; 53 54 bool 55 RegisterIsVolatile (const lldb_private::RegisterInfo *reg_info) override; 56 57 bool CallFrameAddressIsValid(lldb::addr_t cfa)58 CallFrameAddressIsValid (lldb::addr_t cfa) override 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 bool CodeAddressIsValid(lldb::addr_t pc)69 CodeAddressIsValid (lldb::addr_t pc) override 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 lldb::addr_t FixCodeAddress(lldb::addr_t pc)78 FixCodeAddress (lldb::addr_t pc) override 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 const lldb_private::RegisterInfo * 86 GetRegisterInfoArray (uint32_t &count) override; 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 lldb_private::ConstString 107 GetPluginName() override; 108 109 uint32_t 110 GetPluginVersion() override; 111 112 protected: 113 private: ABISysV_arm()114 ABISysV_arm() : 115 lldb_private::ABI() 116 { 117 // Call CreateInstance instead. 118 } 119 }; 120 121 #endif // liblldb_ABISysV_arm_h_ 122