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