brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 2485e4d Raw
97 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H10#define LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H11 12#include "Plugins/ABI/X86/ABIX86_64.h"13 14class ABIWindows_x86_64 : public ABIX86_64 {15public: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::Status29  SetReturnValueObject(lldb::StackFrameSP &frame_sp,30                       lldb::ValueObjectSP &new_value) override;31 32  lldb::ValueObjectSP33  GetReturnValueObjectImpl(lldb_private::Thread &thread,34                           lldb_private::CompilerType &type) const override;35 36  lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;37 38  lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;39 40  bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;41 42  // In Windows_x86_64 ABI requires that the stack will be maintained 16-byte43  // aligned.44  // When ntdll invokes callbacks such as KiUserExceptionDispatcher or45  // KiUserCallbackDispatcher, those functions won't have a properly 16-byte46  // aligned stack - but tolerate unwinding through them by relaxing the47  // requirement to 8 bytes.48  bool CallFrameAddressIsValid(lldb::addr_t cfa) override {49    if (cfa & (8ull - 1ull))50      return false; // Not 8 byte aligned51    if (cfa == 0)52      return false; // Zero is not a valid stack address53    return true;54  }55 56  bool CodeAddressIsValid(lldb::addr_t pc) override {57    // We have a 64 bit address space, so anything is valid as opcodes58    // aren't fixed width...59    return true;60  }61 62  bool GetPointerReturnRegister(const char *&name) override;63 64  //------------------------------------------------------------------65  // Static Functions66  //------------------------------------------------------------------67 68  static void Initialize();69 70  static void Terminate();71 72  static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, const lldb_private::ArchSpec &arch);73 74  static llvm::StringRef GetPluginNameStatic() { return "windows-x86_64"; }75 76  //------------------------------------------------------------------77  // PluginInterface protocol78  //------------------------------------------------------------------79 80  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }81 82protected:83  void CreateRegisterMapIfNeeded();84 85  lldb::ValueObjectSP86  GetReturnValueObjectSimple(lldb_private::Thread &thread,87                             lldb_private::CompilerType &ast_type) const;88 89  bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);90  uint32_t GetGenericNum(llvm::StringRef reg) override;91 92private:93  using ABIX86_64::ABIX86_64; // Call CreateInstance instead.94};95 96#endif // LLDB_SOURCE_PLUGINS_ABI_X86_ABIWINDOWS_X86_64_H97