diff options
author | Jens Remus <jremus@linux.ibm.com> | 2024-07-04 10:34:12 +0200 |
---|---|---|
committer | Jens Remus <jremus@linux.ibm.com> | 2024-07-04 10:34:12 +0200 |
commit | 397582abe705c1b8a1ba042a7dda2e72afd9f4b0 (patch) | |
tree | 4227d63cf6c89e20bd49b1d3336d19893f42203b /gas/gen-sframe.c | |
parent | 541b0fbbf27996443a94565503520a600d99e06a (diff) | |
download | binutils-397582abe705c1b8a1ba042a7dda2e72afd9f4b0.zip binutils-397582abe705c1b8a1ba042a7dda2e72afd9f4b0.tar.gz binutils-397582abe705c1b8a1ba042a7dda2e72afd9f4b0.tar.bz2 |
gas: Refactor SFrame CFI opcode DW_CFA_register processing
Refactor SFrame processing of CFI opcode DW_CFA_register into a separate
function. This harmonizes the CFI opcode processing.
While at it reword the comment on CFI opcodes that are not processed.
This is a purely mechanical change.
gas/
* gen-sframe.c (sframe_do_cfi_insn, sframe_xlate_do_register):
Refactor SFrame CFI opcode DW_CFA_register processing.
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
Diffstat (limited to 'gas/gen-sframe.c')
-rw-r--r-- | gas/gen-sframe.c | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/gas/gen-sframe.c b/gas/gen-sframe.c index fac5b6f..4809619 100644 --- a/gas/gen-sframe.c +++ b/gas/gen-sframe.c @@ -1110,6 +1110,28 @@ sframe_xlate_do_val_offset (struct sframe_xlate_ctx *xlate_ctx ATTRIBUTE_UNUSED, return SFRAME_XLATE_OK; } +/* Translate DW_CFA_register into SFrame context. + Return SFRAME_XLATE_OK if success. */ + +static int +sframe_xlate_do_register (struct sframe_xlate_ctx *xlate_ctx ATTRIBUTE_UNUSED, + struct cfi_insn_data *cfi_insn) +{ + /* Previous value of register1 is register2. However, if the specified + register1 is not interesting (SP, FP, or RA reg), the current DW_CFA_register + instruction can be safely skipped without sacrificing the asynchronicity of + stack trace information. */ + if (cfi_insn->u.rr.reg1 == SFRAME_CFA_SP_REG +#ifdef SFRAME_FRE_RA_TRACKING + || (cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG) +#endif + || cfi_insn->u.rr.reg1 == SFRAME_CFA_FP_REG) + return SFRAME_XLATE_ERR_NOTREPRESENTED; /* Not represented. */ + + /* Safe to skip. */ + return SFRAME_XLATE_OK; +} + /* Translate DW_CFA_remember_state into SFrame context. Return SFRAME_XLATE_OK if success. */ @@ -1298,19 +1320,12 @@ sframe_do_cfi_insn (struct sframe_xlate_ctx *xlate_ctx, case DW_CFA_GNU_window_save: err = sframe_xlate_do_gnu_window_save (xlate_ctx, cfi_insn); break; - /* Other CFI opcodes are not processed at this time. - These do not impact the coverage of the basic stack tracing - information as conveyed in the SFrame format. - - DW_CFA_register, - - etc. */ case DW_CFA_register: - if (cfi_insn->u.rr.reg1 == SFRAME_CFA_SP_REG -#ifdef SFRAME_FRE_RA_TRACKING - || cfi_insn->u.rr.reg1 == SFRAME_CFA_RA_REG -#endif - || cfi_insn->u.rr.reg1 == SFRAME_CFA_FP_REG) - err = SFRAME_XLATE_ERR_NOTREPRESENTED; + err = sframe_xlate_do_register (xlate_ctx, cfi_insn); break; + /* Following CFI opcodes are not processed at this time. + These do not impact the coverage of the basic stack tracing + information as conveyed in the SFrame format. */ case DW_CFA_undefined: case DW_CFA_same_value: break; |