On Mon, Apr 21, 2014 at 12:56:53PM -0400, David Malcolm wrote:
> gcc/
>       * coretypes.h (gimple_goto): New typedef.
>       (const_gimple_goto): New typedef.
> 
>       * gimple.h (gimple_statement_goto): New subclass of
>       gimple_statement_with_ops, adding the invariant that
>       stmt->code == GIMPLE_GOTO.
>       (gimple_statement_base::as_a_gimple_goto): New.
>       (gimple_statement_base::dyn_cast_gimple_goto): New.
>       (is_a_helper <gimple_statement_goto>::test): New.
>       (gimple_build_goto): Return a gimple_goto rather than a
>       plain gimple.
> 
>       * gimple-pretty-print.c (dump_gimple_goto): Require a gimple_goto
>       rather than a plain gimple.
>       (pp_gimple_stmt_1): Add a checked cast to gimple_goto within
>       GIMPLE_GOTO case of switch statement.
> 
>       * gimple.c (gimple_build_goto): Return a gimple_goto rather than a
>       plain gimple.
> 
>       * tree-cfg.c (verify_gimple_goto): Require a gimple_goto rather
>       than a plain gimple.
>       (verify_gimple_stmt): Add a checked cast to gimple_goto within
>       GIMPLE_GOTO case of switch statement.
> ---
>  gcc/coretypes.h           |  4 ++++
>  gcc/gimple-pretty-print.c |  4 ++--

didn't you miss updating the gdb pretty printers in this one?

Trev

