/* scfidw2gen.c - Support for emission of synthesized Dwarf2 CFI.
Copyright (C) 2023 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
GAS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GAS; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
/* If the last address was not at the current PC, advance to current. */
if (frchain_now->frch_cfi_data->last_address != advloc)
cfi_add_advance_loc ((symbolS *)advloc);
switch (arg)
{
case DW_CFA_offset:
cfi_add_CFA_offset (reg1, offset);
break;
case DW_CFA_val_offset:
cfi_add_CFA_val_offset (reg1, offset);
break;
case CFI_rel_offset:
cfi_add_CFA_offset (reg1,
offset - frchain_now->frch_cfi_data->cur_cfa_offset);
break;
case DW_CFA_def_cfa:
cfi_add_CFA_def_cfa (reg1, offset);
break;
case DW_CFA_register:
cfi_add_CFA_register (reg1, reg2);
break;
case DW_CFA_def_cfa_register:
cfi_add_CFA_def_cfa_register (reg1);
break;
case DW_CFA_def_cfa_offset:
cfi_add_CFA_def_cfa_offset (offset);
break;
case CFI_adjust_cfa_offset:
cfi_add_CFA_def_cfa_offset (frchain_now->frch_cfi_data->cur_cfa_offset
+ offset);
break;
case DW_CFA_restore:
cfi_add_CFA_restore (reg1);
break;
case DW_CFA_remember_state:
cfi_add_CFA_remember_state ();
break;
case DW_CFA_restore_state:
cfi_add_CFA_restore_state ();
break;
case CFI_label:
cfi_add_label (name);
break;
case CFI_signal_frame:
frchain_now->frch_cfi_data->cur_fde_data->signal_frame = 1;
break;
/*
case DW_CFA_undefined:
for (;;)
{
reg1 = cfi_parse_reg ();
cfi_add_CFA_undefined (reg1);
SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
break;
++input_line_pointer;
}
break;
case DW_CFA_same_value:
reg1 = cfi_parse_reg ();
cfi_add_CFA_same_value (reg1);
break;
case CFI_return_column:
reg1 = cfi_parse_reg ();
cfi_set_return_column (reg1);
break;
case DW_CFA_GNU_window_save:
cfi_add_CFA_insn (DW_CFA_GNU_window_save);
break;