xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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