|  | .. _code_review_policy: | 
|  |  | 
|  | ===================================== | 
|  | LLVM Code-Review Policy and Practices | 
|  | ===================================== | 
|  |  | 
|  | LLVM's code-review policy and practices help maintain high code quality across | 
|  | the project. Specifically, our code review process aims to: | 
|  |  | 
|  | * Improve readability and maintainability. | 
|  | * Improve robustness and prevent the introduction of defects. | 
|  | * Best leverage the experience of other contributors for each proposed change. | 
|  | * Help grow and develop new contributors, through mentorship by community leaders. | 
|  |  | 
|  | It is important for all contributors to understand our code-review | 
|  | practices and participate in the code-review process. | 
|  |  | 
|  | General Policies | 
|  | ================ | 
|  |  | 
|  | What Code Should Be Reviewed? | 
|  | ----------------------------- | 
|  |  | 
|  | All developers are required to have significant changes reviewed before they | 
|  | are committed to the repository. | 
|  |  | 
|  | Must Code Be Reviewed Prior to Being Committed? | 
|  | ----------------------------------------------- | 
|  |  | 
|  | Code can be reviewed either before it is committed or after. We expect | 
|  | significant patches to be reviewed before being committed. Smaller patches | 
|  | (or patches where the developer owns the component) that meet | 
|  | likely-community-consensus requirements (as apply to all patch approvals) can | 
|  | be committed prior to an explicit review. In situations where there is any | 
|  | uncertainty, a patch should be reviewed prior to being committed. | 
|  |  | 
|  | Please note that the developer responsible for a patch is also | 
|  | responsible for making all necessary review-related changes, including | 
|  | those requested during any post-commit review. | 
|  |  | 
|  | .. _post_commit_review: | 
|  |  | 
|  | Can Code Be Reviewed After It Is Committed? | 
|  | ------------------------------------------- | 
|  |  | 
|  | Post-commit review is encouraged, and can be accomplished using any of the | 
|  | tools detailed below. There is a strong expectation that authors respond | 
|  | promptly to post-commit feedback and address it. Failure to do so is cause for | 
|  | the patch to be :ref:`reverted <revert_policy>`. | 
|  |  | 
|  | If a community member expresses a concern about a recent commit, and this | 
|  | concern would have been significant enough to warrant a conversation during | 
|  | pre-commit review (including around the need for more design discussions), | 
|  | they may ask for a revert to the original author who is responsible to revert | 
|  | the patch promptly. Developers often disagree, and erring on the side of the | 
|  | developer asking for more review prevents any lingering disagreement over | 
|  | code in the tree. This does not indicate any fault from the patch author, | 
|  | this is inherent to our post-commit review practices. | 
|  | Reverting a patch ensures that design discussions can happen without blocking | 
|  | other development; it's entirely possible the patch will end up being reapplied | 
|  | essentially as-is once concerns have been resolved. | 
|  |  | 
|  | Before being recommitted, the patch generally should undergo further review. | 
|  | The community member who identified the problem is expected to engage | 
|  | actively in the review. In cases where the problem is identified by a buildbot, | 
|  | a community member with access to hardware similar to that on the buildbot is | 
|  | expected to engage in the review. | 
|  |  | 
|  | Please note: The bar for post-commit feedback is not higher than for pre-commit | 
|  | feedback. Don't delay unnecessarily in providing feedback. However, if you see | 
|  | something after code has been committed about which you would have commented | 
|  | pre-commit (had you noticed it earlier), please feel free to provide that | 
|  | feedback at any time. | 
|  |  | 
|  | That having been said, if a substantial period of time has passed since the | 
|  | original change was committed, it may be better to create a new patch to | 
|  | address the issues than comment on the original commit. The original patch | 
|  | author, for example, might no longer be an active contributor to the project. | 
|  |  | 
|  | What Tools Are Used for Code Review? | 
|  | ------------------------------------ | 
|  |  | 
|  | Pre-commit code reviews are conducted on GitHub with Pull Requests. See | 
|  | :ref:`GitHub <github-reviews>` documentation. | 
|  |  | 
|  | When Is an RFC Required? | 
|  | ------------------------ | 
|  |  | 
|  | Some changes are too significant for just a code review. Changes that should | 
|  | change the LLVM Language Reference (e.g., adding new target-independent | 
|  | intrinsics), adding language extensions in Clang, and so on, require an RFC | 
|  | (Request for Comment) topic on the `LLVM Discussion Forums <https://discourse.llvm.org>`_ | 
|  | first. For changes that promise significant impact on users and/or downstream | 
|  | code bases, reviewers can request an RFC achieving consensus before proceeding | 
|  | with code review. That having been said, posting initial patches can help with | 
|  | discussions on an RFC. | 
|  |  | 
|  | Code-Review Workflow | 
|  | ==================== | 
|  |  | 
|  | Code review can be an iterative process, which continues until the patch is | 
|  | ready to be committed. Specifically, once a patch is sent out for review, it | 
|  | needs an explicit approval before it is committed. Do not assume silent | 
|  | approval, or solicit objections to a patch with a deadline. | 
|  |  | 
|  | .. note:: | 
|  | If you are using a Pull Request for purposes other than review | 
|  | (eg: precommit CI results, convenient web-based reverts, etc) | 
|  | `skip-precommit-approval <https://github.com/llvm/llvm-project/labels?q=skip-precommit-approval>`_ | 
|  | label to the PR. | 
|  |  | 
|  | Acknowledge All Reviewer Feedback | 
|  | --------------------------------- | 
|  |  | 
|  | All comments by reviewers should be acknowledged by the patch author. It is | 
|  | generally expected that suggested changes will be incorporated into a future | 
|  | revision of the patch unless the author and/or other reviewers can articulate a | 
|  | good reason to do otherwise (and then the reviewers must agree). If a new patch | 
|  | does not address all outstanding feedback, the author should explicitly state | 
|  | that when providing the updated patch. When using the web-based code-review | 
|  | tool, such notes can be provided in the "Diff" description (which is different | 
|  | from the description of the "Differential Revision" as a whole used for the | 
|  | commit message). | 
|  |  | 
|  | If you suggest changes in a code review, but don't wish the suggestion to be | 
|  | interpreted this strongly, please state so explicitly. | 
|  |  | 
|  | .. note:: | 
|  | After responding to reviewer comments, | 
|  | press `Re-request review <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review#:~:text=After%20your%20pull%20request%20is%20reviewed>`_ | 
|  | to bring the Pull Request to the reviewers' attention. | 
|  |  | 
|  | Aim to Make Efficient Use of Everyone's Time | 
|  | -------------------------------------------- | 
|  |  | 
|  | Aim to limit the number of iterations in the review process. For example, when | 
|  | suggesting a change, if you want the author to make a similar set of changes at | 
|  | other places in the code, please explain the requested set of changes so that | 
|  | the author can make all of the changes at once. If a patch will require | 
|  | multiple steps prior to approval (e.g., splitting, refactoring, posting data | 
|  | from specific performance tests), please explain as many of these up front as | 
|  | possible. This allows the patch author and reviewers to make the most efficient | 
|  | use of their time. | 
|  |  | 
|  | .. _lgtm_how_a_patch_is_accepted: | 
|  |  | 
|  | LGTM - How a Patch Is Accepted | 
|  | ------------------------------ | 
|  |  | 
|  | A patch is approved to be committed when a reviewer accepts it, and this is | 
|  | almost always associated with a message containing the text "LGTM" (which | 
|  | stands for Looks Good To Me). | 
|  |  | 
|  | Only approval from a single reviewer is required, unless the pull request | 
|  | has required reviewers. In which case, you must have approval from all of those | 
|  | reviewers. | 
|  |  | 
|  | When providing an unqualified LGTM (approval to commit), it is the | 
|  | responsibility of the reviewer to have reviewed all of the prior discussion and | 
|  | feedback from all reviewers ensuring that all feedback has been addressed and | 
|  | that all other reviewers will almost surely be satisfied with the patch being | 
|  | approved. If unsure, the reviewer should provide a qualified approval, (e.g., | 
|  | "LGTM, but please wait for @someone, @someone_else"). You may also do this if | 
|  | you are fairly certain that a particular community member will wish to review, | 
|  | even if that person hasn't done so yet. | 
|  |  | 
|  | If additional feedback is provided after acceptance (by the same reviewer or | 
|  | another), the author should use their best judgement in deciding whether that | 
|  | feedback can be incorporated into the change without comment (say a typo) or | 
|  | requires further review discussion. More substantial comments (e.g., about the | 
|  | design) will usually require further discussion. If unsure, ask the reviewer. | 
|  |  | 
|  | Note that, if a reviewer has requested a particular community member to review, | 
|  | and after a week that community member has yet to respond, feel free to ping | 
|  | the patch (which literally means submitting a comment on the patch with the | 
|  | word, "Ping."), or alternatively, ask the original reviewer for further | 
|  | suggestions. | 
|  |  | 
|  | If it is likely that others will want to review a recently-posted patch, | 
|  | especially if there might be objections, but no one else has done so yet, it is | 
|  | also polite to provide a qualified approval (e.g., "LGTM, but please wait for a | 
|  | couple of days in case others wish to review"). If approval is received very | 
|  | quickly, a patch author may also elect to wait before committing (and this is | 
|  | certainly considered polite for non-trivial patches). Especially given the | 
|  | global nature of our community, this waiting time should be at least 24 hours. | 
|  | Please also be mindful of weekends and major holidays. | 
|  |  | 
|  | Our goal is to ensure community consensus around design decisions and | 
|  | significant implementation choices, and one responsibility of a reviewer, when | 
|  | providing an overall approval for a patch, is to be reasonably sure that such | 
|  | consensus exists. If you're not familiar enough with the community to know, | 
|  | then you shouldn't be providing final approval to commit. A reviewer providing | 
|  | final approval should have commit access to the LLVM project. | 
|  |  | 
|  | Every patch should be reviewed by at least one technical expert in the areas of | 
|  | the project affected by the change. | 
|  |  | 
|  | Splitting Requests and Conditional Acceptance | 
|  | --------------------------------------------- | 
|  |  | 
|  | Reviewers may request certain aspects of a patch to be broken out into separate | 
|  | patches for independent review. Reviewers may also accept a patch | 
|  | conditioned on the author providing a follow-up patch addressing some | 
|  | particular issue or concern (although no committed patch should leave the | 
|  | project in a broken state). Moreover, reviewers can accept a patch conditioned on | 
|  | the author applying some set of minor updates prior to committing, and when | 
|  | applicable, it is polite for reviewers to do so. | 
|  |  | 
|  | Don't Unintentionally Block a Review | 
|  | ------------------------------------ | 
|  |  | 
|  | If you review a patch, but don't intend for the review process to block on your | 
|  | approval, please state that explicitly. Out of courtesy, we generally wait on | 
|  | committing a patch until all reviewers are satisfied, and if you don't intend | 
|  | to look at the patch again in a timely fashion, please communicate that fact in | 
|  | the review. | 
|  |  | 
|  | Who Can/Should Review Code? | 
|  | =========================== | 
|  |  | 
|  | Non-Experts Should Review Code | 
|  | ------------------------------ | 
|  |  | 
|  | You do not need to be an expert in some area of the code base to review patches; | 
|  | it's fine to ask questions about what some piece of code is doing. If it's not | 
|  | clear to you what is going on, you're unlikely to be the only one. Please | 
|  | remember that it is not in the long-term best interest of the community to have | 
|  | components that are only understood well by a small number of people. Extra | 
|  | comments and/or test cases can often help (and asking for comments in the test | 
|  | cases is fine as well). | 
|  |  | 
|  | Moreover, authors are encouraged to interpret questions as a reason to reexamine | 
|  | the readability of the code in question. Structural changes, or further | 
|  | comments, may be appropriate. | 
|  |  | 
|  | If you're new to the LLVM community, you might also find this presentation helpful: | 
|  | .. _How to Contribute to LLVM, A 2019 LLVM Developers' Meeting Presentation: https://youtu.be/C5Y977rLqpw | 
|  |  | 
|  | A good way for new contributors to increase their knowledge of the code base is | 
|  | to review code. It is perfectly acceptable to review code and explicitly | 
|  | defer to others for approval decisions. | 
|  |  | 
|  | Experts Should Review Code | 
|  | -------------------------- | 
|  |  | 
|  | If you are an expert in an area of the compiler affected by a proposed patch, | 
|  | then you are highly encouraged to review the code. If you are a relevant | 
|  | maintainer, and no other experts are reviewing a patch, you must either help | 
|  | arrange for an expert to review the patch or review it yourself. | 
|  |  | 
|  | Code Reviews, Speed, and Reciprocity | 
|  | ------------------------------------ | 
|  |  | 
|  | Sometimes code reviews will take longer than you might hope, especially for | 
|  | larger features. Common ways to speed up review times for your patches are: | 
|  |  | 
|  | * Review other people's patches. If you help out, everybody will be more | 
|  | willing to do the same for you; goodwill is our currency. | 
|  | * Ping the patch. If it is urgent, provide reasons why it is important to you to | 
|  | get this patch landed and ping it every couple of days. If it is | 
|  | not urgent, the common courtesy ping rate is one week. Remember that you're | 
|  | asking for valuable time from other professional developers. | 
|  | * Ask for help on Discord. Developers on Discord will be able to either help | 
|  | you directly, or tell you who might be a good reviewer. | 
|  | * Split your patch into multiple smaller patches that build on each other. The | 
|  | smaller your patch is, the higher the probability that somebody will take a quick | 
|  | look at it. When doing this, it is helpful to add "[N/M]" (for 1 <= N <= M) to | 
|  | the title of each patch in the series, so it is clear that there is an order | 
|  | and what that order is. | 
|  |  | 
|  | Developers should participate in code reviews as both reviewers and | 
|  | authors. If someone is kind enough to review your code, you should return the | 
|  | favor for someone else. Note that anyone is welcome to review and give feedback | 
|  | on a patch, but approval of patches should be consistent with the policy above. | 
|  |  | 
|  | Upstreaming Changes to LLVM | 
|  | =========================== | 
|  |  | 
|  | When upstreaming your own changes from a downstream project to LLVM, simply | 
|  | follow the process outlined above. | 
|  |  | 
|  | When upstreaming changes originally written by someone else: | 
|  |  | 
|  | * Ensure that there are no obstacles to upstreaming the code. In some cases, | 
|  | this simply means checking with the original author(s) to ensure they are | 
|  | aware of and approve the upstreaming. In other cases, licensing | 
|  | considerations may be more complex. | 
|  | * Properly attribute the original changes, e.g., by creating a commit with | 
|  | multiple authors (`GitHub guide <https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors>`_). | 
|  | * Invite the original author(s) to review the changes, and also include | 
|  | additional reviewers. Specifically, an LGTM from a (co-)author should not be | 
|  | taken as approval to land a change. |