Path: blob/main/contrib/llvm-project/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp
39648 views
//===-- ABIMacOSX_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 "ABIMacOSX_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;3637static const RegisterInfo g_register_infos[] = {38// NAME ALT SZ OFF ENCODING FORMAT EH_FRAME39// DWARF GENERIC PROCESS PLUGIN40// LLDB NATIVE41// ========== ======= == === ============= ============42// ======================= =================== ===========================43// ======================= ======================44{"r0",45nullptr,464,470,48eEncodingUint,49eFormatHex,50{ehframe_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1, LLDB_INVALID_REGNUM,51LLDB_INVALID_REGNUM},52nullptr,53nullptr,54nullptr,55},56{"r1",57nullptr,584,590,60eEncodingUint,61eFormatHex,62{ehframe_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2, LLDB_INVALID_REGNUM,63LLDB_INVALID_REGNUM},64nullptr,65nullptr,66nullptr,67},68{"r2",69nullptr,704,710,72eEncodingUint,73eFormatHex,74{ehframe_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3, LLDB_INVALID_REGNUM,75LLDB_INVALID_REGNUM},76nullptr,77nullptr,78nullptr,79},80{"r3",81nullptr,824,830,84eEncodingUint,85eFormatHex,86{ehframe_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4, LLDB_INVALID_REGNUM,87LLDB_INVALID_REGNUM},88nullptr,89nullptr,90nullptr,91},92{"r4",93nullptr,944,950,96eEncodingUint,97eFormatHex,98{ehframe_r4, dwarf_r4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,99LLDB_INVALID_REGNUM},100nullptr,101nullptr,102nullptr,103},104{"r5",105nullptr,1064,1070,108eEncodingUint,109eFormatHex,110{ehframe_r5, dwarf_r5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,111LLDB_INVALID_REGNUM},112nullptr,113nullptr,114nullptr,115},116{"r6",117nullptr,1184,1190,120eEncodingUint,121eFormatHex,122{ehframe_r6, dwarf_r6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,123LLDB_INVALID_REGNUM},124nullptr,125nullptr,126nullptr,127},128{"r7",129nullptr,1304,1310,132eEncodingUint,133eFormatHex,134{ehframe_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, LLDB_INVALID_REGNUM,135LLDB_INVALID_REGNUM},136nullptr,137nullptr,138nullptr,139},140{"r8",141nullptr,1424,1430,144eEncodingUint,145eFormatHex,146{ehframe_r8, dwarf_r8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,147LLDB_INVALID_REGNUM},148nullptr,149nullptr,150nullptr,151},152{"r9",153nullptr,1544,1550,156eEncodingUint,157eFormatHex,158{ehframe_r9, dwarf_r9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,159LLDB_INVALID_REGNUM},160nullptr,161nullptr,162nullptr,163},164{"r10",165nullptr,1664,1670,168eEncodingUint,169eFormatHex,170{ehframe_r10, dwarf_r10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,171LLDB_INVALID_REGNUM},172nullptr,173nullptr,174nullptr,175},176{"r11",177nullptr,1784,1790,180eEncodingUint,181eFormatHex,182{ehframe_r11, dwarf_r11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,183LLDB_INVALID_REGNUM},184nullptr,185nullptr,186nullptr,187},188{"r12",189nullptr,1904,1910,192eEncodingUint,193eFormatHex,194{ehframe_r12, dwarf_r12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,195LLDB_INVALID_REGNUM},196nullptr,197nullptr,198nullptr,199},200{"sp",201"r13",2024,2030,204eEncodingUint,205eFormatHex,206{ehframe_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, LLDB_INVALID_REGNUM,207LLDB_INVALID_REGNUM},208nullptr,209nullptr,210nullptr,211},212{"lr",213"r14",2144,2150,216eEncodingUint,217eFormatHex,218{ehframe_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, LLDB_INVALID_REGNUM,219LLDB_INVALID_REGNUM},220nullptr,221nullptr,222nullptr,223},224{"pc",225"r15",2264,2270,228eEncodingUint,229eFormatHex,230{ehframe_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, LLDB_INVALID_REGNUM,231LLDB_INVALID_REGNUM},232nullptr,233nullptr,234nullptr,235},236{"cpsr",237"psr",2384,2390,240eEncodingUint,241eFormatHex,242{ehframe_cpsr, dwarf_cpsr, LLDB_REGNUM_GENERIC_FLAGS, LLDB_INVALID_REGNUM,243LLDB_INVALID_REGNUM},244nullptr,245nullptr,246nullptr,247},248{"s0",249nullptr,2504,2510,252eEncodingIEEE754,253eFormatFloat,254{LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,255LLDB_INVALID_REGNUM},256nullptr,257nullptr,258nullptr,259},260{"s1",261nullptr,2624,2630,264eEncodingIEEE754,265eFormatFloat,266{LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,267LLDB_INVALID_REGNUM},268nullptr,269nullptr,270nullptr,271},272{"s2",273nullptr,2744,2750,276eEncodingIEEE754,277eFormatFloat,278{LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,279LLDB_INVALID_REGNUM},280nullptr,281nullptr,282nullptr,283},284{"s3",285nullptr,2864,2870,288eEncodingIEEE754,289eFormatFloat,290{LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,291LLDB_INVALID_REGNUM},292nullptr,293nullptr,294nullptr,295},296{"s4",297nullptr,2984,2990,300eEncodingIEEE754,301eFormatFloat,302{LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,303LLDB_INVALID_REGNUM},304nullptr,305nullptr,306nullptr,307},308{"s5",309nullptr,3104,3110,312eEncodingIEEE754,313eFormatFloat,314{LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,315LLDB_INVALID_REGNUM},316nullptr,317nullptr,318nullptr,319},320{"s6",321nullptr,3224,3230,324eEncodingIEEE754,325eFormatFloat,326{LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,327LLDB_INVALID_REGNUM},328nullptr,329nullptr,330nullptr,331},332{"s7",333nullptr,3344,3350,336eEncodingIEEE754,337eFormatFloat,338{LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,339LLDB_INVALID_REGNUM},340nullptr,341nullptr,342nullptr,343},344{"s8",345nullptr,3464,3470,348eEncodingIEEE754,349eFormatFloat,350{LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,351LLDB_INVALID_REGNUM},352nullptr,353nullptr,354nullptr,355},356{"s9",357nullptr,3584,3590,360eEncodingIEEE754,361eFormatFloat,362{LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,363LLDB_INVALID_REGNUM},364nullptr,365nullptr,366nullptr,367},368{"s10",369nullptr,3704,3710,372eEncodingIEEE754,373eFormatFloat,374{LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,375LLDB_INVALID_REGNUM},376nullptr,377nullptr,378nullptr,379},380{"s11",381nullptr,3824,3830,384eEncodingIEEE754,385eFormatFloat,386{LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,387LLDB_INVALID_REGNUM},388nullptr,389nullptr,390nullptr,391},392{"s12",393nullptr,3944,3950,396eEncodingIEEE754,397eFormatFloat,398{LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,399LLDB_INVALID_REGNUM},400nullptr,401nullptr,402nullptr,403},404{"s13",405nullptr,4064,4070,408eEncodingIEEE754,409eFormatFloat,410{LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,411LLDB_INVALID_REGNUM},412nullptr,413nullptr,414nullptr,415},416{"s14",417nullptr,4184,4190,420eEncodingIEEE754,421eFormatFloat,422{LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,423LLDB_INVALID_REGNUM},424nullptr,425nullptr,426nullptr,427},428{"s15",429nullptr,4304,4310,432eEncodingIEEE754,433eFormatFloat,434{LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,435LLDB_INVALID_REGNUM},436nullptr,437nullptr,438nullptr,439},440{"s16",441nullptr,4424,4430,444eEncodingIEEE754,445eFormatFloat,446{LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,447LLDB_INVALID_REGNUM},448nullptr,449nullptr,450nullptr,451},452{"s17",453nullptr,4544,4550,456eEncodingIEEE754,457eFormatFloat,458{LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,459LLDB_INVALID_REGNUM},460nullptr,461nullptr,462nullptr,463},464{"s18",465nullptr,4664,4670,468eEncodingIEEE754,469eFormatFloat,470{LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,471LLDB_INVALID_REGNUM},472nullptr,473nullptr,474nullptr,475},476{"s19",477nullptr,4784,4790,480eEncodingIEEE754,481eFormatFloat,482{LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,483LLDB_INVALID_REGNUM},484nullptr,485nullptr,486nullptr,487},488{"s20",489nullptr,4904,4910,492eEncodingIEEE754,493eFormatFloat,494{LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,495LLDB_INVALID_REGNUM},496nullptr,497nullptr,498nullptr,499},500{"s21",501nullptr,5024,5030,504eEncodingIEEE754,505eFormatFloat,506{LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,507LLDB_INVALID_REGNUM},508nullptr,509nullptr,510nullptr,511},512{"s22",513nullptr,5144,5150,516eEncodingIEEE754,517eFormatFloat,518{LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,519LLDB_INVALID_REGNUM},520nullptr,521nullptr,522nullptr,523},524{"s23",525nullptr,5264,5270,528eEncodingIEEE754,529eFormatFloat,530{LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,531LLDB_INVALID_REGNUM},532nullptr,533nullptr,534nullptr,535},536{"s24",537nullptr,5384,5390,540eEncodingIEEE754,541eFormatFloat,542{LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,543LLDB_INVALID_REGNUM},544nullptr,545nullptr,546nullptr,547},548{"s25",549nullptr,5504,5510,552eEncodingIEEE754,553eFormatFloat,554{LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,555LLDB_INVALID_REGNUM},556nullptr,557nullptr,558nullptr,559},560{"s26",561nullptr,5624,5630,564eEncodingIEEE754,565eFormatFloat,566{LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,567LLDB_INVALID_REGNUM},568nullptr,569nullptr,570nullptr,571},572{"s27",573nullptr,5744,5750,576eEncodingIEEE754,577eFormatFloat,578{LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,579LLDB_INVALID_REGNUM},580nullptr,581nullptr,582nullptr,583},584{"s28",585nullptr,5864,5870,588eEncodingIEEE754,589eFormatFloat,590{LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,591LLDB_INVALID_REGNUM},592nullptr,593nullptr,594nullptr,595},596{"s29",597nullptr,5984,5990,600eEncodingIEEE754,601eFormatFloat,602{LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,603LLDB_INVALID_REGNUM},604nullptr,605nullptr,606nullptr,607},608{"s30",609nullptr,6104,6110,612eEncodingIEEE754,613eFormatFloat,614{LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,615LLDB_INVALID_REGNUM},616nullptr,617nullptr,618nullptr,619},620{"s31",621nullptr,6224,6230,624eEncodingIEEE754,625eFormatFloat,626{LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,627LLDB_INVALID_REGNUM},628nullptr,629nullptr,630nullptr,631},632{"fpscr",633nullptr,6344,6350,636eEncodingUint,637eFormatHex,638{LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,639LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},640nullptr,641nullptr,642nullptr,643},644{"d0",645nullptr,6468,6470,648eEncodingIEEE754,649eFormatFloat,650{LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,651LLDB_INVALID_REGNUM},652nullptr,653nullptr,654nullptr,655},656{"d1",657nullptr,6588,6590,660eEncodingIEEE754,661eFormatFloat,662{LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,663LLDB_INVALID_REGNUM},664nullptr,665nullptr,666nullptr,667},668{"d2",669nullptr,6708,6710,672eEncodingIEEE754,673eFormatFloat,674{LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,675LLDB_INVALID_REGNUM},676nullptr,677nullptr,678nullptr,679},680{"d3",681nullptr,6828,6830,684eEncodingIEEE754,685eFormatFloat,686{LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,687LLDB_INVALID_REGNUM},688nullptr,689nullptr,690nullptr,691},692{"d4",693nullptr,6948,6950,696eEncodingIEEE754,697eFormatFloat,698{LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,699LLDB_INVALID_REGNUM},700nullptr,701nullptr,702nullptr,703},704{"d5",705nullptr,7068,7070,708eEncodingIEEE754,709eFormatFloat,710{LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,711LLDB_INVALID_REGNUM},712nullptr,713nullptr,714nullptr,715},716{"d6",717nullptr,7188,7190,720eEncodingIEEE754,721eFormatFloat,722{LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,723LLDB_INVALID_REGNUM},724nullptr,725nullptr,726nullptr,727},728{"d7",729nullptr,7308,7310,732eEncodingIEEE754,733eFormatFloat,734{LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,735LLDB_INVALID_REGNUM},736nullptr,737nullptr,738nullptr,739},740{"d8",741nullptr,7428,7430,744eEncodingIEEE754,745eFormatFloat,746{LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,747LLDB_INVALID_REGNUM},748nullptr,749nullptr,750nullptr,751},752{"d9",753nullptr,7548,7550,756eEncodingIEEE754,757eFormatFloat,758{LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,759LLDB_INVALID_REGNUM},760nullptr,761nullptr,762nullptr,763},764{"d10",765nullptr,7668,7670,768eEncodingIEEE754,769eFormatFloat,770{LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,771LLDB_INVALID_REGNUM},772nullptr,773nullptr,774nullptr,775},776{"d11",777nullptr,7788,7790,780eEncodingIEEE754,781eFormatFloat,782{LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,783LLDB_INVALID_REGNUM},784nullptr,785nullptr,786nullptr,787},788{"d12",789nullptr,7908,7910,792eEncodingIEEE754,793eFormatFloat,794{LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,795LLDB_INVALID_REGNUM},796nullptr,797nullptr,798nullptr,799},800{"d13",801nullptr,8028,8030,804eEncodingIEEE754,805eFormatFloat,806{LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,807LLDB_INVALID_REGNUM},808nullptr,809nullptr,810nullptr,811},812{"d14",813nullptr,8148,8150,816eEncodingIEEE754,817eFormatFloat,818{LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,819LLDB_INVALID_REGNUM},820nullptr,821nullptr,822nullptr,823},824{"d15",825nullptr,8268,8270,828eEncodingIEEE754,829eFormatFloat,830{LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,831LLDB_INVALID_REGNUM},832nullptr,833nullptr,834nullptr,835},836{"d16",837nullptr,8388,8390,840eEncodingIEEE754,841eFormatFloat,842{LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,843LLDB_INVALID_REGNUM},844nullptr,845nullptr,846nullptr,847},848{"d17",849nullptr,8508,8510,852eEncodingIEEE754,853eFormatFloat,854{LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,855LLDB_INVALID_REGNUM},856nullptr,857nullptr,858nullptr,859},860{"d18",861nullptr,8628,8630,864eEncodingIEEE754,865eFormatFloat,866{LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,867LLDB_INVALID_REGNUM},868nullptr,869nullptr,870nullptr,871},872{"d19",873nullptr,8748,8750,876eEncodingIEEE754,877eFormatFloat,878{LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,879LLDB_INVALID_REGNUM},880nullptr,881nullptr,882nullptr,883},884{"d20",885nullptr,8868,8870,888eEncodingIEEE754,889eFormatFloat,890{LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,891LLDB_INVALID_REGNUM},892nullptr,893nullptr,894nullptr,895},896{"d21",897nullptr,8988,8990,900eEncodingIEEE754,901eFormatFloat,902{LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,903LLDB_INVALID_REGNUM},904nullptr,905nullptr,906nullptr,907},908{"d22",909nullptr,9108,9110,912eEncodingIEEE754,913eFormatFloat,914{LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,915LLDB_INVALID_REGNUM},916nullptr,917nullptr,918nullptr,919},920{"d23",921nullptr,9228,9230,924eEncodingIEEE754,925eFormatFloat,926{LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,927LLDB_INVALID_REGNUM},928nullptr,929nullptr,930nullptr,931},932{"d24",933nullptr,9348,9350,936eEncodingIEEE754,937eFormatFloat,938{LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,939LLDB_INVALID_REGNUM},940nullptr,941nullptr,942nullptr,943},944{"d25",945nullptr,9468,9470,948eEncodingIEEE754,949eFormatFloat,950{LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,951LLDB_INVALID_REGNUM},952nullptr,953nullptr,954nullptr,955},956{"d26",957nullptr,9588,9590,960eEncodingIEEE754,961eFormatFloat,962{LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,963LLDB_INVALID_REGNUM},964nullptr,965nullptr,966nullptr,967},968{"d27",969nullptr,9708,9710,972eEncodingIEEE754,973eFormatFloat,974{LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,975LLDB_INVALID_REGNUM},976nullptr,977nullptr,978nullptr,979},980{"d28",981nullptr,9828,9830,984eEncodingIEEE754,985eFormatFloat,986{LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,987LLDB_INVALID_REGNUM},988nullptr,989nullptr,990nullptr,991},992{"d29",993nullptr,9948,9950,996eEncodingIEEE754,997eFormatFloat,998{LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,999LLDB_INVALID_REGNUM},1000nullptr,1001nullptr,1002nullptr,1003},1004{"d30",1005nullptr,10068,10070,1008eEncodingIEEE754,1009eFormatFloat,1010{LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,1011LLDB_INVALID_REGNUM},1012nullptr,1013nullptr,1014nullptr,1015},1016{"d31",1017nullptr,10188,10190,1020eEncodingIEEE754,1021eFormatFloat,1022{LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,1023LLDB_INVALID_REGNUM},1024nullptr,1025nullptr,1026nullptr,1027},1028{"r8_usr",1029nullptr,10304,10310,1032eEncodingUint,1033eFormatHex,1034{LLDB_INVALID_REGNUM, dwarf_r8_usr, LLDB_INVALID_REGNUM,1035LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1036nullptr,1037nullptr,1038nullptr,1039},1040{"r9_usr",1041nullptr,10424,10430,1044eEncodingUint,1045eFormatHex,1046{LLDB_INVALID_REGNUM, dwarf_r9_usr, LLDB_INVALID_REGNUM,1047LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1048nullptr,1049nullptr,1050nullptr,1051},1052{"r10_usr",1053nullptr,10544,10550,1056eEncodingUint,1057eFormatHex,1058{LLDB_INVALID_REGNUM, dwarf_r10_usr, LLDB_INVALID_REGNUM,1059LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1060nullptr,1061nullptr,1062nullptr,1063},1064{"r11_usr",1065nullptr,10664,10670,1068eEncodingUint,1069eFormatHex,1070{LLDB_INVALID_REGNUM, dwarf_r11_usr, LLDB_INVALID_REGNUM,1071LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1072nullptr,1073nullptr,1074nullptr,1075},1076{"r12_usr",1077nullptr,10784,10790,1080eEncodingUint,1081eFormatHex,1082{LLDB_INVALID_REGNUM, dwarf_r12_usr, LLDB_INVALID_REGNUM,1083LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1084nullptr,1085nullptr,1086nullptr,1087},1088{"r13_usr",1089"sp_usr",10904,10910,1092eEncodingUint,1093eFormatHex,1094{LLDB_INVALID_REGNUM, dwarf_r13_usr, LLDB_INVALID_REGNUM,1095LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1096nullptr,1097nullptr,1098nullptr,1099},1100{"r14_usr",1101"lr_usr",11024,11030,1104eEncodingUint,1105eFormatHex,1106{LLDB_INVALID_REGNUM, dwarf_r14_usr, LLDB_INVALID_REGNUM,1107LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1108nullptr,1109nullptr,1110nullptr,1111},1112{"r8_fiq",1113nullptr,11144,11150,1116eEncodingUint,1117eFormatHex,1118{LLDB_INVALID_REGNUM, dwarf_r8_fiq, LLDB_INVALID_REGNUM,1119LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1120nullptr,1121nullptr,1122nullptr,1123},1124{"r9_fiq",1125nullptr,11264,11270,1128eEncodingUint,1129eFormatHex,1130{LLDB_INVALID_REGNUM, dwarf_r9_fiq, LLDB_INVALID_REGNUM,1131LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1132nullptr,1133nullptr,1134nullptr,1135},1136{"r10_fiq",1137nullptr,11384,11390,1140eEncodingUint,1141eFormatHex,1142{LLDB_INVALID_REGNUM, dwarf_r10_fiq, LLDB_INVALID_REGNUM,1143LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1144nullptr,1145nullptr,1146nullptr,1147},1148{"r11_fiq",1149nullptr,11504,11510,1152eEncodingUint,1153eFormatHex,1154{LLDB_INVALID_REGNUM, dwarf_r11_fiq, LLDB_INVALID_REGNUM,1155LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1156nullptr,1157nullptr,1158nullptr,1159},1160{"r12_fiq",1161nullptr,11624,11630,1164eEncodingUint,1165eFormatHex,1166{LLDB_INVALID_REGNUM, dwarf_r12_fiq, LLDB_INVALID_REGNUM,1167LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1168nullptr,1169nullptr,1170nullptr,1171},1172{"r13_fiq",1173"sp_fiq",11744,11750,1176eEncodingUint,1177eFormatHex,1178{LLDB_INVALID_REGNUM, dwarf_r13_fiq, LLDB_INVALID_REGNUM,1179LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1180nullptr,1181nullptr,1182nullptr,1183},1184{"r14_fiq",1185"lr_fiq",11864,11870,1188eEncodingUint,1189eFormatHex,1190{LLDB_INVALID_REGNUM, dwarf_r14_fiq, LLDB_INVALID_REGNUM,1191LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1192nullptr,1193nullptr,1194nullptr,1195},1196{"r13_irq",1197"sp_irq",11984,11990,1200eEncodingUint,1201eFormatHex,1202{LLDB_INVALID_REGNUM, dwarf_r13_irq, LLDB_INVALID_REGNUM,1203LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1204nullptr,1205nullptr,1206nullptr,1207},1208{"r14_irq",1209"lr_irq",12104,12110,1212eEncodingUint,1213eFormatHex,1214{LLDB_INVALID_REGNUM, dwarf_r14_irq, LLDB_INVALID_REGNUM,1215LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1216nullptr,1217nullptr,1218nullptr,1219},1220{"r13_abt",1221"sp_abt",12224,12230,1224eEncodingUint,1225eFormatHex,1226{LLDB_INVALID_REGNUM, dwarf_r13_abt, LLDB_INVALID_REGNUM,1227LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1228nullptr,1229nullptr,1230nullptr,1231},1232{"r14_abt",1233"lr_abt",12344,12350,1236eEncodingUint,1237eFormatHex,1238{LLDB_INVALID_REGNUM, dwarf_r14_abt, LLDB_INVALID_REGNUM,1239LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1240nullptr,1241nullptr,1242nullptr,1243},1244{"r13_und",1245"sp_und",12464,12470,1248eEncodingUint,1249eFormatHex,1250{LLDB_INVALID_REGNUM, dwarf_r13_und, LLDB_INVALID_REGNUM,1251LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1252nullptr,1253nullptr,1254nullptr,1255},1256{"r14_und",1257"lr_und",12584,12590,1260eEncodingUint,1261eFormatHex,1262{LLDB_INVALID_REGNUM, dwarf_r14_und, LLDB_INVALID_REGNUM,1263LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1264nullptr,1265nullptr,1266nullptr,1267},1268{"r13_svc",1269"sp_svc",12704,12710,1272eEncodingUint,1273eFormatHex,1274{LLDB_INVALID_REGNUM, dwarf_r13_svc, LLDB_INVALID_REGNUM,1275LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1276nullptr,1277nullptr,1278nullptr,1279},1280{"r14_svc",1281"lr_svc",12824,12830,1284eEncodingUint,1285eFormatHex,1286{LLDB_INVALID_REGNUM, dwarf_r14_svc, LLDB_INVALID_REGNUM,1287LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM},1288nullptr,1289nullptr,1290nullptr,1291}};12921293static const uint32_t k_num_register_infos = std::size(g_register_infos);12941295const lldb_private::RegisterInfo *1296ABIMacOSX_arm::GetRegisterInfoArray(uint32_t &count) {1297count = k_num_register_infos;1298return g_register_infos;1299}13001301size_t ABIMacOSX_arm::GetRedZoneSize() const { return 0; }13021303// Static Functions13041305ABISP1306ABIMacOSX_arm::CreateInstance(ProcessSP process_sp, const ArchSpec &arch) {1307const llvm::Triple::ArchType arch_type = arch.GetTriple().getArch();1308const llvm::Triple::VendorType vendor_type = arch.GetTriple().getVendor();13091310if (vendor_type == llvm::Triple::Apple) {1311if ((arch_type == llvm::Triple::arm) ||1312(arch_type == llvm::Triple::thumb)) {1313return ABISP(1314new ABIMacOSX_arm(std::move(process_sp), MakeMCRegisterInfo(arch)));1315}1316}13171318return ABISP();1319}13201321bool ABIMacOSX_arm::PrepareTrivialCall(Thread &thread, addr_t sp,1322addr_t function_addr, addr_t return_addr,1323llvm::ArrayRef<addr_t> args) const {1324RegisterContext *reg_ctx = thread.GetRegisterContext().get();1325if (!reg_ctx)1326return false;13271328const uint32_t pc_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1329eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);1330const uint32_t sp_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1331eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);1332const uint32_t ra_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1333eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);13341335RegisterValue reg_value;13361337const char *reg_names[] = {"r0", "r1", "r2", "r3"};13381339llvm::ArrayRef<addr_t>::iterator ai = args.begin(), ae = args.end();13401341for (size_t i = 0; i < std::size(reg_names); ++i) {1342if (ai == ae)1343break;13441345reg_value.SetUInt32(*ai);1346if (!reg_ctx->WriteRegister(reg_ctx->GetRegisterInfoByName(reg_names[i]),1347reg_value))1348return false;13491350++ai;1351}13521353if (ai != ae) {1354// Spill onto the stack1355size_t num_stack_regs = ae - ai;13561357sp -= (num_stack_regs * 4);1358// Keep the stack 16 byte aligned1359sp &= ~(16ull - 1ull);13601361// just using arg1 to get the right size1362const RegisterInfo *reg_info = reg_ctx->GetRegisterInfo(1363eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1);13641365addr_t arg_pos = sp;13661367for (; ai != ae; ++ai) {1368reg_value.SetUInt32(*ai);1369if (reg_ctx1370->WriteRegisterValueToMemory(reg_info, arg_pos,1371reg_info->byte_size, reg_value)1372.Fail())1373return false;1374arg_pos += reg_info->byte_size;1375}1376}13771378TargetSP target_sp(thread.CalculateTarget());1379Address so_addr;13801381// Figure out if our return address is ARM or Thumb by using the1382// Address::GetCallableLoadAddress(Target*) which will figure out the ARM1383// thumb-ness and set the correct address bits for us.1384so_addr.SetLoadAddress(return_addr, target_sp.get());1385return_addr = so_addr.GetCallableLoadAddress(target_sp.get());13861387// Set "lr" to the return address1388if (!reg_ctx->WriteRegisterFromUnsigned(ra_reg_num, return_addr))1389return false;13901391// If bit zero or 1 is set, this must be a thumb function, no need to figure1392// this out from the symbols.1393so_addr.SetLoadAddress(function_addr, target_sp.get());1394function_addr = so_addr.GetCallableLoadAddress(target_sp.get());13951396const RegisterInfo *cpsr_reg_info = reg_ctx->GetRegisterInfoByName("cpsr");1397const uint32_t curr_cpsr = reg_ctx->ReadRegisterAsUnsigned(cpsr_reg_info, 0);13981399// Make a new CPSR and mask out any Thumb IT (if/then) bits1400uint32_t new_cpsr = curr_cpsr & ~MASK_CPSR_IT_MASK;1401// If bit zero or 1 is set, this must be thumb...1402if (function_addr & 1ull)1403new_cpsr |= MASK_CPSR_T; // Set T bit in CPSR1404else1405new_cpsr &= ~MASK_CPSR_T; // Clear T bit in CPSR14061407if (new_cpsr != curr_cpsr) {1408if (!reg_ctx->WriteRegisterFromUnsigned(cpsr_reg_info, new_cpsr))1409return false;1410}14111412function_addr &=1413~1ull; // clear bit zero since the CPSR will take care of the mode for us14141415// Update the sp - stack pointer - to be aligned to 16-bytes1416sp &= ~(0xfull);1417if (!reg_ctx->WriteRegisterFromUnsigned(sp_reg_num, sp))1418return false;14191420// Set "pc" to the address requested1421if (!reg_ctx->WriteRegisterFromUnsigned(pc_reg_num, function_addr))1422return false;14231424return true;1425}14261427bool ABIMacOSX_arm::GetArgumentValues(Thread &thread, ValueList &values) const {1428uint32_t num_values = values.GetSize();14291430ExecutionContext exe_ctx(thread.shared_from_this());1431// For now, assume that the types in the AST values come from the Target's1432// scratch AST.14331434// Extract the register context so we can read arguments from registers14351436RegisterContext *reg_ctx = thread.GetRegisterContext().get();14371438if (!reg_ctx)1439return false;14401441addr_t sp = 0;14421443for (uint32_t value_idx = 0; value_idx < num_values; ++value_idx) {1444// We currently only support extracting values with Clang QualTypes. Do we1445// care about others?1446Value *value = values.GetValueAtIndex(value_idx);14471448if (!value)1449return false;14501451CompilerType compiler_type = value->GetCompilerType();1452if (compiler_type) {1453bool is_signed = false;1454size_t bit_width = 0;1455std::optional<uint64_t> bit_size = compiler_type.GetBitSize(&thread);1456if (!bit_size)1457return false;1458if (compiler_type.IsIntegerOrEnumerationType(is_signed))1459bit_width = *bit_size;1460else if (compiler_type.IsPointerOrReferenceType())1461bit_width = *bit_size;1462else1463// We only handle integer, pointer and reference types currently...1464return false;14651466if (bit_width <= (exe_ctx.GetProcessRef().GetAddressByteSize() * 8)) {1467if (value_idx < 4) {1468// Arguments 1-4 are in r0-r3...1469const RegisterInfo *arg_reg_info = nullptr;1470// Search by generic ID first, then fall back to by name1471uint32_t arg_reg_num = reg_ctx->ConvertRegisterKindToRegisterNumber(1472eRegisterKindGeneric, LLDB_REGNUM_GENERIC_ARG1 + value_idx);1473if (arg_reg_num != LLDB_INVALID_REGNUM) {1474arg_reg_info = reg_ctx->GetRegisterInfoAtIndex(arg_reg_num);1475} else {1476switch (value_idx) {1477case 0:1478arg_reg_info = reg_ctx->GetRegisterInfoByName("r0");1479break;1480case 1:1481arg_reg_info = reg_ctx->GetRegisterInfoByName("r1");1482break;1483case 2:1484arg_reg_info = reg_ctx->GetRegisterInfoByName("r2");1485break;1486case 3:1487arg_reg_info = reg_ctx->GetRegisterInfoByName("r3");1488break;1489}1490}14911492if (arg_reg_info) {1493RegisterValue reg_value;14941495if (reg_ctx->ReadRegister(arg_reg_info, reg_value)) {1496if (is_signed)1497reg_value.SignExtend(bit_width);1498if (!reg_value.GetScalarValue(value->GetScalar()))1499return false;1500continue;1501}1502}1503return false;1504} else {1505if (sp == 0) {1506// Read the stack pointer if it already hasn't been read1507sp = reg_ctx->GetSP(0);1508if (sp == 0)1509return false;1510}15111512// Arguments 5 on up are on the stack1513const uint32_t arg_byte_size = (bit_width + (8 - 1)) / 8;1514Status error;1515if (!exe_ctx.GetProcessRef().ReadScalarIntegerFromMemory(1516sp, arg_byte_size, is_signed, value->GetScalar(), error))1517return false;15181519sp += arg_byte_size;1520}1521}1522}1523}1524return true;1525}15261527bool ABIMacOSX_arm::IsArmv7kProcess() const {1528bool is_armv7k = false;1529ProcessSP process_sp(GetProcessSP());1530if (process_sp) {1531const ArchSpec &arch(process_sp->GetTarget().GetArchitecture());1532const ArchSpec::Core system_core = arch.GetCore();1533if (system_core == ArchSpec::eCore_arm_armv7k) {1534is_armv7k = true;1535}1536}1537return is_armv7k;1538}15391540ValueObjectSP ABIMacOSX_arm::GetReturnValueObjectImpl(1541Thread &thread, lldb_private::CompilerType &compiler_type) const {1542Value value;1543ValueObjectSP return_valobj_sp;15441545if (!compiler_type)1546return return_valobj_sp;15471548value.SetCompilerType(compiler_type);15491550RegisterContext *reg_ctx = thread.GetRegisterContext().get();1551if (!reg_ctx)1552return return_valobj_sp;15531554bool is_signed;15551556// Get the pointer to the first stack argument so we have a place to start1557// when reading data15581559const RegisterInfo *r0_reg_info = reg_ctx->GetRegisterInfoByName("r0", 0);1560if (compiler_type.IsIntegerOrEnumerationType(is_signed)) {1561std::optional<uint64_t> bit_width = compiler_type.GetBitSize(&thread);1562if (!bit_width)1563return return_valobj_sp;15641565switch (*bit_width) {1566default:1567return return_valobj_sp;1568case 128:1569if (IsArmv7kProcess()) {1570// "A composite type not larger than 16 bytes is returned in r0-r3. The1571// format is as if the result had been stored in memory at a word-1572// aligned address and then loaded into r0-r3 with an ldm instruction"1573{1574const RegisterInfo *r1_reg_info =1575reg_ctx->GetRegisterInfoByName("r1", 0);1576const RegisterInfo *r2_reg_info =1577reg_ctx->GetRegisterInfoByName("r2", 0);1578const RegisterInfo *r3_reg_info =1579reg_ctx->GetRegisterInfoByName("r3", 0);1580if (r1_reg_info && r2_reg_info && r3_reg_info) {1581std::optional<uint64_t> byte_size =1582compiler_type.GetByteSize(&thread);1583if (!byte_size)1584return return_valobj_sp;1585ProcessSP process_sp(thread.GetProcess());1586if (*byte_size <= r0_reg_info->byte_size + r1_reg_info->byte_size +1587r2_reg_info->byte_size +1588r3_reg_info->byte_size &&1589process_sp) {1590std::unique_ptr<DataBufferHeap> heap_data_up(1591new DataBufferHeap(*byte_size, 0));1592const ByteOrder byte_order = process_sp->GetByteOrder();1593RegisterValue r0_reg_value;1594RegisterValue r1_reg_value;1595RegisterValue r2_reg_value;1596RegisterValue r3_reg_value;1597if (reg_ctx->ReadRegister(r0_reg_info, r0_reg_value) &&1598reg_ctx->ReadRegister(r1_reg_info, r1_reg_value) &&1599reg_ctx->ReadRegister(r2_reg_info, r2_reg_value) &&1600reg_ctx->ReadRegister(r3_reg_info, r3_reg_value)) {1601Status error;1602if (r0_reg_value.GetAsMemoryData(*r0_reg_info,1603heap_data_up->GetBytes() + 0,16044, byte_order, error) &&1605r1_reg_value.GetAsMemoryData(*r1_reg_info,1606heap_data_up->GetBytes() + 4,16074, byte_order, error) &&1608r2_reg_value.GetAsMemoryData(*r2_reg_info,1609heap_data_up->GetBytes() + 8,16104, byte_order, error) &&1611r3_reg_value.GetAsMemoryData(*r3_reg_info,1612heap_data_up->GetBytes() + 12,16134, byte_order, error)) {1614DataExtractor data(DataBufferSP(heap_data_up.release()),1615byte_order,1616process_sp->GetAddressByteSize());16171618return_valobj_sp = ValueObjectConstResult::Create(1619&thread, compiler_type, ConstString(""), data);1620return return_valobj_sp;1621}1622}1623}1624}1625}1626} else {1627return return_valobj_sp;1628}1629break;1630case 64: {1631const RegisterInfo *r1_reg_info = reg_ctx->GetRegisterInfoByName("r1", 0);1632uint64_t raw_value;1633raw_value = reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX;1634raw_value |= ((uint64_t)(reg_ctx->ReadRegisterAsUnsigned(r1_reg_info, 0) &1635UINT32_MAX))1636<< 32;1637if (is_signed)1638value.GetScalar() = (int64_t)raw_value;1639else1640value.GetScalar() = (uint64_t)raw_value;1641} break;1642case 32:1643if (is_signed)1644value.GetScalar() = (int32_t)(1645reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);1646else1647value.GetScalar() = (uint32_t)(1648reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT32_MAX);1649break;1650case 16:1651if (is_signed)1652value.GetScalar() = (int16_t)(1653reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);1654else1655value.GetScalar() = (uint16_t)(1656reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT16_MAX);1657break;1658case 8:1659if (is_signed)1660value.GetScalar() = (int8_t)(1661reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);1662else1663value.GetScalar() = (uint8_t)(1664reg_ctx->ReadRegisterAsUnsigned(r0_reg_info, 0) & UINT8_MAX);1665break;1666}1667} else if (compiler_type.IsPointerType()) {1668uint32_t ptr =1669thread.GetRegisterContext()->ReadRegisterAsUnsigned(r0_reg_info, 0) &1670UINT32_MAX;1671value.GetScalar() = ptr;1672} else {1673// not handled yet1674return return_valobj_sp;1675}16761677// If we get here, we have a valid Value, so make our ValueObject out of it:16781679return_valobj_sp = ValueObjectConstResult::Create(1680thread.GetStackFrameAtIndex(0).get(), value, ConstString(""));1681return return_valobj_sp;1682}16831684Status ABIMacOSX_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp,1685lldb::ValueObjectSP &new_value_sp) {1686Status error;1687if (!new_value_sp) {1688error.SetErrorString("Empty value object for return value.");1689return error;1690}16911692CompilerType compiler_type = new_value_sp->GetCompilerType();1693if (!compiler_type) {1694error.SetErrorString("Null clang type for return value.");1695return error;1696}16971698Thread *thread = frame_sp->GetThread().get();16991700bool is_signed;1701uint32_t count;1702bool is_complex;17031704RegisterContext *reg_ctx = thread->GetRegisterContext().get();17051706bool set_it_simple = false;1707if (compiler_type.IsIntegerOrEnumerationType(is_signed) ||1708compiler_type.IsPointerType()) {1709DataExtractor data;1710Status data_error;1711size_t num_bytes = new_value_sp->GetData(data, data_error);1712if (data_error.Fail()) {1713error.SetErrorStringWithFormat(1714"Couldn't convert return value to raw data: %s",1715data_error.AsCString());1716return error;1717}1718lldb::offset_t offset = 0;1719if (num_bytes <= 8) {1720const RegisterInfo *r0_info = reg_ctx->GetRegisterInfoByName("r0", 0);1721if (num_bytes <= 4) {1722uint32_t raw_value = data.GetMaxU32(&offset, num_bytes);17231724if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value))1725set_it_simple = true;1726} else {1727uint32_t raw_value = data.GetMaxU32(&offset, 4);17281729if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value)) {1730const RegisterInfo *r1_info = reg_ctx->GetRegisterInfoByName("r1", 0);1731uint32_t raw_value = data.GetMaxU32(&offset, num_bytes - offset);17321733if (reg_ctx->WriteRegisterFromUnsigned(r1_info, raw_value))1734set_it_simple = true;1735}1736}1737} else if (num_bytes <= 16 && IsArmv7kProcess()) {1738// "A composite type not larger than 16 bytes is returned in r0-r3. The1739// format is as if the result had been stored in memory at a word-aligned1740// address and then loaded into r0-r3 with an ldm instruction"17411742const RegisterInfo *r0_info = reg_ctx->GetRegisterInfoByName("r0", 0);1743const RegisterInfo *r1_info = reg_ctx->GetRegisterInfoByName("r1", 0);1744const RegisterInfo *r2_info = reg_ctx->GetRegisterInfoByName("r2", 0);1745const RegisterInfo *r3_info = reg_ctx->GetRegisterInfoByName("r3", 0);1746lldb::offset_t offset = 0;1747uint32_t bytes_written = 4;1748uint32_t raw_value = data.GetMaxU64(&offset, 4);1749if (reg_ctx->WriteRegisterFromUnsigned(r0_info, raw_value) &&1750bytes_written <= num_bytes) {1751bytes_written += 4;1752raw_value = data.GetMaxU64(&offset, 4);1753if (bytes_written <= num_bytes &&1754reg_ctx->WriteRegisterFromUnsigned(r1_info, raw_value)) {1755bytes_written += 4;1756raw_value = data.GetMaxU64(&offset, 4);1757if (bytes_written <= num_bytes &&1758reg_ctx->WriteRegisterFromUnsigned(r2_info, raw_value)) {1759bytes_written += 4;1760raw_value = data.GetMaxU64(&offset, 4);1761if (bytes_written <= num_bytes &&1762reg_ctx->WriteRegisterFromUnsigned(r3_info, raw_value)) {1763set_it_simple = true;1764}1765}1766}1767}1768} else {1769error.SetErrorString("We don't support returning longer than 64 bit "1770"integer values at present.");1771}1772} else if (compiler_type.IsFloatingPointType(count, is_complex)) {1773if (is_complex)1774error.SetErrorString(1775"We don't support returning complex values at present");1776else1777error.SetErrorString(1778"We don't support returning float values at present");1779}17801781if (!set_it_simple)1782error.SetErrorString(1783"We only support setting simple integer return types at present.");17841785return error;1786}17871788bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {1789unwind_plan.Clear();1790unwind_plan.SetRegisterKind(eRegisterKindDWARF);17911792uint32_t lr_reg_num = dwarf_lr;1793uint32_t sp_reg_num = dwarf_sp;1794uint32_t pc_reg_num = dwarf_pc;17951796UnwindPlan::RowSP row(new UnwindPlan::Row);17971798// Our Call Frame Address is the stack pointer value1799row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);18001801// The previous PC is in the LR1802row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);1803unwind_plan.AppendRow(row);18041805// All other registers are the same.18061807unwind_plan.SetSourceName("arm at-func-entry default");1808unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);18091810return true;1811}18121813bool ABIMacOSX_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {1814unwind_plan.Clear();1815unwind_plan.SetRegisterKind(eRegisterKindDWARF);18161817uint32_t fp_reg_num =1818dwarf_r7; // apple uses r7 for all frames. Normal arm uses r111819uint32_t pc_reg_num = dwarf_pc;18201821UnwindPlan::RowSP row(new UnwindPlan::Row);1822const int32_t ptr_size = 4;18231824row->GetCFAValue().SetIsRegisterPlusOffset(fp_reg_num, 2 * ptr_size);1825row->SetOffset(0);1826row->SetUnspecifiedRegistersAreUndefined(true);18271828row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);1829row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);18301831unwind_plan.AppendRow(row);1832unwind_plan.SetSourceName("arm-apple-ios default unwind plan");1833unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);1834unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);1835unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);18361837return true;1838}18391840// cf. "ARMv6 Function Calling Conventions"1841// https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv6FunctionCallingConventions.html1842// and "ARMv7 Function Calling Conventions"1843// https://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/Articles/ARMv7FunctionCallingConventions.html18441845// ARMv7 on iOS general purpose reg rules:1846// r0-r3 not preserved (used for argument passing)1847// r4-r6 preserved1848// r7 preserved (frame pointer)1849// r8 preserved1850// r9 not preserved (usable as volatile scratch register with iOS 3.x and1851// later)1852// r10-r11 preserved1853// r12 not presrved1854// r13 preserved (stack pointer)1855// r14 not preserved (link register)1856// r15 preserved (pc)1857// cpsr not preserved (different rules for different bits)18581859// ARMv7 on iOS floating point rules:1860// d0-d7 not preserved (aka s0-s15, q0-q3)1861// d8-d15 preserved (aka s16-s31, q4-q7)1862// d16-d31 not preserved (aka q8-q15)18631864bool ABIMacOSX_arm::RegisterIsVolatile(const RegisterInfo *reg_info) {1865if (reg_info) {1866// Volatile registers are: r0, r1, r2, r3, r9, r12, r13 (aka sp)1867const char *name = reg_info->name;1868if (name[0] == 'r') {1869switch (name[1]) {1870case '0':1871return name[2] == '\0'; // r01872case '1':1873switch (name[2]) {1874case '\0':1875return true; // r11876case '2':1877case '3':1878return name[3] == '\0'; // r12, r13 (sp)1879default:1880break;1881}1882break;18831884case '2':1885return name[2] == '\0'; // r21886case '3':1887return name[2] == '\0'; // r31888case '9':1889return name[2] == '\0'; // r9 (apple-ios only...)18901891break;1892}1893} else if (name[0] == 'd') {1894switch (name[1]) {1895case '0':1896return name[2] == '\0'; // d0 is volatile18971898case '1':1899switch (name[2]) {1900case '\0':1901return true; // d1 is volatile1902case '6':1903case '7':1904case '8':1905case '9':1906return name[3] == '\0'; // d16 - d19 are volatile1907default:1908break;1909}1910break;19111912case '2':1913switch (name[2]) {1914case '\0':1915return true; // d2 is volatile1916case '0':1917case '1':1918case '2':1919case '3':1920case '4':1921case '5':1922case '6':1923case '7':1924case '8':1925case '9':1926return name[3] == '\0'; // d20 - d29 are volatile1927default:1928break;1929}1930break;19311932case '3':1933switch (name[2]) {1934case '\0':1935return true; // d3 is volatile1936case '0':1937case '1':1938return name[3] == '\0'; // d30 - d31 are volatile1939default:1940break;1941}1942break;1943case '4':1944case '5':1945case '6':1946case '7':1947return name[2] == '\0'; // d4 - d7 are volatile19481949default:1950break;1951}1952} else if (name[0] == 's') {1953switch (name[1]) {1954case '0':1955return name[2] == '\0'; // s0 is volatile19561957case '1':1958switch (name[2]) {1959case '\0':1960return true; // s1 is volatile1961case '0':1962case '1':1963case '2':1964case '3':1965case '4':1966case '5':1967return name[3] == '\0'; // s10 - s15 are volatile1968default:1969break;1970}1971break;19721973case '2':1974case '3':1975case '4':1976case '5':1977case '6':1978case '7':1979case '8':1980case '9':1981return name[2] == '\0'; // s2 - s9 are volatile19821983default:1984break;1985}1986} else if (name[0] == 'q') {1987switch (name[1]) {1988case '1':1989switch (name[2]) {1990case '\0':1991return true; // q1 is volatile1992case '0':1993case '1':1994case '2':1995case '3':1996case '4':1997case '5':1998return true; // q10-q15 are volatile1999default:2000break;2001};2002break;2003case '0':2004case '2':2005case '3':2006return name[2] == '\0'; // q0-q3 are volatile2007case '8':2008case '9':2009return name[2] == '\0'; // q8-q9 are volatile2010default:2011break;2012}2013} else if (name[0] == 's' && name[1] == 'p' && name[2] == '\0')2014return true;2015}2016return false;2017}20182019void ABIMacOSX_arm::Initialize() {2020PluginManager::RegisterPlugin(GetPluginNameStatic(),2021"Mac OS X ABI for arm targets", CreateInstance);2022}20232024void ABIMacOSX_arm::Terminate() {2025PluginManager::UnregisterPlugin(CreateInstance);2026}202720282029