Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h
39646 views
//===-- ABISysV_riscv.h -----------------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#ifndef liblldb_ABISysV_riscv_h_9#define liblldb_ABISysV_riscv_h_1011// Other libraries and framework includes12#include "llvm/TargetParser/Triple.h"1314// Project includes15#include "lldb/Target/ABI.h"16#include "lldb/Target/Process.h"17#include "lldb/Utility/Flags.h"18#include "lldb/lldb-private.h"1920class ABISysV_riscv : public lldb_private::RegInfoBasedABI {21public:22~ABISysV_riscv() override = default;2324size_t GetRedZoneSize() const override { return 0; }2526bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,27lldb::addr_t functionAddress,28lldb::addr_t returnAddress,29llvm::ArrayRef<lldb::addr_t> args) const override;3031// Special thread plan for GDB style non-jit function calls.32bool33PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp,34lldb::addr_t functionAddress, lldb::addr_t returnAddress,35llvm::Type &prototype,36llvm::ArrayRef<ABI::CallArgument> args) const override;3738bool GetArgumentValues(lldb_private::Thread &thread,39lldb_private::ValueList &values) const override;4041lldb_private::Status42SetReturnValueObject(lldb::StackFrameSP &frame_sp,43lldb::ValueObjectSP &new_value) override;4445lldb::ValueObjectSP46GetReturnValueObjectImpl(lldb_private::Thread &thread,47lldb_private::CompilerType &type) const override;4849// Specialized to work with llvm IR types.50lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread,51llvm::Type &type) const override;5253bool54CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;5556bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;5758bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;5960bool CallFrameAddressIsValid(lldb::addr_t cfa) override {61// The CFA must be 128 bit aligned, unless the E ABI is used62lldb_private::ArchSpec arch = GetProcessSP()->GetTarget().GetArchitecture();63lldb_private::Flags arch_flags = arch.GetFlags();64if (arch_flags.Test(lldb_private::ArchSpec::eRISCV_rve))65return (cfa & 0x3ull) == 0;66return (cfa & 0xfull) == 0;67}6869void SetIsRV64(bool is_rv64) { m_is_rv64 = is_rv64; }7071bool CodeAddressIsValid(lldb::addr_t pc) override {72// Calls can use the least significant bit to store auxiliary information,73// so no strict check is done for alignment.7475lldb_private::ArchSpec arch = GetProcessSP()->GetTarget().GetArchitecture();7677// <addr> & 2 set is a fault if C extension is not used.78lldb_private::Flags arch_flags(arch.GetFlags());79if (!arch_flags.Test(lldb_private::ArchSpec::eRISCV_rvc) && (pc & 2))80return false;8182// Make sure 64 bit addr_t only has lower 32 bits set on riscv3283llvm::Triple::ArchType machine = arch.GetMachine();84if (llvm::Triple::riscv32 == machine)85return (pc <= UINT32_MAX);8687return true;88}8990const lldb_private::RegisterInfo *91GetRegisterInfoArray(uint32_t &count) override;9293//------------------------------------------------------------------94// Static Functions95//------------------------------------------------------------------9697static void Initialize();9899static void Terminate();100101static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp,102const lldb_private::ArchSpec &arch);103104static llvm::StringRef GetPluginNameStatic() { return "sysv-riscv"; }105106//------------------------------------------------------------------107// PluginInterface protocol108//------------------------------------------------------------------109110llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }111112protected:113void AugmentRegisterInfo(114std::vector<lldb_private::DynamicRegisterInfo::Register> ®s) override;115116bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);117118private:119lldb::ValueObjectSP120GetReturnValueObjectSimple(lldb_private::Thread &thread,121lldb_private::CompilerType &ast_type) const;122123using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance124// instead.125bool m_is_rv64; // true if target is riscv64; false if target is riscv32126};127128#endif // liblldb_ABISysV_riscv_h_129130131