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