[PATCH] forge: utilities to support classifying patches on the forge

Richard Earnshaw (lists) Richard.Earnshaw@arm.com
Wed Oct 29 11:12:26 GMT 2025


And this is the patch.  Sorry, if you want to extract the code itself, you'll need to follow the reference back.

R.

On 28/10/2025 14:10, Richard Earnshaw via Gcc wrote:
> These two files are intended to be a demonstration of how we could auto-classify
> patches submitted to the forge and appropriate labels.
> 
> This is work-in-progress; in particular the classify.py code cannot currently
> read patch files or look up bugzilla tickets.  However, it is possible to run
> the script on the output of find (run from the top-level of the gcc source tree)
> to see which labels would be added for each file in the repository.  Use
> something like:
>   (cd ${gcc_src}; find . \( -name .git -prune \) -o -type f) | ./classify.py
> 
> contrib/ChangeLog:
> 
> 	* forge/classify.py: New file.
> 	* forge/labels: New file.
> ---
>  contrib/forge/classify.py | 158 +++++++++++++++++
>  contrib/forge/labels      | 347 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 505 insertions(+)
>  create mode 100755 contrib/forge/classify.py
>  create mode 100644 contrib/forge/labels
> 
> diff --git a/contrib/forge/classify.py b/contrib/forge/classify.py
> new file mode 100755
> index 00000000000..622b565dd61
> --- /dev/null
> +++ b/contrib/forge/classify.py
> @@ -0,0 +1,158 @@
> +#!/usr/bin/env python3
> +
> +# Map files in the GCC source tree to forge labels.
> +
> +# Copyright (C) 2025 Free Software Foundation, Inc.
> +#
> +# This file is part of GCC.
> +#
> +# GCC is free software; you can redistribute it and/or modify it under
> +# the terms of the GNU General Public License as published by the Free
> +# Software Foundation; either version 3, or (at your option) any later
> +# version.
> +#
> +# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +# WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +# for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# Note, this file requires python 3.10 or later.
> +
> +import re
> +import sys
> +
> +# from unidiff import PatchSet
> +
> +labels_file = 'labels'
> +
> +label_and_rule = re.compile(r'^([a-zA-Z][-+a-zA-Z0-9]*(?:/[a-zA-Z][-+a-zA-Z0-9]*)*)\s+\{([^\}]+)?\}\s+')
> +ignore_line = re.compile(r'^([#:]|\s*\n)')
> +
> +class classifier:
> +    def __init__(self, labs):
> +        self.file_class = []
> +        self.bz_class = []
> +        self.default_class = None
> +        f = open(labs)
> +        for l in f.readlines():
> +            m = label_and_rule.match(l)
> +            if m:
> +                rule = m.group(2)
> +                if rule:
> +                    if rule[:5] == 'file:':
> +                        self.file_class += self._file_entry(rule[5:], m.group(1))
> +                    elif rule == 'default:':
> +                        if self.default_class:
> +                            raise Exception ('There can only be one default class')
> +                        else:
> +                            self.default_class = m.group(1)
> +                    elif rule[:3] == 'BZ:':
> +                        True
> +                    else:
> +                        raise Exception('Unrecognized line: ' + l)
> +
> +            elif not ignore_line.match(l):
> +                print('Unrecognized line:', l)
> +        f.close()
> +
> +    def map_to_labels(self, name):
> +        labels = []
> +        priority = 10 # Lowest supported priority is 9
> +        for fc in self.file_class:
> +            if fc['pattern'].match(name):
> +                if fc['priority'] < priority:
> +                    priority = fc['priority']
> +                    labels = [fc['label']]
> +                elif fc['priority'] == priority:
> +                    labels += [fc['label']]
> +
> +        if len(labels) != 0:
> +            return labels
> +        return [self.default_class]
> +
> +    def _file_entry(self, template, label):
> +        pattern = r''
> +        last_char = None
> +        # Diff file names are of the form a/xxx or b/xxx
> +        # and the output of 'find .' is of the form './xxx'
> +        # so if we need to match the start of the filename, look for
> +        # '^.' to skip the leading character.
> +        pos = 0
> +        depth = 0
> +        priority = 1
> +        length = len(template)
> +        # An initial &<digit> gives a priority for the match.  lower values have
> +        # higher priority (min 1).  A label will only be applied if it has the
> +        # same priority as any existing labels or if it has a lower priority
> +        # value than any existing labels applied (in which case the existing
> +        # labels will be discarded).
> +        if length - pos > 2 and template[pos] == '&':
> +            priority = int(template[1])
> +            pos += 2
> +        if template[pos] == '^':
> +            pattern += r'^.'
> +            pos += 1
> +            # Don't update last_char
> +        else:
> +            pattern += r'.*/'
> +        while pos < length:
> +            # '*' is mapped to '[^/]*' unless the following characters are
> +            # also '*/', in which case we match '(.*/)*'
> +            if template[pos] == '*':
> +                if pos + 2 < length and template[:3] == '**/':
> +                    pattern += r'(:?.*/)*'
> +                    pos += 1
> +                else:
> +                    pattern += r'[^/]*'
> +            elif template[pos] == '+':
> +                pattern += r'\+'
> +            elif template[pos] == '(':
> +                # We don't need any groups from the regex.
> +                pattern += r'(?:'
> +                depth += 1
> +            elif template[pos] == ')':
> +                pattern += r')'
> +                depth -= 1
> +                if depth < 0:
> +                    raise Exception ('Invalid template: ' + template)
> +            elif template[pos] == '.':
> +                pattern += r'\.'
> +            elif template[pos] == '/':
> +                pattern += r'/'
> +                if (depth > 0
> +                    and pos + 1 < length 
> +                    and (template[pos + 1] == '|'
> +                         or template[pos + 1] == ')')):
> +                    # We expect '/|' (or '/)' to appear at the end of an alternative
> +                    # and to mean anything in any subdirectory matched.  But we may
> +                    # need to match files in the alternative, so add an explicit '.*'.
> +                    pattern += r'.*'
> +            else:
> +                pattern += template[pos]
> +            last_char = template[pos]
> +            pos += 1
> +
> +        if depth != 0:
> +            raise Exception ('Invalid template: ' + template)
> +        if last_char != '/':
> +            pattern += '$'
> +
> +        d = dict()
> +        d['pattern'] = re.compile(pattern)
> +        d['priority'] = priority
> +        d['label'] = label
> +        return [d]
> +
> +
> +
> +def main():
> +    my_classifier = classifier(labels_file)
> +    for f in sys.stdin.readlines():
> +        print (f.strip('\n'), ': ', my_classifier.map_to_labels (f.strip('\n')), sep='')
> +
> +if __name__ == "__main__":
> +    main()
> diff --git a/contrib/forge/labels b/contrib/forge/labels
> new file mode 100644
> index 00000000000..c3733c2ecf8
> --- /dev/null
> +++ b/contrib/forge/labels
> @@ -0,0 +1,347 @@
> +# Provisional list of labels for the gcc forge:
> +#
> +# Copyright (C) 2025 Free Software Foundation, Inc.
> +#
> +# This file is part of GCC.
> +#
> +# GCC is free software; you can redistribute it and/or modify it under
> +# the terms of the GNU General Public License as published by the Free
> +# Software Foundation; either version 3, or (at your option) any later
> +# version.
> +#
> +# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
> +# WARRANTY; without even the implied warranty of MERCHANTABILITY or
> +# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
> +# for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with GCC; see the file COPYING3.  If not see
> +# <http://www.gnu.org/licenses/>.
> +
> +# Tags are not exclusive unless otherwise stated.
> +#
> +
> +# Note, *** indicates that this matches a strict category, but perhaps
> +# we shouldn't permit these in labels.
> +
> +# Format of this file:
> +# - Comments start with '#' in the first column and continue to the
> +#   end of a line.
> +# - Color markers start with ':color' and indicate the background
> +#   color of label.  The value is RGB in hex.  Color directives
> +#   continue until the next color marker.
> +# - Multi-select/exclusive labels are marked ':multi' or ':exclusive'
> +#   and indicate if the tag forms part of an exclusive set (you can
> +#   set at most one such label on a patch or issue.  These continue
> +#   until the next multi/exclusive marker.  Note the label name's in
> +#   an exclusive set must follow Forgejo's rules for such labels.
> +# - Other lines are in the format:
> +#     <label-name>	{auto-assignment-query}  [<optional description>]
> +#   The description text will be used to populate the description
> +#   field for the label.
> +#
> +#   The auto-assignment-query is a search term or rule for applying
> +#   the label to the ticket.  No search is performed if the query
> +#   field is empty ({}).
> +#
> +#   Three forms of query are currently supported:
> +#   - BZ:<ticket-num>.<field>
> +#     Extracts 'field' from a bugzilla ticket and uses it to substitute
> +#     as the last component of the label (all such labels must use the
> +#     same query and all the valid values for the label must exist.
> +#   - BZ:imatch(<regex>).<ticket-num>.<field>
> +#     Extracts 'field' from a bugzilla ticket 'ticket-num'
> +
> +
> +
> +## Bug reports
> +# All of these labels are expected to be automatically scraped from
> +# the primary (first-referenced) bugzilla entry that is identified
> +# from the cover text of a patch.  Note that they will not be
> +# automatically updated if the bugzilla entry is changed after the
> +# pull request has been created.
> +
> +# Labels relating to bugs with a 'regression' marker in the bug summary.
> +:color #bd0000
> +:multi
> +Bug/Regression			{BZ:imatch(\[[^\]]*regression\]).<pr>.summary}
> +
> +# Bug importance (exclusive)
> +:color #f06d00
> +:exclusive
> +Bug/Importance/P1		{BZ:<pr>.importance}			The bugzilla ticket has priority P1
> +Bug/Importance/P2		{BZ:<pr>.importance}			The bugzilla ticket has priority P2
> +Bug/Importance/P3		{BZ:<pr>.importance}			The bugzilla ticket has priority P3
> +Bug/Importance/P4		{BZ:<pr>.importance}			The bugzilla ticket has priority P4
> +Bug/Importance/P5		{BZ:<pr>.importance}			The bugzilla ticket has priority P5
> +
> +# Labels relating to bugs with a specific component.  The final
> +# part of the label should be a string match for the component
> +# field of the BZ entry.
> +# (exclusive)
> +:color #fbca04
> +:exclusive
> +Bug/Component/ada		{BZ:<pr>.component}			The bugzilla component is 'ada'
> +Bug/Component/algol68		{BZ:<pr>.component}			The bugzilla component is 'algol68'
> +Bug/Component/analyzer		{BZ:<pr>.component}			The bugzilla component is 'analyzer'
> +Bug/Component/boehm-gc		{BZ:<pr>.component}			The bugzilla component is 'boehm-gc'
> +Bug/Component/bootstrap		{BZ:<pr>.component}			The bugzilla component is 'bootstrap'
> +Bug/Component/c			{BZ:<pr>.component}			The bugzilla component is 'c'
> +Bug/Component/c++		{BZ:<pr>.component}			The bugzilla component is 'c++'
> +Bug/Component/cobol		{BZ:<pr>.component}			The bugzilla component is 'cobol'
> +Bug/Component/d			{BZ:<pr>.component}			The bugzilla component is 'd'
> +Bug/Component/debug		{BZ:<pr>.component}			The bugzilla component is 'debug'
> +Bug/Component/demangler		{BZ:<pr>.component}			The bugzilla component is 'demangler'
> +Bug/Component/diagnostics	{BZ:<pr>.component}			The bugzilla component is 'diagnostics'
> +Bug/Component/driver		{BZ:<pr>.component}			The bugzilla component is 'driver'
> +Bug/Component/fortran		{BZ:<pr>.component}			The bugzilla component is 'fortran'
> +Bug/Component/gcov-profile	{BZ:<pr>.component}			The bugzilla component is 'gcov-profile'
> +Bug/Component/go		{BZ:<pr>.component}			The bugzilla component is 'go'
> +Bug/Component/ipa		{BZ:<pr>.component}			The bugzilla component is 'ipa'
> +Bug/Component/jit		{BZ:<pr>.component}			The bugzilla component is 'jit'
> +Bug/Component/libbacktrace	{BZ:<pr>.component}			The bugzilla component is 'libbacktrace'
> +Bug/Component/libcc1		{BZ:<pr>.component}			The bugzilla component is 'libcc1'
> +Bug/Component/libffi		{BZ:<pr>.component}			The bugzilla component is 'libffi'
> +Bug/Component/libfortran	{BZ:<pr>.component}			The bugzilla component is 'libfortran'
> +Bug/Component/libgcc		{BZ:<pr>.component}			The bugzilla component is 'libgcc'
> +Bug/Component/libgdiagnostics	{BZ:<pr>.component}			The bugzilla component is 'libdiagnostics'
> +Bug/Component/libgomp		{BZ:<pr>.component}			The bugzilla component is 'libgomp'
> +Bug/Component/libitm		{BZ:<pr>.component}			The bugzilla component is 'libitm'
> +Bug/Component/libobjc		{BZ:<pr>.component}			The bugzilla component is 'libobjc'
> +Bug/Component/libquadmath	{BZ:<pr>.component}			The bugzilla component is 'libquadmath'
> +Bug/Component/libstdc++		{BZ:<pr>.component}			The bugzilla component is 'libstdc++'
> +Bug/Component/lto		{BZ:<pr>.component}			The bugzilla component is 'lto'
> +Bug/Component/middle-end	{BZ:<pr>.component}			The bugzilla component is 'middle-end'
> +Bug/Component/modula2		{BZ:<pr>.component}			The bugzilla component is 'modula2'
> +Bug/Component/objc		{BZ:<pr>.component}			The bugzilla component is 'objc'
> +Bug/Component/other		{BZ:<pr>.component}			The bugzilla component is 'other'
> +Bug/Component/pch		{BZ:<pr>.component}			The bugzilla component is 'pch'
> +Bug/Component/pending		{BZ:<pr>.component}			The bugzilla component is 'pending'
> +Bug/Component/plugins		{BZ:<pr>.component}			The bugzilla component is 'plugins'
> +Bug/Component/preprocessor	{BZ:<pr>.component}			The bugzilla component is 'preprocessor'
> +Bug/Component/regression	{BZ:<pr>.component}			The bugzilla component is 'regression'
> +Bug/Component/rtl-optimization	{BZ:<pr>.component}			The bugzilla component is 'rtl-optimization'
> +Bug/Component/rust		{BZ:<pr>.component}			The bugzilla component is 'rust'
> +Bug/Component/sanitizer		{BZ:<pr>.component}			The bugzilla component is 'sanitizer'
> +Bug/Component/sarif-replay	{BZ:<pr>.component}			The bugzilla component is 'sarif-replay'
> +# Bug/Component/spam		*** This shouldn't be needed.
> +Bug/Component/target		{BZ:<pr>.component}			The bugzilla component is 'target'
> +Bug/Component/testsuite		{BZ:<pr>.component}			The bugzilla component is 'testsuite'
> +Bug/Component/translation	{BZ:<pr>.component}			The bugzilla component is 'translation'
> +Bug/Component/tree-optimization	{BZ:<pr>.component}			The bugzilla component is 'tree-optimization'
> +Bug/Component/web		{BZ:<pr>.component}			The bugzilla component is 'web'
> +
> +## Labels relating to releases (for backporting)
> +:color #5319e7
> +:multi
> +# eg: Release/GCC-<major>
> +Release/GCC-13			{}					Consider backporting to GCC-13
> +Release/GCC-14			{}					Consider backporting to GCC-14
> +Release/GCC-15			{}					Consider backporting to GCC-15
> +
> +## Labels related to components
> +# Note that multiple labels in this section can be applied, based on the files
> +# modified.
> +
> +# Miscellany
> +:color #006b75
> +:multi
> +General/config			{file:&2^/(config/|**/*.(in|ac|m4)|**/configure*)}	Affects configure or autoconf scripts
> +General/contrib			{file:^/contrib/}			Miscellaneous support scripts
> +General/make			{file:&2(Makefile(.*)?|*.am)}		Affects Makefiles or automake
> +General/driver			{file:^/gcc/gcc(-main|-ar)?.(cc|h)}	GCC main driver program
> +General/forge			{file:^/.(forgejo|github)/}		Forge and CI infrastructure
> +General/unknown			{default:}				Catch-all, does not match any other category
> +General/gdbhooks		{file:^/gcc/gdb(hooks.py|init.in)}	Support for debugging GCC with GDB (gdbhooks.py)
> +General/docs			{file:docs?/}				Changes to the documentation
> +General/web			{}					Changes to the web pages
> +
> +# Library components
> +:color #009800
> +:multi
> +Library/libada			{file:^/libada/}			Affects libada
> +Library/libatomic		{file:^/libatomic/}			Affects libatomic
> +Library/libbacktrace		{file:^/libbacktrace/}			Affects libbacktrace
> +Library/libcc1			{file:^/libcc1/}			Affects libcc1
> +Library/libcody			{file:^/libcody/}			Affects libcody
> +Library/libcpp			{file:^/libcpp/}			Affects libcpp
> +Library/libdecnumber		{file:^/libdecnumber/}			Affects libdecnumber
> +Library/libffi			{file:^/libffi/}			Affects libffi
> +Library/libgcc			{file:^/libgcc/}			Affects libgcc
> +Library/libgcobol		{file:^/libgcobol/}			Affects libgcobol
> +Library/libgfortran		{file:^/libgfortran/}			Affects libgfortran
> +Library/libgm2			{file:^/libgm2/}			Affects libgm2
> +Library/libgo			{file:^/libgo/}				Affects libgo
> +Library/libgomp			{file:^/libgomp/}			Affects libgomp
> +Library/libgrust		{file:^/libgrust/}			Affects libgrust
> +Library/libiberty		{file:^/(include|libiberty)/}		Affects libiberty
> +Library/libitm			{file:^/libitm/}			Affects libitm
> +Library/libobjc			{file:^/libobjc/}			Affects libobjc
> +Library/libphobos		{file:^/libphobos/}			Affects libphobos
> +Library/libquadmath		{file:^/libquadmath/}			Affects libquadmath
> +Library/libsanitizer		{file:^/libsanitizer/}			Affects libsanitizer
> +Library/libssp			{file:^/libssp/}			Affects libssp
> +Library/libstdc++		{file:^/libstdc++-v3/}			Affects libstdc++
> +Library/libvtv			{file:^/libvtv/}			Affects libvtv
> +Library/zlib			{file:^/zlib/}				Affects zlib
> +
> +# CPU targets (in compiler or in libraries)
> +
> +:color #70c24a
> +:multi
> +Target/aarch64			{file:config/aarch64/}			Affects the aarch64 target
> +Target/alpha			{file:config/alpha/}			Affects the alpha target
> +Target/arc			{file:config/arc/}			Affects the arc target
> +Target/arm			{file:config/arm/}			Affects the arm target
> +Target/avr			{file:config/avr/}			Affects the avr target
> +Target/bfin			{file:config/bfin/}			Affects the bfin target
> +Target/bpf			{file:config/bpf/}			Affects the bpf target
> +Target/c6x			{file:config/c6x/}			Affects the c6x target
> +Target/cris			{file:config/cris/}			Affects the cris target
> +Target/csky			{file:config/csky/}			Affects the csky target
> +Target/epiphany			{file:config/epiphany/}			Affects the epiphany target
> +Target/fr30			{file:config/fr30/}			Affects the fr30 target
> +Target/frv			{file:config/frv/}			Affects the frv target
> +Target/ft32			{file:config/ft32/}			Affects the ft32 target
> +Target/gcn			{file:config/gcn/}			Affects the gcn target
> +Target/h8300			{file:config/h8300/}			Affects the h8300 target
> +Target/i386			{file:config/i386/}			Affects the i386 target
> +Target/ia64			{file:config/ia64/}			Affects the ia64 target
> +Target/iq2000			{file:config/iq2000/}			Affects the iq2000 target
> +Target/lm32			{file:config/lm32/}			Affects the lm32 target
> +Target/loongarch		{file:config/loongarch/}		Affects the loongarch target
> +Target/m32c			{file:config/m32c/}			Affects the m32c target
> +Target/m32r			{file:config/m32r/}			Affects the m32r target
> +Target/m68k			{file:config/m68k/}			Affects the m68k target
> +Target/mcore			{file:config/mcore/}			Affects the mcore target
> +Target/microblaze		{file:config/microblaze/}		Affects the microblaze target
> +Target/mips			{file:config/mips/}			Affects the mips target
> +Target/mmix			{file:config/mmix/}			Affects the mmix target
> +Target/mn10300			{file:config/mn10300/}			Affects the mn1030 target
> +Target/moxie			{file:config/moxie/}			Affects the moxie target
> +Target/msp430			{file:config/msp430/}			Affects the msp430 target
> +Target/nds32			{file:config/nds32/}			Affects the nds32 target
> +Target/nvptx			{file:config/nvptx/}			Affects the nvptx target
> +Target/or1k			{file:config/or1k/}			Affects the or1k target
> +Target/pa			{file:config/pa/}			Affects the pa target
> +Target/pdp11			{file:config/pdp11/}			Affects the pdp1 target
> +Target/pru			{file:config/pru/}			Affects the pru target
> +Target/riscv			{file:config/riscv/}			Affects the riscv target
> +Target/rl78			{file:config/rl78/}			Affects the rl78 target
> +Target/rs6000			{file:config/rs6000/}			Affects the rs6000 target
> +Target/rx			{file:config/rx/}			Affects the rx target
> +Target/s390			{file:config/s390/}			Affects the s390 target
> +Target/sh			{file:config/sh/}			Affects the sh target
> +Target/sparc			{file:config/sparc/}			Affects the sparc target
> +Target/stormy16			{file:config/x?stormy16/}		Affects the stormy16 target
> +Target/v850			{file:config/v850/}			Affects the v850 target
> +Target/vax			{file:config/vax/}			Affects the vax target
> +Target/visium			{file:config/visium/}			Affects the visium target
> +Target/xtensa			{file:config/xtensa/}			Affects the xtensa target
> +
> +# These are OS ports that have their own subdirectory in GCC's config subdir
> +#Target/mingw			{file:config/mingw/}			Affects the mingw target
> +#Target/vms			{file:config/vms/}			Affects the vms target
> +#Target/vxworks			{file:config/vxworks/}			Affects the vxworks target
> +
> +# labels specific to an object file format
> +:color #b0ffb0
> +:multi
> +Obj/coff			{file:&2*coff*}				Target independent code related to COFF object format
> +Obj/elf				{file:&2*elf*}				Target independent code related to COFF object format
> +Obj/pe				{}					Target independent code related to PE-COFF object format
> +
> +# labels relating to a specific OS
> +:color #b0fff9
> +:multi
> +OS/aix				{file:rs6000/*aix*}			Affects AIX OS
> +OS/android			{file:*android*}			Affects Android OS
> +OS/cygwin			{file:(config/mingw/|*(cyqwin|mingw)*)}	Affects cywin or mingw OSes
> +OS/darwin			{file:*darwin*}				Affects Darwin OS
> +OS/dragonfly			{file:*dragonfly*}			Affects Dragonfly OS
> +OS/freebsd			{file:*freebsd*}			Affects FreeBSD OS
> +OS/hpux				{file:*hpux*}				Affects HP-UX OS
> +OS/hurd				{file:*hurd*}				Affects GNU Hurd OS
> +OS/linux			{file:&2*linux*}			Affects generic Linux OS
> +OS/netbsd			{file:*netbsd*}				Affects NetBSD OS
> +OS/openbsd			{file:*openbsd*}			Affects OpenBSD OS
> +OS/rtems			{file:*rtems*}				Affects RTEMS OS
> +OS/solaris			{file:(sol2*|*solaris*)}		Affects Solaris OS
> +OS/vms				{file:(*[^a-z])?vms*}			Affects VMS OS
> +OS/vxworks			{file:(config/vxworks/|*vxworks*)}	Affects VxWorks
> +OS/windows			{file:*windows*}			Affects Windows OS
> +
> +# Labels relating to compiler mid-end
> +:color #207de5
> +:multi
> +Midend/diagnostics		{file:^/gcc/(diagnostics/|text-art/|*diagnostic*|*sarif*)}	Diagnostics framework
> +Midend/rtl			{file:&3^/gcc/*.(cc|c|h)}		General RTL code
> +Midend/reg-alloc		{file:^/gcc/*(ira|lra)*}		Register allocation code
> +Midend/tree			{file:&2^/gcc/*tree*}			General tree/gimple code
> +Midend/vect			{file:^/gcc/*vect*}			Vectorization
> +Midend/cfg			{file:^/gcc/*cfg*}			Control Flow Graph framework
> +Midend/ggc			{file:^/gcc/*ggc*}			Garbage collection
> +Midend/gen			{file:^/gcc/gen*.(cc|h)}		Generator programs, eg genattr
> +Midend/ipa			{file:^/gcc/ipa*}			Inter Procedural Analysis framework
> +Midend/misc			{file:&4^/gcc/*}			Miscellaneous files that doesn't fit anything else
> +Midend/lto			{file:^/gcc/(lto/|*lto*)}		Link Time Optimizer code
> +Midend/jit			{file:^/gcc/jit/}			JIT (Just-In-Time) code
> +Midend/include			{file:^/(fixincludes|gcc/ginclude)/}	Include headers and fixincludes
> +Midend/dwarf			{file:^/gcc/**/*dwarf*}			Dwarf debug information
> +Midend/debug			{file:^/gcc/*ctf*}			Non-dwarf debug support
> +Midend/gimple			{file:^/gcc/*gimple*}			General GIMPLE support
> +Midend/gcse			{file:^/gcc/*gcse*}			RTL GCSE
> +Midend/jump			{file:^/gcc/*jump*}			Jump and branch optimizations
> +Midend/i18n			{file:^/gcc/(po/|intl.*)}		Internationalization and Localization
> +Midend/gcov			{file:^/gcc/gcov*}			GCOV code coverage support
> +Midend/opts			{file:^/gcc/(opt*.awk|*.opt|opt[-s]*)}	Option framework
> +Midend/ranger			{file:^/gcc/*range*}			Value range framework
> +Midend/rtl-ssa			{file:^/gcc/rtl-ssa/}			RTL SSA framework
> +Midend/tree-ssa			{file:^/gcc/(tree|gimple)-ssa*}		Tree SSA framework
> +Midend/autofdo			{file:^/gcc/auto-profile*}		AutoFDO framework
> +Midend/combine			{file:^/gcc/combine*}			Instruction Combiner
> +Midend/reload			{file:^/gcc/reload*}			Legacy reload pass (obsolete)
> +Midend/pair-fusion		{file:^/gcc/pair-fusion*}		Pair Fusion framework
> +Midend/ivopts			{file:^/gcc/*loop-iv*}			Loop IVopt framework
> +Midend/loop			{file:^/gcc/*loop*}			Loop optimizations
> +Midend/openacc			{}					OpenACC framework
> +Midend/openmp			{file:^/gcc/omp*}			OpenMP framework
> +Midend/analyzer			{file:^/gcc/analyzer/}			Static analyzer
> +
> +# Labels relating to language frontends
> +:color #0052cc
> +:multi
> +Frontend/ada			{file:^/gcc/ada/}			The Ada frontend
> +Frontend/algol68		{file:^/gcc/algol68/}			The Algol68 frontend
> +Frontend/c			{file:^/gcc/c(|-family)/}		The C frontend
> +Frontend/c++			{file:^/gcc/c(p|-family)/}		The C++ frontend
> +Frontend/cobol			{file:^/gcc/cobol/}			The COBOL frontend
> +Frontend/d			{file:^/gcc/d/}				The D frontend
> +Frontend/fortran		{file:^/gcc/fortran/}			The Fortran frontend
> +Frontend/go			{file:^/gcc/(go/|godump*)}		The Go frontend
> +Frontend/m2			{file:^/gcc/m2/}			The Modula-2 frontend
> +Frontend/objc			{file:^/gcc/objcp?/}			The Objective-C/-C++ frontends
> +Frontend/rust			{file:^/gcc/rust/}			The Rust frontend
> +
> +# Labels relating to testsuites (probably incomplete)
> +:color #c544ff
> +:multi
> +Tests/framework			{file:testsuite/lib/}			Changes to the test framework (testsuite/lib)
> +Tests/torture			{file:^/gcc/testsuite/*-torture/}	Changes to legacy torture tests
> +Tests/target			{file:^/gcc/testsuite/*.target/}	Changes to target-specific tests (use target/* as well)
> +Tests/lang			{file:^/gcc/testsuite/(gcc|gdc|gfortran|g++|obj|go|cobol|gnat|ada|c-c++|gm2|rust)*/}	Changes to language-specific tests
> +Tests/lib			{file:^/lib*/**/testsuite/}		Changes to top-level library tests (use Library/* as well)
> +Tests/jit			{file:^/gcc/testsuite/jit.dg/}		Changes to GCC's jit tests
> +Tests/selftest			{file:^/gcc/testsuite/selftests/}	Changes to GCC's self-tests
> +Tests/diagnostics		{file:^/gcc/testsuite/libgdiagnostics.dg/}	Changes to GCC's diagnostic framework tests
> +Tests/sarif			{file:^/gcc/testsuite/sarif-replay.dg/}	Changes to GCC's sarif tests
> +
> +## Forge status labels
> +# Labels for runners (exclusive)
> +:color #f6c6c7
> +:exclusive
> +Runner/pending			{}					Runner has started, but results not yet available
> +Runner/unresolved		{}					Runner failed for an unknown reason)
> +Runner/red			{}					Check failed with errors, code not fit for committing
> +Runner/amber			{}					Check failed with warnings, manually inspect results
> +Runner/green			{}					Checks passed



More information about the Gcc mailing list