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