CI passed, pushed to trunk :)

On Thu, May 29, 2025 at 1:59 PM Kito Cheng <kito.ch...@sifive.com> wrote:
>
> This commit implements a full-featured iterator for the
> riscv_subset_list, that it able to use range-based-for-loop.
>
> That could simplfy the code in the future, and make it more readable,
> also more compatible with standard C++ containers.
>
> gcc/ChangeLog:
>
>         * config/riscv/riscv-c.cc (riscv_cpu_cpp_builtins): Use
>         range-based-for-loop.
>         * config/riscv/riscv-subset.h (riscv_subset_list::iterator):
>         New.
>         (riscv_subset_list::const_iterator): New.
> ---
>  gcc/config/riscv/riscv-c.cc     | 18 ++++------
>  gcc/config/riscv/riscv-subset.h | 62 +++++++++++++++++++++++++++++++--
>  2 files changed, 66 insertions(+), 14 deletions(-)
>
> diff --git a/gcc/config/riscv/riscv-c.cc b/gcc/config/riscv/riscv-c.cc
> index 1ff1968f6d8..d2c0af35955 100644
> --- a/gcc/config/riscv/riscv-c.cc
> +++ b/gcc/config/riscv/riscv-c.cc
> @@ -239,26 +239,22 @@ riscv_cpu_cpp_builtins (cpp_reader *pfile)
>    size_t max_ext_len = 0;
>
>    /* Figure out the max length of extension name for reserving buffer.   */
> -  for (const riscv_subset_t *subset = subset_list->begin ();
> -       subset != subset_list->end ();
> -       subset = subset->next)
> -    max_ext_len = MAX (max_ext_len, subset->name.length ());
> +  for (auto &subset : *subset_list)
> +    max_ext_len = MAX (max_ext_len, subset.name.length ());
>
>    char *buf = (char *)alloca (max_ext_len + 10 /* For __riscv_ and '\0'.  
> */);
>
> -  for (const riscv_subset_t *subset = subset_list->begin ();
> -       subset != subset_list->end ();
> -       subset = subset->next)
> +  for (auto &subset : *subset_list)
>      {
> -      int version_value = riscv_ext_version_value (subset->major_version,
> -                                                  subset->minor_version);
> +      int version_value = riscv_ext_version_value (subset.major_version,
> +                                                  subset.minor_version);
>        /* Special rule for zicsr and zifencei, it's used for ISA spec 2.2 or
>          earlier.  */
> -      if ((subset->name == "zicsr" || subset->name == "zifencei")
> +      if ((subset.name == "zicsr" || subset.name == "zifencei")
>           && version_value == 0)
>         version_value = riscv_ext_version_value (2, 0);
>
> -      sprintf (buf, "__riscv_%s", subset->name.c_str ());
> +      sprintf (buf, "__riscv_%s", subset.name.c_str ());
>        builtin_define_with_int_value (buf, version_value);
>      }
>  }
> diff --git a/gcc/config/riscv/riscv-subset.h b/gcc/config/riscv/riscv-subset.h
> index c5d9fab4de9..a35537d7754 100644
> --- a/gcc/config/riscv/riscv-subset.h
> +++ b/gcc/config/riscv/riscv-subset.h
> @@ -109,9 +109,6 @@ public:
>    static riscv_subset_list *parse (const char *, location_t);
>    const char *parse_single_ext (const char *, bool exact_single_p = true);
>
> -  const riscv_subset_t *begin () const {return m_head;};
> -  const riscv_subset_t *end () const {return NULL;};
> -
>    int match_score (riscv_subset_list *) const;
>
>    void set_loc (location_t);
> @@ -119,6 +116,65 @@ public:
>    void set_allow_adding_dup (bool v) { m_allow_adding_dup = v; }
>
>    void finalize ();
> +
> +  class iterator
> +  {
> +  public:
> +    explicit iterator(riscv_subset_t *node) : m_node(node) {}
> +
> +    riscv_subset_t &operator*() const { return *m_node; }
> +    riscv_subset_t *operator->() const { return m_node; }
> +
> +    iterator &operator++()
> +    {
> +      if (m_node)
> +       m_node = m_node->next;
> +      return *this;
> +    }
> +
> +    bool operator!=(const iterator &other) const
> +    {
> +      return m_node != other.m_node;
> +    }
> +
> +    bool operator==(const iterator &other) const
> +    {
> +      return m_node == other.m_node;
> +    }
> +
> +  private:
> +    riscv_subset_t *m_node;
> +  };
> +
> +  iterator begin() { return iterator(m_head); }
> +  iterator end()   { return iterator(nullptr); }
> +
> +  class const_iterator
> +  {
> +  public:
> +    explicit const_iterator(const riscv_subset_t *node) : m_node(node) {}
> +
> +    const riscv_subset_t &operator*() const { return *m_node; }
> +    const riscv_subset_t *operator->() const { return m_node; }
> +
> +    const_iterator &operator++()
> +    {
> +      if (m_node)
> +       m_node = m_node->next;
> +      return *this;
> +    }
> +
> +    bool operator!=(const const_iterator &other) const
> +    {
> +      return m_node != other.m_node;
> +    }
> +
> +  private:
> +    const riscv_subset_t *m_node;
> +  };
> +
> +  const_iterator begin() const { return const_iterator(m_head); }
> +  const_iterator end() const   { return const_iterator(nullptr); }
>  };
>
>  extern const riscv_subset_list *riscv_cmdline_subset_list (void);
> --
> 2.34.1
>

Reply via email to