1 //===-- ABIWindows_x86_64.h ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H 10 #define LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H 11 12 #include "Plugins/ABI/X86/ABIX86_64.h" 13 14 class ABIWindows_x86_64 : public ABIX86_64 { 15 public: 16 ~ABIWindows_x86_64() override = default; 17 18 size_t GetRedZoneSize() const override; 19 20 bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp, 21 lldb::addr_t functionAddress, 22 lldb::addr_t returnAddress, 23 llvm::ArrayRef<lldb::addr_t> args) const override; 24 25 bool GetArgumentValues(lldb_private::Thread &thread, 26 lldb_private::ValueList &values) const override; 27 28 lldb_private::Status 29 SetReturnValueObject(lldb::StackFrameSP &frame_sp, 30 lldb::ValueObjectSP &new_value) override; 31 32 lldb::ValueObjectSP 33 GetReturnValueObjectImpl(lldb_private::Thread &thread, 34 lldb_private::CompilerType &type) const override; 35 36 bool 37 CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; 38 39 bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; 40 41 bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; 42 43 // In Windows_x86_64 ABI, stack will always be maintained 16-byte aligned 44 bool CallFrameAddressIsValid(lldb::addr_t cfa) override { 45 if (cfa & (16ull - 1ull)) 46 return false; // Not 16 byte aligned 47 if (cfa == 0) 48 return false; // Zero is not a valid stack address 49 return true; 50 } 51 52 bool CodeAddressIsValid(lldb::addr_t pc) override { 53 // We have a 64 bit address space, so anything is valid as opcodes 54 // aren't fixed width... 55 return true; 56 } 57 58 bool GetPointerReturnRegister(const char *&name) override; 59 60 //------------------------------------------------------------------ 61 // Static Functions 62 //------------------------------------------------------------------ 63 64 static void Initialize(); 65 66 static void Terminate(); 67 68 static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch); 69 70 static llvm::StringRef GetPluginNameStatic() { return "windows-x86_64"; } 71 72 //------------------------------------------------------------------ 73 // PluginInterface protocol 74 //------------------------------------------------------------------ 75 76 llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 77 78 protected: 79 void CreateRegisterMapIfNeeded(); 80 81 lldb::ValueObjectSP 82 GetReturnValueObjectSimple(lldb_private::Thread &thread, 83 lldb_private::CompilerType &ast_type) const; 84 85 bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info); 86 uint32_t GetGenericNum(llvm::StringRef reg) override; 87 88 private: 89 using ABIX86_64::ABIX86_64; // Call CreateInstance instead. 90 }; 91 92 #endif // LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H 93