| ===================================== |
| 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 our web-based code-review tool (see |
| :doc:`Phabricator`). Post-commit reviews can be done on Phabricator, by email |
| on the relevant project's commit mailing list, on the project's development |
| list, or on the bug tracker. |
| |
| 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) email on the project's ``*-dev`` mailing list 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. |
| |
| 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. |
| |
| 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 |
| ------------------------------ |
| |
| 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. |
| |
| When providing an unqualified LGTM (approval to commit), it is the |
| responsibility of the reviewer to have reviewed all of the 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 you approve of the idea/concept of a patch but feel unqualified to approve, |
| another option (other than accepting the patch) is to simply *"Award Token"* |
| (right-hand side in Phabricator) to indicate support without indicating to |
| other reviewers that the patch has been accepted and reviewed in their |
| dashboard. |
| |
| 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 code |
| owner, 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 IRC. Developers on IRC 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. |