This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 3/8] gdb/s390: Fill pseudo register agent expression hooks.


On Sun, Feb 07 2016, Marcin KoÅcielnicki wrote:

> gdb/ChangeLog:
>
> 	* s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function.
> 	(s390_ax_pseudo_register_push_stack): New function.
> 	(s390_gdbarch_init): Fill ax_pseudo_register_collect and
> 	ax_pseudo_register_push_stack hooks.
> ---
> Added missing comments.
>
>  gdb/ChangeLog         |  7 +++++
>  gdb/s390-linux-tdep.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 91 insertions(+)
>
> diff --git a/gdb/ChangeLog b/gdb/ChangeLog
> index d24cccd..6260040 100644
> --- a/gdb/ChangeLog
> +++ b/gdb/ChangeLog
> @@ -1,5 +1,12 @@
>  2016-02-07  Marcin KoÅcielnicki  <koriakin@0x04.net>
>  
> +	* s390-linux-tdep.c (s390_ax_pseudo_register_collect): New function.
> +	(s390_ax_pseudo_register_push_stack): New function.
> +	(s390_gdbarch_init): Fill ax_pseudo_register_collect and
> +	ax_pseudo_register_push_stack hooks.
> +
> +2016-02-07  Marcin KoÅcielnicki  <koriakin@0x04.net>
> +
>  	* s390-linux-tdep.c (s390_supply_pseudo_pc): New function.
>  	(s390_gdbarch_init): Fill supply_pseudo_pc hook.
>  
> diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
> index 144365c..97bd564 100644
> --- a/gdb/s390-linux-tdep.c
> +++ b/gdb/s390-linux-tdep.c
> @@ -547,6 +547,86 @@ s390_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
>    return default_register_reggroup_p (gdbarch, regnum, group);
>  }
>  
> +/* The "ax_pseudo_register_collect" gdbarch method.  */
> +
> +static int
> +s390_ax_pseudo_register_collect (struct gdbarch *gdbarch,
> +				 struct agent_expr *ax, int regnum)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  if (regnum == tdep->pc_regnum)
> +    {
> +      ax_reg_mask (ax, S390_PSWA_REGNUM);
> +    }
> +  else if (regnum == tdep->cc_regnum)
> +    {
> +      ax_reg_mask (ax, S390_PSWM_REGNUM);
> +    }
> +  else if (regnum_is_gpr_full (tdep, regnum))
> +    {
> +      regnum -= tdep->gpr_full_regnum;
> +      ax_reg_mask (ax, S390_R0_REGNUM + regnum);
> +      ax_reg_mask (ax, S390_R0_UPPER_REGNUM + regnum);
> +    }
> +  else if (regnum_is_vxr_full (tdep, regnum))
> +    {
> +      regnum -= tdep->v0_full_regnum;
> +      ax_reg_mask (ax, S390_F0_REGNUM + regnum);
> +      ax_reg_mask (ax, S390_V0_LOWER_REGNUM + regnum);
> +    }
> +  else
> +    {
> +      internal_error (__FILE__, __LINE__, _("invalid regnum"));
> +    }
> +  return 0;
> +}
> +
> +/* The "ax_pseudo_register_push_stack" gdbarch method.  */
> +
> +static int
> +s390_ax_pseudo_register_push_stack (struct gdbarch *gdbarch,
> +				    struct agent_expr *ax, int regnum)
> +{
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +  if (regnum == tdep->pc_regnum)
> +    {
> +      ax_reg (ax, S390_PSWA_REGNUM);
> +      if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
> +	{
> +	  ax_zero_ext (ax, 31);
> +	}
> +    }
> +  else if (regnum == tdep->cc_regnum)
> +    {
> +      ax_reg (ax, S390_PSWM_REGNUM);
> +      if (register_size (gdbarch, S390_PSWA_REGNUM) == 4)
> +	ax_const_l (ax, 12);
> +      else
> +	ax_const_l (ax, 44);
> +      ax_simple (ax, aop_rsh_unsigned);
> +      ax_zero_ext (ax, 2);
> +    }
> +  else if (regnum_is_gpr_full (tdep, regnum))
> +    {
> +      regnum -= tdep->gpr_full_regnum;
> +      ax_reg (ax, S390_R0_REGNUM + regnum);
> +      ax_reg (ax, S390_R0_UPPER_REGNUM + regnum);
> +      ax_const_l (ax, 32);
> +      ax_simple (ax, aop_lsh);
> +      ax_simple (ax, aop_bit_or);
> +    }
> +  else if (regnum_is_vxr_full (tdep, regnum))
> +    {
> +      /* Too large to stuff on the stack.  */
> +      return 1;
> +    }
> +  else
> +    {
> +      internal_error (__FILE__, __LINE__, _("invalid regnum"));
> +    }
> +  return 0;
> +}
> +
>  
>  /* A helper for s390_software_single_step, decides if an instruction
>     is a partial-execution instruction that needs to be executed until
> @@ -7886,6 +7966,10 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
>    set_tdesc_pseudo_register_type (gdbarch, s390_pseudo_register_type);
>    set_tdesc_pseudo_register_reggroup_p (gdbarch,
>  					s390_pseudo_register_reggroup_p);
> +  set_gdbarch_ax_pseudo_register_collect (gdbarch,
> +					  s390_ax_pseudo_register_collect);
> +  set_gdbarch_ax_pseudo_register_push_stack
> +      (gdbarch, s390_ax_pseudo_register_push_stack);
>    tdesc_use_registers (gdbarch, tdesc, tdesc_data);
>    set_gdbarch_register_name (gdbarch, s390_register_name);

Thanks, this is OK.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]