| ============================= | 
 | LLVM Community Support Policy | 
 | ============================= | 
 |  | 
 | As a compilation infrastructure, LLVM has multiple types of users, both | 
 | downstream and upstream, of many combinations of its projects, tools and | 
 | libraries. | 
 |  | 
 | There is a core part of it that encompass the implementation of the compiler | 
 | (front/middle/back ends), run-time libraries (RT, C++, OpenMP, etc) and | 
 | associated tools (debugger, linker, object file manipulation, etc). These | 
 | components are present in the public release on our supported architectures | 
 | and operating systems and the whole community must maintain and care about. | 
 |  | 
 | There are, however, other components within the main repository that either | 
 | cater to a specific sub-community of LLVM (upstream or downstream) or | 
 | help parts of the community to integrate LLVM into their own development tools | 
 | or external projects. Those parts of the main repository don't always have | 
 | rigorous testing like the core parts, nor are they validated and shipped with | 
 | our public upstream releases. | 
 |  | 
 | Even not being a core part of the project, we have enough sub-communities | 
 | needing those changes with enough overlap that having them in the main | 
 | repository is beneficial to minimise the repetition of those changes in all | 
 | the external repositories that need them. | 
 |  | 
 | But the maintenance costs of such diverse ecosystem is non trivial, so we divide | 
 | the level of support in two tiers: core and peripheral, with two | 
 | different levels of impact and responsibilities. Those tiers refer only to the | 
 | main repository (``llvm-project``) and not the other repositories in our git | 
 | project, unless explicitly stated. | 
 |  | 
 | Regardless of the tier, all code must follow the existing policies on quality, | 
 | reviews, style, etc. | 
 |  | 
 | Core Tier | 
 | ========= | 
 |  | 
 | The core tier encompasses all of the code in the main repository that is | 
 | in production, is actively tested and released in a regular schedule, including | 
 | core LLVM APIs and infrastructure, front/middle/back-ends, run-time libraries, | 
 | tools, etc. | 
 |  | 
 | It is the responsibility of **every** LLVM developer to care for the core tier | 
 | regardless of where their work is applied to. | 
 |  | 
 | What is covered | 
 | --------------- | 
 |  | 
 | The core tier is composed of: | 
 |  * Core code (``llvm-project``) present in official releases and buildbots: | 
 |    compiler, debugger, linker, libraries, etc, including infrastructure code | 
 |    (table-gen, lit, file-check, unit-tests, etc). | 
 |  * Build infrastructure that creates releases and buildbots (CMake, scripts). | 
 |  * `Phabricator <https://github.com/llvm/phabricator>`_ and | 
 |    `buildbot <https://github.com/llvm/llvm-zorg>`_ infrastructure. | 
 |  * The `test-suite <https://github.com/llvm/llvm-test-suite>`_. | 
 |  | 
 | Requirements | 
 | ------------ | 
 |  | 
 | Code in this tier must: | 
 |  * Keep official buildbots green, with warnings on breakages being emailed to | 
 |    all affected developers. Those must be fixed as soon as possible or patches | 
 |    must be reverted, as per review policy. | 
 |  * Bit-rot of a component in the core tier will result in that component being | 
 |    downgraded to the peripheral tier or being removed. Sub-communities can | 
 |    avoid this by fixing all raised issues in a timely manner. | 
 |  | 
 | Peripheral Tier | 
 | =============== | 
 |  | 
 | The peripheral tier encompass the parts of LLVM that cater to a specific | 
 | sub-community and which don't usually affect the core components directly. | 
 |  | 
 | This includes experimental back-ends, disabled-by-default options and | 
 | alternative paths (work-in-progress replacements) in the same repository, as | 
 | well as separate efforts to integrate LLVM development with local practices. | 
 |  | 
 | It is the responsibility of each sub-community to care about their own parts | 
 | and the intersection of that with the core tier and other peripheral parts. | 
 |  | 
 | There are three main groups of code that fit in this category: | 
 |  * Code that is making its way into LLVM, via the `experimental <https://llvm.org/docs/DeveloperPolicy.html#introducing-new-components-into-llvm>`_ | 
 |    roadmap or similar efforts. | 
 |  * Code that is making its way out of LLVM, via deprecation, replacement or | 
 |    bit-rot, and will be removed if the sub-community that cares about it | 
 |    cannot maintain it. | 
 |  * Code that isn't meant to be in LLVM core and can coexist with the code in | 
 |    the core tier (and others in the peripheral tier) long term, without causing | 
 |    breakages or disturbances. | 
 |  | 
 | What is covered | 
 | --------------- | 
 |  | 
 | The peripheral tier is composed of: | 
 |  * Experimental targets and options that haven't been enable by default yet. | 
 |  * Main repository projects that don't get released or regularly tested. | 
 |  * Legacy tools and scripts that aren't used in upstream validation. | 
 |  * Alternative build systems (ex. GN, Bazel) and related infrastructure. | 
 |  * Tools support (ex. gdb scripts, editor configuration, helper scripts). | 
 |  | 
 | Requirements | 
 | ------------ | 
 |  | 
 | Code in this tier must: | 
 |  * Have a clear benefit for residing in the main repository, catering to an | 
 |    active sub-community (upstream or downstream). | 
 |  * Be actively maintained by such sub-community and have its problems addressed | 
 |    in a timely manner. | 
 |  | 
 | Code in this tier must **not**: | 
 |  * Break or invalidate core tier code or infrastructure. If that happens | 
 |    accidentally, reverting functionality and working on the issues offline | 
 |    is the only acceptable course of action. | 
 |  * Negatively affect development of core tier code, with the sub-community | 
 |    involved responsible for making changes to address specific concerns. | 
 |  * Negatively affect other peripheral tier code, with the sub-communities | 
 |    involved tasked to resolve the issues, still making sure the solution doesn't | 
 |    break or invalidate the core tier. | 
 |  * Impose sub-optimal implementation strategies on core tier components as a | 
 |    result of idiosyncrasies in the peripheral component. | 
 |  * Have build infrastructure that spams all developers about their breakages. | 
 |  * Fall into disrepair. This is a reflection of lack of an active sub-community | 
 |    and will result in removal. | 
 |  | 
 | Code in this tier should: | 
 |  * Have infrastructure to test, whenever meaningful, with either no warnings or | 
 |    notification contained within the sub-community. | 
 |  * Have support and testing that scales with the complexity and resilience of | 
 |    the component, with the bar for simple and gracefully-degrading components | 
 |    (such as editor bindings) much lower than for complex components that must | 
 |    remain fresh with HEAD (such as experimental back-ends or alternative build | 
 |    systems). | 
 |  * Have a document making clear the status of implementation, level of support | 
 |    available, who the sub-community is and, if applicable, roadmap for inclusion | 
 |    into the core tier. | 
 |  * Be restricted to a specific directory or have a consistent pattern (ex. | 
 |    unique file suffix), making it easy to remove when necessary. | 
 |  | 
 | Inclusion Policy | 
 | ================ | 
 |  | 
 | To add a new peripheral component, send an RFC to the appropriate dev list | 
 | proposing its addition and explaining how it will meet the support requirements | 
 | listed above. Different types of components could require different levels of | 
 | detail. when in doubt, ask the community what's the best approach. | 
 |  | 
 | Inclusion must reach consensus in the RFC by the community and the approval of | 
 | the corresponding review (by multiple members of the community) is the official | 
 | note of acceptance. | 
 |  | 
 | After merge, there often is a period of transition, where teething issues on | 
 | existing buildbots are discovered and fixed. If those cannot be fixed straight | 
 | away, the sub-community is responsible for tracking and reverting all the | 
 | pertinent patches and retrying the inclusion review. | 
 |  | 
 | Once the component is stable in tree, it must follow this policy and the | 
 | deprecation rules below apply. | 
 |  | 
 | Due to the uncertain nature of inclusion, it's advisable that new components | 
 | are not added too close to a release branch. The time will depend on the size | 
 | and complexity of the component, so adding release and testing managers on the | 
 | RFC and review is strongly advisable. | 
 |  | 
 | Deprecation Policy | 
 | ================== | 
 |  | 
 | The LLVM code base has a number of files that aren't being actively maintained. | 
 | But not all of those files are obstructing the development of the project and | 
 | so it remains in the repository with the assumption that it could still be | 
 | useful for downstream users. | 
 |  | 
 | For code to remain in the repository, its presence must not impose an undue | 
 | burden on maintaining other components (core or peripheral). | 
 |  | 
 | Warnings | 
 | -------- | 
 |  | 
 | There are multiple types of issues that might trigger a request for deprecation, | 
 | including (but not limited to): | 
 |  | 
 |  * Changes in a component consistently break other areas of the project. | 
 |  * Components go broken for long periods of time (weeks or more). | 
 |  * Clearly superior alternatives are in use and maintenance is painful. | 
 |  * Builds and tests are harder / take longer, increasing the cost of | 
 |    maintenance, overtaking the perceived benefits. | 
 |  | 
 | If the maintenance cost is higher than it is acceptable by the majority of | 
 | developers, it means that either the sub-community is too small (and the extra | 
 | cost should be paid locally), or not active enough (and the problems won't be | 
 | fixed any time soon). In either case, removal of such problematic component is | 
 | justified. | 
 |  | 
 | Steps for removal | 
 | ----------------- | 
 |  | 
 | However clear the needs for removal are, we should take an incremental approach | 
 | to deprecating code, especially when there's still a sub-community that cares | 
 | about it. In that sense, code will never be removed outright without a series | 
 | of steps are taken. | 
 |  | 
 | A minimum set of steps should be: | 
 |  #. A proposal for removal / deactivation should be made to the Discourse forums  | 
 |     (under the appropriate category), with a clear | 
 |     statement of the maintenance costs imposed and the alternatives, if | 
 |     applicable. | 
 |  #. There must be enough consensus on the list that removal is warranted, and no | 
 |     pending proposals to fix the situation from a sub-community. | 
 |  #. An announcement for removal must be made on the same lists, with ample time | 
 |     for downstream users to take action on their local infrastructure. The time | 
 |     will depend on what is being removed. | 
 |  | 
 |     #. If a script or documents are to be removed, they can always be pulled | 
 |        from previous revision, and can be removed within days. | 
 |     #. if a whole target is removed, we need to first announce publicly, and | 
 |        potentially mark as deprecated in one release, only to remove on the | 
 |        next release. | 
 |     #. Everything else will fall in between those two extremes. | 
 |  #. The removal is made by either the proposer or the sub-community that used to | 
 |     maintain it, with replacements and arrangements made atomically on the same | 
 |     commit. | 
 |  | 
 | If a proposal for removal is delayed by the promise a sub-community will take | 
 | care of the code affected, the sub-community will have a time to fix all the | 
 | issues (depending on each case, as above), and if those are not fixed in time, a | 
 | subsequent request for removal should be made and the community may elect to | 
 | eject the component without further attempts to fix. | 
 |  | 
 | Reinstatement | 
 | ------------- | 
 |  | 
 | If a component is removed from LLVM, it may, at a later date, request inclusion | 
 | of a modified version, with evidence that all of the issues were fixed and that | 
 | there is a clear sub-community that will maintain it. | 
 |  | 
 | By consequence, the pressure on such sub-community will be higher to keep | 
 | overall maintenance costs to a minimum and will need to show steps to mitigate | 
 | all of the issues that were listed as reasons for its original removal. | 
 |  | 
 | Failing on those again, will lead to become a candidate for removal yet again. | 
 |  |