| ============================= |
| 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. |
| |