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
>
signature.asc
Description: Digital signature
