diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h --- a/lldb/include/lldb/Utility/ArchSpec.h +++ b/lldb/include/lldb/Utility/ArchSpec.h @@ -180,6 +180,9 @@ eCore_hexagon_hexagonv4, eCore_hexagon_hexagonv5, + eCore_riscv32, + eCore_riscv64, + eCore_uknownMach32, eCore_uknownMach64, diff --git a/lldb/source/API/SystemInitializerFull.cpp b/lldb/source/API/SystemInitializerFull.cpp --- a/lldb/source/API/SystemInitializerFull.cpp +++ b/lldb/source/API/SystemInitializerFull.cpp @@ -32,6 +32,7 @@ #include "Plugins/ABI/SysV-mips64/ABISysV_mips64.h" #include "Plugins/ABI/SysV-ppc/ABISysV_ppc.h" #include "Plugins/ABI/SysV-ppc64/ABISysV_ppc64.h" +#include "Plugins/ABI/SysV-riscv/ABISysV_riscv.h" #include "Plugins/ABI/SysV-s390x/ABISysV_s390x.h" #include "Plugins/ABI/SysV-x86_64/ABISysV_x86_64.h" #include "Plugins/Architecture/Arm/ArchitectureArm.h" @@ -185,6 +186,7 @@ ABISysV_ppc64::Initialize(); ABISysV_mips::Initialize(); ABISysV_mips64::Initialize(); + ABISysV_riscv::Initialize(); ABISysV_s390x::Initialize(); ArchitectureArm::Initialize(); diff --git a/lldb/source/Plugins/ABI/CMakeLists.txt b/lldb/source/Plugins/ABI/CMakeLists.txt --- a/lldb/source/Plugins/ABI/CMakeLists.txt +++ b/lldb/source/Plugins/ABI/CMakeLists.txt @@ -8,6 +8,7 @@ add_subdirectory(SysV-s390x) add_subdirectory(SysV-i386) add_subdirectory(SysV-x86_64) +add_subdirectory(SysV-riscv) add_subdirectory(MacOSX-i386) add_subdirectory(MacOSX-arm) add_subdirectory(MacOSX-arm64) diff --git a/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.h b/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.h new file mode 100644 --- /dev/null +++ b/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.h @@ -0,0 +1,112 @@ +//===-- ABISysV_riscv.h -----------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_ABISysV_riscv_h_ +#define liblldb_ABISysV_riscv_h_ + +#include "lldb/Target/ABI.h" +#include "lldb/lldb-private.h" + +class ABISysV_riscv : public lldb_private::ABI { + bool isRV64; + +public: + size_t GetRedZoneSize() const override { return 0; } + + bool PrepareTrivialCall(lldb_private::Thread &thread, lldb::addr_t sp, + lldb::addr_t functionAddress, + lldb::addr_t returnAddress, + llvm::ArrayRef args) const override { + // TODO: Implement + return false; + } + + bool GetArgumentValues(lldb_private::Thread &thread, + lldb_private::ValueList &values) const override { + // TODO: Implement + return false; + } + + lldb_private::Status + SetReturnValueObject(lldb::StackFrameSP &frame_sp, + lldb::ValueObjectSP &new_value) override { + // TODO: Implement + lldb_private::Status error; + error.SetErrorString("Not yet implemented"); + return error; + } + + lldb::ValueObjectSP + GetReturnValueObjectImpl(lldb_private::Thread &thread, + lldb_private::CompilerType &type) const override { + // TODO: Implement + lldb::ValueObjectSP return_valobj; + return return_valobj; + } + + bool CreateFunctionEntryUnwindPlan( + lldb_private::UnwindPlan &unwind_plan) override { + // TODO: Implement disassembly-based unwinding + unwind_plan.Clear(); + return false; + } + + bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override { + // TODO: Implement disassembly-based unwinding + unwind_plan.Clear(); + return true; + } + + bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override { + // TODO: Implement + return false; + } + + bool CallFrameAddressIsValid(lldb::addr_t cfa) override { + // Assume any address except zero is valid + if (cfa == 0) + return false; + return true; + } + + bool CodeAddressIsValid(lldb::addr_t pc) override { + // Any address in the address space is valid + if (!isRV64) + return (pc <= UINT32_MAX); + return (pc <= UINT64_MAX); + } + + const lldb_private::RegisterInfo * + GetRegisterInfoArray(uint32_t &count) override; + + // Static Functions + + static void Initialize(); + + static void Terminate(); + + static lldb::ABISP CreateInstance(lldb::ProcessSP process_sp, + const lldb_private::ArchSpec &arch); + + // PluginInterface protocol + + static lldb_private::ConstString GetPluginNameStatic(); + + lldb_private::ConstString GetPluginName() override; + + uint32_t GetPluginVersion() override { return 1; } + +protected: +private: + ABISysV_riscv(lldb::ProcessSP process_sp, bool _isRV64) + : lldb_private::ABI(process_sp), isRV64(_isRV64) { + // Call CreateInstance instead. + } +}; + +#endif // liblldb_ABISysV_riscv_h_ diff --git a/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.cpp b/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.cpp new file mode 100644 --- /dev/null +++ b/lldb/source/Plugins/ABI/SysV-riscv/ABISysV_riscv.cpp @@ -0,0 +1,832 @@ +//===-- ABISysV_riscv.cpp ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +//===----------------------------------------------------------------------===// + +#include "ABISysV_riscv.h" + +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/Triple.h" + +#include "lldb/Core/Module.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Core/Value.h" +#include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/Core/ValueObjectMemory.h" +#include "lldb/Core/ValueObjectRegister.h" +#include "lldb/Symbol/UnwindPlan.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/RegisterContext.h" +#include "lldb/Target/StackFrame.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Thread.h" +#include "lldb/Utility/ConstString.h" +#include "lldb/Utility/DataExtractor.h" +#include "lldb/Utility/Log.h" +#include "lldb/Utility/RegisterValue.h" +#include "lldb/Utility/Status.h" + +using namespace lldb; +using namespace lldb_private; + +static RegisterInfo g_register_infos_rv32[] = { + {"x0", + "zero", + 4, + 0, + eEncodingUint, + eFormatHex, + {0, 0, LLDB_INVALID_REGNUM, 0, 0}, + nullptr, + nullptr, + nullptr, + 0}, + {"x1", + "ra", + 4, + 0, + eEncodingUint, + eFormatHex, + {1, 1, LLDB_REGNUM_GENERIC_RA, 1, 1}, + nullptr, + nullptr, + nullptr, + 0}, + {"x2", + "sp", + 4, + 0, + eEncodingUint, + eFormatHex, + {2, 2, LLDB_REGNUM_GENERIC_SP, 2, 2}, + nullptr, + nullptr, + nullptr, + 0}, + {"x3", + "gp", + 4, + 0, + eEncodingUint, + eFormatHex, + {3, 3, LLDB_INVALID_REGNUM, 3, 3}, + nullptr, + nullptr, + nullptr, + 0}, + {"x4", + "tp", + 4, + 0, + eEncodingUint, + eFormatHex, + {4, 4, LLDB_INVALID_REGNUM, 4, 4}, + nullptr, + nullptr, + nullptr, + 0}, + {"x5", + "t0", + 4, + 0, + eEncodingUint, + eFormatHex, + {5, 5, LLDB_INVALID_REGNUM, 5, 5}, + nullptr, + nullptr, + nullptr, + 0}, + {"x6", + "t1", + 4, + 0, + eEncodingUint, + eFormatHex, + {6, 6, LLDB_INVALID_REGNUM, 6, 6}, + nullptr, + nullptr, + nullptr, + 0}, + {"x7", + "t2", + 4, + 0, + eEncodingUint, + eFormatHex, + {7, 7, LLDB_INVALID_REGNUM, 7, 7}, + nullptr, + nullptr, + nullptr, + 0}, + {"x8", + "s0", + 4, + 0, + eEncodingUint, + eFormatHex, + {8, 8, LLDB_INVALID_REGNUM, 8, 8}, + nullptr, + nullptr, + nullptr, + 0}, + {"x9", + "s1", + 4, + 0, + eEncodingUint, + eFormatHex, + {9, 9, LLDB_INVALID_REGNUM, 9, 9}, + nullptr, + nullptr, + nullptr, + 0}, + {"x10", + "a0", + 4, + 0, + eEncodingUint, + eFormatHex, + {10, 10, LLDB_INVALID_REGNUM, 10, 10}, + nullptr, + nullptr, + nullptr, + 0}, + {"x11", + "a1", + 4, + 0, + eEncodingUint, + eFormatHex, + {11, 11, LLDB_INVALID_REGNUM, 11, 11}, + nullptr, + nullptr, + nullptr, + 0}, + {"x12", + "a2", + 4, + 0, + eEncodingUint, + eFormatHex, + {12, 12, LLDB_INVALID_REGNUM, 12, 12}, + nullptr, + nullptr, + nullptr, + 0}, + {"x13", + "a3", + 4, + 0, + eEncodingUint, + eFormatHex, + {13, 13, LLDB_INVALID_REGNUM, 13, 13}, + nullptr, + nullptr, + nullptr, + 0}, + {"x14", + "a4", + 4, + 0, + eEncodingUint, + eFormatHex, + {14, 14, LLDB_INVALID_REGNUM, 14, 14}, + nullptr, + nullptr, + nullptr, + 0}, + {"x15", + "a5", + 4, + 0, + eEncodingUint, + eFormatHex, + {15, 15, LLDB_INVALID_REGNUM, 15, 15}, + nullptr, + nullptr, + nullptr, + 0}, + {"x16", + "a6", + 4, + 0, + eEncodingUint, + eFormatHex, + {16, 16, LLDB_INVALID_REGNUM, 16, 16}, + nullptr, + nullptr, + nullptr, + 0}, + {"x17", + "a7", + 4, + 0, + eEncodingUint, + eFormatHex, + {17, 17, LLDB_INVALID_REGNUM, 17, 17}, + nullptr, + nullptr, + nullptr, + 0}, + {"x18", + "s2", + 4, + 0, + eEncodingUint, + eFormatHex, + {18, 18, LLDB_INVALID_REGNUM, 18, 18}, + nullptr, + nullptr, + nullptr, + 0}, + {"x19", + "s3", + 4, + 0, + eEncodingUint, + eFormatHex, + {19, 19, LLDB_INVALID_REGNUM, 19, 19}, + nullptr, + nullptr, + nullptr, + 0}, + {"x20", + "s4", + 4, + 0, + eEncodingUint, + eFormatHex, + {20, 20, LLDB_INVALID_REGNUM, 20, 20}, + nullptr, + nullptr, + nullptr, + 0}, + {"x21", + "s5", + 4, + 0, + eEncodingUint, + eFormatHex, + {21, 21, LLDB_INVALID_REGNUM, 21, 21}, + nullptr, + nullptr, + nullptr, + 0}, + {"x22", + "s6", + 4, + 0, + eEncodingUint, + eFormatHex, + {22, 22, LLDB_INVALID_REGNUM, 22, 22}, + nullptr, + nullptr, + nullptr, + 0}, + {"x23", + "s7", + 4, + 0, + eEncodingUint, + eFormatHex, + {23, 23, LLDB_INVALID_REGNUM, 23, 23}, + nullptr, + nullptr, + nullptr, + 0}, + {"x24", + "s8", + 4, + 0, + eEncodingUint, + eFormatHex, + {24, 24, LLDB_INVALID_REGNUM, 24, 24}, + nullptr, + nullptr, + nullptr, + 0}, + {"x25", + "s9", + 4, + 0, + eEncodingUint, + eFormatHex, + {25, 25, LLDB_INVALID_REGNUM, 25, 25}, + nullptr, + nullptr, + nullptr, + 0}, + {"x26", + "s10", + 4, + 0, + eEncodingUint, + eFormatHex, + {26, 26, LLDB_INVALID_REGNUM, 26, 26}, + nullptr, + nullptr, + nullptr, + 0}, + {"x27", + "s11", + 4, + 0, + eEncodingUint, + eFormatHex, + {27, 27, LLDB_INVALID_REGNUM, 27, 27}, + nullptr, + nullptr, + nullptr, + 0}, + {"x28", + "t3", + 4, + 0, + eEncodingUint, + eFormatHex, + {28, 28, LLDB_INVALID_REGNUM, 28, 28}, + nullptr, + nullptr, + nullptr, + 0}, + {"x29", + "t4", + 4, + 0, + eEncodingUint, + eFormatHex, + {29, 29, LLDB_INVALID_REGNUM, 29, 29}, + nullptr, + nullptr, + nullptr, + 0}, + {"x30", + "t5", + 4, + 0, + eEncodingUint, + eFormatHex, + {30, 30, LLDB_INVALID_REGNUM, 30, 30}, + nullptr, + nullptr, + nullptr, + 0}, + {"x31", + "t6", + 4, + 0, + eEncodingUint, + eFormatHex, + {31, 31, LLDB_INVALID_REGNUM, 31, 31}, + nullptr, + nullptr, + nullptr, + 0}, + {"pc", + nullptr, + 4, + 0, + eEncodingUint, + eFormatHex, + {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_PC, + LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM}, + nullptr, + nullptr, + nullptr, + 0}, +}; + +static RegisterInfo g_register_infos_rv64[] = { + {"x0", + "zero", + 8, + 0, + eEncodingUint, + eFormatHex, + {0, 0, LLDB_INVALID_REGNUM, 0, 0}, + nullptr, + nullptr, + nullptr, + 0}, + {"x1", + "ra", + 8, + 0, + eEncodingUint, + eFormatHex, + {1, 1, LLDB_REGNUM_GENERIC_RA, 1, 1}, + nullptr, + nullptr, + nullptr, + 0}, + {"x2", + "sp", + 8, + 0, + eEncodingUint, + eFormatHex, + {2, 2, LLDB_REGNUM_GENERIC_SP, 2, 2}, + nullptr, + nullptr, + nullptr, + 0}, + {"x3", + "gp", + 8, + 0, + eEncodingUint, + eFormatHex, + {3, 3, LLDB_INVALID_REGNUM, 3, 3}, + nullptr, + nullptr, + nullptr, + 0}, + {"x4", + "tp", + 8, + 0, + eEncodingUint, + eFormatHex, + {4, 4, LLDB_INVALID_REGNUM, 4, 4}, + nullptr, + nullptr, + nullptr, + 0}, + {"x5", + "t0", + 8, + 0, + eEncodingUint, + eFormatHex, + {5, 5, LLDB_INVALID_REGNUM, 5, 5}, + nullptr, + nullptr, + nullptr, + 0}, + {"x6", + "t1", + 8, + 0, + eEncodingUint, + eFormatHex, + {6, 6, LLDB_INVALID_REGNUM, 6, 6}, + nullptr, + nullptr, + nullptr, + 0}, + {"x7", + "t2", + 8, + 0, + eEncodingUint, + eFormatHex, + {7, 7, LLDB_INVALID_REGNUM, 7, 7}, + nullptr, + nullptr, + nullptr, + 0}, + {"x8", + "s0", + 8, + 0, + eEncodingUint, + eFormatHex, + {8, 8, LLDB_INVALID_REGNUM, 8, 8}, + nullptr, + nullptr, + nullptr, + 0}, + {"x9", + "s1", + 8, + 0, + eEncodingUint, + eFormatHex, + {9, 9, LLDB_INVALID_REGNUM, 9, 9}, + nullptr, + nullptr, + nullptr, + 0}, + {"x10", + "a0", + 8, + 0, + eEncodingUint, + eFormatHex, + {10, 10, LLDB_INVALID_REGNUM, 10, 10}, + nullptr, + nullptr, + nullptr, + 0}, + {"x11", + "a1", + 8, + 0, + eEncodingUint, + eFormatHex, + {11, 11, LLDB_INVALID_REGNUM, 11, 11}, + nullptr, + nullptr, + nullptr, + 0}, + {"x12", + "a2", + 8, + 0, + eEncodingUint, + eFormatHex, + {12, 12, LLDB_INVALID_REGNUM, 12, 12}, + nullptr, + nullptr, + nullptr, + 0}, + {"x13", + "a3", + 8, + 0, + eEncodingUint, + eFormatHex, + {13, 13, LLDB_INVALID_REGNUM, 13, 13}, + nullptr, + nullptr, + nullptr, + 0}, + {"x14", + "a4", + 8, + 0, + eEncodingUint, + eFormatHex, + {14, 14, LLDB_INVALID_REGNUM, 14, 14}, + nullptr, + nullptr, + nullptr, + 0}, + {"x15", + "a5", + 8, + 0, + eEncodingUint, + eFormatHex, + {15, 15, LLDB_INVALID_REGNUM, 15, 15}, + nullptr, + nullptr, + nullptr, + 0}, + {"x16", + "a6", + 8, + 0, + eEncodingUint, + eFormatHex, + {16, 16, LLDB_INVALID_REGNUM, 16, 16}, + nullptr, + nullptr, + nullptr, + 0}, + {"x17", + "a7", + 8, + 0, + eEncodingUint, + eFormatHex, + {17, 17, LLDB_INVALID_REGNUM, 17, 17}, + nullptr, + nullptr, + nullptr, + 0}, + {"x18", + "s2", + 8, + 0, + eEncodingUint, + eFormatHex, + {18, 18, LLDB_INVALID_REGNUM, 18, 18}, + nullptr, + nullptr, + nullptr, + 0}, + {"x19", + "s3", + 8, + 0, + eEncodingUint, + eFormatHex, + {19, 19, LLDB_INVALID_REGNUM, 19, 19}, + nullptr, + nullptr, + nullptr, + 0}, + {"x20", + "s4", + 8, + 0, + eEncodingUint, + eFormatHex, + {20, 20, LLDB_INVALID_REGNUM, 20, 20}, + nullptr, + nullptr, + nullptr, + 0}, + {"x21", + "s5", + 8, + 0, + eEncodingUint, + eFormatHex, + {21, 21, LLDB_INVALID_REGNUM, 21, 21}, + nullptr, + nullptr, + nullptr, + 0}, + {"x22", + "s6", + 8, + 0, + eEncodingUint, + eFormatHex, + {22, 22, LLDB_INVALID_REGNUM, 22, 22}, + nullptr, + nullptr, + nullptr, + 0}, + {"x23", + "s7", + 8, + 0, + eEncodingUint, + eFormatHex, + {23, 23, LLDB_INVALID_REGNUM, 23, 23}, + nullptr, + nullptr, + nullptr, + 0}, + {"x24", + "s8", + 8, + 0, + eEncodingUint, + eFormatHex, + {24, 24, LLDB_INVALID_REGNUM, 24, 24}, + nullptr, + nullptr, + nullptr, + 0}, + {"x25", + "s9", + 8, + 0, + eEncodingUint, + eFormatHex, + {25, 25, LLDB_INVALID_REGNUM, 25, 25}, + nullptr, + nullptr, + nullptr, + 0}, + {"x26", + "s10", + 8, + 0, + eEncodingUint, + eFormatHex, + {26, 26, LLDB_INVALID_REGNUM, 26, 26}, + nullptr, + nullptr, + nullptr, + 0}, + {"x27", + "s11", + 8, + 0, + eEncodingUint, + eFormatHex, + {27, 27, LLDB_INVALID_REGNUM, 27, 27}, + nullptr, + nullptr, + nullptr, + 0}, + {"x28", + "t3", + 8, + 0, + eEncodingUint, + eFormatHex, + {28, 28, LLDB_INVALID_REGNUM, 28, 28}, + nullptr, + nullptr, + nullptr, + 0}, + {"x29", + "t4", + 8, + 0, + eEncodingUint, + eFormatHex, + {29, 29, LLDB_INVALID_REGNUM, 29, 29}, + nullptr, + nullptr, + nullptr, + 0}, + {"x30", + "t5", + 8, + 0, + eEncodingUint, + eFormatHex, + {30, 30, LLDB_INVALID_REGNUM, 30, 30}, + nullptr, + nullptr, + nullptr, + 0}, + {"x31", + "t6", + 8, + 0, + eEncodingUint, + eFormatHex, + {31, 31, LLDB_INVALID_REGNUM, 31, 31}, + nullptr, + nullptr, + nullptr, + 0}, + {"pc", + nullptr, + 8, + 0, + eEncodingUint, + eFormatHex, + {LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_REGNUM_GENERIC_PC, + LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM}, + nullptr, + nullptr, + nullptr, + 0}, +}; + +static const uint32_t k_num_register_infos_rv32 = + llvm::array_lengthof(g_register_infos_rv32); +static const uint32_t k_num_register_infos_rv64 = + llvm::array_lengthof(g_register_infos_rv64); +static bool g_register_info_names_constified = false; + +static void ConstantifyTable(RegisterInfo *register_infos, uint32_t count) { + for (uint32_t i = 0; i < count; ++i) { + if (register_infos[i].name) + register_infos[i].name = ConstString(register_infos[i].name).GetCString(); + if (register_infos[i].alt_name) + register_infos[i].alt_name = + ConstString(register_infos[i].alt_name).GetCString(); + } +} + +const lldb_private::RegisterInfo * +ABISysV_riscv::GetRegisterInfoArray(uint32_t &count) { + // Make the C-string names and alt_names for the register infos into const + // C-string values by having the ConstString unique the names in the global + // constant C-string pool. + if (!g_register_info_names_constified) { + g_register_info_names_constified = true; + ConstantifyTable(g_register_infos_rv32, k_num_register_infos_rv32); + ConstantifyTable(g_register_infos_rv64, k_num_register_infos_rv64); + } + + if (isRV64) { + count = k_num_register_infos_rv64; + return g_register_infos_rv64; + } + count = k_num_register_infos_rv32; + return g_register_infos_rv32; +} + +ABISP +ABISysV_riscv::CreateInstance(lldb::ProcessSP process_sp, + const ArchSpec &arch) { + if (arch.GetTriple().getArch() == llvm::Triple::riscv32 || + arch.GetTriple().getArch() == llvm::Triple::riscv64) { + return ABISP(new ABISysV_riscv(process_sp, arch.GetTriple().getArch() == + llvm::Triple::riscv64)); + } + return ABISP(); +} + +void ABISysV_riscv::Initialize() { + PluginManager::RegisterPlugin( + GetPluginNameStatic(), "System V ABI for riscv targets", CreateInstance); +} + +void ABISysV_riscv::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); +} + +// PluginInterface protocol + +lldb_private::ConstString ABISysV_riscv::GetPluginNameStatic() { + static ConstString g_name("sysv-riscv"); + return g_name; +} + +lldb_private::ConstString ABISysV_riscv::GetPluginName() { + return GetPluginNameStatic(); +} diff --git a/lldb/source/Plugins/ABI/SysV-riscv/CMakeLists.txt b/lldb/source/Plugins/ABI/SysV-riscv/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/lldb/source/Plugins/ABI/SysV-riscv/CMakeLists.txt @@ -0,0 +1,10 @@ +add_lldb_library(lldbPluginABISysV_riscv PLUGIN + ABISysV_riscv.cpp + + LINK_LIBS + lldbCore + lldbSymbol + lldbTarget + LINK_COMPONENTS + Support + ) diff --git a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp --- a/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp +++ b/lldb/source/Plugins/Disassembler/llvm/DisassemblerLLVMC.cpp @@ -1198,6 +1198,11 @@ cpu = "apple-latest"; } + // For RISC-V, enable all standard extensions so these can be disassembled. + if (triple.getArch() == llvm::Triple::riscv32 || + triple.getArch() == llvm::Triple::riscv64) + features_str += "+a,+c,+d,+f,+m"; + // We use m_disasm_up.get() to tell whether we are valid or not, so if this // isn't good for some reason, we won't be valid and FindPlugin will fail and // we won't get used. diff --git a/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp b/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp --- a/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp +++ b/lldb/source/Plugins/Process/Utility/DynamicRegisterInfo.cpp @@ -621,6 +621,18 @@ } break; + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: + for (auto ® : m_regs) { + if (strcmp(reg.name, "x1") == 0) + reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA; + else if (strcmp(reg.name, "x2") == 0) + reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP; + else if (strcmp(reg.name, "pc") == 0) + reg.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC; + } + break; + default: break; } diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -1911,6 +1911,15 @@ trap_opcode_size = sizeof(g_i386_opcode); } break; + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: { + // FIXME: Use ebreak when c_ebreak is not available. + static const uint8_t g_riscv_c_opcode[] = {0x02, 0x90}; // c_ebreak + trap_opcode = g_riscv_c_opcode; + trap_opcode_size = sizeof(g_riscv_c_opcode); + break; + } + default: llvm_unreachable( "Unhandled architecture in Platform::GetSoftwareBreakpointTrapOpcode"); diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -2070,6 +2070,8 @@ case llvm::Triple::ppc: case llvm::Triple::ppc64: case llvm::Triple::ppc64le: + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: case llvm::Triple::systemz: case llvm::Triple::hexagon: m_unwinder_up.reset(new UnwindLLDB(*this)); diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp --- a/lldb/source/Utility/ArchSpec.cpp +++ b/lldb/source/Utility/ArchSpec.cpp @@ -210,6 +210,11 @@ {eByteOrderLittle, 4, 4, 4, llvm::Triple::hexagon, ArchSpec::eCore_hexagon_hexagonv5, "hexagonv5"}, + {eByteOrderLittle, 4, 2, 4, llvm::Triple::riscv32, + ArchSpec::eCore_riscv32, "riscv32"}, + {eByteOrderLittle, 8, 2, 4, llvm::Triple::riscv64, + ArchSpec::eCore_riscv64, "riscv64"}, + {eByteOrderLittle, 4, 4, 4, llvm::Triple::UnknownArch, ArchSpec::eCore_uknownMach32, "unknown-mach-32"}, {eByteOrderLittle, 8, 4, 4, llvm::Triple::UnknownArch, @@ -446,6 +451,10 @@ ArchSpec::eMIPSSubType_mips64r6el, 0xFFFFFFFFu, 0xFFFFFFFFu}, // mips64r6el {ArchSpec::eCore_hexagon_generic, llvm::ELF::EM_HEXAGON, LLDB_INVALID_CPUTYPE, 0xFFFFFFFFu, 0xFFFFFFFFu}, // HEXAGON + {ArchSpec::eCore_riscv32, llvm::ELF::EM_RISCV, LLDB_INVALID_CPUTYPE, + 0xFFFFFFFFu, 0xFFFFFFFFu}, // riscv32 + {ArchSpec::eCore_riscv64, llvm::ELF::EM_RISCV, LLDB_INVALID_CPUTYPE, + 0xFFFFFFFFu, 0xFFFFFFFFu}, // riscv64 }; static const ArchDefinition g_elf_arch_def = {