1351290Sdim//===-- ABIWindows_x86_64.h ----------------------------------------*- C++ -*-===//
2351290Sdim//
3351290Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4351290Sdim// See https://llvm.org/LICENSE.txt for license information.
5351290Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6351290Sdim//
7351290Sdim//===----------------------------------------------------------------------===//
8351290Sdim
9351290Sdim#ifndef liblldb_ABIWindows_x86_64_h_
10351290Sdim#define liblldb_ABIWindows_x86_64_h_
11351290Sdim
12351290Sdim#include "lldb/Target/ABI.h"
13351290Sdim#include "lldb/lldb-private.h"
14351290Sdim
15351290Sdimclass ABIWindows_x86_64 : public lldb_private::ABI {
16351290Sdimpublic:
17351290Sdim  ~ABIWindows_x86_64() override = default;
18351290Sdim
19351290Sdim  size_t GetRedZoneSize() const override;
20351290Sdim
21351290Sdim  bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,
22351290Sdim                          lldb::addr_t functionAddress,
23351290Sdim                          lldb::addr_t returnAddress,
24351290Sdim                          llvm::ArrayRef<lldb::addr_t> args) const override;
25351290Sdim
26351290Sdim  bool GetArgumentValues(lldb_private::Thread &thread,
27351290Sdim                         lldb_private::ValueList &values) const override;
28351290Sdim
29351290Sdim  lldb_private::Status
30351290Sdim  SetReturnValueObject(lldb::StackFrameSP &frame_sp,
31351290Sdim                       lldb::ValueObjectSP &new_value) override;
32351290Sdim
33351290Sdim  lldb::ValueObjectSP
34351290Sdim  GetReturnValueObjectImpl(lldb_private::Thread &thread,
35351290Sdim                           lldb_private::CompilerType &type) const override;
36351290Sdim
37351290Sdim  bool
38351290Sdim  CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
39351290Sdim
40351290Sdim  bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
41351290Sdim
42351290Sdim  bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
43351290Sdim
44351290Sdim  // In Windows_x86_64 ABI, stack will always be maintained 16-byte aligned
45351290Sdim  bool CallFrameAddressIsValid(lldb::addr_t cfa) override {
46351290Sdim	  if (cfa & (16ull - 1ull))
47351290Sdim      return false; // Not 16 byte aligned
48351290Sdim    if (cfa == 0)
49351290Sdim      return false; // Zero is not a valid stack address
50351290Sdim    return true;
51351290Sdim  }
52351290Sdim
53351290Sdim  bool CodeAddressIsValid(lldb::addr_t pc) override {
54351290Sdim    // We have a 64 bit address space, so anything is valid as opcodes
55351290Sdim    // aren't fixed width...
56351290Sdim    return true;
57351290Sdim  }
58351290Sdim
59351290Sdim  const lldb_private::RegisterInfo *
60351290Sdim  GetRegisterInfoArray(uint32_t &count) override;
61351290Sdim
62351290Sdim  bool GetPointerReturnRegister(const char *&name) override;
63351290Sdim
64351290Sdim  //------------------------------------------------------------------
65351290Sdim  // Static Functions
66351290Sdim  //------------------------------------------------------------------
67351290Sdim
68351290Sdim  static void Initialize();
69351290Sdim
70351290Sdim  static void Terminate();
71351290Sdim
72351290Sdim  static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch);
73351290Sdim
74351290Sdim  static lldb_private::ConstString GetPluginNameStatic();
75351290Sdim
76351290Sdim  //------------------------------------------------------------------
77351290Sdim  // PluginInterface protocol
78351290Sdim  //------------------------------------------------------------------
79351290Sdim
80351290Sdim  lldb_private::ConstString GetPluginName() override;
81351290Sdim
82351290Sdim  uint32_t GetPluginVersion() override;
83351290Sdim
84351290Sdimprotected:
85351290Sdim  void CreateRegisterMapIfNeeded();
86351290Sdim
87351290Sdim  lldb::ValueObjectSP
88351290Sdim  GetReturnValueObjectSimple(lldb_private::Thread &thread,
89351290Sdim                             lldb_private::CompilerType &ast_type) const;
90351290Sdim
91351290Sdim  bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
92351290Sdim
93351290Sdimprivate:
94360784Sdim  ABIWindows_x86_64(lldb::ProcessSP process_sp,
95360784Sdim                    std::unique_ptr<llvm::MCRegisterInfo> info_up)
96360784Sdim      : lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
97351290Sdim    // Call CreateInstance instead.
98351290Sdim  }
99351290Sdim};
100351290Sdim
101351290Sdim#endif // liblldb_ABISysV_x86_64_h_
102