Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp
39648 views
//===-- ABISysV_arm.cpp ---------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "ABISysV_arm.h"910#include <optional>11#include <vector>1213#include "llvm/ADT/STLExtras.h"14#include "llvm/TargetParser/Triple.h"1516#include "lldb/Core/Module.h"17#include "lldb/Core/PluginManager.h"18#include "lldb/Core/Value.h"19#include "lldb/Core/ValueObjectConstResult.h"20#include "lldb/Symbol/UnwindPlan.h"21#include "lldb/Target/Process.h"22#include "lldb/Target/RegisterContext.h"23#include "lldb/Target/Target.h"24#include "lldb/Target/Thread.h"25#include "lldb/Utility/ConstString.h"26#include "lldb/Utility/RegisterValue.h"27#include "lldb/Utility/Scalar.h"28#include "lldb/Utility/Status.h"2930#include "Plugins/Process/Utility/ARMDefines.h"31#include "Utility/ARM_DWARF_Registers.h"32#include "Utility/ARM_ehframe_Registers.h"3334using namespace lldb;35using namespace lldb_private;3637LLDB_PLUGIN_DEFINE(ABISysV_arm)3839static const RegisterInfo g_register_infos[] = {40// NAME ALT SZ OFF ENCODING FORMAT EH_FRAME41// DWARF GENERIC PROCESS PLUGIN42// LLDB NATIVE VALUE REGS INVALIDATE REGS43// ========== ======= == === ============= ============44// ======================= =================== ===========================45// ======================= ====================== ==========46// ===============47{"r0",48nullptr,494,500,51eEncodingUint,52eFormatHex,53{ehframe_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1, LLDB_INVALID_REGNUM,54LLDB_INVALID_REGNUM},55nullptr,56nullptr,57nullptr,58},59{"r1",60nullptr,614,620,63eEncodingUint,64eFormatHex,65{ehframe_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2, LLDB_INVALID_REGNUM,66LLDB_INVALID_REGNUM},67nullptr,68nullptr,69nullptr,70},71{"r2",72nullptr,734,740,75eEncodingUint,76eFormatHex,77{ehframe_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3, LLDB_INVALID_REGNUM,78LLDB_INVALID_REGNUM},79nullptr,80nullptr,81nullptr,82},83{"r3",84nullptr,854,860,87eEncodingUint,88eFormatHex,89{ehframe_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4, LLDB_INVALID_REGNUM,90LLDB_INVALID_REGNUM},91nullptr,92nullptr,93nullptr,94},95{"r4",96nullptr,974,980,99eEncodingUint,100eFormatHex,101{ehframe_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,102LLDB_INVALID_REGNUM},103nullptr,104nullptr,105nullptr,106},107{"r5",108nullptr,1094,1100,111eEncodingUint,112eFormatHex,113{ehframe_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,114LLDB_INVALID_REGNUM},115nullptr,116nullptr,117nullptr,118},119{"r6",120nullptr,1214,1220,123eEncodingUint,124eFormatHex,125{ehframe_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,126LLDB_INVALID_REGNUM},127nullptr,128nullptr,129nullptr,130},131{"r7",132nullptr,1334,1340,135eEncodingUint,136eFormatHex,137{ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,138LLDB_INVALID_REGNUM},139nullptr,140nullptr,141nullptr,142},143{"r8",144nullptr,1454,1460,147eEncodingUint,148eFormatHex,149{ehframe_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,150LLDB_INVALID_REGNUM},151nullptr,152nullptr,153nullptr,154},155{"r9",156nullptr,1574,1580,159eEncodingUint,160eFormatHex,161{ehframe_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,162LLDB_INVALID_REGNUM},163nullptr,164nullptr,165nullptr,166},167{"r10",168nullptr,1694,1700,171eEncodingUint,172eFormatHex,173{ehframe_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,174LLDB_INVALID_REGNUM},175nullptr,176nullptr,177nullptr,178},179{"r11",180nullptr,1814,1820,183eEncodingUint,184eFormatHex,185{ehframe_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,186LLDB_INVALID_REGNUM},187nullptr,188nullptr,189nullptr,190},191{"r12",192nullptr,1934,1940,195eEncodingUint,196eFormatHex,197{ehframe_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,198LLDB_INVALID_REGNUM},199nullptr,200nullptr,201nullptr,202},203{"sp",204"r13",2054,2060,207eEncodingUint,208eFormatHex,209{ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,210LLDB_INVALID_REGNUM},211nullptr,212nullptr,213nullptr,214},215{"lr",216"r14",2174,2180,219eEncodingUint,220eFormatHex,221{ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM,222LLDB_INVALID_REGNUM},223nullptr,224nullptr,225nullptr,226},227{"pc",228"r15",2294,2300,231eEncodingUint,232eFormatHex,233{ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,234LLDB_INVALID_REGNUM},235nullptr,236nullptr,237nullptr,238},239{"cpsr",240"psr",2414,2420,243eEncodingUint,244eFormatHex,245{ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM,246LLDB_INVALID_REGNUM},247nullptr,248nullptr,249nullptr,250},251{"s0",252nullptr,2534,2540,255eEncodingIEEE754,256eFormatFloat,257{LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,258LLDB_INVALID_REGNUM},259nullptr,260nullptr,261nullptr,262},263{"s1",264nullptr,2654,2660,267eEncodingIEEE754,268eFormatFloat,269{LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,270LLDB_INVALID_REGNUM},271nullptr,272nullptr,273nullptr,274},275{"s2",276nullptr,2774,2780,279eEncodingIEEE754,280eFormatFloat,281{LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,282LLDB_INVALID_REGNUM},283nullptr,284nullptr,285nullptr,286},287{"s3",288nullptr,2894,2900,291eEncodingIEEE754,292eFormatFloat,293{LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,294LLDB_INVALID_REGNUM},295nullptr,296nullptr,297nullptr,298},299{"s4",300nullptr,3014,3020,303eEncodingIEEE754,304eFormatFloat,305{LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,306LLDB_INVALID_REGNUM},307nullptr,308nullptr,309nullptr,310},311{"s5",312nullptr,3134,3140,315eEncodingIEEE754,316eFormatFloat,317{LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,318LLDB_INVALID_REGNUM},319nullptr,320nullptr,321nullptr,322},323{"s6",324nullptr,3254,3260,327eEncodingIEEE754,328eFormatFloat,329{LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,330LLDB_INVALID_REGNUM},331nullptr,332nullptr,333nullptr,334},335{"s7",336nullptr,3374,3380,339eEncodingIEEE754,340eFormatFloat,341{LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,342LLDB_INVALID_REGNUM},343nullptr,344nullptr,345nullptr,346},347{"s8",348nullptr,3494,3500,351eEncodingIEEE754,352eFormatFloat,353{LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,354LLDB_INVALID_REGNUM},355nullptr,356nullptr,357nullptr,358},359{"s9",360nullptr,3614,3620,363eEncodingIEEE754,364eFormatFloat,365{LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,366LLDB_INVALID_REGNUM},367nullptr,368nullptr,369nullptr,370},371{"s10",372nullptr,3734,3740,375eEncodingIEEE754,376eFormatFloat,377{LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,378LLDB_INVALID_REGNUM},379nullptr,380nullptr,381nullptr,382},383{"s11",384nullptr,3854,3860,387eEncodingIEEE754,388eFormatFloat,389{LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,390LLDB_INVALID_REGNUM},391nullptr,392nullptr,393nullptr,394},395{"s12",396nullptr,3974,3980,399eEncodingIEEE754,400eFormatFloat,401{LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,402LLDB_INVALID_REGNUM},403nullptr,404nullptr,405nullptr,406},407{"s13",408nullptr,4094,4100,411eEncodingIEEE754,412eFormatFloat,413{LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,414LLDB_INVALID_REGNUM},415nullptr,416nullptr,417nullptr,418},419{"s14",420nullptr,4214,4220,423eEncodingIEEE754,424eFormatFloat,425{LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,426LLDB_INVALID_REGNUM},427nullptr,428nullptr,429nullptr,430},431{"s15",432nullptr,4334,4340,435eEncodingIEEE754,436eFormatFloat,437{LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,438LLDB_INVALID_REGNUM},439nullptr,440nullptr,441nullptr,442},443{"s16",444nullptr,4454,4460,447eEncodingIEEE754,448eFormatFloat,449{LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,450LLDB_INVALID_REGNUM},451nullptr,452nullptr,453nullptr,454},455{"s17",456nullptr,4574,4580,459eEncodingIEEE754,460eFormatFloat,461{LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,462LLDB_INVALID_REGNUM},463nullptr,464nullptr,465nullptr,466},467{"s18",468nullptr,4694,4700,471eEncodingIEEE754,472eFormatFloat,473{LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,474LLDB_INVALID_REGNUM},475nullptr,476nullptr,477nullptr,478},479{"s19",480nullptr,4814,4820,483eEncodingIEEE754,484eFormatFloat,485{LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,486LLDB_INVALID_REGNUM},487nullptr,488nullptr,489nullptr,490},491{"s20",492nullptr,4934,4940,495eEncodingIEEE754,496eFormatFloat,497{LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,498LLDB_INVALID_REGNUM},499nullptr,500nullptr,501nullptr,502},503{"s21",504nullptr,5054,5060,507eEncodingIEEE754,508eFormatFloat,509{LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,510LLDB_INVALID_REGNUM},511nullptr,512nullptr,513nullptr,514},515{"s22",516nullptr,5174,5180,519eEncodingIEEE754,520eFormatFloat,521{LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,522LLDB_INVALID_REGNUM},523nullptr,524nullptr,525nullptr,526},527{"s23",528nullptr,5294,5300,531eEncodingIEEE754,532eFormatFloat,533{LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,534LLDB_INVALID_REGNUM},535nullptr,536nullptr,537nullptr,538},539{"s24",540nullptr,5414,5420,543eEncodingIEEE754,544eFormatFloat,545{LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,546LLDB_INVALID_REGNUM},547nullptr,548nullptr,549nullptr,550},551{"s25",552nullptr,5534,5540,555eEncodingIEEE754,556eFormatFloat,557{LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,558LLDB_INVALID_REGNUM},559nullptr,560nullptr,561nullptr,562},563{"s26",564nullptr,5654,5660,567eEncodingIEEE754,568eFormatFloat,569{LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,570LLDB_INVALID_REGNUM},571nullptr,572nullptr,573nullptr,574},575{"s27",576nullptr,5774,5780,579eEncodingIEEE754,580eFormatFloat,581{LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,582LLDB_INVALID_REGNUM},583nullptr,584nullptr,585nullptr,586},587{"s28",588nullptr,5894,5900,591eEncodingIEEE754,592eFormatFloat,593{LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,594LLDB_INVALID_REGNUM},595nullptr,596nullptr,597nullptr,598},599{"s29",600nullptr,6014,6020,603eEncodingIEEE754,604eFormatFloat,605{LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,606LLDB_INVALID_REGNUM},607nullptr,608nullptr,609nullptr,610},611{"s30",612nullptr,6134,6140,615eEncodingIEEE754,616eFormatFloat,617{LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,618LLDB_INVALID_REGNUM},619nullptr,620nullptr,621nullptr,622},623{"s31",624nullptr,6254,6260,627eEncodingIEEE754,628eFormatFloat,629{LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,630LLDB_INVALID_REGNUM},631nullptr,632nullptr,633nullptr,634},635{"fpscr",636nullptr,6374,6380,639eEncodingUint,640eFormatHex,641{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,642LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},643nullptr,644nullptr,645nullptr,646},647{"d0",648nullptr,6498,6500,651eEncodingIEEE754,652eFormatFloat,653{LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,654LLDB_INVALID_REGNUM},655nullptr,656nullptr,657nullptr,658},659{"d1",660nullptr,6618,6620,663eEncodingIEEE754,664eFormatFloat,665{LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,666LLDB_INVALID_REGNUM},667nullptr,668nullptr,669nullptr,670},671{"d2",672nullptr,6738,6740,675eEncodingIEEE754,676eFormatFloat,677{LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,678LLDB_INVALID_REGNUM},679nullptr,680nullptr,681nullptr,682},683{"d3",684nullptr,6858,6860,687eEncodingIEEE754,688eFormatFloat,689{LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,690LLDB_INVALID_REGNUM},691nullptr,692nullptr,693nullptr,694},695{"d4",696nullptr,6978,6980,699eEncodingIEEE754,700eFormatFloat,701{LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,702LLDB_INVALID_REGNUM},703nullptr,704nullptr,705nullptr,706},707{"d5",708nullptr,7098,7100,711eEncodingIEEE754,712eFormatFloat,713{LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,714LLDB_INVALID_REGNUM},715nullptr,716nullptr,717nullptr,718},719{"d6",720nullptr,7218,7220,723eEncodingIEEE754,724eFormatFloat,725{LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,726LLDB_INVALID_REGNUM},727nullptr,728nullptr,729nullptr,730},731{"d7",732nullptr,7338,7340,735eEncodingIEEE754,736eFormatFloat,737{LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,738LLDB_INVALID_REGNUM},739nullptr,740nullptr,741nullptr,742},743{"d8",744nullptr,7458,7460,747eEncodingIEEE754,748eFormatFloat,749{LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,750LLDB_INVALID_REGNUM},751nullptr,752nullptr,753nullptr,754},755{"d9",756nullptr,7578,7580,759eEncodingIEEE754,760eFormatFloat,761{LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,762LLDB_INVALID_REGNUM},763nullptr,764nullptr,765nullptr,766},767{"d10",768nullptr,7698,7700,771eEncodingIEEE754,772eFormatFloat,773{LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,774LLDB_INVALID_REGNUM},775nullptr,776nullptr,777nullptr,778},779{"d11",780nullptr,7818,7820,783eEncodingIEEE754,784eFormatFloat,785{LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,786LLDB_INVALID_REGNUM},787nullptr,788nullptr,789nullptr,790},791{"d12",792nullptr,7938,7940,795eEncodingIEEE754,796eFormatFloat,797{LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,798LLDB_INVALID_REGNUM},799nullptr,800nullptr,801nullptr,802},803{"d13",804nullptr,8058,8060,807eEncodingIEEE754,808eFormatFloat,809{LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,810LLDB_INVALID_REGNUM},811nullptr,812nullptr,813nullptr,814},815{"d14",816nullptr,8178,8180,819eEncodingIEEE754,820eFormatFloat,821{LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,822LLDB_INVALID_REGNUM},823nullptr,824nullptr,825nullptr,826},827{"d15",828nullptr,8298,8300,831eEncodingIEEE754,832eFormatFloat,833{LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,834LLDB_INVALID_REGNUM},835nullptr,836nullptr,837nullptr,838},839{"d16",840nullptr,8418,8420,843eEncodingIEEE754,844eFormatFloat,845{LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,846LLDB_INVALID_REGNUM},847nullptr,848nullptr,849nullptr,850},851{"d17",852nullptr,8538,8540,855eEncodingIEEE754,856eFormatFloat,857{LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,858LLDB_INVALID_REGNUM},859nullptr,860nullptr,861nullptr,862},863{"d18",864nullptr,8658,8660,867eEncodingIEEE754,868eFormatFloat,869{LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,870LLDB_INVALID_REGNUM},871nullptr,872nullptr,873nullptr,874},875{"d19",876nullptr,8778,8780,879eEncodingIEEE754,880eFormatFloat,881{LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,882LLDB_INVALID_REGNUM},883nullptr,884nullptr,885nullptr,886},887{"d20",888nullptr,8898,8900,891eEncodingIEEE754,892eFormatFloat,893{LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,894LLDB_INVALID_REGNUM},895nullptr,896nullptr,897nullptr,898},899{"d21",900nullptr,9018,9020,903eEncodingIEEE754,904eFormatFloat,905{LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,906LLDB_INVALID_REGNUM},907nullptr,908nullptr,909nullptr,910},911{"d22",912nullptr,9138,9140,915eEncodingIEEE754,916eFormatFloat,917{LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,918LLDB_INVALID_REGNUM},919nullptr,920nullptr,921nullptr,922},923{"d23",924nullptr,9258,9260,927eEncodingIEEE754,928eFormatFloat,929{LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,930LLDB_INVALID_REGNUM},931nullptr,932nullptr,933nullptr,934},935{"d24",936nullptr,9378,9380,939eEncodingIEEE754,940eFormatFloat,941{LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,942LLDB_INVALID_REGNUM},943nullptr,944nullptr,945nullptr,946},947{"d25",948nullptr,9498,9500,951eEncodingIEEE754,952eFormatFloat,953{LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,954LLDB_INVALID_REGNUM},955nullptr,956nullptr,957nullptr,958},959{"d26",960nullptr,9618,9620,963eEncodingIEEE754,964eFormatFloat,965{LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,966LLDB_INVALID_REGNUM},967nullptr,968nullptr,969nullptr,970},971{"d27",972nullptr,9738,9740,975eEncodingIEEE754,976eFormatFloat,977{LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,978LLDB_INVALID_REGNUM},979nullptr,980nullptr,981nullptr,982},983{"d28",984nullptr,9858,9860,987eEncodingIEEE754,988eFormatFloat,989{LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,990LLDB_INVALID_REGNUM},991nullptr,992nullptr,993nullptr,994},995{"d29",996nullptr,9978,9980,999eEncodingIEEE754,1000eFormatFloat,1001{LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,1002LLDB_INVALID_REGNUM},1003nullptr,1004nullptr,1005nullptr,1006},1007{"d30",1008nullptr,10098,10100,1011eEncodingIEEE754,1012eFormatFloat,1013{LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,1014LLDB_INVALID_REGNUM},1015nullptr,1016nullptr,1017nullptr,1018},1019{"d31",1020nullptr,10218,10220,1023eEncodingIEEE754,1024eFormatFloat,1025{LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,1026LLDB_INVALID_REGNUM},1027nullptr,1028nullptr,1029nullptr,1030},1031{"r8_usr",1032nullptr,10334,10340,1035eEncodingUint,1036eFormatHex,1037{LLDB_INVALID_REGNUM, dwarf_r8_usr, LLDB_INVALID_REGNUM,1038LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1039nullptr,1040nullptr,1041nullptr,1042},1043{"r9_usr",1044nullptr,10454,10460,1047eEncodingUint,1048eFormatHex,1049{LLDB_INVALID_REGNUM, dwarf_r9_usr, LLDB_INVALID_REGNUM,1050LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1051nullptr,1052nullptr,1053nullptr,1054},1055{"r10_usr",1056nullptr,10574,10580,1059eEncodingUint,1060eFormatHex,1061{LLDB_INVALID_REGNUM, dwarf_r10_usr, LLDB_INVALID_REGNUM,1062LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1063nullptr,1064nullptr,1065nullptr,1066},1067{"r11_usr",1068nullptr,10694,10700,1071eEncodingUint,1072eFormatHex,1073{LLDB_INVALID_REGNUM, dwarf_r11_usr, LLDB_INVALID_REGNUM,1074LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1075nullptr,1076nullptr,1077nullptr,1078},1079{"r12_usr",1080nullptr,10814,10820,1083eEncodingUint,1084eFormatHex,1085{LLDB_INVALID_REGNUM, dwarf_r12_usr, LLDB_INVALID_REGNUM,1086LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1087nullptr,1088nullptr,1089nullptr,1090},1091{"r13_usr",1092"sp_usr",10934,10940,1095eEncodingUint,1096eFormatHex,1097{LLDB_INVALID_REGNUM, dwarf_r13_usr, LLDB_INVALID_REGNUM,1098LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1099nullptr,1100nullptr,1101nullptr,1102},1103{"r14_usr",1104"lr_usr",11054,11060,1107eEncodingUint,1108eFormatHex,1109{LLDB_INVALID_REGNUM, dwarf_r14_usr, LLDB_INVALID_REGNUM,1110LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1111nullptr,1112nullptr,1113nullptr,1114},1115{"r8_fiq",1116nullptr,11174,11180,1119eEncodingUint,1120eFormatHex,1121{LLDB_INVALID_REGNUM, dwarf_r8_fiq, LLDB_INVALID_REGNUM,1122LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1123nullptr,1124nullptr,1125nullptr,1126},1127{"r9_fiq",1128nullptr,11294,11300,1131eEncodingUint,1132eFormatHex,1133{LLDB_INVALID_REGNUM, dwarf_r9_fiq, LLDB_INVALID_REGNUM,1134LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1135nullptr,1136nullptr,1137nullptr,1138},1139{"r10_fiq",1140nullptr,11414,11420,1143eEncodingUint,1144eFormatHex,1145{LLDB_INVALID_REGNUM, dwarf_r10_fiq, LLDB_INVALID_REGNUM,1146LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1147nullptr,1148nullptr,1149nullptr,1150},1151{"r11_fiq",1152nullptr,11534,11540,1155eEncodingUint,1156eFormatHex,1157{LLDB_INVALID_REGNUM, dwarf_r11_fiq, LLDB_INVALID_REGNUM,1158LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1159nullptr,1160nullptr,1161nullptr,1162},1163{"r12_fiq",1164nullptr,11654,11660,1167eEncodingUint,1168eFormatHex,1169{LLDB_INVALID_REGNUM, dwarf_r12_fiq, LLDB_INVALID_REGNUM,1170LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1171nullptr,1172nullptr,1173nullptr,1174},1175{"r13_fiq",1176"sp_fiq",11774,11780,1179eEncodingUint,1180eFormatHex,1181{LLDB_INVALID_REGNUM, dwarf_r13_fiq, LLDB_INVALID_REGNUM,1182LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1183nullptr,1184nullptr,1185nullptr,1186},1187{"r14_fiq",1188"lr_fiq",11894,11900,1191eEncodingUint,1192eFormatHex,1193{LLDB_INVALID_REGNUM, dwarf_r14_fiq, LLDB_INVALID_REGNUM,1194LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1195nullptr,1196nullptr,1197nullptr,1198},1199{"r13_irq",1200"sp_irq",12014,12020,1203eEncodingUint,1204eFormatHex,1205{LLDB_INVALID_REGNUM, dwarf_r13_irq, LLDB_INVALID_REGNUM,1206LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1207nullptr,1208nullptr,1209nullptr,1210},1211{"r14_irq",1212"lr_irq",12134,12140,1215eEncodingUint,1216eFormatHex,1217{LLDB_INVALID_REGNUM, dwarf_r14_irq, LLDB_INVALID_REGNUM,1218LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1219nullptr,1220nullptr,1221nullptr,1222},1223{"r13_abt",1224"sp_abt",12254,12260,1227eEncodingUint,1228eFormatHex,1229{LLDB_INVALID_REGNUM, dwarf_r13_abt, LLDB_INVALID_REGNUM,1230LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1231nullptr,1232nullptr,1233nullptr,1234},1235{"r14_abt",1236"lr_abt",12374,12380,1239eEncodingUint,1240eFormatHex,1241{LLDB_INVALID_REGNUM, dwarf_r14_abt, LLDB_INVALID_REGNUM,1242LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1243nullptr,1244nullptr,1245nullptr,1246},1247{"r13_und",1248"sp_und",12494,12500,1251eEncodingUint,1252eFormatHex,1253{LLDB_INVALID_REGNUM, dwarf_r13_und, LLDB_INVALID_REGNUM,1254LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1255nullptr,1256nullptr,1257nullptr,1258},1259{"r14_und",1260"lr_und",12614,12620,1263eEncodingUint,1264eFormatHex,1265{LLDB_INVALID_REGNUM, dwarf_r14_und, LLDB_INVALID_REGNUM,1266LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1267nullptr,1268nullptr,1269nullptr,12701271},1272{"r13_svc",1273"sp_svc",12744,12750,1276eEncodingUint,1277eFormatHex,1278{LLDB_INVALID_REGNUM, dwarf_r13_svc, LLDB_INVALID_REGNUM,1279LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1280nullptr,1281nullptr,1282nullptr,1283},1284{"r14_svc",1285"lr_svc",12864,12870,1288eEncodingUint,1289eFormatHex,1290{LLDB_INVALID_REGNUM, dwarf_r14_svc, LLDB_INVALID_REGNUM,1291LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1292nullptr,1293nullptr,1294nullptr,1295}};12961297static const uint32_t k_num_register_infos = std::size(g_register_infos);12981299const lldb_private::RegisterInfo *1300ABISysV_arm::GetRegisterInfoArray(uint32_t &count) {1301count = k_num_register_infos;1302return g_register_infos;1303}13041305size_t ABISysV_arm::GetRedZoneSize() const { return 0; }13061307// Static Functions13081309ABISP1310ABISysV_arm::CreateInstance(lldb::ProcessSP process_sp, const ArchSpec &arch) {1311const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();1312const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();13131314if (vendor_type != llvm::Triple::Apple) {1315if ((arch_type == llvm::Triple::arm) ||1316(arch_type == llvm::Triple::thumb)) {1317return ABISP(1318new ABISysV_arm(std::move(process_sp), MakeMCRegisterInfo(arch)));1319}1320}13211322return ABISP();1323}13241325bool ABISysV_arm::PrepareTrivialCall(Thread &thread, addr_t sp,1326addr_t function_addr, addr_t return_addr,1327llvm::ArrayRef<addr_t> args) const {1328RegisterContext *reg_ctx = thread.GetRegisterContext().get();1329if (!reg_ctx)1330return false;13311332const uint32_t pc_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1333eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);1334const uint32_t sp_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1335eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);1336const uint32_t ra_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1337eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);13381339RegisterValue reg_value;13401341const uint8_t reg_names[] = {1342LLDB_REGNUM_GENERIC_ARG1, LLDB_REGNUM_GENERIC_ARG2,1343LLDB_REGNUM_GENERIC_ARG3, LLDB_REGNUM_GENERIC_ARG4};13441345llvm::ArrayRef<addr_t>::iterator ai = args.begin(), ae = args.end();13461347for (size_t i = 0; i < std::size(reg_names); ++i) {1348if (ai == ae)1349break;13501351reg_value.SetUInt32(*ai);1352if (!reg_ctx->WriteRegister(1353reg_ctx->GetRegisterInfo(eRegisterKindGeneric, reg_names[i]),1354reg_value))1355return false;13561357++ai;1358}13591360if (ai != ae) {1361// Spill onto the stack1362size_t num_stack_regs = ae - ai;13631364sp -= (num_stack_regs * 4);1365// Keep the stack 8 byte aligned, not that we need to1366sp &= ~(8ull - 1ull);13671368// just using arg1 to get the right size1369const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(1370eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);13711372addr_t arg_pos = sp;13731374for (; ai != ae; ++ai) {1375reg_value.SetUInt32(*ai);1376if (reg_ctx1377->WriteRegisterValueToMemory(reg_info, arg_pos,1378reg_info->byte_size, reg_value)1379.Fail())1380return false;1381arg_pos += reg_info->byte_size;1382}1383}13841385TargetSP target_sp(thread.CalculateTarget());1386Address so_addr;13871388// Figure out if our return address is ARM or Thumb by using the1389// Address::GetCallableLoadAddress(Target*) which will figure out the ARM1390// thumb-ness and set the correct address bits for us.1391so_addr.SetLoadAddress(return_addr, target_sp.get());1392return_addr = so_addr.GetCallableLoadAddress(target_sp.get());13931394// Set "lr" to the return address1395if (!reg_ctx->WriteRegisterFromUnsigned(ra_reg_num, return_addr))1396return false;13971398// Set "sp" to the requested value1399if (!reg_ctx->WriteRegisterFromUnsigned(sp_reg_num, sp))1400return false;14011402// If bit zero or 1 is set, this must be a thumb function, no need to figure1403// this out from the symbols.1404so_addr.SetLoadAddress(function_addr, target_sp.get());1405function_addr = so_addr.GetCallableLoadAddress(target_sp.get());14061407const RegisterInfo *cpsr_reg_info =1408reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);1409const uint32_t curr_cpsr = reg_ctx->ReadRegisterAsUnsigned(cpsr_reg_info, 0);14101411// Make a new CPSR and mask out any Thumb IT (if/then) bits1412uint32_t new_cpsr = curr_cpsr & ~MASK_CPSR_IT_MASK;1413// If bit zero or 1 is set, this must be thumb...1414if (function_addr & 1ull)1415new_cpsr |= MASK_CPSR_T; // Set T bit in CPSR1416else1417new_cpsr &= ~MASK_CPSR_T; // Clear T bit in CPSR14181419if (new_cpsr != curr_cpsr) {1420if (!reg_ctx->WriteRegisterFromUnsigned(cpsr_reg_info, new_cpsr))1421return false;1422}14231424function_addr &=1425~1ull; // clear bit zero since the CPSR will take care of the mode for us14261427// Set "pc" to the address requested1428return reg_ctx->WriteRegisterFromUnsigned(pc_reg_num, function_addr);1429}14301431bool ABISysV_arm::GetArgumentValues(Thread &thread, ValueList &values) const {1432uint32_t num_values = values.GetSize();14331434ExecutionContext exe_ctx(thread.shared_from_this());1435// For now, assume that the types in the AST values come from the Target's1436// scratch AST.14371438// Extract the register context so we can read arguments from registers14391440RegisterContext *reg_ctx = thread.GetRegisterContext().get();14411442if (!reg_ctx)1443return false;14441445addr_t sp = 0;14461447for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {1448// We currently only support extracting values with Clang QualTypes. Do we1449// care about others?1450Value *value = values.GetValueAtIndex(value_idx);14511452if (!value)1453return false;14541455CompilerType compiler_type = value->GetCompilerType();1456if (compiler_type) {1457bool is_signed = false;1458size_t bit_width = 0;1459if (compiler_type.IsIntegerOrEnumerationType(is_signed) ||1460compiler_type.IsPointerOrReferenceType()) {1461if (std::optional<uint64_t> size = compiler_type.GetBitSize(&thread))1462bit_width = *size;1463} else {1464// We only handle integer, pointer and reference types currently...1465return false;1466}14671468if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {1469if (value_idx < 4) {1470// Arguments 1-4 are in r0-r3...1471const RegisterInfo *arg_reg_info = nullptr;1472arg_reg_info = reg_ctx->GetRegisterInfo(1473eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);1474if (arg_reg_info) {1475RegisterValue reg_value;14761477if (reg_ctx->ReadRegister(arg_reg_info, reg_value)) {1478if (is_signed)1479reg_value.SignExtend(bit_width);1480if (!reg_value.GetScalarValue(value->GetScalar()))1481return false;1482continue;1483}1484}1485return false;1486} else {1487if (sp == 0) {1488// Read the stack pointer if it already hasn't been read1489sp = reg_ctx->GetSP(0);1490if (sp == 0)1491return false;1492}14931494// Arguments 5 on up are on the stack1495const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;1496Status error;1497if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(1498sp, arg_byte_size, is_signed, value->GetScalar(), error))1499return false;15001501sp += arg_byte_size;1502}1503}1504}1505}1506return true;1507}15081509static bool GetReturnValuePassedInMemory(Thread &thread,1510RegisterContext *reg_ctx,1511size_t byte_size, Value &value) {1512Status error;1513DataBufferHeap buffer(byte_size, 0);15141515const RegisterInfo *r0_reg_info =1516reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);1517uint32_t address =1518reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1519thread.GetProcess()->ReadMemory(address, buffer.GetBytes(),1520buffer.GetByteSize(), error);15211522if (error.Fail())1523return false;15241525value.SetBytes(buffer.GetBytes(), buffer.GetByteSize());1526return true;1527}15281529bool ABISysV_arm::IsArmHardFloat(Thread &thread) const {1530ProcessSP process_sp(thread.GetProcess());1531if (process_sp) {1532const ArchSpec &arch(process_sp->GetTarget().GetArchitecture());15331534return (arch.GetFlags() & ArchSpec::eARM_abi_hard_float) != 0;1535}15361537return false;1538}15391540ValueObjectSP ABISysV_arm::GetReturnValueObjectImpl(1541Thread &thread, lldb_private::CompilerType &compiler_type) const {1542Value value;1543ValueObjectSP return_valobj_sp;15441545if (!compiler_type)1546return return_valobj_sp;15471548// value.SetContext (Value::eContextTypeClangType,1549// compiler_type.GetOpaqueQualType());1550value.SetCompilerType(compiler_type);15511552RegisterContext *reg_ctx = thread.GetRegisterContext().get();1553if (!reg_ctx)1554return return_valobj_sp;15551556bool is_signed;1557bool is_complex;1558uint32_t float_count;1559bool is_vfp_candidate = false;1560uint8_t vfp_count = 0;1561uint8_t vfp_byte_size = 0;15621563// Get the pointer to the first stack argument so we have a place to start1564// when reading data15651566const RegisterInfo *r0_reg_info =1567reg_ctx->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);1568std::optional<uint64_t> bit_width = compiler_type.GetBitSize(&thread);1569std::optional<uint64_t> byte_size = compiler_type.GetByteSize(&thread);1570if (!bit_width || !byte_size)1571return return_valobj_sp;15721573if (compiler_type.IsIntegerOrEnumerationType(is_signed)) {1574switch (*bit_width) {1575default:1576return return_valobj_sp;1577case 64: {1578const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfo(1579eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);1580uint64_t raw_value;1581raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1582raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) &1583UINT32_MAX))1584<< 32;1585if (is_signed)1586value.GetScalar() = (int64_t)raw_value;1587else1588value.GetScalar() = (uint64_t)raw_value;1589} break;1590case 32:1591if (is_signed)1592value.GetScalar() = (int32_t)(1593reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);1594else1595value.GetScalar() = (uint32_t)(1596reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);1597break;1598case 16:1599if (is_signed)1600value.GetScalar() = (int16_t)(1601reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);1602else1603value.GetScalar() = (uint16_t)(1604reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);1605break;1606case 8:1607if (is_signed)1608value.GetScalar() = (int8_t)(1609reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);1610else1611value.GetScalar() = (uint8_t)(1612reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);1613break;1614}1615} else if (compiler_type.IsPointerType()) {1616uint32_t ptr =1617thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) &1618UINT32_MAX;1619value.GetScalar() = ptr;1620} else if (compiler_type.IsVectorType()) {1621if (IsArmHardFloat(thread) && (*byte_size == 8 || *byte_size == 16)) {1622is_vfp_candidate = true;1623vfp_byte_size = 8;1624vfp_count = (*byte_size == 8 ? 1 : 2);1625} else if (*byte_size <= 16) {1626DataBufferHeap buffer(16, 0);1627uint32_t *buffer_ptr = (uint32_t *)buffer.GetBytes();16281629for (uint32_t i = 0; 4 * i < *byte_size; ++i) {1630const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(1631eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + i);1632buffer_ptr[i] =1633reg_ctx->ReadRegisterAsUnsigned(reg_info, 0) & UINT32_MAX;1634}1635value.SetBytes(buffer.GetBytes(), *byte_size);1636} else {1637if (!GetReturnValuePassedInMemory(thread, reg_ctx, *byte_size, value))1638return return_valobj_sp;1639}1640} else if (compiler_type.IsFloatingPointType(float_count, is_complex)) {1641if (float_count == 1 && !is_complex) {1642switch (*bit_width) {1643default:1644return return_valobj_sp;1645case 64: {1646static_assert(sizeof(double) == sizeof(uint64_t));16471648if (IsArmHardFloat(thread)) {1649RegisterValue reg_value;1650const RegisterInfo *d0_reg_info =1651reg_ctx->GetRegisterInfoByName("d0", 0);1652reg_ctx->ReadRegister(d0_reg_info, reg_value);1653value.GetScalar() = reg_value.GetAsDouble();1654} else {1655uint64_t raw_value;1656const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfo(1657eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);1658raw_value =1659reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1660raw_value |=1661((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) &1662UINT32_MAX))1663<< 32;1664value.GetScalar() = *reinterpret_cast<double *>(&raw_value);1665}1666break;1667}1668case 16: // Half precision returned after a conversion to single precision1669case 32: {1670static_assert(sizeof(float) == sizeof(uint32_t));16711672if (IsArmHardFloat(thread)) {1673RegisterValue reg_value;1674const RegisterInfo *s0_reg_info =1675reg_ctx->GetRegisterInfoByName("s0", 0);1676reg_ctx->ReadRegister(s0_reg_info, reg_value);1677value.GetScalar() = reg_value.GetAsFloat();1678} else {1679uint32_t raw_value;1680raw_value =1681reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1682value.GetScalar() = *reinterpret_cast<float *>(&raw_value);1683}1684break;1685}1686}1687} else if (is_complex && float_count == 2) {1688if (IsArmHardFloat(thread)) {1689is_vfp_candidate = true;1690vfp_byte_size = *byte_size / 2;1691vfp_count = 2;1692} else if (!GetReturnValuePassedInMemory(thread, reg_ctx, *bit_width / 8,1693value))1694return return_valobj_sp;1695} else1696// not handled yet1697return return_valobj_sp;1698} else if (compiler_type.IsAggregateType()) {1699if (IsArmHardFloat(thread)) {1700CompilerType base_type;1701const uint32_t homogeneous_count =1702compiler_type.IsHomogeneousAggregate(&base_type);17031704if (homogeneous_count > 0 && homogeneous_count <= 4) {1705std::optional<uint64_t> base_byte_size = base_type.GetByteSize(&thread);1706if (base_type.IsVectorType()) {1707if (base_byte_size &&1708(*base_byte_size == 8 || *base_byte_size == 16)) {1709is_vfp_candidate = true;1710vfp_byte_size = 8;1711vfp_count = (*base_byte_size == 8 ? homogeneous_count1712: homogeneous_count * 2);1713}1714} else if (base_type.IsFloatingPointType(float_count, is_complex)) {1715if (float_count == 1 && !is_complex) {1716is_vfp_candidate = true;1717if (base_byte_size)1718vfp_byte_size = *base_byte_size;1719vfp_count = homogeneous_count;1720}1721}1722} else if (homogeneous_count == 0) {1723const uint32_t num_children = compiler_type.GetNumFields();17241725if (num_children > 0 && num_children <= 2) {1726uint32_t index = 0;1727for (index = 0; index < num_children; index++) {1728std::string name;1729base_type = compiler_type.GetFieldAtIndex(index, name, nullptr,1730nullptr, nullptr);17311732if (base_type.IsFloatingPointType(float_count, is_complex)) {1733std::optional<uint64_t> base_byte_size =1734base_type.GetByteSize(&thread);1735if (float_count == 2 && is_complex) {1736if (index != 0 && base_byte_size &&1737vfp_byte_size != *base_byte_size)1738break;1739else if (base_byte_size)1740vfp_byte_size = *base_byte_size;1741} else1742break;1743} else1744break;1745}17461747if (index == num_children) {1748is_vfp_candidate = true;1749vfp_byte_size = (vfp_byte_size >> 1);1750vfp_count = (num_children << 1);1751}1752}1753}1754}17551756if (*byte_size <= 4) {1757RegisterValue r0_reg_value;1758uint32_t raw_value =1759reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1760value.SetBytes(&raw_value, *byte_size);1761} else if (!is_vfp_candidate) {1762if (!GetReturnValuePassedInMemory(thread, reg_ctx, *byte_size, value))1763return return_valobj_sp;1764}1765} else {1766// not handled yet1767return return_valobj_sp;1768}17691770if (is_vfp_candidate) {1771ProcessSP process_sp(thread.GetProcess());1772ByteOrder byte_order = process_sp->GetByteOrder();17731774WritableDataBufferSP data_sp(new DataBufferHeap(*byte_size, 0));1775uint32_t data_offset = 0;17761777for (uint32_t reg_index = 0; reg_index < vfp_count; reg_index++) {1778uint32_t regnum = 0;17791780if (vfp_byte_size == 4)1781regnum = dwarf_s0 + reg_index;1782else if (vfp_byte_size == 8)1783regnum = dwarf_d0 + reg_index;1784else1785break;17861787const RegisterInfo *reg_info =1788reg_ctx->GetRegisterInfo(eRegisterKindDWARF, regnum);1789if (reg_info == nullptr)1790break;17911792RegisterValue reg_value;1793if (!reg_ctx->ReadRegister(reg_info, reg_value))1794break;17951796// Make sure we have enough room in "data_sp"1797if ((data_offset + vfp_byte_size) <= data_sp->GetByteSize()) {1798Status error;1799const size_t bytes_copied = reg_value.GetAsMemoryData(1800*reg_info, data_sp->GetBytes() + data_offset, vfp_byte_size,1801byte_order, error);1802if (bytes_copied != vfp_byte_size)1803break;18041805data_offset += bytes_copied;1806}1807}18081809if (data_offset == *byte_size) {1810DataExtractor data;1811data.SetByteOrder(byte_order);1812data.SetAddressByteSize(process_sp->GetAddressByteSize());1813data.SetData(data_sp);18141815return ValueObjectConstResult::Create(&thread, compiler_type,1816ConstString(""), data);1817} else { // Some error occurred while getting values from registers1818return return_valobj_sp;1819}1820}18211822// If we get here, we have a valid Value, so make our ValueObject out of it:18231824return_valobj_sp = ValueObjectConstResult::Create(1825thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));1826return return_valobj_sp;1827}18281829Status ABISysV_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp,1830lldb::ValueObjectSP &new_value_sp) {1831Status error;1832if (!new_value_sp) {1833error.SetErrorString("Empty value object for return value.");1834return error;1835}18361837CompilerType compiler_type = new_value_sp->GetCompilerType();1838if (!compiler_type) {1839error.SetErrorString("Null clang type for return value.");1840return error;1841}18421843Thread *thread = frame_sp->GetThread().get();18441845bool is_signed;1846uint32_t count;1847bool is_complex;18481849RegisterContext *reg_ctx = thread->GetRegisterContext().get();18501851bool set_it_simple = false;1852if (compiler_type.IsIntegerOrEnumerationType(is_signed) ||1853compiler_type.IsPointerType()) {1854DataExtractor data;1855Status data_error;1856size_t num_bytes = new_value_sp->GetData(data, data_error);1857if (data_error.Fail()) {1858error.SetErrorStringWithFormat(1859"Couldn't convert return value to raw data: %s",1860data_error.AsCString());1861return error;1862}1863lldb::offset_t offset = 0;1864if (num_bytes <= 8) {1865const RegisterInfo *r0_info = reg_ctx->GetRegisterInfo(1866eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);1867if (num_bytes <= 4) {1868uint32_t raw_value = data.GetMaxU32(&offset, num_bytes);18691870if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value))1871set_it_simple = true;1872} else {1873uint32_t raw_value = data.GetMaxU32(&offset, 4);18741875if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value)) {1876const RegisterInfo *r1_info = reg_ctx->GetRegisterInfo(1877eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG2);1878uint32_t raw_value = data.GetMaxU32(&offset, num_bytes - offset);18791880if (reg_ctx->WriteRegisterFromUnsigned(r1_info, raw_value))1881set_it_simple = true;1882}1883}1884} else {1885error.SetErrorString("We don't support returning longer than 64 bit "1886"integer values at present.");1887}1888} else if (compiler_type.IsFloatingPointType(count, is_complex)) {1889if (is_complex)1890error.SetErrorString(1891"We don't support returning complex values at present");1892else1893error.SetErrorString(1894"We don't support returning float values at present");1895}18961897if (!set_it_simple)1898error.SetErrorString(1899"We only support setting simple integer return types at present.");19001901return error;1902}19031904bool ABISysV_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {1905unwind_plan.Clear();1906unwind_plan.SetRegisterKind(eRegisterKindDWARF);19071908uint32_t lr_reg_num = dwarf_lr;1909uint32_t sp_reg_num = dwarf_sp;1910uint32_t pc_reg_num = dwarf_pc;19111912UnwindPlan::RowSP row(new UnwindPlan::Row);19131914// Our Call Frame Address is the stack pointer value1915row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);19161917// The previous PC is in the LR1918row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);1919unwind_plan.AppendRow(row);19201921// All other registers are the same.19221923unwind_plan.SetSourceName("arm at-func-entry default");1924unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);19251926return true;1927}19281929bool ABISysV_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {1930unwind_plan.Clear();1931unwind_plan.SetRegisterKind(eRegisterKindDWARF);19321933// TODO: Handle thumb1934uint32_t fp_reg_num = dwarf_r11;1935uint32_t pc_reg_num = dwarf_pc;19361937UnwindPlan::RowSP row(new UnwindPlan::Row);1938const int32_t ptr_size = 4;19391940row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);1941row->SetOffset(0);1942row->SetUnspecifiedRegistersAreUndefined(true);19431944row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);1945row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);19461947unwind_plan.AppendRow(row);1948unwind_plan.SetSourceName("arm default unwind plan");1949unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);1950unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);1951unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);19521953return true;1954}19551956// cf. "ARMv6 Function Calling Conventions"19571958// ARMv7 on GNU/Linux general purpose reg rules:1959// r0-r3 not preserved (used for argument passing)1960// r4-r11 preserved (v1-v8)1961// r12 not presrved1962// r13 preserved (stack pointer)1963// r14 preserved (link register)1964// r15 preserved (pc)1965// cpsr not preserved (different rules for different bits)19661967// ARMv7 VFP register rules:1968// d0-d7 not preserved (aka s0-s15, q0-q3)1969// d8-d15 preserved (aka s16-s31, q4-q7)1970// d16-d31 not preserved (aka q8-q15)19711972bool ABISysV_arm::RegisterIsVolatile(const RegisterInfo *reg_info) {1973if (reg_info) {1974// Volatile registers are: r0, r1, r2, r3, r9, r12, r13 (aka sp)1975const char *name = reg_info->name;1976if (name[0] == 'r') {1977switch (name[1]) {1978case '0':1979return name[2] == '\0'; // r01980case '1':1981switch (name[2]) {1982case '\0':1983return true; // r11984case '2':1985return name[3] == '\0'; // r121986default:1987break;1988}1989break;19901991case '2':1992return name[2] == '\0'; // r21993case '3':1994return name[2] == '\0'; // r31995default:1996break;1997}1998} else if (name[0] == 'd') {1999switch (name[1]) {2000case '0':2001return name[2] == '\0'; // d0 is volatile20022003case '1':2004switch (name[2]) {2005case '\0':2006return true; // d1 is volatile2007case '6':2008case '7':2009case '8':2010case '9':2011return name[3] == '\0'; // d16 - d19 are volatile2012default:2013break;2014}2015break;20162017case '2':2018switch (name[2]) {2019case '\0':2020return true; // d2 is volatile2021case '0':2022case '1':2023case '2':2024case '3':2025case '4':2026case '5':2027case '6':2028case '7':2029case '8':2030case '9':2031return name[3] == '\0'; // d20 - d29 are volatile2032default:2033break;2034}2035break;20362037case '3':2038switch (name[2]) {2039case '\0':2040return true; // d3 is volatile2041case '0':2042case '1':2043return name[3] == '\0'; // d30 - d31 are volatile2044default:2045break;2046}2047break;2048case '4':2049case '5':2050case '6':2051case '7':2052return name[2] == '\0'; // d4 - d7 are volatile20532054default:2055break;2056}2057} else if (name[0] == 's') {2058switch (name[1]) {2059case '0':2060return name[2] == '\0'; // s0 is volatile20612062case '1':2063switch (name[2]) {2064case '\0':2065return true; // s1 is volatile2066case '0':2067case '1':2068case '2':2069case '3':2070case '4':2071case '5':2072return name[3] == '\0'; // s10 - s15 are volatile2073default:2074break;2075}2076break;20772078case '2':2079case '3':2080case '4':2081case '5':2082case '6':2083case '7':2084case '8':2085case '9':2086return name[2] == '\0'; // s2 - s9 are volatile20872088default:2089break;2090}2091} else if (name[0] == 'q') {2092switch (name[1]) {2093case '1':2094switch (name[2]) {2095case '\0':2096return true; // q1 is volatile2097case '0':2098case '1':2099case '2':2100case '3':2101case '4':2102case '5':2103return true; // q10-q15 are volatile2104default:2105return false;2106}2107break;21082109case '0':2110case '2':2111case '3':2112return name[2] == '\0'; // q0-q3 are volatile2113case '8':2114case '9':2115return name[2] == '\0'; // q8-q9 are volatile2116default:2117break;2118}2119} else if (name[0] == 's' && name[1] == 'p' && name[2] == '\0')2120return true;2121}2122return false;2123}21242125void ABISysV_arm::Initialize() {2126PluginManager::RegisterPlugin(GetPluginNameStatic(),2127"SysV ABI for arm targets", CreateInstance);2128}21292130void ABISysV_arm::Terminate() {2131PluginManager::UnregisterPlugin(CreateInstance);2132}213321342135