1*06c3fb27SDimitry Andric //===-- ABISysV_msp430.cpp --------------------------------------*- C++ -*-===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // The LLVM Compiler Infrastructure
4*06c3fb27SDimitry Andric //
5*06c3fb27SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*06c3fb27SDimitry Andric // License. See LICENSE.TXT for details.
7*06c3fb27SDimitry Andric //
8*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
9*06c3fb27SDimitry Andric
10*06c3fb27SDimitry Andric #include "ABISysV_msp430.h"
11*06c3fb27SDimitry Andric
12*06c3fb27SDimitry Andric #include "lldb/Core/Module.h"
13*06c3fb27SDimitry Andric #include "lldb/Core/PluginManager.h"
14*06c3fb27SDimitry Andric #include "lldb/Core/Value.h"
15*06c3fb27SDimitry Andric #include "lldb/Core/ValueObjectConstResult.h"
16*06c3fb27SDimitry Andric #include "lldb/Core/ValueObjectMemory.h"
17*06c3fb27SDimitry Andric #include "lldb/Core/ValueObjectRegister.h"
18*06c3fb27SDimitry Andric #include "lldb/Symbol/UnwindPlan.h"
19*06c3fb27SDimitry Andric #include "lldb/Target/Process.h"
20*06c3fb27SDimitry Andric #include "lldb/Target/RegisterContext.h"
21*06c3fb27SDimitry Andric #include "lldb/Target/StackFrame.h"
22*06c3fb27SDimitry Andric #include "lldb/Target/Target.h"
23*06c3fb27SDimitry Andric #include "lldb/Target/Thread.h"
24*06c3fb27SDimitry Andric #include "lldb/Utility/ConstString.h"
25*06c3fb27SDimitry Andric #include "lldb/Utility/DataExtractor.h"
26*06c3fb27SDimitry Andric #include "lldb/Utility/Log.h"
27*06c3fb27SDimitry Andric #include "lldb/Utility/RegisterValue.h"
28*06c3fb27SDimitry Andric
29*06c3fb27SDimitry Andric #include "llvm/IR/DerivedTypes.h"
30*06c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
31*06c3fb27SDimitry Andric
32*06c3fb27SDimitry Andric using namespace lldb;
33*06c3fb27SDimitry Andric using namespace lldb_private;
34*06c3fb27SDimitry Andric
35*06c3fb27SDimitry Andric LLDB_PLUGIN_DEFINE_ADV(ABISysV_msp430, ABIMSP430)
36*06c3fb27SDimitry Andric
37*06c3fb27SDimitry Andric enum dwarf_regnums {
38*06c3fb27SDimitry Andric dwarf_pc = 0,
39*06c3fb27SDimitry Andric dwarf_sp,
40*06c3fb27SDimitry Andric dwarf_r2,
41*06c3fb27SDimitry Andric dwarf_r3,
42*06c3fb27SDimitry Andric dwarf_fp,
43*06c3fb27SDimitry Andric dwarf_r5,
44*06c3fb27SDimitry Andric dwarf_r6,
45*06c3fb27SDimitry Andric dwarf_r7,
46*06c3fb27SDimitry Andric dwarf_r8,
47*06c3fb27SDimitry Andric dwarf_r9,
48*06c3fb27SDimitry Andric dwarf_r10,
49*06c3fb27SDimitry Andric dwarf_r11,
50*06c3fb27SDimitry Andric dwarf_r12,
51*06c3fb27SDimitry Andric dwarf_r13,
52*06c3fb27SDimitry Andric dwarf_r14,
53*06c3fb27SDimitry Andric dwarf_r15,
54*06c3fb27SDimitry Andric };
55*06c3fb27SDimitry Andric
56*06c3fb27SDimitry Andric static const RegisterInfo g_register_infos[] = {
57*06c3fb27SDimitry Andric {"r0",
58*06c3fb27SDimitry Andric "pc",
59*06c3fb27SDimitry Andric 2,
60*06c3fb27SDimitry Andric 0,
61*06c3fb27SDimitry Andric eEncodingUint,
62*06c3fb27SDimitry Andric eFormatHex,
63*06c3fb27SDimitry Andric {dwarf_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,
64*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
65*06c3fb27SDimitry Andric nullptr,
66*06c3fb27SDimitry Andric nullptr,
67*06c3fb27SDimitry Andric nullptr,
68*06c3fb27SDimitry Andric },
69*06c3fb27SDimitry Andric {"r1",
70*06c3fb27SDimitry Andric "sp",
71*06c3fb27SDimitry Andric 2,
72*06c3fb27SDimitry Andric 0,
73*06c3fb27SDimitry Andric eEncodingUint,
74*06c3fb27SDimitry Andric eFormatHex,
75*06c3fb27SDimitry Andric {dwarf_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,
76*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
77*06c3fb27SDimitry Andric nullptr,
78*06c3fb27SDimitry Andric nullptr,
79*06c3fb27SDimitry Andric nullptr,
80*06c3fb27SDimitry Andric },
81*06c3fb27SDimitry Andric {"r2",
82*06c3fb27SDimitry Andric "",
83*06c3fb27SDimitry Andric 2,
84*06c3fb27SDimitry Andric 0,
85*06c3fb27SDimitry Andric eEncodingUint,
86*06c3fb27SDimitry Andric eFormatHex,
87*06c3fb27SDimitry Andric {dwarf_r2, dwarf_r2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
88*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
89*06c3fb27SDimitry Andric nullptr,
90*06c3fb27SDimitry Andric nullptr,
91*06c3fb27SDimitry Andric nullptr,
92*06c3fb27SDimitry Andric },
93*06c3fb27SDimitry Andric {"r3",
94*06c3fb27SDimitry Andric "",
95*06c3fb27SDimitry Andric 2,
96*06c3fb27SDimitry Andric 0,
97*06c3fb27SDimitry Andric eEncodingUint,
98*06c3fb27SDimitry Andric eFormatHex,
99*06c3fb27SDimitry Andric {dwarf_r3, dwarf_r3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
100*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
101*06c3fb27SDimitry Andric nullptr,
102*06c3fb27SDimitry Andric nullptr,
103*06c3fb27SDimitry Andric nullptr,
104*06c3fb27SDimitry Andric },
105*06c3fb27SDimitry Andric {"r4",
106*06c3fb27SDimitry Andric "fp",
107*06c3fb27SDimitry Andric 2,
108*06c3fb27SDimitry Andric 0,
109*06c3fb27SDimitry Andric eEncodingUint,
110*06c3fb27SDimitry Andric eFormatHex,
111*06c3fb27SDimitry Andric {dwarf_fp, dwarf_fp, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,
112*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
113*06c3fb27SDimitry Andric nullptr,
114*06c3fb27SDimitry Andric nullptr,
115*06c3fb27SDimitry Andric nullptr,
116*06c3fb27SDimitry Andric },
117*06c3fb27SDimitry Andric {"r5",
118*06c3fb27SDimitry Andric "",
119*06c3fb27SDimitry Andric 2,
120*06c3fb27SDimitry Andric 0,
121*06c3fb27SDimitry Andric eEncodingUint,
122*06c3fb27SDimitry Andric eFormatHex,
123*06c3fb27SDimitry Andric {dwarf_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
124*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
125*06c3fb27SDimitry Andric nullptr,
126*06c3fb27SDimitry Andric nullptr,
127*06c3fb27SDimitry Andric nullptr,
128*06c3fb27SDimitry Andric },
129*06c3fb27SDimitry Andric {"r6",
130*06c3fb27SDimitry Andric "",
131*06c3fb27SDimitry Andric 2,
132*06c3fb27SDimitry Andric 0,
133*06c3fb27SDimitry Andric eEncodingUint,
134*06c3fb27SDimitry Andric eFormatHex,
135*06c3fb27SDimitry Andric {dwarf_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
136*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
137*06c3fb27SDimitry Andric nullptr,
138*06c3fb27SDimitry Andric nullptr,
139*06c3fb27SDimitry Andric nullptr,
140*06c3fb27SDimitry Andric },
141*06c3fb27SDimitry Andric {"r7",
142*06c3fb27SDimitry Andric "",
143*06c3fb27SDimitry Andric 2,
144*06c3fb27SDimitry Andric 0,
145*06c3fb27SDimitry Andric eEncodingUint,
146*06c3fb27SDimitry Andric eFormatHex,
147*06c3fb27SDimitry Andric {dwarf_r7, dwarf_r7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
148*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
149*06c3fb27SDimitry Andric nullptr,
150*06c3fb27SDimitry Andric nullptr,
151*06c3fb27SDimitry Andric nullptr,
152*06c3fb27SDimitry Andric },
153*06c3fb27SDimitry Andric {"r8",
154*06c3fb27SDimitry Andric "",
155*06c3fb27SDimitry Andric 2,
156*06c3fb27SDimitry Andric 0,
157*06c3fb27SDimitry Andric eEncodingUint,
158*06c3fb27SDimitry Andric eFormatHex,
159*06c3fb27SDimitry Andric {dwarf_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
160*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
161*06c3fb27SDimitry Andric nullptr,
162*06c3fb27SDimitry Andric nullptr,
163*06c3fb27SDimitry Andric nullptr,
164*06c3fb27SDimitry Andric },
165*06c3fb27SDimitry Andric {"r9",
166*06c3fb27SDimitry Andric "",
167*06c3fb27SDimitry Andric 2,
168*06c3fb27SDimitry Andric 0,
169*06c3fb27SDimitry Andric eEncodingUint,
170*06c3fb27SDimitry Andric eFormatHex,
171*06c3fb27SDimitry Andric {dwarf_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
172*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
173*06c3fb27SDimitry Andric nullptr,
174*06c3fb27SDimitry Andric nullptr,
175*06c3fb27SDimitry Andric nullptr,
176*06c3fb27SDimitry Andric },
177*06c3fb27SDimitry Andric {"r10",
178*06c3fb27SDimitry Andric "",
179*06c3fb27SDimitry Andric 2,
180*06c3fb27SDimitry Andric 0,
181*06c3fb27SDimitry Andric eEncodingUint,
182*06c3fb27SDimitry Andric eFormatHex,
183*06c3fb27SDimitry Andric {dwarf_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
184*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
185*06c3fb27SDimitry Andric nullptr,
186*06c3fb27SDimitry Andric nullptr,
187*06c3fb27SDimitry Andric nullptr,
188*06c3fb27SDimitry Andric },
189*06c3fb27SDimitry Andric {"r11",
190*06c3fb27SDimitry Andric "",
191*06c3fb27SDimitry Andric 2,
192*06c3fb27SDimitry Andric 0,
193*06c3fb27SDimitry Andric eEncodingUint,
194*06c3fb27SDimitry Andric eFormatHex,
195*06c3fb27SDimitry Andric {dwarf_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
196*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
197*06c3fb27SDimitry Andric nullptr,
198*06c3fb27SDimitry Andric nullptr,
199*06c3fb27SDimitry Andric nullptr,
200*06c3fb27SDimitry Andric },
201*06c3fb27SDimitry Andric {"r12",
202*06c3fb27SDimitry Andric "",
203*06c3fb27SDimitry Andric 2,
204*06c3fb27SDimitry Andric 0,
205*06c3fb27SDimitry Andric eEncodingUint,
206*06c3fb27SDimitry Andric eFormatHex,
207*06c3fb27SDimitry Andric {dwarf_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
208*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
209*06c3fb27SDimitry Andric nullptr,
210*06c3fb27SDimitry Andric nullptr,
211*06c3fb27SDimitry Andric nullptr,
212*06c3fb27SDimitry Andric },
213*06c3fb27SDimitry Andric {"r13",
214*06c3fb27SDimitry Andric "",
215*06c3fb27SDimitry Andric 2,
216*06c3fb27SDimitry Andric 0,
217*06c3fb27SDimitry Andric eEncodingUint,
218*06c3fb27SDimitry Andric eFormatHex,
219*06c3fb27SDimitry Andric {dwarf_r13, dwarf_r13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
220*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
221*06c3fb27SDimitry Andric nullptr,
222*06c3fb27SDimitry Andric nullptr,
223*06c3fb27SDimitry Andric nullptr,
224*06c3fb27SDimitry Andric },
225*06c3fb27SDimitry Andric {"r14",
226*06c3fb27SDimitry Andric "",
227*06c3fb27SDimitry Andric 2,
228*06c3fb27SDimitry Andric 0,
229*06c3fb27SDimitry Andric eEncodingUint,
230*06c3fb27SDimitry Andric eFormatHex,
231*06c3fb27SDimitry Andric {dwarf_r14, dwarf_r14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
232*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
233*06c3fb27SDimitry Andric nullptr,
234*06c3fb27SDimitry Andric nullptr,
235*06c3fb27SDimitry Andric nullptr,
236*06c3fb27SDimitry Andric },
237*06c3fb27SDimitry Andric {"r15",
238*06c3fb27SDimitry Andric "",
239*06c3fb27SDimitry Andric 2,
240*06c3fb27SDimitry Andric 0,
241*06c3fb27SDimitry Andric eEncodingUint,
242*06c3fb27SDimitry Andric eFormatHex,
243*06c3fb27SDimitry Andric {dwarf_r15, dwarf_r15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,
244*06c3fb27SDimitry Andric LLDB_INVALID_REGNUM},
245*06c3fb27SDimitry Andric nullptr,
246*06c3fb27SDimitry Andric nullptr,
247*06c3fb27SDimitry Andric nullptr,
248*06c3fb27SDimitry Andric }};
249*06c3fb27SDimitry Andric
250*06c3fb27SDimitry Andric static const uint32_t k_num_register_infos =
251*06c3fb27SDimitry Andric sizeof(g_register_infos) / sizeof(RegisterInfo);
252*06c3fb27SDimitry Andric
253*06c3fb27SDimitry Andric const lldb_private::RegisterInfo *
GetRegisterInfoArray(uint32_t & count)254*06c3fb27SDimitry Andric ABISysV_msp430::GetRegisterInfoArray(uint32_t &count) {
255*06c3fb27SDimitry Andric // Make the C-string names and alt_names for the register infos into const
256*06c3fb27SDimitry Andric // C-string values by having the ConstString unique the names in the global
257*06c3fb27SDimitry Andric // constant C-string pool.
258*06c3fb27SDimitry Andric count = k_num_register_infos;
259*06c3fb27SDimitry Andric return g_register_infos;
260*06c3fb27SDimitry Andric }
261*06c3fb27SDimitry Andric
GetRedZoneSize() const262*06c3fb27SDimitry Andric size_t ABISysV_msp430::GetRedZoneSize() const { return 0; }
263*06c3fb27SDimitry Andric
264*06c3fb27SDimitry Andric //------------------------------------------------------------------
265*06c3fb27SDimitry Andric // Static Functions
266*06c3fb27SDimitry Andric //------------------------------------------------------------------
267*06c3fb27SDimitry Andric
268*06c3fb27SDimitry Andric ABISP
CreateInstance(lldb::ProcessSP process_sp,const ArchSpec & arch)269*06c3fb27SDimitry Andric ABISysV_msp430::CreateInstance(lldb::ProcessSP process_sp,
270*06c3fb27SDimitry Andric const ArchSpec &arch) {
271*06c3fb27SDimitry Andric if (arch.GetTriple().getArch() == llvm::Triple::msp430) {
272*06c3fb27SDimitry Andric return ABISP(
273*06c3fb27SDimitry Andric new ABISysV_msp430(std::move(process_sp), MakeMCRegisterInfo(arch)));
274*06c3fb27SDimitry Andric }
275*06c3fb27SDimitry Andric return ABISP();
276*06c3fb27SDimitry Andric }
277*06c3fb27SDimitry Andric
PrepareTrivialCall(Thread & thread,lldb::addr_t sp,lldb::addr_t pc,lldb::addr_t ra,llvm::ArrayRef<addr_t> args) const278*06c3fb27SDimitry Andric bool ABISysV_msp430::PrepareTrivialCall(Thread &thread, lldb::addr_t sp,
279*06c3fb27SDimitry Andric lldb::addr_t pc, lldb::addr_t ra,
280*06c3fb27SDimitry Andric llvm::ArrayRef<addr_t> args) const {
281*06c3fb27SDimitry Andric // we don't use the traditional trivial call specialized for jit
282*06c3fb27SDimitry Andric return false;
283*06c3fb27SDimitry Andric }
284*06c3fb27SDimitry Andric
GetArgumentValues(Thread & thread,ValueList & values) const285*06c3fb27SDimitry Andric bool ABISysV_msp430::GetArgumentValues(Thread &thread,
286*06c3fb27SDimitry Andric ValueList &values) const {
287*06c3fb27SDimitry Andric return false;
288*06c3fb27SDimitry Andric }
289*06c3fb27SDimitry Andric
SetReturnValueObject(lldb::StackFrameSP & frame_sp,lldb::ValueObjectSP & new_value_sp)290*06c3fb27SDimitry Andric Status ABISysV_msp430::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
291*06c3fb27SDimitry Andric lldb::ValueObjectSP &new_value_sp) {
292*06c3fb27SDimitry Andric return Status();
293*06c3fb27SDimitry Andric }
294*06c3fb27SDimitry Andric
GetReturnValueObjectSimple(Thread & thread,CompilerType & return_compiler_type) const295*06c3fb27SDimitry Andric ValueObjectSP ABISysV_msp430::GetReturnValueObjectSimple(
296*06c3fb27SDimitry Andric Thread &thread, CompilerType &return_compiler_type) const {
297*06c3fb27SDimitry Andric ValueObjectSP return_valobj_sp;
298*06c3fb27SDimitry Andric return return_valobj_sp;
299*06c3fb27SDimitry Andric }
300*06c3fb27SDimitry Andric
GetReturnValueObjectImpl(Thread & thread,CompilerType & return_compiler_type) const301*06c3fb27SDimitry Andric ValueObjectSP ABISysV_msp430::GetReturnValueObjectImpl(
302*06c3fb27SDimitry Andric Thread &thread, CompilerType &return_compiler_type) const {
303*06c3fb27SDimitry Andric ValueObjectSP return_valobj_sp;
304*06c3fb27SDimitry Andric return return_valobj_sp;
305*06c3fb27SDimitry Andric }
306*06c3fb27SDimitry Andric
307*06c3fb27SDimitry Andric // called when we are on the first instruction of a new function
CreateFunctionEntryUnwindPlan(UnwindPlan & unwind_plan)308*06c3fb27SDimitry Andric bool ABISysV_msp430::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
309*06c3fb27SDimitry Andric unwind_plan.Clear();
310*06c3fb27SDimitry Andric unwind_plan.SetRegisterKind(eRegisterKindDWARF);
311*06c3fb27SDimitry Andric
312*06c3fb27SDimitry Andric uint32_t sp_reg_num = dwarf_sp;
313*06c3fb27SDimitry Andric uint32_t pc_reg_num = dwarf_pc;
314*06c3fb27SDimitry Andric
315*06c3fb27SDimitry Andric UnwindPlan::RowSP row(new UnwindPlan::Row);
316*06c3fb27SDimitry Andric row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 2);
317*06c3fb27SDimitry Andric row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -2, true);
318*06c3fb27SDimitry Andric row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);
319*06c3fb27SDimitry Andric
320*06c3fb27SDimitry Andric unwind_plan.AppendRow(row);
321*06c3fb27SDimitry Andric unwind_plan.SetSourceName("msp430 at-func-entry default");
322*06c3fb27SDimitry Andric unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
323*06c3fb27SDimitry Andric return true;
324*06c3fb27SDimitry Andric }
325*06c3fb27SDimitry Andric
CreateDefaultUnwindPlan(UnwindPlan & unwind_plan)326*06c3fb27SDimitry Andric bool ABISysV_msp430::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
327*06c3fb27SDimitry Andric unwind_plan.Clear();
328*06c3fb27SDimitry Andric unwind_plan.SetRegisterKind(eRegisterKindDWARF);
329*06c3fb27SDimitry Andric
330*06c3fb27SDimitry Andric uint32_t fp_reg_num = dwarf_fp;
331*06c3fb27SDimitry Andric uint32_t sp_reg_num = dwarf_sp;
332*06c3fb27SDimitry Andric uint32_t pc_reg_num = dwarf_pc;
333*06c3fb27SDimitry Andric
334*06c3fb27SDimitry Andric UnwindPlan::RowSP row(new UnwindPlan::Row);
335*06c3fb27SDimitry Andric row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 2);
336*06c3fb27SDimitry Andric row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -2, true);
337*06c3fb27SDimitry Andric row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);
338*06c3fb27SDimitry Andric row->SetRegisterLocationToUnspecified(fp_reg_num, true);
339*06c3fb27SDimitry Andric
340*06c3fb27SDimitry Andric unwind_plan.AppendRow(row);
341*06c3fb27SDimitry Andric unwind_plan.SetSourceName("msp430 default unwind plan");
342*06c3fb27SDimitry Andric unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
343*06c3fb27SDimitry Andric unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
344*06c3fb27SDimitry Andric return true;
345*06c3fb27SDimitry Andric }
346*06c3fb27SDimitry Andric
RegisterIsVolatile(const RegisterInfo * reg_info)347*06c3fb27SDimitry Andric bool ABISysV_msp430::RegisterIsVolatile(const RegisterInfo *reg_info) {
348*06c3fb27SDimitry Andric return !RegisterIsCalleeSaved(reg_info);
349*06c3fb27SDimitry Andric }
350*06c3fb27SDimitry Andric
RegisterIsCalleeSaved(const RegisterInfo * reg_info)351*06c3fb27SDimitry Andric bool ABISysV_msp430::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {
352*06c3fb27SDimitry Andric int reg = ((reg_info->byte_offset) / 2);
353*06c3fb27SDimitry Andric
354*06c3fb27SDimitry Andric bool save = (reg >= 4) && (reg <= 10);
355*06c3fb27SDimitry Andric return save;
356*06c3fb27SDimitry Andric }
357*06c3fb27SDimitry Andric
Initialize(void)358*06c3fb27SDimitry Andric void ABISysV_msp430::Initialize(void) {
359*06c3fb27SDimitry Andric PluginManager::RegisterPlugin(
360*06c3fb27SDimitry Andric GetPluginNameStatic(), "System V ABI for msp430 targets", CreateInstance);
361*06c3fb27SDimitry Andric }
362*06c3fb27SDimitry Andric
Terminate(void)363*06c3fb27SDimitry Andric void ABISysV_msp430::Terminate(void) {
364*06c3fb27SDimitry Andric PluginManager::UnregisterPlugin(CreateInstance);
365*06c3fb27SDimitry Andric }
366