1==============
2MyFirstTypoFix
3==============
4
5.. contents::
6   :local:
7
8Introduction
9============
10
11This tutorial will guide you through the process of making a change to
12LLVM, and contributing it back to the LLVM project. We'll be making a
13change to Clang, but the steps for other parts of LLVM are the same.
14Even though the change we'll be making is simple, we're going to cover
15steps like building LLVM, running the tests, and code review. This is
16good practice, and you'll be prepared for making larger changes.
17
18We'll assume you:
19
20-  know how to use an editor,
21
22-  have basic C++ knowledge,
23
24-  know how to install software on your system,
25
26-  are comfortable with the command line,
27
28-  have basic knowledge of git.
29
30
31The change we're making
32-----------------------
33
34Clang has a warning for infinite recursion:
35
36.. code:: console
37
38   $ echo "void foo() { foo(); }" > ~/test.cc
39   $ clang -c -Wall ~/test.cc
40   input.cc:1:14: warning: all paths through this function will call
41   itself [-Winfinite-recursion]
42
43This is clear enough, but not exactly catchy. Let's improve the wording
44a little:
45
46.. code:: console
47
48   input.cc:1:14: warning: to understand recursion, you must first
49   understand recursion [-Winfinite-recursion]
50
51
52Dependencies
53------------
54
55We're going to need some tools:
56
57-  git: to check out the LLVM source code,
58
59-  a C++ compiler: to compile LLVM source code. You'll want `a recent
60   version <https://llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library>`__
61   of Clang, GCC, or Visual Studio.
62
63-  CMake: used to configure how LLVM should be built on your system,
64
65-  ninja: runs the C++ compiler to (re)build specific parts of LLVM,
66
67-  python: to run the LLVM tests,
68
69-  arcanist: for uploading changes for review,
70
71As an example, on Ubuntu:
72
73.. code:: console
74
75   $ sudo apt-get install git clang cmake ninja-build python arcanist
76
77
78Building LLVM
79=============
80
81
82Checkout
83--------
84
85The source code is stored `on
86Github <https://github.com/llvm/llvm-project>`__ in one large repository
87("the monorepo").
88
89It may take a while to download!
90
91.. code:: console
92
93   $ git clone https://github.com/llvm/llvm-project.git
94
95This will create a directory "llvm-project" with all of the source
96code.(Checking out anonymously is OK - pushing commits uses a different
97mechanism, as we'll see later)
98
99Configure your workspace
100------------------------
101
102Before we can build the code, we must configure exactly how to build it
103by running CMake. CMake combines information from three sources:
104
105-  explicit choices you make (is this a debug build?)
106
107-  settings detected from your system (where are libraries installed?)
108
109-  project structure (which files are part of 'clang'?)
110
111First, create a directory to build in. Usually, this is
112llvm-project/build.
113
114.. code:: console
115
116   $ mkdir llvm-project/build
117   $ cd llvm-project/build
118
119Now, run CMake:
120
121.. code:: console
122
123   $ cmake -G Ninja ../llvm -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS=clang
124
125If all goes well, you'll see a lot of "performing test" lines, and
126finally:
127
128.. code:: console
129
130   Configuring done
131   Generating done
132   Build files have been written to: /path/llvm-project/build
133
134And you should see a build.ninja file.
135
136Let's break down that last command a little:
137
138-  **-G Ninja**: we're going to use ninja to build; please create
139   build.ninja
140
141-  **../llvm**: this is the path to the source of the "main" LLVM
142   project
143
144-  The two **-D** flags set CMake variables, which override
145   CMake/project defaults:
146
147-  **CMAKE\ BUILD\ TYPE=Release**: build in optimized mode, which is
148   (surprisingly) the fastest option.
149
150   If you want to run under a debugger, you should use the default Debug
151   (which is totally unoptimized, and will lead to >10x slower test
152   runs) or RelWithDebInfo which is a halfway point.
153   **CMAKE\ BUILD\ TYPE** affects code generation only, assertions are
154   on by default regardless! **LLVM\ ENABLE\ ASSERTIONS=Off** disables
155   them.
156
157-  **LLVM\ ENABLE\ PROJECTS=clang** : this lists the LLVM subprojects
158   you are interested in building, in addition to LLVM itself. Multiple
159   projects can be listed, separated by semicolons, such as "clang;
160   lldb".In this example, we'll be making a change to Clang, so we
161   should build it.
162
163Finally, create a symlink (or a copy) of
164llvm-project/build/compile-commands.json into llvm-project/:
165
166.. code:: console
167
168   $ ln -s build/compile_commands.json ../
169
170(This isn't strictly necessary for building and testing, but allows
171tools like clang-tidy, clang-query, and clangd to work in your source
172tree).
173
174
175Build and test
176--------------
177
178Finally, we can build the code! It's important to do this first, to
179ensure we're in a good state before making changes. But what to build?
180In ninja, you specify a **target**. If we just want to build the clang
181binary, our target name is "clang" and we run:
182
183.. code:: console
184
185   $ ninja clang
186
187The first time we build will be very slow - Clang + LLVM is a lot of
188code. But incremental builds are fast: ninja will only rebuild the parts
189that have changed. When it finally finishes you should have a working
190clang binary. Try running:
191
192.. code:: console
193
194   $ bin/clang --version
195
196There's also a target for building and running all the clang tests:
197
198.. code:: console
199
200   $ ninja check-clang
201
202This is a common pattern in LLVM: check-llvm is all the checks for core,
203other projects have targets like check-lldb.
204
205
206Making changes
207==============
208
209
210Edit
211----
212
213We need to find the file containing the error message.
214
215.. code:: console
216
217   $ git grep "all paths through this function" ..
218   ../clang/include/clang/Basic/DiagnosticSemaKinds.td:  "all paths through this function will call itself">,
219
220The string that appears in DiagnosticSemaKinds.td is the one that is
221printed by Clang. \*.td files define tables - in this case it's a list
222of warnings and errors clang can emit and their messages. Let's update
223the message in your favorite editor:
224
225.. code:: console
226
227   $ vi ../clang/include/clang/Basic/DiagnosticSemaKinds.td
228
229Find the message (it should be under
230warn\ *infinite*\ recursive_function)Change the message to "in order to
231understand recursion, you must first understand recursion".
232
233
234Test again
235----------
236
237To verify our change, we can build clang and manually check that it
238works.
239
240.. code:: console
241
242   $ ninja clang
243   $ bin/clang -Wall ~/test.cc
244
245   **/path/test.cc:1:124:** **warning****: in order to understand recursion, you must
246   first understand recursion [-Winfinite-recursion]**
247
248We should also run the tests to make sure we didn't break something.
249
250.. code:: console
251
252   $ ninja check-clang
253
254Notice that it is much faster to build this time, but the tests take
255just as long to run. Ninja doesn't know which tests might be affected,
256so it runs them all.
257
258.. code:: console
259
260   ********************
261   Testing Time: 408.84s
262   ********************
263   Failing Tests (1):
264       Clang :: SemaCXX/warn-infinite-recursion.cpp
265
266Well, that makes sense… and the test output suggests it's looking for
267the old string "call itself" and finding our new message instead.
268Note that more tests may fail in a similar way as new tests are
269added time to time.
270
271Let's fix it by updating the expectation in the test.
272
273.. code:: console
274
275   $ vi ../clang/test/SemaCXX/warn-infinite-recursion.cpp
276
277Everywhere we see `// expected-warning{{call itself}}` (or something similar
278from the original warning text), let's replace it with
279`// expected-warning{{to understand recursion}}`.
280
281Now we could run **all** the tests again, but this is a slow way to
282iterate on a change! Instead, let's find a way to re-run just the
283specific test. There are two main types of tests in LLVM:
284
285-  **lit tests** (e.g. SemaCXX/warn-infinite-recursion.cpp).
286
287These are fancy shell scripts that run command-line tools and verify the
288output. They live in files like
289clang/**test**/FixIt/dereference-addressof.c. Re-run like this:
290
291.. code:: console
292
293   $ bin/llvm-lit -v ../clang/test/SemaCXX/warn-infinite-recursion.cpp
294
295-  **unit tests** (e.g. ToolingTests/ReplacementTest.CanDeleteAllText)
296
297These are C++ programs that call LLVM functions and verify the results.
298They live in suites like ToolingTests. Re-run like this:
299
300.. code:: console
301
302   $ ninja ToolingTests && tools/clang/unittests/Tooling/ToolingTests
303   --gtest_filter=ReplacementTest.CanDeleteAllText
304
305
306Commit locally
307--------------
308
309We'll save the change to a local git branch. This lets us work on other
310things while the change is being reviewed. Changes should have a
311description, to explain to reviewers and future readers of the code why
312the change was made.
313
314.. code:: console
315
316   $ git checkout -b myfirstpatch
317   $ git commit -am "[Diagnostic] Clarify -Winfinite-recursion message"
318
319Now we're ready to send this change out into the world! By the way,
320There is a unwritten convention of using tag for your commit. Tags
321usually represent modules that you intend to modify. If you don't know
322the tags for your modules, you can look at the commit history :
323https://github.com/llvm/llvm-project/commits/main.
324
325
326Code review
327===========
328
329
330Finding a reviewer
331------------------
332
333Changes can be reviewed by anyone in the LLVM community who has commit
334access.For larger and more complicated changes, it's important that the
335reviewer has experience with the area of LLVM and knows the design goals
336well. The author of a change will often assign a specific reviewer (git
337blame and git log can be useful to find one).
338
339As our change is fairly simple, we'll add the cfe-commits mailing list
340as a subscriber; anyone who works on clang can likely pick up the
341review. (For changes outside clang, llvm-commits is the usual list. See
342`http://lists.llvm.org/ <http://lists.llvm.org/mailman/listinfo>`__ for
343all the \*-commits mailing lists).
344
345
346Uploading a change for review
347-----------------------------
348
349LLVM code reviews happen at https://reviews.llvm.org. The web interface
350is called Phabricator, and the code review part is Differential. You
351should create a user account there for reviews (click "Log In" and then
352"Register new account").
353
354Now you can upload your change for review:
355
356.. code:: console
357
358   $ arc diff HEAD^
359
360This creates a review for your change, comparing your current commit
361with the previous commit. You will be prompted to fill in the review
362details. Your commit message is already there, so just add cfe-commits
363under the "subscribers" section. It should print a code review URL:
364https://reviews.llvm.org/D58291 You can always find your active reviews
365on Phabricator under "My activity".
366
367
368Review process
369--------------
370
371When you upload a change for review, an email is sent to you, the
372cfe-commits list, and anyone else subscribed to these kinds of changes.
373Within a few days, someone should start the review. They may add
374themselves as a reviewer, or simply start leaving comments. You'll get
375another email any time the review is updated. The details are in the
376`https://llvm.org/docs/CodeReview/ <https://llvm.org/docs/CodeReview.html>`__.
377
378
379Comments
380~~~~~~~~
381
382The reviewer can leave comments on the change, and you can reply. Some
383comments are attached to specific lines, and appear interleaved with the
384code. You can either reply to these, or address them and mark them as
385"done". Note that in-line replies are **not** sent straight away! They
386become "draft" comments and you must click "Submit" at the bottom of the
387page.
388
389
390Updating your change
391~~~~~~~~~~~~~~~~~~~~
392
393If you make changes in response to a reviewer's comments, simply run
394
395.. code:: console
396
397   $ arc diff
398
399again to update the change and notify the reviewer. Typically this is a
400good time to send any draft comments as well.
401
402
403Accepting a revision
404~~~~~~~~~~~~~~~~~~~~
405
406When the reviewer is happy with the change, they will **Accept** the
407revision. They may leave some more minor comments that you should
408address, but at this point the review is complete. It's time to get it
409committed!
410
411
412Commit by proxy
413---------------
414
415As this is your first change, you won't have access to commit it
416yourself yet. The reviewer **doesn't know this**, so you need to tell
417them! Leave a message on the review like:
418
419   Thanks @somellvmdev. I don't have commit access, can you land this
420   patch for me? Please use "My Name my@email" to commit the change.
421
422The review will be updated when the change is committed.
423
424
425Review expectations
426-------------------
427
428In order to make LLVM a long-term sustainable effort, code needs to be
429maintainable and well tested. Code reviews help to achieve that goal.
430Especially for new contributors, that often means many rounds of reviews
431and push-back on design decisions that do not fit well within the
432overall architecture of the project.
433
434For your first patches, this means:
435
436-  be kind, and expect reviewers to be kind in return - LLVM has a `Code
437   of Conduct <https://llvm.org/docs/CodeOfConduct.html>`__;
438
439-  be patient - understanding how a new feature fits into the
440   architecture of the project is often a time consuming effort, and
441   people have to juggle this with other responsibilities in their
442   lives; **ping the review once a week** when there is no response;
443
444-  if you can't agree, generally the best way is to do what the reviewer
445   asks; we optimize for readability of the code, which the reviewer is
446   in a better position to judge; if this feels like it's not the right
447   option, you can contact the cfe-dev mailing list to get more feedback
448   on the direction;
449
450
451Commit access
452=============
453
454Once you've contributed a handful of patches to LLVM, start to think
455about getting commit access yourself. It's probably a good idea if:
456
457-  you've landed 3-5 patches of larger scope than "fix a typo"
458
459-  you'd be willing to review changes that are closely related to yours
460
461-  you'd like to keep contributing to LLVM.
462
463
464Getting commit access
465---------------------
466
467LLVM uses Git for committing changes. The details are in the `developer
468policy
469document <https://llvm.org/docs/DeveloperPolicy.html#obtaining-commit-access>`__.
470
471
472With great power
473----------------
474
475Actually, this would be a great time to read the rest of the `developer
476policy <https://llvm.org/docs/DeveloperPolicy.html>`__, too. At minimum,
477you need to be subscribed to the relevant commits list before landing
478changes (e.g. [email protected]), as discussion often happens
479there if a new patch causes problems.
480
481
482Commit
483------
484
485Let's say you have a change on a local git branch, reviewed and ready to
486commit. Things to do first:
487
488-  if you used multiple fine-grained commits locally, squash them into a
489   single commit. LLVM prefers commits to match the code that was
490   reviewed. (If you created one commit and then used "arc diff", you're
491   fine)
492
493-  rebase your patch against the latest LLVM code. LLVM uses a linear
494   history, so everything should be based on an up-to-date origin/main.
495
496.. code:: console
497
498   $ git pull --rebase https://github.com/llvm/llvm-project.git main
499
500-  ensure the patch looks correct.
501
502.. code:: console
503
504   $ git show
505
506-  run the tests one last time, for good luck
507
508At this point git show should show a single commit on top of
509origin/main.
510
511Now you can push your commit with
512
513.. code:: console
514
515   $ git push https://github.com/llvm/llvm-project.git HEAD:main
516
517You should see your change `on
518GitHub <https://github.com/llvm/llvm-project/commits/main>`__ within
519minutes.
520
521
522Post-commit errors
523------------------
524
525Once your change is submitted it will be picked up by automated build
526bots that will build and test your patch in a variety of configurations.
527
528You can see all configurations and their current state in a waterfall
529view at http://lab.llvm.org/buildbot/#/waterfall. The waterfall view is good
530to get a general overview over the tested configurations and to see
531which configuration have been broken for a while.
532
533The console view at http://lab.llvm.org/buildbot/#/console helps to get a
534better understanding of the build results of a specific patch. If you
535want to follow along how your change is affecting the build bots, **this
536should be the first place to look at** - the colored bubbles correspond
537to projects in the waterfall.
538
539If you see a broken build, do not despair - some build bots are
540continuously broken; if your change broke the build, you will see a red
541bubble in the console view, while an already broken build will show an
542orange bubble. Of course, even when the build was already broken, a new
543change might introduce a hidden new failure.
544
545| When you want to see more details how a specific build is broken,
546  click the red bubble.
547| If post-commit error logs confuse you, do not worry too much -
548  everybody on the project is aware that this is a bit unwieldy, so
549  expect people to jump in and help you understand what's going on!
550
551buildbots, overview of bots, getting error logs.
552
553
554Reverts
555-------
556
557if in doubt, revert and re-land.
558
559
560Conclusion
561==========
562
563llvm is a land of contrasts.
564