| (developer_policy)= | |
| # LLVM Developer Policy | |
| ## Introduction | |
| This document contains the LLVM Developer Policy which defines the project's | |
| policy towards developers and their contributions. The intent of this policy is | |
| to eliminate miscommunication, rework, and confusion that might arise from the | |
| distributed nature of LLVM's development. By stating the policy in clear terms, | |
| we hope each developer can know ahead of time what to expect when making LLVM | |
| contributions. This policy covers all llvm.org subprojects, including Clang, | |
| LLDB, libc++, MLIR, etc. | |
| The developer policy supports the following LLVM project objectives: | |
| 1. Attract both users and new contributors to the LLVM project. | |
| 2. Help people contribute to LLVM by documenting our development practices. | |
| 3. Maintain the stability, performance, and quality of the `main` branch. | |
| 4. Establish the project's {ref}`copyright, license, and patent | |
| policies <copyright-license-patents>` policies. | |
| ## Developer Policies | |
| ### Communication Channels | |
| LLVM is a large project with many subcomponents, and it has a wide array of | |
| communication channels that you can use to keep track of recent developments, | |
| upcoming projects, new designs, enhancements, and other community business. | |
| First and foremost is the [LLVM Discourse forums](https://discourse.llvm.org), | |
| which is the successor to our former mailing lists (llvm-dev@, cfe-dev@, | |
| lldb-dev@, etc). This is probably the most vital and active communication | |
| channel to our highly distributed open source project. It enables long-form | |
| asynchronous text communication, and this is where people tend to propose major | |
| changes or propose new designs in the form of RFCs (Request For Comment), which | |
| are described later. Please be aware that the Discourse forums are public and | |
| archived, and that notices of confidentiality or non-disclosure cannot be | |
| respected. | |
| We accept code contributions as {ref}`GitHub Pull Requests <github-reviews>`. | |
| Our project is generally too large to subscribe to all github notifications, so | |
| if you want to be notified of pull requests affecting specific parts of the | |
| code, you can join one of the | |
| [pr-subscribers-\*](https://github.com/orgs/llvm/teams?query=pr-subscribers) | |
| GitHub teams. This | |
| [mapping](https://github.com/llvm/llvm-project/blob/main/.github/new-prs-labeler.yml) | |
| documents the paths that trigger notifications for each of the listed teams. | |
| Missing features and bugs are tracked through our [GitHub issue | |
| tracker](https://github.com/llvm/llvm-project/issues). You can subscribe for | |
| notification for specific components by joining one of the | |
| [issue-subscribers-\*](https://github.com/orgs/llvm/teams?query=issue-subscribers) | |
| teams. You may also subscribe to the | |
| [llvm-bugs](http://lists.llvm.org/mailman/listinfo/llvm-bugs) email list to | |
| subscribe to the firehose of all issue notifications, which some community | |
| members use to perform custom filtering. | |
| Beyond the asynchronous written communication channels, LLVM has a Discord | |
| server for real-time chat communication, as well as a community calendar with | |
| many regular workgroup video calls and office hours. See {doc}`GettingInvolved` | |
| for more information on other ways to engage with the community. | |
| (patch)= | |
| ### Making and Submitting a Patch | |
| Patches are submitted to GitHub and reviewed using Pull Requests. Follow the | |
| {ref}`Getting Started Guide <sources>` to check out sources, make a patch, and | |
| then follow the {ref}`GitHub Pull Request <github-reviews>` guide to upload a | |
| pull request. | |
| Here are some tips to enable a successful code review: | |
| - {ref}`Include a test <include a testcase>`. This tends to be one of the first | |
| things a reviewer will ask for and look at to understand what a new patch | |
| does. | |
| - Identify 2-3 individuals to review the patch. Look through the relevant | |
| {ref}`Maintainers` file or browse git blame for likely stakeholders for the | |
| code you want to modify, and add `@username` to a PR comment to notify them | |
| of your PR if you are unable to add reviewers yourself due to GitHub permissions. | |
| - To avoid precommit CI failures due to merge conflicts, base your patches on | |
| a recent commit from `main`. If you want to make changes to a release | |
| branch, land a change in `main` first and then follow the {ref}`backporting | |
| instructions <backporting>`. | |
| See {doc}`CodeReview` for more info on what to expect. | |
| When submitting patches, please do not add confidentiality or non-disclosure | |
| notices to the patches themselves. These notices conflict with the LLVM | |
| licensing terms and may result in your contribution being excluded. | |
| (github-email-address)= | |
| ### Email Addresses | |
| The LLVM project uses email to communicate to contributors outside of the | |
| GitHub platform about their past contributions. Primarily, our buildbot | |
| infrastructure uses emails to contact contributors about build and test | |
| failures. | |
| Therefore, the LLVM community requires contributors to have a public email | |
| address associated with their GitHub commits, so please ensure that "Keep my | |
| email addresses private" is disabled in your [account | |
| settings](https://github.com/settings/emails). There are many free email | |
| forwarding services available if you wish to keep your identity private. | |
| (code review)= | |
| ### Code Reviews | |
| LLVM uses code review, which is a generally accepted software engineering best | |
| practice for maintaining high code quality. Please see {doc}`CodeReview` for | |
| more information on LLVM's code review process. | |
| (maintainers)= | |
| ### Maintainers | |
| The LLVM Project aims to evolve features quickly while continually being in a | |
| release-ready state. In order to accomplish this, the project needs volunteers | |
| willing to do the less glamorous work to ensure we produce robust, high-quality | |
| products. | |
| Maintainers are those volunteers; they are regular contributors who volunteer | |
| to take on additional community responsibilities beyond code contributions. | |
| Community members can find active and inactive maintainers for a project in the | |
| `Maintainers.md` file at the root directory of the individual project. | |
| Maintainers are volunteering to take on the following shared responsibilities | |
| within an area of a project: | |
| - ensure that commits receive high-quality review, either by the maintainer | |
| or by someone else, | |
| - help to confirm and comment on issues, | |
| - mediate code review disagreements through collaboration with other | |
| maintainers (and other reviewers) to come to a consensus on how best to | |
| proceed with disputed changes, | |
| - actively engage with relevant RFCs, | |
| - aid release managers with backporting and other release-related activities, | |
| - be a point of contact for contributors who need help (answering questions | |
| on Discord/Discourse or holding office hours). | |
| Each top-level project in the monorepo will specify one or more | |
| lead maintainers who are responsible for ensuring community needs are | |
| met for that project. This role is like any other maintainer role, | |
| except the responsibilities span the project rather than a limited area | |
| within the project. If you cannot reach a maintainer or don't know which | |
| maintainer to reach out to, a lead maintainer is always a good choice | |
| to reach out to. If a project has no active lead maintainers, it may be a | |
| reasonable candidate for removal from the monorepo. A discussion should be | |
| started on Discourse to find a new, active lead maintainer or whether the | |
| project should be discontinued. | |
| All contributors with commit access to the LLVM Project are eligible to be a | |
| maintainer. However, we are looking for people who can commit to: | |
| - engaging in their responsibilities the majority of the days in a month, | |
| - ensuring that they, and the community members they interact with, abide by | |
| the {ref}`LLVM Community Code of Conduct`, and | |
| - performing these duties for at least three months. | |
| We recognize that priorities shift, job changes happen, burnout is real, | |
| extended vacations are a blessing, and people's lives are generally complex. | |
| Therefore, we want as little friction as possible for someone to become a | |
| maintainer or to step down as a maintainer. | |
| *To become a new maintainer*, you can volunteer yourself by posting a PR which | |
| adds yourself to the area(s) you are volunteering for. Alternatively, an | |
| existing maintainer can nominate you by posting a PR, but the nominee must | |
| explicitly accept the PR so that it's clear they agree to volunteer within the | |
| proposed area(s). The PR will be accepted so long as at least one maintainer in | |
| the same project vouches for their ability to perform the responsibilities and | |
| there are no explicit objections raised by the community. | |
| *To step down as a maintainer*, you can move your name to the "inactive | |
| maintainers" section of the `Maintainers.md` file for | |
| the project, or remove your name entirely; no PR review is necessary. | |
| Additionally, any maintainer who has not been actively performing their | |
| responsibilities over an extended period of time can be moved to the "inactive | |
| maintainers" section by another active maintainer within that project with | |
| agreement from one other active maintainer within that project. If there is | |
| only one active maintainer for a project, please post on Discourse to solicit | |
| wider community feedback about the removal and future direction for the project. | |
| However, please discuss the situation with the inactive maintainer before such | |
| removal to avoid accidental miscommunications. If the inactive maintainer is | |
| unreachable, no discussion with them is required. Stepping down or being removed | |
| as a maintainer is normal and does not prevent someone from resuming their | |
| activities as a maintainer in the future. | |
| *To resume activities as a maintainer*, you can post a PR moving your name from | |
| the "inactive maintainers" section of the `Maintainers.md` | |
| file to the active maintainers list. Because the volunteer | |
| was already previously accepted, they will be re-accepted so long as at least | |
| one maintainer in the same project approves the PR and there are no explicit | |
| objections raised by the community. | |
| (include a testcase)= | |
| ### Test Cases | |
| Developers are required to create test cases for any bugs fixed and any new | |
| features added. Some tips for getting your testcase approved: | |
| - All feature and regression test cases are added to the `test` subdirectory | |
| of each LLVM subproject, i.e. `llvm-project/llvm/test` for LLVM itself. The | |
| appropriate sub-directory should be selected (see the {doc}`Testing Guide | |
| <TestingGuide>` for details). | |
| - We prefer that functional changes are tested using `FileCheck` and the tool | |
| that fits most closely with the code being modified. For example, `opt` is | |
| used to test IR transformations, `llc` for backend changes, and `clang` | |
| for frontend changes. Some components have scripts for generating and | |
| updating golden tests in the `utils/` subproject directory, i.e. | |
| [mlir/utils/generate-test-checks.py](https://github.com/llvm/llvm-project/blob/main/mlir/utils/generate-test-checks.py) | |
| and | |
| [llvm/utils/update_llc_test_checks.py](https://github.com/llvm/llvm-project/blob/main/llvm/utils/update_llc_test_checks.py) | |
| - Some subprojects such as `clang` and `clangd` have project specific testing | |
| tools, like the `clang -verify` flag | |
| ([docs](https://clang.llvm.org/docs/InternalsManual.html#verifying-diagnostics)) | |
| and the `clangd -lit-test` flag, which are preferred over `FileCheck`. | |
| - Changes to libraries, such as Support, which are not directly observable | |
| through tool invocations, are often best tested with unit tests. Unit tests | |
| are located under the `unittests` subdirectory of each subproject. | |
| - Test cases should be targeted. Large inputs exhibiting bugs should be | |
| reduced with tools like `llvm-reduce` before committing them to the suite. | |
| It is not acceptable to place an entire failing program into `llvm/test` as | |
| this creates a *time-to-test* burden on all developers. Please keep them | |
| short. | |
| - Avoid adding links to resources that are not available to the entire | |
| community, such as links to private bug trackers, internal corporate | |
| documentation, etc. Instead, add sufficient comments to the test to provide | |
| the context behind such links. | |
| As a project, we prefer to separate tests into small in-tree tests, and large | |
| out-of-tree integration tests. More extensive integration test cases (e.g., | |
| entire applications, benchmarks, etc) should be added to the | |
| [llvm-test-suite](https://github.com/llvm/llvm-test-suite) repository. The | |
| `llvm-test-suite` repository is for integration and application testing | |
| (correctness, performance, etc) testing, not feature or regression testing. It | |
| also serves to separate out third party code that falls under a different | |
| license. | |
| ### Release Notes | |
| Many projects in LLVM communicate important changes to users through release | |
| notes, typically found in `docs/ReleaseNotes.rst` for the project. Changes to | |
| a project that are user-facing, or that users may wish to know about, should be | |
| added to the project's release notes at the author's or code reviewer's | |
| discretion, preferably as part of the commit landing the changes. Examples of | |
| changes that would typically warrant adding a release note (this list is not | |
| exhaustive): | |
| - Adding, removing, or modifying command-line options. | |
| - Adding, removing, or regrouping a diagnostic. | |
| - Fixing a bug that potentially has significant user-facing impact (please link | |
| to the issue fixed in the bug database). | |
| - Adding or removing optimizations that have widespread impact or enables new | |
| programming paradigms. | |
| - Modifying a C stable API. | |
| - Notifying users about a potentially disruptive change expected to be made | |
| in a future release, such as removal of a deprecated feature. In this case, | |
| the release note should be added to a `Potentially Breaking Changes` | |
| section of the notes with sufficient information and examples to | |
| demonstrate the potential disruption. Additionally, any new entries to this | |
| section should be announced in the | |
| [Announcements](https://discourse.llvm.org/c/announce/) channel on | |
| Discourse. See {ref}`breaking` for more details. | |
| Code reviewers are encouraged to request a release note if they think one is | |
| warranted when performing a code review. | |
| ### Quality | |
| The minimum quality standards that any change must satisfy before being | |
| committed to the main development branch are: | |
| 1. Code must adhere to the {doc}`LLVM Coding Standards <CodingStandards>`. | |
| 2. Code must compile cleanly (no errors, no warnings) on at least one | |
| platform. | |
| 3. Bug fixes and new features should {ref}`include a testcase <include a | |
| testcase>` so we know if the fix/feature ever regresses in the future. | |
| 4. Pull requests should build and pass premerge checks. For first-time | |
| contributors, this will require an initial cursory review to run the | |
| checks. | |
| 5. Ensure that links in source code and test files point to publicly available | |
| resources and are used primarily to add additional information rather than to | |
| supply critical context. The surrounding comments should be sufficient to | |
| provide the context behind such links. | |
| Additionally, the committer is responsible for addressing any problems found in | |
| the future that the change is responsible for. For example: | |
| - The code needs to compile cleanly and pass tests on all stable [LLVM | |
| buildbots](https://lab.llvm.org/buildbot/). | |
| - The changes should not cause any correctness regressions in the | |
| [llvm-test-suite](https://github.com/llvm/llvm-test-suite) and must not | |
| cause any major performance regressions. | |
| - The change set should not cause performance or correctness regressions for | |
| the LLVM tools. See | |
| [llvm-compile-time-tracker.com](https://llvm-compile-time-tracker.com) | |
| - The changes should not cause performance or correctness regressions in code | |
| compiled by LLVM on all applicable targets. | |
| - You are expected to address any [GitHub | |
| Issues](https://github.com/llvm/llvm-project/issues) that result from your | |
| change. | |
| Our build bots and [nightly testing | |
| infrastructure](https://llvm.org/docs/lnt/intro.html) find many of these issues. Build bots | |
| will directly email you if a group of commits that included yours caused a | |
| failure. You are expected to check the build bot messages to see if they are | |
| your fault and, if so, fix the breakage. However, keep in mind that if you | |
| receive such an email, it is highly likely that your change is not at fault. | |
| Changes are batched together precisely because these tests are generally too | |
| expensive to run continuously for every change. | |
| Commits that violate these quality standards may be reverted (see below). This | |
| is necessary when the change blocks other developers from making progress. The | |
| developer is welcome to re-commit the change after the problem has been fixed. | |
| (commit messages)= | |
| ### Commit messages | |
| Although we don't enforce the format of commit messages, we prefer that | |
| you follow these guidelines to help review, search in logs, email formatting | |
| and so on. These guidelines are very similar to rules used by other open source | |
| projects. | |
| Commit messages should communicate briefly what the change does, but they | |
| should really emphasize why a change is being made and provide useful context. | |
| Commit messages should be thoughtfully written and specific, rather than vague. | |
| For example, "bits were not set right" will leave the reviewer wondering about | |
| which bits, and why they weren't right, while "Correctly set overflow bits in | |
| TargetInfo" conveys almost all there is to the change. | |
| Below are some guidelines about the format of the message itself: | |
| - Separate the commit message into title and body separated by a blank line. | |
| - In the situation where there are multiple authors, or in the rare situation | |
| you are submitting a change for someone else (e.g., after putting an old | |
| patch from someone else through review yourself), please use the [git tag | |
| 'Co-authored-by:' to list the additional | |
| authors](https://github.blog/2018-01-29-commit-together-with-co-authors/). | |
| See [Attribution of Changes](#attribution-of-changes) for more information | |
| including the method we used for attribution before the project migrated to | |
| git. | |
| - The title should be concise. Because all commits are emailed to the list with | |
| the first line as the subject, long titles are frowned upon. Short titles | |
| also look better in `git log`. | |
| - When the changes are restricted to a specific part of the code (e.g. a | |
| back-end or optimization pass), it is customary to add a tag to the | |
| beginning of the line in square brackets. For example, "\[SCEV\] \..." or | |
| "\[OpenMP\] \...". This helps email filters and searches for post-commit | |
| reviews. | |
| - The body should be concise, but explanatory, including a complete | |
| rationale. Unless it is required to understand the change, examples, code | |
| snippets and gory details should be left to bug comments, web review or the | |
| mailing list. | |
| - Text formatting and spelling should follow the same rules as documentation | |
| and in-code comments, ex. capitalization, full stop, etc. | |
| - If the commit is a bug fix on top of another recently committed patch, or a | |
| revert or reapply of a patch, include the git commit hash of the prior | |
| related commit. This could be as simple as "Revert commit NNNN because it | |
| caused issue #". | |
| - If the patch fixes a bug in GitHub Issues, we encourage adding a reference to | |
| the issue being closed, as described | |
| {ref}`here <Closing>`. | |
| - It is also acceptable to add other metadata to the commit message to automate | |
| processes, including for downstream consumers. This metadata can include | |
| links to resources that are not available to the entire community. However, | |
| such links and/or metadata should not be used in place of making the commit | |
| message self-explanatory. Note that such non-public links should not be | |
| included in the submitted code. | |
| - Avoid 'tagging' someone's username in your commits and PR descriptions | |
| (e.g., `@<someUser>`), doing so results in that account receiving a | |
| notification every time the commit is cherry-picked and/or pushed to a | |
| fork. | |
| LLVM uses a squash workflow for pull requests, so as the pull request evolves | |
| during review, it's important to update the pull request description over the | |
| course of a review. GitHub uses the initial commit message to create the pull | |
| request description, but it ignores all subsequent commit messages. Authors and | |
| reviewers should make a final editing pass over the squashed commit description when | |
| squashing and merging PRs. | |
| For minor violations of these recommendations, the community normally favors | |
| reminding the contributor of this policy over reverting. | |
| (revert_policy)= | |
| ### Patch reversion policy | |
| As a community, we strongly value having the tip of tree in a good state while | |
| allowing rapid iterative development. As such, we tend to make much heavier | |
| use of reverts to keep the tree healthy than some other open source projects, | |
| and our norms are a bit different. | |
| How should you respond if someone reverted your change? | |
| - Remember, it is normal and healthy to have patches reverted. Having a patch | |
| reverted does not necessarily mean you did anything wrong. | |
| - We encourage explicitly thanking the person who reverted the patch for doing | |
| the task on your behalf. | |
| - If you need more information to address the problem, please follow up in the | |
| original commit thread with the reverting patch author. | |
| When should you revert your own change? | |
| - Any time you learn of a serious problem with a change, you should revert | |
| it. We strongly encourage "revert to green" as opposed to "fixing | |
| forward". We encourage reverting first, investigating offline, and then | |
| reapplying the fixed patch - possibly after another round of review if | |
| warranted. | |
| - If you break a buildbot in a way which can't be quickly fixed, please | |
| revert. | |
| - If a test case that demonstrates a problem is reported in the commit thread, | |
| please revert and investigate offline. | |
| - If you receive substantial {ref}`post-commit review <post_commit_review>` | |
| feedback, please revert and address said feedback before recommitting. | |
| (Possibly after another round of review.) | |
| - If you are asked to revert by another contributor, please revert and | |
| discuss the merits of the request offline (unless doing so would further | |
| destabilize tip of tree). | |
| When should you revert someone else's change? | |
| - In general, if the author themselves would revert the change per these | |
| guidelines, we encourage other contributors to do so as a courtesy to the | |
| author. This is one of the major cases where our norms differ from others; | |
| we generally consider reverting a normal part of development. We don't | |
| expect contributors to be always available, and the assurance that a | |
| problematic patch will be reverted and we can return to it at our next | |
| opportunity enables this. | |
| What are the expectations around a revert? | |
| - Use your best judgment. If you're uncertain, please start an email on | |
| the commit thread asking for assistance. We aren't trying to enumerate | |
| every case, but rather give a set of guidelines. | |
| - You should be sure that reverting the change improves the stability of tip | |
| of tree. Sometimes, reverting one change in a series can worsen things | |
| instead of improving them. We expect reasonable judgment to ensure that | |
| the proper patch or set of patches is being reverted. | |
| - The commit message for the reverting commit should explain why patch is | |
| being reverted. | |
| - It is customary to respond to the original commit email mentioning the | |
| revert. This serves as both a notice to the original author that their | |
| patch was reverted, and helps others following llvm-commits track context. | |
| - Ideally, you should have a publicly reproducible test case ready to share. | |
| Where possible, we encourage sharing of test cases in commit threads, or | |
| in PRs. We encourage the reverter to minimize the test case and to prune | |
| dependencies where practical. This even applies when reverting your own | |
| patch; documenting the reasons for others who might be following along is | |
| critical. | |
| - It is not considered reasonable to revert without at least the promise to | |
| provide a means for the patch author to debug the root issue. If a situation | |
| arises where a public reproducer can not be shared for some reason (e.g. | |
| requires hardware patch author doesn't have access to, sharp regression in | |
| compile time of internal workload, etc.), the reverter is expected to be | |
| proactive about working with the patch author to debug and test candidate | |
| patches. | |
| - Reverts should be reasonably timely. A change submitted two hours ago | |
| can be reverted without prior discussion. A change submitted two years ago | |
| should not be. Where exactly the transition point is is hard to say, but | |
| it's probably in the handful of days in tree territory. If you are unsure, | |
| we encourage you to reply to the commit thread, give the author a bit to | |
| respond, and then proceed with the revert if the author doesn't seem to be | |
| actively responding. | |
| - When re-applying a reverted patch, the commit message should be updated to | |
| indicate the problem that was addressed and how it was addressed. | |
| (obtaining_commit_access)= | |
| ### Obtaining Commit Access | |
| Once you have 3 or more merged pull requests, you may use [this | |
| link](https://github.com/llvm/llvm-project/issues/new?title=Request%20Commit%20Access%20For%20%3Cuser%3E&body=%23%23%23%20Why%20Are%20you%20requesting%20commit%20access%20?) | |
| to file an issue and request commit access. Replace the \<user\> string in the title | |
| with your github username, and explain why you are requesting commit access in | |
| the issue description. Once the issue is created, you will need to get two | |
| current contributors to support your request before commit access will be granted. | |
| Reviewers of your committed patches will automatically be CCed upon creating the issue. | |
| Most commonly these reviewers will provide the necessary approval, but approvals | |
| from other LLVM committers are also acceptable. Those reviewing the application are | |
| confirming that you have indeed had three patches committed, and that based on interactions | |
| on those reviews and elsewhere in the LLVM community they have no concern about you | |
| adhering to our Developer Policy and Code of Conduct. Reviewers should clearly state their | |
| reasoning for accepting or rejecting the request, and finish with a clear statement such | |
| as "I approve of this request", "LGTM", or "I do not approve of this request". | |
| If approved, a GitHub invitation will be sent to your | |
| GitHub account. In case you don't get notification from GitHub, go to | |
| [Invitation Link](https://github.com/orgs/llvm/invitation) directly. Once | |
| you accept the invitation, you'll get commit access. | |
| Prior to obtaining commit access, it is common practice to request that | |
| someone with commit access commits on your behalf. When doing so, please | |
| provide the name and email address you would like to use in the Author | |
| property of the commit. | |
| For external tracking purposes, committed changes are automatically reflected on | |
| a commits mailing list soon after the commit lands (e.g. | |
| <llvm-commits@lists.llvm.org>). Note that these mailing lists are moderated, and | |
| it is not unusual for a large commit to require a moderator to approve the | |
| email, so do not be concerned if a commit does not immediately appear in the | |
| archives. | |
| If you have recently been granted commit access, these policies apply: | |
| 1. You are granted *commit-after-approval* to all parts of LLVM. For | |
| information on how to get approval for a patch, please see | |
| {doc}`CodeReview`. When approved, you may commit it yourself. | |
| 2. You are allowed to commit patches without approval which you think are | |
| obvious. This is clearly a subjective decision \-\-- we simply expect you to | |
| use good judgement. Examples include: fixing build breakage, reverting | |
| obviously broken patches, documentation/comment changes, any other minor | |
| changes. Avoid committing formatting- or whitespace-only changes outside of | |
| code you plan to make subsequent changes to. Also, try to separate | |
| formatting or whitespace changes from functional changes, either by | |
| correcting the format first (ideally) or afterward. Such changes should be | |
| highly localized and the commit message should clearly state that the commit | |
| is not intended to change functionality, usually by stating it is | |
| {ref}`NFC <nfc>`. | |
| 3. You are allowed to commit patches without approval to those portions of LLVM | |
| that you have contributed or maintain (i.e., have been assigned | |
| responsibility for), with the proviso that such commits must not break the | |
| build. This is a "trust but verify" policy, and commits of this nature are | |
| reviewed after they are committed. | |
| 4. Multiple violations of these policies or a single egregious violation may | |
| cause commit access to be revoked. | |
| In any case, your changes are still subject to {ref}`code review <code review>` | |
| (either before or after they are committed, depending on the nature of the | |
| change). You are encouraged to review other peoples' patches as well, but you | |
| aren't required to do so. | |
| ### Obtaining Other Access or Permissions | |
| To obtain access other than commit access, you can raise an issue like the one | |
| for obtaining commit access. However, instead of including PRs you have authored, | |
| include evidence of your need for the type of access you want. | |
| For example, if you are helping to triage issues and want the ability to add | |
| labels, include links to issues you have triaged previously and explain how | |
| having this ability would help that work. | |
| (discuss the change/gather consensus)= | |
| ### Proposing Major Changes (RFCs) | |
| The design of LLVM is carefully controlled to ensure that all the pieces fit | |
| together well and are as consistent as possible. If you plan to make a major | |
| change to the way LLVM works or want to add a major new extension, it is a good | |
| idea to get consensus with the development community before you invest | |
| significant effort in an implementation. Prototype implementations, however, can | |
| often be helpful in making design discussions more concrete by demonstrating | |
| what is possible. | |
| LLVM is a large community with many stakeholders, and before landing any major | |
| change, it is important to discuss the design of a change publicly with the | |
| community. This is done by posting a Request For Comments (RFC) on the [LLVM | |
| Discourse forums](https://discourse.llvm.org). See the {doc}`RFC process | |
| <RFCProcess>` documentation for more details. | |
| (incremental-changes)= | |
| ### Incremental Development | |
| In the LLVM project, we prefer the incremental development approach, where | |
| significant changes are developed in-tree incrementally. The alternative | |
| approach of implementing features in long-lived development branches or forks | |
| is discouraged, although we have accepted features developed this way in the | |
| past. Long-term development branches have a number of drawbacks: | |
| 1. Branches must have mainline merged into them periodically. If the branch | |
| development and mainline development occur in the same pieces of code, | |
| resolving merge conflicts can take a lot of time. | |
| 2. Other people in the community tend to ignore work on branches. | |
| 3. Huge changes (produced when a branch is merged back onto mainline) are | |
| extremely difficult to {ref}`code review <code review>`. | |
| 4. Branches are not routinely tested by our nightly tester infrastructure. | |
| 5. Changes developed as monolithic large changes often don't work until the | |
| entire set of changes is done. Breaking it down into a set of smaller | |
| changes increases the odds that any of the work will be committed to the | |
| main repository. | |
| To address these problems, LLVM uses an incremental development style and we | |
| require contributors to follow this practice when making a large/invasive | |
| change. Some tips: | |
| - Large/invasive changes usually have a number of secondary changes that are | |
| required before the big change can be made (e.g. API cleanup, etc). These | |
| sorts of changes can often be done before the major change is done, | |
| independently of that work. | |
| - The remaining inter-related work should be decomposed into unrelated sets of | |
| changes if possible. Once this is done, define the first increment and get | |
| consensus on what the end goal of the change is. | |
| - Each change in the set can be stand alone (e.g. to fix a bug), or part of a | |
| planned series of changes that works towards the development goal. | |
| - Each change should be kept as small as possible. This simplifies your work | |
| (into a logical progression), simplifies code review and reduces the chance | |
| that you will get negative feedback on the change. Small increments also | |
| facilitate the maintenance of a high quality code base. | |
| - Often, an independent precursor to a big change is to add a new API and slowly | |
| migrate clients to use the new API. Each change to use the new API is often | |
| "obvious" and can be committed without review. Once the new API is in place | |
| and used, it is much easier to replace the underlying implementation of the | |
| API. This implementation change is logically separate from the API | |
| change. | |
| If you are interested in making a large change, and this scares you, please | |
| make sure to first {ref}`discuss the change/gather consensus <discuss the | |
| change/gather consensus>` then ask about the best way to go about making the | |
| change. | |
| (breaking)= | |
| ### Making Potentially Breaking Changes | |
| Please help notify users and vendors of potential disruptions when upgrading to | |
| a newer version of a tool. For example, deprecating a feature that is expected | |
| to be removed in the future, removing an already-deprecated feature, upgrading | |
| a diagnostic from a warning to an error, switching important default behavior, | |
| or any other potentially disruptive situation thought to be worth raising | |
| awareness of. For such changes, the following should be done: | |
| - When performing the code review for the change, please add any applicable | |
| "vendors" github team to the review for their awareness. The purpose of these | |
| groups is to give vendors early notice that potentially disruptive changes | |
| are being considered but have not yet been accepted. Vendors can give early | |
| testing feedback on the changes to alert us to unacceptable breakages. The | |
| current list of vendor groups is: | |
| - [Clang vendors](https://github.com/orgs/llvm/teams/clang-vendors) | |
| - [libc++ vendors](https://github.com/orgs/llvm/teams/libcxx-vendors) | |
| People interested in joining the vendors group can do so by clicking the | |
| "Join team" button on the linked github pages above. | |
| - When committing the change to the repository, add appropriate information | |
| about the potentially breaking changes to the `Potentially Breaking Changes` | |
| section of the project's release notes. The release note should have | |
| information about what the change is, what is potentially disruptive about | |
| it, as well as any code examples, links, and motivation that is appropriate | |
| to share with users. This helps users to learn about potential issues with | |
| upgrading to that release. | |
| - After the change has been committed to the repository, the potentially | |
| disruptive changes described in the release notes should be posted to the | |
| [Announcements](https://discourse.llvm.org/c/announce/) channel on | |
| Discourse. The post should be tagged with the `potentially-breaking` label | |
| and a label specific to the project (such as `clang`, `llvm`, etc). This | |
| is another mechanism by which we can give pre-release notice to users about | |
| potentially disruptive changes. It is a lower-traffic alternative to the | |
| joining "vendors" group. To automatically be notified of new announcements | |
| with the `potentially-breaking` label, go to your user preferences page in | |
| Discourse, and add the label to one of the watch categories under | |
| `Notifications->Tags`. | |
| ### Attribution of Changes | |
| When contributors submit a patch to an LLVM project, other developers with | |
| commit access may merge the PR for the author (based on the progression of code | |
| review, etc.). GitHub will automatically ensure that authorship is preserved, | |
| and one does not need to take any further action. We do not want the source | |
| code to be littered with random attributions "this code written by J. Random | |
| Hacker" (this is noisy and distracting). In practice, the revision control | |
| system keeps a perfect history of who changed what, and the CREDITS.txt file | |
| describes higher-level contributions. If you need to adjust authorship for any | |
| reason, please follow the attribution of changes in the simple manner as | |
| outlined by the [commit messages](#commit-messages) section. Overall, please do | |
| not add contributor names to the source code. | |
| Also, don't commit patches authored by others unless they have submitted the | |
| patch to the project or you have been authorized to submit them on their behalf | |
| (you work together and your company authorized you to contribute the patches, | |
| etc.). The author should first submit them as a GitHub issue, to the relevant | |
| category on Discourse, or ideally as a GitHub Pull Request. If someone sends you | |
| a patch privately, encourage them to submit it as a GitHub PR first. | |
| Our previous version control system (subversion) did not distinguish between the | |
| author and the committer like git does. As such, older commits used a different | |
| attribution mechanism. The previous method was to include "Patch by John Doe." | |
| in a separate line of the commit message and there are automated processes that | |
| rely on this format. | |
| ### Bans | |
| The goal of a ban is to protect people in the community from having to interact | |
| with people who are consistently not respecting the | |
| {ref}`LLVM Community Code of Conduct` in LLVM project spaces. Contributions of | |
| any variety (pull requests, issue reports, forum posts, etc.) require | |
| interacting with the community. Therefore, we do not accept any form of direct | |
| contribution from a banned individual. | |
| Indirect contributions are permissible only by someone taking full ownership of | |
| such a contribution and they are responsible for all related interactions with | |
| the community regarding that contribution. | |
| Trying to evade a non-permanent ban results in getting banned permanently. | |
| When in doubt how to act in a specific instance, please reach out to | |
| <conduct@llvm.org> for advice. | |
| (IR backwards compatibility)= | |
| ### IR Backwards Compatibility | |
| When the IR format has to be changed, keep in mind that we try to maintain some | |
| backwards compatibility. The rules are intended as a balance between convenience | |
| for llvm users and not imposing a big burden on llvm developers: | |
| - The textual format is not backwards compatible. We don't change it too often, | |
| but there are no specific promises. | |
| - Additions and changes to the IR should be reflected in | |
| `test/Bitcode/compatibility.ll`. | |
| - The current LLVM version supports loading any bitcode since version 3.0. | |
| - After each X.Y release, `compatibility.ll` must be copied to | |
| `compatibility-X.Y.ll`. The corresponding bitcode file should be assembled | |
| using the X.Y build and committed as `compatibility-X.Y.ll.bc`. | |
| - Newer releases can ignore features from older releases, but they cannot | |
| miscompile them. For example, if nsw is ever replaced with something else, | |
| dropping it would be a valid way to upgrade the IR. | |
| - Debug metadata is special in that it is currently dropped during upgrades. | |
| - Non-debug metadata is defined to be safe to drop, so a valid way to upgrade | |
| it is to drop it. That is not very user friendly and a bit more effort is | |
| expected, but no promises are made. | |
| - Legacy bitcode may have degraded performance when compared to | |
| the compiled output with the legacy compiler. | |
| ### C API Changes | |
| - Stability Guarantees: The C API is, in general, a "best effort" for stability. | |
| This means that we make every attempt to keep the C API stable, but that | |
| stability will be limited by the abstractness of the interface and the | |
| stability of the C++ API that it wraps. In practice, this means that things | |
| like "create debug info" or "create this type of instruction" are likely to be | |
| less stable than "take this IR file and JIT it for my current machine". | |
| - Release stability: We won't break the C API on the release branch with patches | |
| that go on that branch, with the exception that we will fix an unintentional | |
| C API break that will keep the release consistent with both the previous and | |
| next release. | |
| - Testing: Patches to the C API are expected to come with tests just like any | |
| other patch. | |
| - Including new things into the API: If an LLVM subcomponent has a C API already | |
| included, then expanding that C API is acceptable. Adding C API for | |
| subcomponents that don't currently have one needs to be discussed on the | |
| [LLVM Discourse forums](https://discourse.llvm.org) for design and | |
| maintainability feedback prior to implementation. | |
| - Documentation: Any changes to the C API are required to be documented in the | |
| release notes so that it's clear to external users who do not follow the | |
| project how the C API is changing and evolving. | |
| (toolchain)= | |
| ### Updating Toolchain Requirements | |
| We intend to require newer toolchains as time goes by. This means LLVM's | |
| codebase can use newer versions of C++ as they get standardized. Requiring newer | |
| toolchains to build LLVM can be painful for those building LLVM; therefore, it | |
| will only be done through the following process: | |
| - It is a general goal to support LLVM and GCC versions from the last 3 years | |
| at a minimum. This time-based guideline is not strict: we may support much | |
| older compilers, or decide to support fewer versions. | |
| - An RFC is sent to the [LLVM Discourse forums](https://discourse.llvm.org) | |
| - Detail upsides of the version increase (e.g. which newer C++ language or | |
| library features LLVM should use; avoid miscompiles in particular compiler | |
| versions, etc). | |
| - Detail downsides on important platforms (e.g. Ubuntu LTS status). | |
| - See the {doc}`RFC process <RFCProcess>` documentation for more | |
| details. | |
| - Once the RFC reaches consensus, update the CMake toolchain version checks | |
| as well as the {doc}`getting started<GettingStarted>` guide. This | |
| provides a softer transition path for developers compiling LLVM, because | |
| the error can be turned into a warning using a CMake flag. This is an | |
| important step: LLVM still doesn't have code which requires the new | |
| toolchains, but it soon will. If you compile LLVM but don't read the | |
| forums, we should tell you! | |
| - Ensure that at least one LLVM release has had this soft-error. Not all | |
| developers compile LLVM top-of-tree. These release-bound developers | |
| should also be told about upcoming changes. | |
| - Turn the soft-error into a hard-error after said LLVM release has | |
| branched. | |
| - Update the {doc}`coding standards<CodingStandards>` to allow the new | |
| features we've explicitly approved in the RFC. | |
| - Start using the new features in LLVM's codebase. | |
| Here's a [sample | |
| RFC](https://discourse.llvm.org/t/rfc-migrating-past-c-11/50943) and the | |
| [corresponding change](https://reviews.llvm.org/D57264). | |
| (ci-usage)= | |
| ### Working with the CI system | |
| The main continuous integration (CI) tool for the LLVM project is the | |
| [LLVM Buildbot](https://lab.llvm.org/buildbot/). It uses different *builders* | |
| to cover a wide variety of sub-projects and configurations. The builds are | |
| executed on different *workers*. Builders and workers are configured and | |
| provided by community members. | |
| The Buildbot tracks the commits on the main branch and the release branches. | |
| This means that patches are built and tested after they are merged to the these | |
| branches (aka post-merge testing). This also means it's okay to break the build | |
| occasionally, as it's unreasonable to expect contributors to build and test | |
| their patch with every possible configuration. | |
| *If your commit broke the build:* | |
| - Fix the build as soon as possible as this might block other contributors or | |
| downstream users. | |
| - If you need more time to analyze and fix the bug, please revert your change | |
| to unblock others. | |
| *If someone else broke the build and this blocks your work* | |
| - Comment on the code review in | |
| [GitHub](https://github.com/llvm/llvm-project/pulls) (if available) or | |
| email the author, explain the problem and how this impacts you. Add a link | |
| to the broken build and the error message so folks can understand the | |
| problem. | |
| - Revert the commit if this blocks your work, see | |
| [revert_policy](#revert_policy) . | |
| *If a build/worker is permanently broken* | |
| - 1st step: contact the owner of the worker. You can find the name and | |
| contact information for the *Admin* of worker on the page of the build in | |
| the *Worker* tab: | |
|  | |
| - 2nd step: If the owner does not respond or fix the worker, please escalate | |
| to Galina Kostanova, the maintainer of the BuildBot master. | |
| - 3rd step: If Galina could not help you, please escalate to the | |
| [Infrastructure Working Group](mailto:iwg@llvm.org). | |
| (new-llvm-components)= | |
| ## Introducing New Components into LLVM | |
| The LLVM community is a vibrant and exciting place to be, and we look to be | |
| inclusive of new projects and foster new communities, and increase | |
| collaboration across industry and academia. | |
| That said, we need to strike a balance between being inclusive of new ideas and | |
| people and the cost of ongoing maintenance that new code requires. As such, we | |
| have a general {doc}`support policy<SupportPolicy>` for introducing major new | |
| components into the LLVM world, depending on the degree of detail and | |
| responsibility required. *Core* projects need a higher degree of scrutiny | |
| than *peripheral* projects, and the latter may have additional differences. | |
| However, this is really only intended to cover common cases | |
| that we have seen arise: different situations are different, and we are open | |
| to discussing unusual cases as well - just start an RFC thread on the | |
| [LLVM Discourse forums](https://discourse.llvm.org). | |
| ### Adding a New Target | |
| LLVM is very receptive to new targets, even experimental ones, but a number of | |
| problems can appear when adding new large portions of code, and back-ends are | |
| normally added in bulk. New targets need the same level of support as other | |
| *core* parts of the compiler, so they are covered in the *core tier* of our | |
| {doc}`support policy<SupportPolicy>`. | |
| We have found that landing large pieces of new code and then trying to fix | |
| emergent problems in-tree is problematic for a variety of reasons. For these | |
| reasons, new targets are *always* added as *experimental* until they can be | |
| proven stable, and later moved to non-experimental. | |
| The differences between both classes are: | |
| - Experimental targets are not built by default (they need to be explicitly | |
| enabled at CMake time). | |
| - Test failures, bugs, and build breakages that only appear when the | |
| experimental target is enabled, caused by changes unrelated to the target, are | |
| the responsibility of the community behind the target to fix. | |
| The basic rules for a back-end to be upstreamed in **experimental** mode are: | |
| - Every target must have at least one {ref}`maintainer<maintainers>`. The | |
| `Maintainers.md` file has to be updated as part of the first merge. These | |
| maintainers make sure that changes to the target get reviewed and steers | |
| the overall effort. | |
| - There must be an active community behind the target. This community will | |
| help maintain the target by providing buildbots, fixing bugs, answering the | |
| LLVM community's questions and making sure the new target doesn't break any | |
| of the other targets, or generic code. This behavior is expected to | |
| continue throughout the lifetime of the target's code. | |
| - The code must be free of contentious issues, for example, large | |
| changes in how the IR behaves or should be formed by the front-ends, | |
| unless agreed by the majority of the community via refactoring of the | |
| ({doc}`IR standard<LangRef>`) **before** the merge of the new target changes, | |
| following the {ref}`IR backwards compatibility`. | |
| - The code conforms to all of the policies laid out in this developer policy | |
| document, including license, patent, and coding standards. | |
| - The target should have either reasonable documentation on how it works | |
| (ISA, ABI, etc.) or a publicly available simulator/hardware (either free or | |
| cheap enough) - preferably both. This allows developers to validate | |
| assumptions, understand constraints and review code that can affect the | |
| target. | |
| In addition, the rules for a back-end to be promoted to **official** are: | |
| - The target must have addressed every other minimum requirement and | |
| have been stable in tree for at least 3 months. This cool down | |
| period is to make sure that the back-end and the target community can | |
| endure continuous upstream development for the foreseeable future. | |
| - The target's code must have been completely adapted to this policy | |
| as well as the {doc}`coding standards<CodingStandards>`. Any exceptions that | |
| were made to move into experimental mode must have been fixed **before** | |
| becoming official. | |
| - The test coverage needs to be broad and well written (small tests, | |
| well documented). The build target `check-all` must pass with the | |
| new target built, and where applicable, the `test-suite` must also | |
| pass without errors, in at least one configuration (publicly | |
| demonstrated, for example, via buildbots). | |
| - Public buildbots need to be created and actively maintained, unless | |
| the target requires no additional buildbots (ex. `check-all` covers | |
| all tests). The more relevant and public the new target's CI infrastructure | |
| is, the more the LLVM community will embrace it. | |
| To **continue** as a supported and official target: | |
| - The maintainer(s) must continue following these rules throughout the lifetime | |
| of the target. Continuous violations of aforementioned rules and policies | |
| could lead to complete removal of the target from the code base. | |
| - Degradation in support, documentation or test coverage will make the target as | |
| nuisance to other targets and be considered a candidate for deprecation and | |
| ultimately removed. | |
| In essence, these rules are necessary for targets to gain and retain their | |
| status, but also markers to define bit-rot, and will be used to clean up the | |
| tree from unmaintained targets. | |
| Those wishing to add a new target to LLVM must follow the procedure below: | |
| 1. Read this section and make sure your target follows all requirements. For | |
| minor issues, your community will be responsible for making all necessary | |
| adjustments soon after the initial merge. | |
| 2. Send a request for comment (RFC) to the [LLVM Discourse | |
| forums](https://discourse.llvm.org) describing | |
| your target and how it follows all the requirements and what work has been | |
| done and will need to be done to accommodate the official target requirements. | |
| Make sure to expose any and all controversial issues, changes needed in the | |
| base code, table gen, etc. See the {doc}`RFC process <RFCProcess>` | |
| documentation for more details. | |
| 3. Once the response is positive, the LLVM community can start reviewing the | |
| actual patches (but they can be prepared before, to support the RFC). Create | |
| a sequence of N patches, numbered '1/N' to 'N/N' (make sure N is an actual | |
| number, not the letter 'N'), that completes the basic structure of the target. | |
| 4. The initial patch should add documentation, maintainers, and triple support in | |
| clang and LLVM. The following patches add TableGen infrastructure to describe | |
| the target and lower instructions to assembly. The final patch must show that | |
| the target can lower correctly with extensive LIT tests (IR to MIR, MIR to | |
| ASM, etc). | |
| 5. Some patches may be approved before others, but only after *all* patches are | |
| approved that the whole set can be merged in one go. This is to guarantee | |
| that all changes are good as a single block. | |
| 6. After the initial merge, the target community can stop numbering patches and | |
| start working asynchronously on the target to complete support. They should | |
| still seek review from those who helped them in the initial phase, to make | |
| sure the progress is still consistent. | |
| 7. Once all official requirements have been fulfilled (as above), the maintainers | |
| should request the target to be enabled by default by sending another RFC to | |
| the [LLVM Discourse forums](https://discourse.llvm.org). | |
| ### Adding an Established Project To the LLVM Monorepo | |
| The [LLVM monorepo](https://github.com/llvm/llvm-project) is the centerpoint | |
| of development in the LLVM world, and has all of the primary LLVM components, | |
| including the LLVM optimizer and code generators, Clang, LLDB, etc. [Monorepos | |
| in general](https://en.wikipedia.org/wiki/Monorepo) are great because they | |
| allow atomic commits to the project, simplify CI, and make it easier for | |
| subcommunities to collaborate. | |
| Like new targets, most projects already in the monorepo are considered to be in | |
| the *core tier* of our {doc}`support policy<SupportPolicy>`. The burden to add | |
| things to the LLVM monorepo needs to be very high - code that is added to this | |
| repository is checked out by everyone in the community. As such, we hold | |
| components to a high bar similar to "official targets", they: | |
| - Must be generally aligned with the mission of the LLVM project to advance | |
| compilers, languages, tools, runtimes, etc. | |
| - Must conform to all of the policies laid out in this developer policy | |
| document, including license, patent, coding standards, and code of conduct. | |
| - Must have an active community that maintains the code, including established | |
| maintainers. | |
| - Should have reasonable documentation about how it works, including a high | |
| quality README file. | |
| - Should have CI to catch breakage within the project itself or due to | |
| underlying LLVM dependencies. | |
| - Should have code free of issues the community finds contentious, or be on a | |
| clear path to resolving them. | |
| - Must be proposed through the LLVM RFC process, and have its addition approved | |
| by the LLVM community - this ultimately mediates the resolution of the | |
| "should" concerns above. See the {doc}`RFC process <RFCProcess>` | |
| documentation for more details. | |
| If you have a project that you think would make sense to add to the LLVM | |
| monorepo, please start an RFC topic on the [LLVM Discourse | |
| forums](https://discourse.llvm.org) to kick off the discussion. This process | |
| can take some time and iteration - please don't be discouraged or intimidated | |
| by that! | |
| If you have an earlier stage project that you think is aligned with LLVM, please | |
| see the "Incubating New Projects" section. | |
| ### Incubating New Projects | |
| The burden to add a new project to the LLVM monorepo is intentionally very high, | |
| but that can have a chilling effect on new and innovative projects. To help | |
| foster these sorts of projects, LLVM supports an "incubator" process that is | |
| much easier to get started with. It provides space for potentially valuable, | |
| new top-level and sub-projects to reach a critical mass before they have enough | |
| code to prove their utility and grow a community. This also allows | |
| collaboration between teams that already have permissions to make contributions | |
| to projects under the LLVM umbrella. | |
| Projects which can be considered for the LLVM incubator meet the following | |
| criteria: | |
| - Must be generally aligned with the mission of the LLVM project to advance | |
| compilers, languages, tools, runtimes, etc. | |
| - Must conform to the license, patent, and code of conduct policies laid | |
| out in this developer policy document. | |
| - Must have a documented charter and development plan, e.g. in the form of | |
| a README file, mission statement, and/or manifesto. | |
| - Should conform to coding standards, incremental development process, and | |
| other expectations. | |
| - Should have a sense of the community that it hopes to eventually foster, | |
| and there should be interest from members with different affiliations / | |
| organizations. | |
| - Should have a feasible path to eventually graduate as a dedicated | |
| top-level or sub-project within the [LLVM | |
| monorepo](https://github.com/llvm/llvm-project). | |
| - Should include a notice (e.g. in the project README or web page) that the | |
| project is in 'incubation status' and is not included in LLVM releases | |
| (see suggested wording below). | |
| - Must be proposed through the LLVM RFC process, and have its addition | |
| approved by the LLVM community - this ultimately mediates the resolution | |
| of the "should" concerns above. See the {doc}`RFC process <RFCProcess>` | |
| documentation for more details. | |
| That said, the project need not have any code to get started, and need not have | |
| an established community at all! Furthermore, incubating projects may pass | |
| through transient states that violate the "Should" guidelines above, or would | |
| otherwise make them unsuitable for direct inclusion in the monorepo (e.g. | |
| dependencies that have not yet been factored appropriately, leveraging | |
| experimental components or APIs that are not yet upstream, etc). | |
| When approved, the llvm-admin group can grant the new project: | |
| - A new repository in the LLVM Github Organization - but not the LLVM monorepo. | |
| - New mailing list, discourse forum, and/or discord chat hosted with other LLVM | |
| forums. | |
| - Other infrastructure integration can be discussed on a case-by-case basis. | |
| Graduation to the mono-repo would follow existing processes and standards for | |
| becoming a first-class part of the monorepo. Similarly, an incubating project | |
| may be eventually retired, but no process has been established for that yet. If | |
| and when this comes up, please start an RFC discussion on the [LLVM Discourse | |
| forums](https://discourse.llvm.org). | |
| This process is very new - please expect the details to change, it is always | |
| safe to ask on the [LLVM Discourse forums](https://discourse.llvm.org) about | |
| this. | |
| Suggested disclaimer for the project README and the main project web page: | |
| This project is participating in the LLVM Incubator process: as such, it is | |
| not part of any official LLVM release. While incubation status is not | |
| necessarily a reflection of the completeness or stability of the code, it | |
| does indicate that the project is not yet endorsed as a component of LLVM. | |
| ### Adding or enabling a new LLVM pass | |
| The guidelines here are primarily targeted at the enablement of new major | |
| passes in the target-independent optimization pipeline. Small additions, or | |
| backend-specific passes, require a lesser degree of care. Before creating a new | |
| pass, consider whether the functionality can be integrated into an existing | |
| pass first. This is often both faster and more powerful. | |
| When adding a new pass, the goal should be to enable it as part of the default | |
| optimization pipeline as early as possible and then continue development | |
| incrementally. (This does not apply to passes that are only relevant for | |
| specific uses of LLVM, such as GC support passes.) | |
| The recommended workflow is: | |
| 1. Implement a basic version of the pass and add it to the pass pipeline behind | |
| a flag that is disabled by default. The initial version should focus on | |
| handling simple cases correctly and efficiently. | |
| 2. Enable the pass by default. Separating this step allows easily disabling the | |
| pass if issues are encountered, without having to revert the entire | |
| implementation. | |
| 3. Incrementally extend the pass with new functionality. As the pass is already | |
| enabled, it becomes easier to identify the specific change that has caused a | |
| regression in correctness, optimization quality or compile-time. | |
| When enabling a pass, certain requirements must be met (in no particular | |
| order): | |
| - **Maintenance:** The pass (and any analyses it depends on) must have at | |
| least one maintainer. | |
| - **Usefulness:** There should be evidence that the pass improves performance | |
| (or whatever metric it optimizes for) on real-world workloads. Improvements | |
| seen only on synthetic benchmarks may be insufficient. | |
| - **Compile-Time:** The pass should not have a large impact on compile-time, | |
| where the evaluation of what "large" means is up to reviewer discretion, and | |
| may differ based on the value the pass provides. In any case, it is expected | |
| that a concerted effort has been made to mitigate the compile-time impact, | |
| both for the average case, and for pathological cases. | |
| - **Correctness:** The pass should have no known correctness issues (except | |
| global correctness issues that affect all of LLVM). If an old pass is being | |
| enabled (rather than implementing a new one incrementally), additional due | |
| diligence is required. The pass should be fully reviewed to ensure that it | |
| still complies with current quality standards. Fuzzing with disabled | |
| profitability checks may help gain additional confidence in the | |
| implementation. | |
| If non-trivial issues are found in a newly enabled pass, it may be temporarily | |
| disabled again, until the issues have been resolved. | |
| (copyright-license-patents)= | |
| ## Copyright, License, and Patents | |
| :::{note} | |
| This section deals with legal matters but does not provide legal advice. We are not lawyers \-\-- please seek legal counsel from a licensed attorney. | |
| ::: | |
| This section addresses the issues of copyright, license and patents for the LLVM | |
| project. The copyright for the code is held by the contributors of the code. | |
| The code is licensed under permissive {ref}`open source licensing terms <open | |
| source licensing terms>`, namely the Apache-2.0 with LLVM-exception license, | |
| which includes a copyright and {ref}`patent license <patent license>`. When you | |
| contribute code to the LLVM project, you license it under these terms. | |
| In certain circumstances, code licensed under other licenses can be added | |
| to the codebase. However, this may only be done with approval of the LLVM | |
| Foundation Board of Directors, and contributors should plan for the approval | |
| process to take at least 4-6 weeks. If you would like to contribute code | |
| under a different license, please create a pull request with the code | |
| you want to contribute and email <board@llvm.org> requesting a review. | |
| If you have questions or comments about these topics, please ask on the [LLVM | |
| Discourse forums](https://discourse.llvm.org). However, please realize that | |
| most compiler developers are not lawyers, and therefore you will not be getting | |
| official legal advice. | |
| ### Copyright | |
| The LLVM project does not collect copyright assignments, which means that the | |
| copyright for the code in the project is held by the respective contributors. | |
| Because you (or your company) | |
| retain ownership of the code you contribute, you know it may only be used under | |
| the terms of the open source license you contributed it under: the license for | |
| your contributions cannot be changed in the future without your approval. | |
| Because the LLVM project does not require copyright assignments, changing the | |
| LLVM license requires tracking down the | |
| contributors to LLVM and getting them to agree that a license change is | |
| acceptable for their contributions. We feel that a high burden for relicensing | |
| is good for the project, because contributors do not have to fear that their | |
| code will be used in a way with which they disagree. | |
| #### Embedded Copyright or 'Contributed by' Statements | |
| The LLVM project does not accept contributions that include in-source copyright | |
| notices except where such notices are part of a larger external project being | |
| added as a vendored dependency. | |
| LLVM source code lives for a long time and is edited by many people, the best | |
| way to track contributions is through revision control history. See the | |
| [Attribution of Changes](#attribution-of-changes) section for more information | |
| about attributing changes to authors other than the committer. | |
| ### Relicensing | |
| The last paragraph notwithstanding, the LLVM Project is in the middle of a large | |
| effort to change licenses, which aims to solve several problems: | |
| - The old licenses made it difficult to move code from (e.g.) the compiler to | |
| runtime libraries, because runtime libraries used a different license from | |
| the rest of the compiler. | |
| - Some contributions were not submitted to LLVM due to concerns that | |
| the patent grant required by the project was overly broad. | |
| - The patent grant was unique to the LLVM Project, not written by a lawyer, and | |
| was difficult to determine what protection was provided (if any). | |
| The scope of relicensing is all code that is considered part of the LLVM | |
| project, including the main LLVM repository, runtime libraries (compiler_rt, | |
| OpenMP, etc), Polly, and all other subprojects. There are a few exceptions: | |
| - Code imported from other projects (e.g. Google Test, Autoconf, etc) will | |
| remain as it is. This code isn't developed as part of the LLVM project, it | |
| is used by LLVM. | |
| - Some subprojects are impractical or uninteresting to relicense (e.g. llvm-gcc | |
| and dragonegg). These will be split off from the LLVM project (e.g. to | |
| separate GitHub projects), allowing interested people to continue their | |
| development elsewhere. | |
| To relicense LLVM, we will be seeking approval from all of the copyright holders | |
| of code in the repository, or potentially remove/rewrite code if we cannot. | |
| This is a large | |
| and challenging project which will take a significant amount of time to | |
| complete. | |
| Starting on 2024-06-01 (first of June 2024), new contributions only need to | |
| be covered by the new LLVM license, i.e. Apache-2.0 WITH LLVM-exception. | |
| Before this date, the project required all contributions to be made under | |
| both the new license and the legacy license. | |
| If you are a contributor to LLVM with contributions committed before 2019-01-19 | |
| and have not done so already, please do follow the instructions at | |
| <https://foundation.llvm.org/docs/relicensing/>, under section "Individual | |
| Relicensing Agreement" to relicense your contributions under the new license. | |
| (open source licensing terms)= | |
| ### New LLVM Project License Framework | |
| Contributions to LLVM are licensed under the [Apache License, Version | |
| 2.0](https://www.apache.org/licenses/LICENSE-2.0), with two limited | |
| exceptions intended to ensure that LLVM is very permissively licensed. | |
| Collectively, the name of this license is "Apache 2.0 License with LLVM | |
| exceptions". The exceptions read: | |
| ---- LLVM Exceptions to the Apache 2.0 License ---- | |
| As an exception, if, as a result of your compiling your source code, portions | |
| of this Software are embedded into an Object form of such source code, you | |
| may redistribute such embedded portions in such Object form without complying | |
| with the conditions of Sections 4(a), 4(b) and 4(d) of the License. | |
| In addition, if you combine or link compiled forms of this Software with | |
| software that is licensed under the GPLv2 ("Combined Software") and if a | |
| court of competent jurisdiction determines that the patent provision (Section | |
| 3), the indemnity provision (Section 9) or other Section of the License | |
| conflicts with the conditions of the GPLv2, you may retroactively and | |
| prospectively choose to deem waived or otherwise exclude such Section(s) of | |
| the License, but only in their entirety and only with respect to the Combined | |
| Software. | |
| We intend to keep LLVM perpetually open source and available under a permissive | |
| license - this fosters the widest adoption of LLVM by | |
| **allowing commercial products to be derived from LLVM** with few restrictions | |
| and without a requirement for making any derived works also open source. In | |
| particular, LLVM's license is not a "copyleft" license like the GPL. | |
| The "Apache 2.0 License with LLVM exceptions" allows you to: | |
| - freely download and use LLVM (in whole or in part) for personal, internal, | |
| or commercial purposes. | |
| - include LLVM in packages or distributions you create. | |
| - combine LLVM with code licensed under every other major open source | |
| license (including BSD, MIT, GPLv2, GPLv3\...). | |
| - make changes to LLVM code without being required to contribute it back | |
| to the project - contributions are appreciated though! | |
| However, it imposes these limitations on you: | |
| - You must retain the copyright notice if you redistribute LLVM: You cannot | |
| strip the copyright headers off or replace them with your own. | |
| - Binaries that include LLVM must reproduce the copyright notice (e.g. in an | |
| included README file or in an "About" box), unless the LLVM code was added as | |
| a by-product of compilation. For example, if an LLVM runtime library like | |
| compiler_rt or libc++ was automatically included into your application by the | |
| compiler, you do not need to attribute it. | |
| - You can't use our names to promote your products (LLVM derived or not) - | |
| though you can make truthful statements about your use of the LLVM code, | |
| without implying our sponsorship. | |
| - There's no warranty on LLVM at all. | |
| We want LLVM code to be widely used, and believe that this provides a model | |
| that is great for contributors and users of the project. For more information | |
| about the Apache 2.0 License, please see the [Apache License | |
| FAQ](http://www.apache.org/foundation/license-faq.html), maintained by the | |
| Apache Project. | |
| (patent license)= | |
| ### Patents | |
| Section 3 of the Apache 2.0 license is a patent grant under which | |
| contributors of code to the project contribute the rights to use any of | |
| their patents that would otherwise be infringed by that code contribution | |
| (protecting uses of that code). Further, the patent grant is revoked | |
| from anyone who files a patent lawsuit about code in LLVM - this protects the | |
| community by providing a "patent commons" for the code base and reducing the | |
| odds of patent lawsuits in general. | |
| The license specifically scopes which patents are included with code | |
| contributions. To help explain this, the [Apache License | |
| FAQ](http://www.apache.org/foundation/license-faq.html) explains this scope using | |
| some questions and answers, which we reproduce here for your convenience (for | |
| reference, the "ASF" is the Apache Software Foundation, the guidance still | |
| holds though): | |
| Q1: If I own a patent and contribute to a Work, and, at the time my | |
| contribution is included in that Work, none of my patent's claims are subject | |
| to Apache's Grant of Patent License, is there a way any of those claims would | |
| later become subject to the Grant of Patent License solely due to subsequent | |
| contributions by other parties who are not licensees of that patent. | |
| A1: No. | |
| Q2: If at any time after my contribution, I am able to license other patent | |
| claims that would have been subject to Apache's Grant of Patent License if | |
| they were licensable by me at the time of my contribution, do those other | |
| claims become subject to the Grant of Patent License? | |
| A2: Yes. | |
| Q3: If I own or control a licensable patent and contribute code to a specific | |
| Apache product, which of my patent claims are subject to Apache's Grant of | |
| Patent License? | |
| A3: The only patent claims that are licensed to the ASF are those you own or | |
| have the right to license that read on your contribution or on the | |
| combination of your contribution with the specific Apache product to which | |
| you contributed as it existed at the time of your contribution. No additional | |
| patent claims become licensed as a result of subsequent combinations of your | |
| contribution with any other software. Note, however, that licensable patent | |
| claims include those that you acquire in the future, as long as they read on | |
| your original contribution as made at the original time. Once a patent claim | |
| is subject to Apache's Grant of Patent License, it is licensed under the | |
| terms of that Grant to the ASF and to recipients of any software distributed | |
| by the ASF for any Apache software product whatsoever. | |
| (legacy)= | |
| ### Legacy License Structure | |
| :::{note} | |
| The code base was previously licensed under the Terms described here. | |
| We are in the middle of relicensing to a new approach (described above). | |
| More than 99% of all contributions made to LLVM are covered by the Apache-2.0 | |
| WITH LLVM-exception license. A small portion of LLVM code remains exclusively | |
| covered by the legacy license. Contributions after 2024-06-01 are covered | |
| exclusively by the new license. | |
| ::: | |
| We intend to keep LLVM perpetually open source and to use a permissive open | |
| source license. The code in | |
| LLVM is available under the [University of Illinois/NCSA Open Source | |
| License](http://www.opensource.org/licenses/UoI-NCSA.php), which boils down to | |
| this: | |
| - You can freely distribute LLVM. | |
| - You must retain the copyright notice if you redistribute LLVM. | |
| - Binaries derived from LLVM must reproduce the copyright notice (e.g. in an | |
| included README file). | |
| - You can't use our names to promote your LLVM derived products. | |
| - There's no warranty on LLVM at all. | |
| We believe this fosters the widest adoption of LLVM because it **allows | |
| commercial products to be derived from LLVM** with few restrictions and without | |
| a requirement for making any derived works also open source (i.e. LLVM's | |
| license is not a "copyleft" license like the GPL). We suggest that you read the | |
| [License](http://www.opensource.org/licenses/UoI-NCSA.php) if further | |
| clarification is needed. | |
| In addition to the UIUC license, the runtime library components of LLVM | |
| (**compiler_rt, libc++, and libclc**) are also licensed under the [MIT | |
| License](http://www.opensource.org/licenses/mit-license.php), which does not contain | |
| the binary redistribution clause. As a user of these runtime libraries, it | |
| means that you can choose to use the code under either license (and thus don't | |
| need the binary redistribution clause), and as a contributor to the code that | |
| you agree that any contributions to these libraries be licensed under both | |
| licenses. We feel that this is important for runtime libraries, because they | |
| are implicitly linked into applications and therefore should not subject those | |
| applications to the binary redistribution clause. This also means that it is ok | |
| to move code from (e.g.) libc++ to the LLVM core without concern, but that code | |
| cannot be moved from the LLVM core to libc++ without the copyright owner's | |
| permission. | |
| (ai contributions)= | |
| ### AI generated contributions | |
| This section has moved into a {doc}`separate policy document <AIToolPolicy>`. |