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