xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ABI/AArch64/ABIAArch64.cpp (revision 681ce946f33e75c590e97c53076e86dff1fe8f4a)
1 //===-- AArch66.h ---------------------------------------------------------===//
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 #include "ABIAArch64.h"
10 #ifdef LLDB_ENABLE_ALL
11 #include "ABIMacOSX_arm64.h"
12 #endif // LLDB_ENABLE_ALL
13 #include "ABISysV_arm64.h"
14 #include "Utility/ARM64_DWARF_Registers.h"
15 #include "lldb/Core/PluginManager.h"
16 #include "lldb/Target/Process.h"
17 
18 LLDB_PLUGIN_DEFINE(ABIAArch64)
19 
20 void ABIAArch64::Initialize() {
21   ABISysV_arm64::Initialize();
22 #ifdef LLDB_ENABLE_ALL
23   ABIMacOSX_arm64::Initialize();
24 #endif // LLDB_ENABLE_ALL
25 }
26 
27 void ABIAArch64::Terminate() {
28   ABISysV_arm64::Terminate();
29 #ifdef LLDB_ENABLE_ALL
30   ABIMacOSX_arm64::Terminate();
31 #endif // LLDB_ENABLE_ALL
32 }
33 
34 lldb::addr_t ABIAArch64::FixCodeAddress(lldb::addr_t pc) {
35   if (lldb::ProcessSP process_sp = GetProcessSP())
36     return FixAddress(pc, process_sp->GetCodeAddressMask());
37   return pc;
38 }
39 
40 lldb::addr_t ABIAArch64::FixDataAddress(lldb::addr_t pc) {
41   if (lldb::ProcessSP process_sp = GetProcessSP())
42     return FixAddress(pc, process_sp->GetDataAddressMask());
43   return pc;
44 }
45 
46 std::pair<uint32_t, uint32_t>
47 ABIAArch64::GetEHAndDWARFNums(llvm::StringRef name) {
48   if (name == "pc")
49     return {LLDB_INVALID_REGNUM, arm64_dwarf::pc};
50   if (name == "cpsr")
51     return {LLDB_INVALID_REGNUM, arm64_dwarf::cpsr};
52   return MCBasedABI::GetEHAndDWARFNums(name);
53 }
54 
55 std::string ABIAArch64::GetMCName(std::string reg) {
56   MapRegisterName(reg, "v", "q");
57   MapRegisterName(reg, "x29", "fp");
58   MapRegisterName(reg, "x30", "lr");
59   return reg;
60 }
61 uint32_t ABIAArch64::GetGenericNum(llvm::StringRef name) {
62   return llvm::StringSwitch<uint32_t>(name)
63       .Case("pc", LLDB_REGNUM_GENERIC_PC)
64       .Case("lr", LLDB_REGNUM_GENERIC_RA)
65       .Case("sp", LLDB_REGNUM_GENERIC_SP)
66       .Case("fp", LLDB_REGNUM_GENERIC_FP)
67       .Case("cpsr", LLDB_REGNUM_GENERIC_FLAGS)
68       .Case("x0", LLDB_REGNUM_GENERIC_ARG1)
69       .Case("x1", LLDB_REGNUM_GENERIC_ARG2)
70       .Case("x2", LLDB_REGNUM_GENERIC_ARG3)
71       .Case("x3", LLDB_REGNUM_GENERIC_ARG4)
72       .Case("x4", LLDB_REGNUM_GENERIC_ARG5)
73       .Case("x5", LLDB_REGNUM_GENERIC_ARG6)
74       .Case("x6", LLDB_REGNUM_GENERIC_ARG7)
75       .Case("x7", LLDB_REGNUM_GENERIC_ARG8)
76       .Default(LLDB_INVALID_REGNUM);
77 }
78