From cda8971baaeb240bb7c5075faa96dd4be02d923a Mon Sep 17 00:00:00 2001 From: Jinyang He Date: Sat, 5 Nov 2022 09:48:02 +0800 Subject: [PATCH] Add dwarf cfa support --- compiler/aasmdata.pas | 6 ++++++ compiler/cfidwarf.pas | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/compiler/aasmdata.pas b/compiler/aasmdata.pas index 5884c942fc..738c8cb29b 100644 --- a/compiler/aasmdata.pas +++ b/compiler/aasmdata.pas @@ -173,6 +173,7 @@ interface procedure outmost_frame(list:TAsmList);virtual; procedure cfa_offset(list:TAsmList;reg:tregister;ofs:longint);virtual; procedure cfa_restore(list:TAsmList;reg:tregister);virtual; + procedure cfa_def_cfa(list:TAsmList;reg:tregister;ofs:longint);virtual; procedure cfa_def_cfa_register(list:TAsmList;reg:tregister);virtual; procedure cfa_def_cfa_offset(list:TAsmList;ofs:longint);virtual; function get_frame_start: TAsmLabel;virtual; @@ -315,6 +316,11 @@ implementation end; + procedure TAsmCFI.cfa_def_cfa(list:TAsmList;reg:tregister;ofs:longint); + begin + end; + + procedure TAsmCFI.cfa_def_cfa_register(list:TAsmList;reg:tregister); begin end; diff --git a/compiler/cfidwarf.pas b/compiler/cfidwarf.pas index 8f967830f7..8d053f2e29 100644 --- a/compiler/cfidwarf.pas +++ b/compiler/cfidwarf.pas @@ -100,6 +100,7 @@ interface procedure outmost_frame(list: TAsmList);override; procedure cfa_offset(list:TAsmList;reg:tregister;ofs:longint);override; procedure cfa_restore(list:TAsmList;reg:tregister);override; + procedure cfa_def_cfa(list:TAsmList;reg:tregister;ofs:longint);override; procedure cfa_def_cfa_register(list:TAsmList;reg:tregister);override; procedure cfa_def_cfa_offset(list:TAsmList;ofs:longint);override; end; @@ -115,6 +116,7 @@ interface procedure outmost_frame(list: TAsmList);override; procedure cfa_offset(list:TAsmList;reg:tregister;ofs:longint);override; procedure cfa_restore(list:TAsmList;reg:tregister);override; + procedure cfa_def_cfa(list:TAsmList;reg:tregister;ofs:longint);override; procedure cfa_def_cfa_register(list:TAsmList;reg:tregister);override; procedure cfa_def_cfa_offset(list:TAsmList;ofs:longint);override; end; @@ -641,6 +643,15 @@ implementation end; + procedure TDwarfAsmCFILowLevel.cfa_def_cfa(list:TAsmList;reg:tregister;ofs:longint); + begin + if datatype=dt_none then + exit; + cfa_advance_loc(list); + DwarfList.concat(tdwarfitem.create_reg_const(DW_CFA_def_cfa,doe_uleb,reg,doe_uleb,ofs)); + end; + + procedure TDwarfAsmCFILowLevel.cfa_def_cfa_register(list:TAsmList;reg:tregister); begin if datatype=dt_none then @@ -739,6 +750,19 @@ implementation end; + procedure TDwarfAsmCFIHighLevel.cfa_def_cfa(list: TAsmList; reg: tregister; ofs: longint); + begin + if not(tf_use_hlcfi in target_info.flags) then + begin + inherited; + exit; + end; + if not(af_supports_hlcfi in target_asm.flags) then + exit; + list.concat(tai_cfi_op_reg_val.create(cfi_def_cfa,reg,ofs)); + end; + + procedure TDwarfAsmCFIHighLevel.cfa_def_cfa_register(list: TAsmList; reg: tregister); begin if not(tf_use_hlcfi in target_info.flags) then