Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp
39653 views
//===-- ABISysV_msp430.cpp --------------------------------------*- C++ -*-===//1//2// The LLVM Compiler Infrastructure3//4// This file is distributed under the University of Illinois Open Source5// License. See LICENSE.TXT for details.6//7//===----------------------------------------------------------------------===//89#include "ABISysV_msp430.h"1011#include "lldb/Core/Module.h"12#include "lldb/Core/PluginManager.h"13#include "lldb/Core/Value.h"14#include "lldb/Core/ValueObjectConstResult.h"15#include "lldb/Core/ValueObjectMemory.h"16#include "lldb/Core/ValueObjectRegister.h"17#include "lldb/Symbol/UnwindPlan.h"18#include "lldb/Target/Process.h"19#include "lldb/Target/RegisterContext.h"20#include "lldb/Target/StackFrame.h"21#include "lldb/Target/Target.h"22#include "lldb/Target/Thread.h"23#include "lldb/Utility/ConstString.h"24#include "lldb/Utility/DataExtractor.h"25#include "lldb/Utility/Log.h"26#include "lldb/Utility/RegisterValue.h"2728#include "llvm/IR/DerivedTypes.h"29#include "llvm/TargetParser/Triple.h"3031using namespace lldb;32using namespace lldb_private;3334LLDB_PLUGIN_DEFINE_ADV(ABISysV_msp430, ABIMSP430)3536enum dwarf_regnums {37dwarf_pc = 0,38dwarf_sp,39dwarf_r2,40dwarf_r3,41dwarf_fp,42dwarf_r5,43dwarf_r6,44dwarf_r7,45dwarf_r8,46dwarf_r9,47dwarf_r10,48dwarf_r11,49dwarf_r12,50dwarf_r13,51dwarf_r14,52dwarf_r15,53};5455static const RegisterInfo g_register_infos[] = {56{"r0",57"pc",582,590,60eEncodingUint,61eFormatHex,62{dwarf_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,63LLDB_INVALID_REGNUM},64nullptr,65nullptr,66nullptr,67},68{"r1",69"sp",702,710,72eEncodingUint,73eFormatHex,74{dwarf_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,75LLDB_INVALID_REGNUM},76nullptr,77nullptr,78nullptr,79},80{"r2",81"",822,830,84eEncodingUint,85eFormatHex,86{dwarf_r2, dwarf_r2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,87LLDB_INVALID_REGNUM},88nullptr,89nullptr,90nullptr,91},92{"r3",93"",942,950,96eEncodingUint,97eFormatHex,98{dwarf_r3, dwarf_r3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,99LLDB_INVALID_REGNUM},100nullptr,101nullptr,102nullptr,103},104{"r4",105"fp",1062,1070,108eEncodingUint,109eFormatHex,110{dwarf_fp, dwarf_fp, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,111LLDB_INVALID_REGNUM},112nullptr,113nullptr,114nullptr,115},116{"r5",117"",1182,1190,120eEncodingUint,121eFormatHex,122{dwarf_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,123LLDB_INVALID_REGNUM},124nullptr,125nullptr,126nullptr,127},128{"r6",129"",1302,1310,132eEncodingUint,133eFormatHex,134{dwarf_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,135LLDB_INVALID_REGNUM},136nullptr,137nullptr,138nullptr,139},140{"r7",141"",1422,1430,144eEncodingUint,145eFormatHex,146{dwarf_r7, dwarf_r7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,147LLDB_INVALID_REGNUM},148nullptr,149nullptr,150nullptr,151},152{"r8",153"",1542,1550,156eEncodingUint,157eFormatHex,158{dwarf_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,159LLDB_INVALID_REGNUM},160nullptr,161nullptr,162nullptr,163},164{"r9",165"",1662,1670,168eEncodingUint,169eFormatHex,170{dwarf_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,171LLDB_INVALID_REGNUM},172nullptr,173nullptr,174nullptr,175},176{"r10",177"",1782,1790,180eEncodingUint,181eFormatHex,182{dwarf_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,183LLDB_INVALID_REGNUM},184nullptr,185nullptr,186nullptr,187},188{"r11",189"",1902,1910,192eEncodingUint,193eFormatHex,194{dwarf_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,195LLDB_INVALID_REGNUM},196nullptr,197nullptr,198nullptr,199},200{"r12",201"",2022,2030,204eEncodingUint,205eFormatHex,206{dwarf_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,207LLDB_INVALID_REGNUM},208nullptr,209nullptr,210nullptr,211},212{"r13",213"",2142,2150,216eEncodingUint,217eFormatHex,218{dwarf_r13, dwarf_r13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,219LLDB_INVALID_REGNUM},220nullptr,221nullptr,222nullptr,223},224{"r14",225"",2262,2270,228eEncodingUint,229eFormatHex,230{dwarf_r14, dwarf_r14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,231LLDB_INVALID_REGNUM},232nullptr,233nullptr,234nullptr,235},236{"r15",237"",2382,2390,240eEncodingUint,241eFormatHex,242{dwarf_r15, dwarf_r15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,243LLDB_INVALID_REGNUM},244nullptr,245nullptr,246nullptr,247}};248249static const uint32_t k_num_register_infos =250sizeof(g_register_infos) / sizeof(RegisterInfo);251252const lldb_private::RegisterInfo *253ABISysV_msp430::GetRegisterInfoArray(uint32_t &count) {254// Make the C-string names and alt_names for the register infos into const255// C-string values by having the ConstString unique the names in the global256// constant C-string pool.257count = k_num_register_infos;258return g_register_infos;259}260261size_t ABISysV_msp430::GetRedZoneSize() const { return 0; }262263//------------------------------------------------------------------264// Static Functions265//------------------------------------------------------------------266267ABISP268ABISysV_msp430::CreateInstance(lldb::ProcessSP process_sp,269const ArchSpec &arch) {270if (arch.GetTriple().getArch() == llvm::Triple::msp430) {271return ABISP(272new ABISysV_msp430(std::move(process_sp), MakeMCRegisterInfo(arch)));273}274return ABISP();275}276277bool ABISysV_msp430::PrepareTrivialCall(Thread &thread, lldb::addr_t sp,278lldb::addr_t pc, lldb::addr_t ra,279llvm::ArrayRef<addr_t> args) const {280// we don't use the traditional trivial call specialized for jit281return false;282}283284bool ABISysV_msp430::GetArgumentValues(Thread &thread,285ValueList &values) const {286return false;287}288289Status ABISysV_msp430::SetReturnValueObject(lldb::StackFrameSP &frame_sp,290lldb::ValueObjectSP &new_value_sp) {291return Status();292}293294ValueObjectSP ABISysV_msp430::GetReturnValueObjectSimple(295Thread &thread, CompilerType &return_compiler_type) const {296ValueObjectSP return_valobj_sp;297return return_valobj_sp;298}299300ValueObjectSP ABISysV_msp430::GetReturnValueObjectImpl(301Thread &thread, CompilerType &return_compiler_type) const {302ValueObjectSP return_valobj_sp;303return return_valobj_sp;304}305306// called when we are on the first instruction of a new function307bool ABISysV_msp430::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {308unwind_plan.Clear();309unwind_plan.SetRegisterKind(eRegisterKindDWARF);310311uint32_t sp_reg_num = dwarf_sp;312uint32_t pc_reg_num = dwarf_pc;313314UnwindPlan::RowSP row(new UnwindPlan::Row);315row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 2);316row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -2, true);317row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);318319unwind_plan.AppendRow(row);320unwind_plan.SetSourceName("msp430 at-func-entry default");321unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);322return true;323}324325bool ABISysV_msp430::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {326unwind_plan.Clear();327unwind_plan.SetRegisterKind(eRegisterKindDWARF);328329uint32_t fp_reg_num = dwarf_fp;330uint32_t sp_reg_num = dwarf_sp;331uint32_t pc_reg_num = dwarf_pc;332333UnwindPlan::RowSP row(new UnwindPlan::Row);334row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 2);335row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -2, true);336row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true);337row->SetRegisterLocationToUnspecified(fp_reg_num, true);338339unwind_plan.AppendRow(row);340unwind_plan.SetSourceName("msp430 default unwind plan");341unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);342unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);343return true;344}345346bool ABISysV_msp430::RegisterIsVolatile(const RegisterInfo *reg_info) {347return !RegisterIsCalleeSaved(reg_info);348}349350bool ABISysV_msp430::RegisterIsCalleeSaved(const RegisterInfo *reg_info) {351int reg = ((reg_info->byte_offset) / 2);352353bool save = (reg >= 4) && (reg <= 10);354return save;355}356357void ABISysV_msp430::Initialize(void) {358PluginManager::RegisterPlugin(359GetPluginNameStatic(), "System V ABI for msp430 targets", CreateInstance);360}361362void ABISysV_msp430::Terminate(void) {363PluginManager::UnregisterPlugin(CreateInstance);364}365366367