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