blob: f6a531136dcbef637002bf1c036098481a8822f6 [file] [log] [blame]
Raphael Isemann80814282020-01-24 08:23:27 +01001//===-- ABI.cpp -----------------------------------------------------------===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/Target/ABI.h"
10#include "lldb/Core/PluginManager.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000011#include "lldb/Core/Value.h"
12#include "lldb/Core/ValueObjectConstResult.h"
Alex Langford4dc0acc2019-05-31 20:17:21 +000013#include "lldb/Expression/ExpressionVariable.h"
Greg Claytona1e5dc82015-08-11 22:53:00 +000014#include "lldb/Symbol/CompilerType.h"
Sean Callanan8f1f9a12015-09-30 19:57:57 +000015#include "lldb/Symbol/TypeSystem.h"
Jim Inghamef651602011-12-22 19:12:40 +000016#include "lldb/Target/Target.h"
Jim Ingham73ca05a2011-12-17 01:35:57 +000017#include "lldb/Target/Thread.h"
Pavel Labathd0b44db2019-09-25 13:03:04 +000018#include "lldb/Utility/Log.h"
19#include "llvm/Support/TargetRegistry.h"
Jonas Devlieghere8f95a822020-02-17 09:06:18 -080020#include <cctype>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021
22using namespace lldb;
23using namespace lldb_private;
24
Greg Clayton31f1d2f2011-05-11 18:39:18 +000025ABISP
Jason Molenda43294c92017-06-29 02:57:03 +000026ABI::FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000027 ABISP abi_sp;
28 ABICreateInstance create_callback;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029
Kate Stoneb9c1b512016-09-06 20:57:50 +000030 for (uint32_t idx = 0;
31 (create_callback = PluginManager::GetABICreateCallbackAtIndex(idx)) !=
32 nullptr;
33 ++idx) {
Jason Molenda43294c92017-06-29 02:57:03 +000034 abi_sp = create_callback(process_sp, arch);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036 if (abi_sp)
37 return abi_sp;
38 }
39 abi_sp.reset();
40 return abi_sp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041}
42
Eugene Zelenko9394d7722016-02-18 00:10:17 +000043ABI::~ABI() = default;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000044
Raphael Isemann24e07572020-10-13 17:10:10 +020045bool RegInfoBasedABI::GetRegisterInfoByName(llvm::StringRef name,
46 RegisterInfo &info) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000047 uint32_t count = 0;
48 const RegisterInfo *register_info_array = GetRegisterInfoArray(count);
49 if (register_info_array) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 uint32_t i;
51 for (i = 0; i < count; ++i) {
Raphael Isemannb0060c32020-02-19 11:27:10 +010052 const char *reg_name = register_info_array[i].name;
Raphael Isemann24e07572020-10-13 17:10:10 +020053 if (reg_name == name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 info = register_info_array[i];
55 return true;
56 }
Greg Clayton56d9a1b2011-08-22 02:49:39 +000057 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 for (i = 0; i < count; ++i) {
Raphael Isemannb0060c32020-02-19 11:27:10 +010059 const char *reg_alt_name = register_info_array[i].alt_name;
Raphael Isemann24e07572020-10-13 17:10:10 +020060 if (reg_alt_name == name) {
Kate Stoneb9c1b512016-09-06 20:57:50 +000061 info = register_info_array[i];
62 return true;
63 }
64 }
65 }
66 return false;
67}
68
Kate Stoneb9c1b512016-09-06 20:57:50 +000069ValueObjectSP ABI::GetReturnValueObject(Thread &thread, CompilerType &ast_type,
70 bool persistent) const {
71 if (!ast_type.IsValid())
72 return ValueObjectSP();
Jim Inghamef651602011-12-22 19:12:40 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 ValueObjectSP return_valobj_sp;
Jim Inghamef651602011-12-22 19:12:40 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 return_valobj_sp = GetReturnValueObjectImpl(thread, ast_type);
77 if (!return_valobj_sp)
78 return return_valobj_sp;
Jim Inghamef651602011-12-22 19:12:40 +000079
Kate Stoneb9c1b512016-09-06 20:57:50 +000080 // Now turn this into a persistent variable.
81 // FIXME: This code is duplicated from Target::EvaluateExpression, and it is
82 // used in similar form in a couple
83 // of other places. Figure out the correct Create function to do all this
84 // work.
Jim Inghamef651602011-12-22 19:12:40 +000085
Kate Stoneb9c1b512016-09-06 20:57:50 +000086 if (persistent) {
Adrian Prantl5435f782018-04-30 23:59:15 +000087 Target &target = *thread.CalculateTarget();
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 PersistentExpressionState *persistent_expression_state =
Adrian Prantl5435f782018-04-30 23:59:15 +000089 target.GetPersistentExpressionStateForLanguage(
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 ast_type.GetMinimumLanguage());
91
92 if (!persistent_expression_state)
Adrian Prantle9331a52020-01-08 14:18:47 -080093 return {};
Kate Stoneb9c1b512016-09-06 20:57:50 +000094
Adrian Prantl03219f72018-04-30 23:59:17 +000095 ConstString persistent_variable_name =
Jim Ingham67d67eb2020-03-20 14:59:54 -070096 persistent_expression_state->GetNextPersistentVariableName();
Kate Stoneb9c1b512016-09-06 20:57:50 +000097
98 lldb::ValueObjectSP const_valobj_sp;
99
100 // Check in case our value is already a constant value
101 if (return_valobj_sp->GetIsConstant()) {
102 const_valobj_sp = return_valobj_sp;
103 const_valobj_sp->SetName(persistent_variable_name);
104 } else
105 const_valobj_sp =
106 return_valobj_sp->CreateConstantValue(persistent_variable_name);
107
108 lldb::ValueObjectSP live_valobj_sp = return_valobj_sp;
109
110 return_valobj_sp = const_valobj_sp;
111
Alex Langforde574f8b2019-07-17 07:03:17 +0000112 ExpressionVariableSP expr_variable_sp(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113 persistent_expression_state->CreatePersistentVariable(
114 return_valobj_sp));
115
Alex Langforde574f8b2019-07-17 07:03:17 +0000116 assert(expr_variable_sp);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117
118 // Set flags and live data as appropriate
119
120 const Value &result_value = live_valobj_sp->GetValue();
121
122 switch (result_value.GetValueType()) {
123 case Value::eValueTypeHostAddress:
124 case Value::eValueTypeFileAddress:
125 // we don't do anything with these for now
126 break;
127 case Value::eValueTypeScalar:
Alex Langforde574f8b2019-07-17 07:03:17 +0000128 expr_variable_sp->m_flags |=
Alex Langford4dc0acc2019-05-31 20:17:21 +0000129 ExpressionVariable::EVIsFreezeDried;
Alex Langforde574f8b2019-07-17 07:03:17 +0000130 expr_variable_sp->m_flags |=
Alex Langford4dc0acc2019-05-31 20:17:21 +0000131 ExpressionVariable::EVIsLLDBAllocated;
Alex Langforde574f8b2019-07-17 07:03:17 +0000132 expr_variable_sp->m_flags |=
Alex Langford4dc0acc2019-05-31 20:17:21 +0000133 ExpressionVariable::EVNeedsAllocation;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 break;
135 case Value::eValueTypeLoadAddress:
Alex Langforde574f8b2019-07-17 07:03:17 +0000136 expr_variable_sp->m_live_sp = live_valobj_sp;
137 expr_variable_sp->m_flags |=
Alex Langford4dc0acc2019-05-31 20:17:21 +0000138 ExpressionVariable::EVIsProgramReference;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 break;
Jim Ingham73ca05a2011-12-17 01:35:57 +0000140 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141
Alex Langforde574f8b2019-07-17 07:03:17 +0000142 return_valobj_sp = expr_variable_sp->GetValueObject();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 }
144 return return_valobj_sp;
Jim Ingham73ca05a2011-12-17 01:35:57 +0000145}
146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147ValueObjectSP ABI::GetReturnValueObject(Thread &thread, llvm::Type &ast_type,
148 bool persistent) const {
149 ValueObjectSP return_valobj_sp;
150 return_valobj_sp = GetReturnValueObjectImpl(thread, ast_type);
151 return return_valobj_sp;
Deepak Panickal2526ee52014-07-21 17:21:01 +0000152}
Jim Ingham73ca05a2011-12-17 01:35:57 +0000153
Deepak Panickal2526ee52014-07-21 17:21:01 +0000154// specialized to work with llvm IR types
155//
156// for now we will specify a default implementation so that we don't need to
157// modify other ABIs
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158lldb::ValueObjectSP ABI::GetReturnValueObjectImpl(Thread &thread,
159 llvm::Type &ir_type) const {
160 ValueObjectSP return_valobj_sp;
Deepak Panickal2526ee52014-07-21 17:21:01 +0000161
Kate Stoneb9c1b512016-09-06 20:57:50 +0000162 /* this is a dummy and will only be called if an ABI does not override this */
Deepak Panickal2526ee52014-07-21 17:21:01 +0000163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 return return_valobj_sp;
Deepak Panickal2526ee52014-07-21 17:21:01 +0000165}
166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167bool ABI::PrepareTrivialCall(Thread &thread, lldb::addr_t sp,
168 lldb::addr_t functionAddress,
169 lldb::addr_t returnAddress, llvm::Type &returntype,
170 llvm::ArrayRef<ABI::CallArgument> args) const {
171 // dummy prepare trivial call
David Blaikiea322f362017-01-06 00:38:06 +0000172 llvm_unreachable("Should never get here!");
Deepak Panickal2526ee52014-07-21 17:21:01 +0000173}
Ulrich Weigand7311bb32016-04-14 14:25:20 +0000174
Kate Stoneb9c1b512016-09-06 20:57:50 +0000175bool ABI::GetFallbackRegisterLocation(
176 const RegisterInfo *reg_info,
177 UnwindPlan::Row::RegisterLocation &unwind_regloc) {
Adrian Prantl05097242018-04-30 16:49:04 +0000178 // Did the UnwindPlan fail to give us the caller's stack pointer? The stack
179 // pointer is defined to be the same as THIS frame's CFA, so return the CFA
180 // value as the caller's stack pointer. This is true on x86-32/x86-64 at
181 // least.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 if (reg_info->kinds[eRegisterKindGeneric] == LLDB_REGNUM_GENERIC_SP) {
183 unwind_regloc.SetIsCFAPlusOffset(0);
184 return true;
185 }
Ulrich Weigand7311bb32016-04-14 14:25:20 +0000186
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187 // If a volatile register is being requested, we don't want to forward the
Adrian Prantl05097242018-04-30 16:49:04 +0000188 // next frame's register contents up the stack -- the register is not
189 // retrievable at this frame.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190 if (RegisterIsVolatile(reg_info)) {
191 unwind_regloc.SetUndefined();
192 return true;
193 }
Ulrich Weigand7311bb32016-04-14 14:25:20 +0000194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195 return false;
Ulrich Weigand7311bb32016-04-14 14:25:20 +0000196}
Pavel Labathd0b44db2019-09-25 13:03:04 +0000197
198std::unique_ptr<llvm::MCRegisterInfo> ABI::MakeMCRegisterInfo(const ArchSpec &arch) {
199 std::string triple = arch.GetTriple().getTriple();
200 std::string lookup_error;
201 const llvm::Target *target =
202 llvm::TargetRegistry::lookupTarget(triple, lookup_error);
203 if (!target) {
204 LLDB_LOG(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS),
205 "Failed to create an llvm target for {0}: {1}", triple,
206 lookup_error);
207 return nullptr;
208 }
209 std::unique_ptr<llvm::MCRegisterInfo> info_up(
210 target->createMCRegInfo(triple));
211 assert(info_up);
212 return info_up;
213}
Pavel Labath2b8db382019-12-03 11:39:20 +0100214
Pavel Labath12e32d32020-02-02 10:27:40 +0100215void RegInfoBasedABI::AugmentRegisterInfo(RegisterInfo &info) {
Pavel Labath2b8db382019-12-03 11:39:20 +0100216 if (info.kinds[eRegisterKindEHFrame] != LLDB_INVALID_REGNUM &&
217 info.kinds[eRegisterKindDWARF] != LLDB_INVALID_REGNUM)
218 return;
219
220 RegisterInfo abi_info;
Raphael Isemann24e07572020-10-13 17:10:10 +0200221 if (!GetRegisterInfoByName(info.name, abi_info))
Pavel Labath2b8db382019-12-03 11:39:20 +0100222 return;
223
224 if (info.kinds[eRegisterKindEHFrame] == LLDB_INVALID_REGNUM)
225 info.kinds[eRegisterKindEHFrame] = abi_info.kinds[eRegisterKindEHFrame];
226 if (info.kinds[eRegisterKindDWARF] == LLDB_INVALID_REGNUM)
227 info.kinds[eRegisterKindDWARF] = abi_info.kinds[eRegisterKindDWARF];
228 if (info.kinds[eRegisterKindGeneric] == LLDB_INVALID_REGNUM)
229 info.kinds[eRegisterKindGeneric] = abi_info.kinds[eRegisterKindGeneric];
230}
Pavel Labath07355c12020-02-03 17:58:37 +0100231
232void MCBasedABI::AugmentRegisterInfo(RegisterInfo &info) {
233 uint32_t eh, dwarf;
234 std::tie(eh, dwarf) = GetEHAndDWARFNums(info.name);
235
236 if (info.kinds[eRegisterKindEHFrame] == LLDB_INVALID_REGNUM)
237 info.kinds[eRegisterKindEHFrame] = eh;
238 if (info.kinds[eRegisterKindDWARF] == LLDB_INVALID_REGNUM)
239 info.kinds[eRegisterKindDWARF] = dwarf;
240 if (info.kinds[eRegisterKindGeneric] == LLDB_INVALID_REGNUM)
241 info.kinds[eRegisterKindGeneric] = GetGenericNum(info.name);
242}
243
244std::pair<uint32_t, uint32_t>
245MCBasedABI::GetEHAndDWARFNums(llvm::StringRef name) {
246 std::string mc_name = GetMCName(name.str());
Pavel Labathb2d64b62020-02-17 14:12:29 +0100247 for (char &c : mc_name)
248 c = std::toupper(c);
Pavel Labath07355c12020-02-03 17:58:37 +0100249 int eh = -1;
250 int dwarf = -1;
251 for (unsigned reg = 0; reg < m_mc_register_info_up->getNumRegs(); ++reg) {
252 if (m_mc_register_info_up->getName(reg) == mc_name) {
253 eh = m_mc_register_info_up->getDwarfRegNum(reg, /*isEH=*/true);
254 dwarf = m_mc_register_info_up->getDwarfRegNum(reg, /*isEH=*/false);
255 break;
256 }
257 }
258 return std::pair<uint32_t, uint32_t>(eh == -1 ? LLDB_INVALID_REGNUM : eh,
259 dwarf == -1 ? LLDB_INVALID_REGNUM
260 : dwarf);
261}
262
263void MCBasedABI::MapRegisterName(std::string &name, llvm::StringRef from_prefix,
264 llvm::StringRef to_prefix) {
265 llvm::StringRef name_ref = name;
266 if (!name_ref.consume_front(from_prefix))
267 return;
268 uint64_t _;
269 if (name_ref.empty() || to_integer(name_ref, _, 10))
270 name = (to_prefix + name_ref).str();
271}