Skip to content
  • Simon Marchi's avatar
    Create a displaced_step_closure class hierarchy · cfba9872
    Simon Marchi authored
    displaced_step_closure is a type defined in multiple -tdep.c files.
    Trying to xfree it from the common code (infrun.c) is a problem when we
    try to poison xfree for non-POD types.  Because there can be multiple of
    these types in the same build, this patch makes a hierarchy of classes
    with a virtual destructor.  When the common code deletes the object
    through a displaced_step_closure pointer, it will invoke the right
    destructor.
    
    The amd64 used a last-member array with a variable size.  That doesn't
    work with new, so I changed it for an std::vector.  Other architectures
    which used a simple byte buffer as a closure now use a shared
    buf_displaced_step_closure, a closure type that only contains a
    gdb::byte_vector.
    
    Reg-tested on the buildbot.
    
    gdb/ChangeLog:
    
    	* infrun.h: Include common/byte-vector.h.
    	(struct displaced_step_closure): New struct.
    	(struct buf_displaced_step_closure): New struct.
    	* infrun.c (displaced_step_closure::~displaced_step_closure):
    	Provide default implementation.
    	(displaced_step_clear): Deallocate step closure with delete.
    	* aarch64-tdep.c (displaced_step_closure): Rename to ...
    	(aarch64_displaced_step_closure): ... this, extend
    	displaced_step_closure.
    	(aarch64_displaced_step_data) <dsc>: Change type to
    	aarch64_displaced_step_closure.
    	(aarch64_displaced_step_copy_insn): Adjust to type change, use
    	unique_ptr.
    	(aarch64_displaced_step_fixup): Add cast for displaced step
    	closure.
    	* amd64-tdep.c (displaced_step_closure): Rename to ...
    	(amd64_displaced_step_closure): ... this, extend
    	displaced_step_closure.
    	<insn_buf>: Change type to std::vector<gdb_byte>.
    	<max_len>: Remove.
    	(fixup_riprel): Change type of DSC parameter, adjust to type
    	change of insn_buf.
    	(fixup_displaced_copy): Change type of DSC parameter.
    	(amd64_displaced_step_copy_insn): Instantiate
    	amd64_displaced_step_closure.
    	(amd64_displaced_step_fixup): Add cast for closure type, adjust
    	to type change of insn_buf.
    	* arm-linux-tdep.c (arm_linux_cleanup_svc): Change type of
    	parameter DSC.
    	(arm_linux_copy_svc): Likewise.
    	(cleanup_kernel_helper_return): Likewise.
    	(arm_catch_kernel_helper_return): Likewise.
    	(arm_linux_displaced_step_copy_insn): Instantiate
    	arm_displaced_step_closure.
    	* arm-tdep.c (arm_pc_is_thumb): Add cast for closure.
    	(displaced_read_reg): Change type of parameter DSC.
    	(branch_write_pc): Likewise.
    	(load_write_pc): Likewise.
    	(alu_write_pc): Likewise.
    	(displaced_write_reg): Likewise.
    	(arm_copy_unmodified): Likewise.
    	(thumb_copy_unmodified_32bit): Likewise.
    	(thumb_copy_unmodified_16bit): Likewise.
    	(cleanup_preload): Likewise.
    	(install_preload): Likewise.
    	(arm_copy_preload): Likewise.
    	(thumb2_copy_preload): Likewise.
    	(install_preload_reg): Likewise.
    	(arm_copy_preload_reg): Likewise.
    	(cleanup_copro_load_store): Likewise.
    	(install_copro_load_store): Likewise.
    	(arm_copy_copro_load_store) Likewise.
    	(thumb2_copy_copro_load_store): Likewise.
    	(cleanup_branch): Likewise.
    	(install_b_bl_blx): Likewise.
    	(arm_copy_b_bl_blx): Likewise.
    	(thumb2_copy_b_bl_blx): Likewise.
    	(thumb_copy_b): Likewise.
    	(install_bx_blx_reg): Likewise.
    	(arm_copy_bx_blx_reg): Likewise.
    	(thumb_copy_bx_blx_reg): Likewise.
    	(cleanup_alu_imm): Likewise.
    	(arm_copy_alu_imm): Likewise.
    	(thumb2_copy_alu_imm): Likewise.
    	(cleanup_alu_reg): Likewise.
    	(install_alu_reg): Likewise.
    	(arm_copy_alu_reg): Likewise.
    	(thumb_copy_alu_reg): Likewise.
    	(cleanup_alu_shifted_reg): Likewise.
    	(install_alu_shifted_reg): Likewise.
    	(arm_copy_alu_shifted_reg): Likewise.
    	(cleanup_load): Likewise.
    	(cleanup_store): Likewise.
    	(arm_copy_extra_ld_st): Likewise.
    	(install_load_store): Likewise.
    	(thumb2_copy_load_literal): Likewise.
    	(thumb2_copy_load_reg_imm): Likewise.
    	(arm_copy_ldr_str_ldrb_strb): Likewise.
    	(cleanup_block_load_all): Likewise.
    	(cleanup_block_store_pc): Likewise.
    	(cleanup_block_load_pc): Likewise.
    	(arm_copy_block_xfer): Likewise.
    	(thumb2_copy_block_xfer): Likewise.
    	(cleanup_svc): Likewise.
    	(install_svc): Likewise.
    	(arm_copy_svc): Likewise.
    	(thumb_copy_svc): Likewise.
    	(arm_copy_undef): Likewise.
    	(thumb_32bit_copy_undef): Likewise.
    	(arm_copy_unpred): Likewise.
    	(arm_decode_misc_memhint_neon): Likewise.
    	(arm_decode_unconditional): Likewise.
    	(arm_decode_miscellaneous): Likewise.
    	(arm_decode_dp_misc): Likewise.
    	(arm_decode_ld_st_word_ubyte): Likewise.
    	(arm_decode_media): Likewise.
    	(arm_decode_b_bl_ldmstm): Likewise.
    	(arm_decode_ext_reg_ld_st): Likewise.
    	(thumb2_decode_dp_shift_reg): Likewise.
    	(thumb2_decode_ext_reg_ld_st): Likewise.
    	(arm_decode_svc_copro): Likewise.
    	(thumb2_decode_svc_copro): Likewise.
    	(install_pc_relative): Likewise.
    	(thumb_copy_pc_relative_16bit): Likewise.
    	(thumb_decode_pc_relative_16bit): Likewise.
    	(thumb_copy_pc_relative_32bit): Likewise.
    	(thumb_copy_16bit_ldr_literal): Likewise.
    	(thumb_copy_cbnz_cbz): Likewise.
    	(thumb2_copy_table_branch): Likewise.
    	(cleanup_pop_pc_16bit_all): Likewise.
    	(thumb_copy_pop_pc_16bit): Likewise.
    	(thumb_process_displaced_16bit_insn): Likewise.
    	(decode_thumb_32bit_ld_mem_hints): Likewise.
    	(thumb_process_displaced_32bit_insn): Likewise.
    	(thumb_process_displaced_insn): Likewise.
    	(arm_process_displaced_insn): Likewise.
    	(arm_displaced_init_closure): Likewise.
    	(arm_displaced_step_fixup): Add cast for closure.
    	* arm-tdep.h: Include infrun.h.
    	(displaced_step_closure): Rename to ...
    	(arm_displaced_step_closure): ... this, extend
    	displaced_step_closure.
    	<u::svc::copy_svc_os>: Change type of parameter DSC.
    	<cleanup>: Likewise.
    	(arm_process_displaced_insn): Likewise.
    	(arm_displaced_init_closure): Likewise.
    	(displaced_read_reg): Likewise.
    	(displaced_write_reg): Likewise.
    	* i386-linux-tdep.c (i386_linux_displaced_step_copy_insn):
    	Adjust.
    	* i386-tdep.h: Include infrun.h.
    	(i386_displaced_step_closure): New typedef.
    	* i386-tdep.c (i386_displaced_step_copy_insn): Use
    	i386_displaced_step_closure.
    	(i386_displaced_step_fixup): Adjust.
    	* rs6000-tdep.c (ppc_displaced_step_closure): New typedef.
    	(ppc_displaced_step_copy_insn): Use ppc_displaced_step_closure
    	and unique_ptr.
    	(ppc_displaced_step_fixup): Adjust.
    	* s390-linux-tdep.c (s390_displaced_step_closure): New typedef.
    	(s390_displaced_step_copy_insn): Use s390_displaced_step_closure
    	and unique_ptr.
    	(s390_displaced_step_fixup): Adjust.
    cfba9872