ABIMacOSX_arm64.h revision 360784
1178784Skmacy//===-- ABIMacOSX_arm64.h ---------------------------------------*- C++ -*-===// 2178784Skmacy// 3256829Snp// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4178784Skmacy// See https://llvm.org/LICENSE.txt for license information. 5178784Skmacy// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6178784Skmacy// 7178784Skmacy//===----------------------------------------------------------------------===// 8178784Skmacy 9178784Skmacy#ifndef liblldb_ABIMacOSX_arm64_h_ 10178784Skmacy#define liblldb_ABIMacOSX_arm64_h_ 11178784Skmacy 12178784Skmacy#include "lldb/Target/ABI.h" 13178784Skmacy#include "lldb/Utility/ConstString.h" 14178784Skmacy#include "lldb/lldb-private.h" 15178784Skmacy 16178784Skmacyclass ABIMacOSX_arm64 : public lldb_private::ABI { 17178784Skmacypublic: 18178784Skmacy ~ABIMacOSX_arm64() override = default; 19178784Skmacy 20178784Skmacy size_t GetRedZoneSize() const override; 21178784Skmacy 22178784Skmacy bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp, 23178784Skmacy lldb::addr_t functionAddress, 24178784Skmacy lldb::addr_t returnAddress, 25178784Skmacy llvm::ArrayRef<lldb::addr_t> args) const override; 26178784Skmacy 27178784Skmacy bool GetArgumentValues(lldb_private::Thread &thread, 28178784Skmacy lldb_private::ValueList &values) const override; 29178784Skmacy 30178784Skmacy bool 31178784Skmacy CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; 32178784Skmacy 33178784Skmacy bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; 34178784Skmacy 35178784Skmacy bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; 36178784Skmacy 37256829Snp // The arm64 ABI requires that stack frames be 16 byte aligned. 38256829Snp // When there is a trap handler on the stack, e.g. _sigtramp in userland 39256829Snp // code, we've seen that the stack pointer is often not aligned properly 40256829Snp // before the handler is invoked. This means that lldb will stop the unwind 41256829Snp // early -- before the function which caused the trap. 42256829Snp // 43256829Snp // To work around this, we relax that alignment to be just word-size 44256829Snp // (8-bytes). 45256829Snp // Whitelisting the trap handlers for user space would be easy (_sigtramp) but 46256829Snp // in other environments there can be a large number of different functions 47256829Snp // involved in async traps. 48256829Snp bool CallFrameAddressIsValid(lldb::addr_t cfa) override { 49256829Snp // Make sure the stack call frame addresses are are 8 byte aligned 50178784Skmacy if (cfa & (8ull - 1ull)) 51256829Snp return false; // Not 8 byte aligned 52178784Skmacy if (cfa == 0) 53256829Snp return false; // Zero is not a valid stack address 54237263Snp return true; 55178784Skmacy } 56256829Snp 57178784Skmacy bool CodeAddressIsValid(lldb::addr_t pc) override { 58178784Skmacy if (pc & (4ull - 1ull)) 59256829Snp return false; // Not 4 byte aligned 60256829Snp 61256829Snp // Anything else if fair game.. 62178784Skmacy return true; 63256829Snp } 64256829Snp 65256829Snp const lldb_private::RegisterInfo * 66178784Skmacy GetRegisterInfoArray(uint32_t &count) override; 67256829Snp 68256829Snp // Static Functions 69256829Snp 70256829Snp static void Initialize(); 71256829Snp 72256829Snp static void Terminate(); 73256829Snp 74256829Snp static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch); 75256829Snp 76256829Snp // PluginInterface protocol 77256829Snp 78256829Snp static lldb_private::ConstString GetPluginNameStatic(); 79256829Snp 80256829Snp lldb_private::ConstString GetPluginName() override { 81256829Snp return GetPluginNameStatic(); 82256829Snp } 83256829Snp 84178784Skmacy uint32_t GetPluginVersion() override; 85178784Skmacy 86178784Skmacy lldb_private::Status 87178784Skmacy SetReturnValueObject(lldb::StackFrameSP &frame_sp, 88178784Skmacy lldb::ValueObjectSP &new_value) override; 89178784Skmacy 90178784Skmacyprotected: 91178784Skmacy lldb::ValueObjectSP 92178784Skmacy GetReturnValueObjectImpl(lldb_private::Thread &thread, 93256829Snp lldb_private::CompilerType &ast_type) const override; 94256829Snp 95256829Snpprivate: 96256829Snp ABIMacOSX_arm64(lldb::ProcessSP process_sp, 97256829Snp std::unique_ptr<llvm::MCRegisterInfo> info_up) 98256829Snp : lldb_private::ABI(std::move(process_sp), std::move(info_up)) { 99256829Snp // Call CreateInstance instead. 100256829Snp } 101256829Snp}; 102256829Snp 103256829Snp#endif // liblldb_ABIMacOSX_arm64_h_ 104178784Skmacy