>  gcc/gimple.c              |  5 +++--
>  gcc/gimple.h              | 36 +++++++++++++++++++++++++++++++++++-
>  gcc/tree-cfg.c            |  4 ++--
>  5 files changed, 46 insertions(+), 7 deletions(-)
> 
> diff --git a/gcc/coretypes.h b/gcc/coretypes.h
> index d5c62b9..1d04d07 100644
> --- a/gcc/coretypes.h
> +++ b/gcc/coretypes.h
> @@ -77,6 +77,10 @@ struct gimple_statement_debug;
>  typedef struct gimple_statement_debug *gimple_debug;
>  typedef const struct gimple_statement_debug *const_gimple_debug;
>  
> +struct gimple_statement_goto;
> +typedef struct gimple_statement_goto *gimple_goto;
> +typedef const struct gimple_statement_goto *const_gimple_goto;
> +
>  struct gimple_statement_label;
>  typedef struct gimple_statement_label *gimple_label;
>  typedef const struct gimple_statement_label *const_gimple_label;
> diff --git a/gcc/gimple-pretty-print.c b/gcc/gimple-pretty-print.c
> index 90baded..6ee6ce9 100644
> --- a/gcc/gimple-pretty-print.c
> +++ b/gcc/gimple-pretty-print.c
> @@ -874,7 +874,7 @@ dump_gimple_label (pretty_printer *buffer, gimple_label 
> gs, int spc, int flags)
>     TDF_* in dumpfile.h).  */
>  
>  static void
> -dump_gimple_goto (pretty_printer *buffer, gimple gs, int spc, int flags)
> +dump_gimple_goto (pretty_printer *buffer, gimple_goto gs, int spc, int flags)
>  {
>    tree label = gimple_goto_dest (gs);
>    if (flags & TDF_RAW)
> @@ -2115,7 +2115,7 @@ pp_gimple_stmt_1 (pretty_printer *buffer, gimple gs, 
> int spc, int flags)
>        break;
>  
>      case GIMPLE_GOTO:
> -      dump_gimple_goto (buffer, gs, spc, flags);
> +      dump_gimple_goto (buffer, gs->as_a_gimple_goto (), spc, flags);
>        break;
>  
>      case GIMPLE_NOP:
> diff --git a/gcc/gimple.c b/gcc/gimple.c
> index 222c068..b73fc74 100644
> --- a/gcc/gimple.c
> +++ b/gcc/gimple.c
> @@ -495,10 +495,11 @@ gimple_build_label (tree label)
>  
>  /* Build a GIMPLE_GOTO statement to label DEST.  */
>  
> -gimple
> +gimple_goto
>  gimple_build_goto (tree dest)
>  {
> -  gimple p = gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1);
> +  gimple_goto p = gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK,
> +                                      1)->as_a_gimple_goto ();
>    gimple_goto_set_dest (p, dest);
>    return p;
>  }
> diff --git a/gcc/gimple.h b/gcc/gimple.h
> index 39ac2dc..a4c7b30 100644
> --- a/gcc/gimple.h
> +++ b/gcc/gimple.h
> @@ -222,6 +222,12 @@ public:
>      return as_a <gimple_statement_debug> (this);
>    }
>  
> +  inline gimple_goto
> +  as_a_gimple_goto ()
> +  {
> +    return as_a <gimple_statement_goto> (this);
> +  }
> +
>    inline gimple_label
>    as_a_gimple_label ()
>    {
> @@ -290,6 +296,12 @@ public:
>      return dyn_cast <gimple_statement_debug> (this);
>    }
>  
> +  inline gimple_goto
> +  dyn_cast_gimple_goto ()
> +  {
> +    return dyn_cast <gimple_statement_goto> (this);
> +  }
> +
>    inline gimple_label
>    dyn_cast_gimple_label ()
>    {
> @@ -922,6 +934,20 @@ struct GTY((tag("GSS_WITH_OPS")))
>  };
>  
>  /* A statement with the invariant that
> +      stmt->code == GIMPLE_GOTO
> +   i.e. a goto statement.
> +
> +   This type will normally be accessed via the gimple_goto and
> +   const_gimple_goto typedefs (in coretypes.h), which are pointers to
> +   this type.  */
> +
> +struct GTY((tag("GSS_WITH_OPS")))
> +  gimple_statement_goto : public gimple_statement_with_ops
> +{
> +  /* no additional fields; this uses the layout for GSS_WITH_OPS. */
> +};
> +
> +/* A statement with the invariant that
>        stmt->code == GIMPLE_LABEL
>     i.e. a label statement.
>  
> @@ -1024,6 +1050,14 @@ is_a_helper <gimple_statement_debug>::test (gimple gs)
>  template <>
>  template <>
>  inline bool
> +is_a_helper <gimple_statement_goto>::test (gimple gs)
> +{
> +  return gs->code == GIMPLE_GOTO;
> +}
> +
> +template <>
> +template <>
> +inline bool
>  is_a_helper <gimple_statement_label>::test (gimple gs)
>  {
>    return gs->code == GIMPLE_LABEL;
> @@ -1429,7 +1463,7 @@ gimple_cond gimple_build_cond (enum tree_code, tree, 
> tree, tree, tree);
>  gimple_cond gimple_build_cond_from_tree (tree, tree, tree);
>  void gimple_cond_set_condition_from_tree (gimple_cond, tree);
>  gimple_label gimple_build_label (tree label);
> -gimple gimple_build_goto (tree dest);
> +gimple_goto gimple_build_goto (tree dest);
>  gimple gimple_build_nop (void);
>  gimple_bind gimple_build_bind (tree, gimple_seq, tree);
>  gimple gimple_build_asm_vec (const char *, vec<tree, va_gc> *,
> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> index 1bfed7d..8b8020e 100644
> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -4229,7 +4229,7 @@ verify_gimple_return (gimple_return stmt)
>     is a problem, otherwise false.  */
>  
>  static bool
> -verify_gimple_goto (gimple stmt)
> +verify_gimple_goto (gimple_goto stmt)
>  {
>    tree dest = gimple_goto_dest (stmt);
>  
> @@ -4429,7 +4429,7 @@ verify_gimple_stmt (gimple stmt)
>                                      gimple_cond_rhs (stmt));
>  
>      case GIMPLE_GOTO:
> -      return verify_gimple_goto (stmt);
> +      return verify_gimple_goto (stmt->as_a_gimple_goto ());
>  
>      case GIMPLE_SWITCH:
>        return verify_gimple_switch (stmt->as_a_gimple_switch ());
> -- 
> 1.8.5.3
> 

Attachment: signature.asc
Description: Digital signature

Reply via email to