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

Richard Earnshaw rearnsha@arm.com
Tue Oct 28 14:10:39 GMT 2025


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
-- 
2.43.0



More information about the Gcc mailing list