forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CodingStandards.html
1534 lines (1216 loc) · 53.1 KB
/
CodingStandards.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="llvm.css" type="text/css">
<title>LLVM Coding Standards</title>
</head>
<body>
<h1>
LLVM Coding Standards
</h1>
<ol>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#mechanicalissues">Mechanical Source Issues</a>
<ol>
<li><a href="#sourceformating">Source Code Formatting</a>
<ol>
<li><a href="#scf_commenting">Commenting</a></li>
<li><a href="#scf_commentformat">Comment Formatting</a></li>
<li><a href="#scf_includes"><tt>#include</tt> Style</a></li>
<li><a href="#scf_codewidth">Source Code Width</a></li>
<li><a href="#scf_spacestabs">Use Spaces Instead of Tabs</a></li>
<li><a href="#scf_indentation">Indent Code Consistently</a></li>
</ol></li>
<li><a href="#compilerissues">Compiler Issues</a>
<ol>
<li><a href="#ci_warningerrors">Treat Compiler Warnings Like
Errors</a></li>
<li><a href="#ci_portable_code">Write Portable Code</a></li>
<li><a href="#ci_rtti_exceptions">Do not use RTTI or Exceptions</a></li>
<li><a href="#ci_class_struct">Use of <tt>class</tt>/<tt>struct</tt> Keywords</a></li>
</ol></li>
</ol></li>
<li><a href="#styleissues">Style Issues</a>
<ol>
<li><a href="#macro">The High-Level Issues</a>
<ol>
<li><a href="#hl_module">A Public Header File <b>is</b> a
Module</a></li>
<li><a href="#hl_dontinclude"><tt>#include</tt> as Little as Possible</a></li>
<li><a href="#hl_privateheaders">Keep "internal" Headers
Private</a></li>
<li><a href="#hl_earlyexit">Use Early Exits and <tt>continue</tt> to Simplify
Code</a></li>
<li><a href="#hl_else_after_return">Don't use <tt>else</tt> after a
<tt>return</tt></a></li>
<li><a href="#hl_predicateloops">Turn Predicate Loops into Predicate
Functions</a></li>
</ol></li>
<li><a href="#micro">The Low-Level Issues</a>
<ol>
<li><a href="#ll_naming">Name Types, Functions, Variables, and Enumerators Properly</a></li>
<li><a href="#ll_assert">Assert Liberally</a></li>
<li><a href="#ll_ns_std">Do not use '<tt>using namespace std</tt>'</a></li>
<li><a href="#ll_virtual_anch">Provide a virtual method anchor for
classes in headers</a></li>
<li><a href="#ll_end">Don't evaluate <tt>end()</tt> every time through a
loop</a></li>
<li><a href="#ll_iostream"><tt>#include <iostream></tt> is
<em>forbidden</em></a></li>
<li><a href="#ll_raw_ostream">Use <tt>raw_ostream</tt></a></li>
<li><a href="#ll_avoidendl">Avoid <tt>std::endl</tt></a></li>
</ol></li>
<li><a href="#nano">Microscopic Details</a>
<ol>
<li><a href="#micro_spaceparen">Spaces Before Parentheses</a></li>
<li><a href="#micro_preincrement">Prefer Preincrement</a></li>
<li><a href="#micro_namespaceindent">Namespace Indentation</a></li>
<li><a href="#micro_anonns">Anonymous Namespaces</a></li>
</ol></li>
</ol></li>
<li><a href="#seealso">See Also</a></li>
</ol>
<div class="doc_author">
<p>Written by <a href="mailto:[email protected]">Chris Lattner</a></p>
</div>
<!-- *********************************************************************** -->
<h2>
<a name="introduction">Introduction</a>
</h2>
<!-- *********************************************************************** -->
<div>
<p>This document attempts to describe a few coding standards that are being used
in the LLVM source tree. Although no coding standards should be regarded as
absolute requirements to be followed in all instances, coding standards can be
useful.</p>
<p>This document intentionally does not prescribe fixed standards for religious
issues such as brace placement and space usage. For issues like this, follow
the golden rule:</p>
<blockquote>
<p><b><a name="goldenrule">If you are adding a significant body of source to a
project, feel free to use whatever style you are most comfortable with. If you
are extending, enhancing, or bug fixing already implemented code, use the style
that is already being used so that the source is uniform and easy to
follow.</a></b></p>
</blockquote>
<p>The ultimate goal of these guidelines is the increase readability and
maintainability of our common source base. If you have suggestions for topics to
be included, please mail them to <a
href="mailto:[email protected]">Chris</a>.</p>
</div>
<!-- *********************************************************************** -->
<h2>
<a name="mechanicalissues">Mechanical Source Issues</a>
</h2>
<!-- *********************************************************************** -->
<div>
<!-- ======================================================================= -->
<h3>
<a name="sourceformating">Source Code Formatting</a>
</h3>
<div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_commenting">Commenting</a>
</h4>
<div>
<p>Comments are one critical part of readability and maintainability. Everyone
knows they should comment, so should you. When writing comments, write them as
English prose, which means they should use proper capitalization, punctuation,
etc. Although we all should probably
comment our code more than we do, there are a few very critical places that
documentation is very useful:</p>
<h5>File Headers</h5>
<div>
<p>Every source file should have a header on it that describes the basic
purpose of the file. If a file does not have a header, it should not be
checked into Subversion. Most source trees will probably have a standard
file header format. The standard format for the LLVM source tree looks like
this:</p>
<div class="doc_code">
<pre>
//===-- llvm/Instruction.h - Instruction class definition -------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the declaration of the Instruction class, which is the
// base class for all of the VM instructions.
//
//===----------------------------------------------------------------------===//
</pre>
</div>
<p>A few things to note about this particular format: The "<tt>-*- C++
-*-</tt>" string on the first line is there to tell Emacs that the source file
is a C++ file, not a C file (Emacs assumes <tt>.h</tt> files are C files by default).
Note that this tag is not necessary in <tt>.cpp</tt> files. The name of the file is also
on the first line, along with a very short description of the purpose of the
file. This is important when printing out code and flipping though lots of
pages.</p>
<p>The next section in the file is a concise note that defines the license
that the file is released under. This makes it perfectly clear what terms the
source code can be distributed under and should not be modified in any way.</p>
<p>The main body of the description does not have to be very long in most cases.
Here it's only two lines. If an algorithm is being implemented or something
tricky is going on, a reference to the paper where it is published should be
included, as well as any notes or "gotchas" in the code to watch out for.</p>
</div>
<h5>Class overviews</h5>
<p>Classes are one fundamental part of a good object oriented design. As such,
a class definition should have a comment block that explains what the class is
used for... if it's not obvious. If it's so completely obvious your grandma
could figure it out, it's probably safe to leave it out. Naming classes
something sane goes a long ways towards avoiding writing documentation.</p>
<h5>Method information</h5>
<div>
<p>Methods defined in a class (as well as any global functions) should also be
documented properly. A quick note about what it does and a description of the
borderline behaviour is all that is necessary here (unless something
particularly tricky or insidious is going on). The hope is that people can
figure out how to use your interfaces without reading the code itself... that is
the goal metric.</p>
<p>Good things to talk about here are what happens when something unexpected
happens: does the method return null? Abort? Format your hard disk?</p>
</div>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_commentformat">Comment Formatting</a>
</h4>
<div>
<p>In general, prefer C++ style (<tt>//</tt>) comments. They take less space,
require less typing, don't have nesting problems, etc. There are a few cases
when it is useful to use C style (<tt>/* */</tt>) comments however:</p>
<ol>
<li>When writing C code: Obviously if you are writing C code, use C style
comments.</li>
<li>When writing a header file that may be <tt>#include</tt>d by a C source
file.</li>
<li>When writing a source file that is used by a tool that only accepts C
style comments.</li>
</ol>
<p>To comment out a large block of code, use <tt>#if 0</tt> and <tt>#endif</tt>.
These nest properly and are better behaved in general than C style comments.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_includes"><tt>#include</tt> Style</a>
</h4>
<div>
<p>Immediately after the <a href="#scf_commenting">header file comment</a> (and
include guards if working on a header file), the <a
href="#hl_dontinclude">minimal</a> list of <tt>#include</tt>s required by the
file should be listed. We prefer these <tt>#include</tt>s to be listed in this
order:</p>
<ol>
<li><a href="#mmheader">Main Module Header</a></li>
<li><a href="#hl_privateheaders">Local/Private Headers</a></li>
<li><tt>llvm/*</tt></li>
<li><tt>llvm/Analysis/*</tt></li>
<li><tt>llvm/Assembly/*</tt></li>
<li><tt>llvm/Bitcode/*</tt></li>
<li><tt>llvm/CodeGen/*</tt></li>
<li>...</li>
<li><tt>Support/*</tt></li>
<li><tt>Config/*</tt></li>
<li>System <tt>#includes</tt></li>
</ol>
<p>and each category should be sorted by name.</p>
<p><a name="mmheader">The "Main Module Header"</a> file applies to <tt>.cpp</tt> files
which implement an interface defined by a <tt>.h</tt> file. This <tt>#include</tt>
should always be included <b>first</b> regardless of where it lives on the file
system. By including a header file first in the <tt>.cpp</tt> files that implement the
interfaces, we ensure that the header does not have any hidden dependencies
which are not explicitly #included in the header, but should be. It is also a
form of documentation in the <tt>.cpp</tt> file to indicate where the interfaces it
implements are defined.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_codewidth">Source Code Width</a>
</h4>
<div>
<p>Write your code to fit within 80 columns of text. This helps those of us who
like to print out code and look at your code in an xterm without resizing
it.</p>
<p>The longer answer is that there must be some limit to the width of the code
in order to reasonably allow developers to have multiple files side-by-side in
windows on a modest display. If you are going to pick a width limit, it is
somewhat arbitrary but you might as well pick something standard. Going with
90 columns (for example) instead of 80 columns wouldn't add any significant
value and would be detrimental to printing out code. Also many other projects
have standardized on 80 columns, so some people have already configured their
editors for it (vs something else, like 90 columns).</p>
<p>This is one of many contentious issues in coding standards, but it is not up
for debate.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_spacestabs">Use Spaces Instead of Tabs</a>
</h4>
<div>
<p>In all cases, prefer spaces to tabs in source files. People have different
preferred indentation levels, and different styles of indentation that they
like; this is fine. What isn't fine is that different editors/viewers expand
tabs out to different tab stops. This can cause your code to look completely
unreadable, and it is not worth dealing with.</p>
<p>As always, follow the <a href="#goldenrule">Golden Rule</a> above: follow the
style of existing code if you are modifying and extending it. If you like four
spaces of indentation, <b>DO NOT</b> do that in the middle of a chunk of code
with two spaces of indentation. Also, do not reindent a whole source file: it
makes for incredible diffs that are absolutely worthless.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="scf_indentation">Indent Code Consistently</a>
</h4>
<div>
<p>Okay, in your first year of programming you were told that indentation is
important. If you didn't believe and internalize this then, now is the time.
Just do it.</p>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="compilerissues">Compiler Issues</a>
</h3>
<div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ci_warningerrors">Treat Compiler Warnings Like Errors</a>
</h4>
<div>
<p>If your code has compiler warnings in it, something is wrong — you
aren't casting values correctly, your have "questionable" constructs in your
code, or you are doing something legitimately wrong. Compiler warnings can
cover up legitimate errors in output and make dealing with a translation unit
difficult.</p>
<p>It is not possible to prevent all warnings from all compilers, nor is it
desirable. Instead, pick a standard compiler (like <tt>gcc</tt>) that provides
a good thorough set of warnings, and stick to it. At least in the case of
<tt>gcc</tt>, it is possible to work around any spurious errors by changing the
syntax of the code slightly. For example, a warning that annoys me occurs when
I write code like this:</p>
<div class="doc_code">
<pre>
if (V = getValue()) {
...
}
</pre>
</div>
<p><tt>gcc</tt> will warn me that I probably want to use the <tt>==</tt>
operator, and that I probably mistyped it. In most cases, I haven't, and I
really don't want the spurious errors. To fix this particular problem, I
rewrite the code like this:</p>
<div class="doc_code">
<pre>
if ((V = getValue())) {
...
}
</pre>
</div>
<p>which shuts <tt>gcc</tt> up. Any <tt>gcc</tt> warning that annoys you can
be fixed by massaging the code appropriately.</p>
<p>These are the <tt>gcc</tt> warnings that I prefer to enable:</p>
<div class="doc_code">
<pre>
-Wall -Winline -W -Wwrite-strings -Wno-unused
</pre>
</div>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ci_portable_code">Write Portable Code</a>
</h4>
<div>
<p>In almost all cases, it is possible and within reason to write completely
portable code. If there are cases where it isn't possible to write portable
code, isolate it behind a well defined (and well documented) interface.</p>
<p>In practice, this means that you shouldn't assume much about the host
compiler, and Visual Studio tends to be the lowest common denominator.
If advanced features are used, they should only be an implementation detail of
a library which has a simple exposed API, and preferably be buried in
libSystem.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ci_rtti_exceptions">Do not use RTTI or Exceptions</a>
</h4>
<div>
<p>In an effort to reduce code and executable size, LLVM does not use RTTI
(e.g. <tt>dynamic_cast<></tt>) or exceptions. These two language features
violate the general C++ principle of <i>"you only pay for what you use"</i>,
causing executable bloat even if exceptions are never used in the code base, or
if RTTI is never used for a class. Because of this, we turn them off globally
in the code.</p>
<p>That said, LLVM does make extensive use of a hand-rolled form of RTTI that
use templates like <a href="ProgrammersManual.html#isa"><tt>isa<></tt>,
<tt>cast<></tt>, and <tt>dyn_cast<></tt></a>. This form of RTTI is
opt-in and can be added to any class. It is also substantially more efficient
than <tt>dynamic_cast<></tt>.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ci_class_struct">Use of <tt>class</tt> and <tt>struct</tt> Keywords</a>
</h4>
<div>
<p>In C++, the <tt>class</tt> and <tt>struct</tt> keywords can be used almost
interchangeably. The only difference is when they are used to declare a class:
<tt>class</tt> makes all members private by default while <tt>struct</tt> makes
all members public by default.</p>
<p>Unfortunately, not all compilers follow the rules and some will generate
different symbols based on whether <tt>class</tt> or <tt>struct</tt> was used to
declare the symbol. This can lead to problems at link time.</p>
<p>So, the rule for LLVM is to always use the <tt>class</tt> keyword, unless
<b>all</b> members are public and the type is a C++
<a href="http://en.wikipedia.org/wiki/Plain_old_data_structure">POD</a> type, in
which case <tt>struct</tt> is allowed.</p>
</div>
</div>
</div>
<!-- *********************************************************************** -->
<h2>
<a name="styleissues">Style Issues</a>
</h2>
<!-- *********************************************************************** -->
<div>
<!-- ======================================================================= -->
<h3>
<a name="macro">The High-Level Issues</a>
</h3>
<!-- ======================================================================= -->
<div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_module">A Public Header File <b>is</b> a Module</a>
</h4>
<div>
<p>C++ doesn't do too well in the modularity department. There is no real
encapsulation or data hiding (unless you use expensive protocol classes), but it
is what we have to work with. When you write a public header file (in the LLVM
source tree, they live in the top level "<tt>include</tt>" directory), you are
defining a module of functionality.</p>
<p>Ideally, modules should be completely independent of each other, and their
header files should only <tt>#include</tt> the absolute minimum number of
headers possible. A module is not just a class, a function, or a
namespace: <a href="http://www.cuj.com/articles/2000/0002/0002c/0002c.htm">it's
a collection of these</a> that defines an interface. This interface may be
several functions, classes, or data structures, but the important issue is how
they work together.</p>
<p>In general, a module should be implemented by one or more <tt>.cpp</tt>
files. Each of these <tt>.cpp</tt> files should include the header that defines
their interface first. This ensures that all of the dependences of the module
header have been properly added to the module header itself, and are not
implicit. System headers should be included after user headers for a
translation unit.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_dontinclude"><tt>#include</tt> as Little as Possible</a>
</h4>
<div>
<p><tt>#include</tt> hurts compile time performance. Don't do it unless you
have to, especially in header files.</p>
<p>But wait! Sometimes you need to have the definition of a class to use it, or
to inherit from it. In these cases go ahead and <tt>#include</tt> that header
file. Be aware however that there are many cases where you don't need to have
the full definition of a class. If you are using a pointer or reference to a
class, you don't need the header file. If you are simply returning a class
instance from a prototyped function or method, you don't need it. In fact, for
most cases, you simply don't need the definition of a class. And not
<tt>#include</tt>'ing speeds up compilation.</p>
<p>It is easy to try to go too overboard on this recommendation, however. You
<b>must</b> include all of the header files that you are using — you can
include them either directly or indirectly (through another header file). To
make sure that you don't accidentally forget to include a header file in your
module header, make sure to include your module header <b>first</b> in the
implementation file (as mentioned above). This way there won't be any hidden
dependencies that you'll find out about later.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_privateheaders">Keep "Internal" Headers Private</a>
</h4>
<div>
<p>Many modules have a complex implementation that causes them to use more than
one implementation (<tt>.cpp</tt>) file. It is often tempting to put the
internal communication interface (helper classes, extra functions, etc) in the
public module header file. Don't do this!</p>
<p>If you really need to do something like this, put a private header file in
the same directory as the source files, and include it locally. This ensures
that your private interface remains private and undisturbed by outsiders.</p>
<p>Note however, that it's okay to put extra implementation methods in a public
class itself. Just make them private (or protected) and all is well.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_earlyexit">Use Early Exits and <tt>continue</tt> to Simplify Code</a>
</h4>
<div>
<p>When reading code, keep in mind how much state and how many previous
decisions have to be remembered by the reader to understand a block of code.
Aim to reduce indentation where possible when it doesn't make it more difficult
to understand the code. One great way to do this is by making use of early
exits and the <tt>continue</tt> keyword in long loops. As an example of using
an early exit from a function, consider this "bad" code:</p>
<div class="doc_code">
<pre>
Value *DoSomething(Instruction *I) {
if (!isa<TerminatorInst>(I) &&
I->hasOneUse() && SomeOtherThing(I)) {
... some long code ....
}
return 0;
}
</pre>
</div>
<p>This code has several problems if the body of the '<tt>if</tt>' is large.
When you're looking at the top of the function, it isn't immediately clear that
this <em>only</em> does interesting things with non-terminator instructions, and
only applies to things with the other predicates. Second, it is relatively
difficult to describe (in comments) why these predicates are important because
the <tt>if</tt> statement makes it difficult to lay out the comments. Third,
when you're deep within the body of the code, it is indented an extra level.
Finally, when reading the top of the function, it isn't clear what the result is
if the predicate isn't true; you have to read to the end of the function to know
that it returns null.</p>
<p>It is much preferred to format the code like this:</p>
<div class="doc_code">
<pre>
Value *DoSomething(Instruction *I) {
// Terminators never need 'something' done to them because ...
if (isa<TerminatorInst>(I))
return 0;
// We conservatively avoid transforming instructions with multiple uses
// because goats like cheese.
if (!I->hasOneUse())
return 0;
// This is really just here for example.
if (!SomeOtherThing(I))
return 0;
... some long code ....
}
</pre>
</div>
<p>This fixes these problems. A similar problem frequently happens in <tt>for</tt>
loops. A silly example is something like this:</p>
<div class="doc_code">
<pre>
for (BasicBlock::iterator II = BB->begin(), E = BB->end(); II != E; ++II) {
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(II)) {
Value *LHS = BO->getOperand(0);
Value *RHS = BO->getOperand(1);
if (LHS != RHS) {
...
}
}
}
</pre>
</div>
<p>When you have very, very small loops, this sort of structure is fine. But if
it exceeds more than 10-15 lines, it becomes difficult for people to read and
understand at a glance. The problem with this sort of code is that it gets very
nested very quickly. Meaning that the reader of the code has to keep a lot of
context in their brain to remember what is going immediately on in the loop,
because they don't know if/when the <tt>if</tt> conditions will have elses etc.
It is strongly preferred to structure the loop like this:</p>
<div class="doc_code">
<pre>
for (BasicBlock::iterator II = BB->begin(), E = BB->end(); II != E; ++II) {
BinaryOperator *BO = dyn_cast<BinaryOperator>(II);
if (!BO) continue;
Value *LHS = BO->getOperand(0);
Value *RHS = BO->getOperand(1);
if (LHS == RHS) continue;
...
}
</pre>
</div>
<p>This has all the benefits of using early exits for functions: it reduces
nesting of the loop, it makes it easier to describe why the conditions are true,
and it makes it obvious to the reader that there is no <tt>else</tt> coming up
that they have to push context into their brain for. If a loop is large, this
can be a big understandability win.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_else_after_return">Don't use <tt>else</tt> after a <tt>return</tt></a>
</h4>
<div>
<p>For similar reasons above (reduction of indentation and easier reading),
please do not use '<tt>else</tt>' or '<tt>else if</tt>' after something that
interrupts control flow — like <tt>return</tt>, <tt>break</tt>,
<tt>continue</tt>, <tt>goto</tt>, etc. For example, this is <em>bad</em>:</p>
<div class="doc_code">
<pre>
case 'J': {
if (Signed) {
Type = Context.getsigjmp_bufType();
if (Type.isNull()) {
Error = ASTContext::GE_Missing_sigjmp_buf;
return QualType();
<b>} else {
break;
}</b>
} else {
Type = Context.getjmp_bufType();
if (Type.isNull()) {
Error = ASTContext::GE_Missing_jmp_buf;
return QualType();
<b>} else {
break;
}</b>
}
}
}
</pre>
</div>
<p>It is better to write it like this:</p>
<div class="doc_code">
<pre>
case 'J':
if (Signed) {
Type = Context.getsigjmp_bufType();
if (Type.isNull()) {
Error = ASTContext::GE_Missing_sigjmp_buf;
return QualType();
}
} else {
Type = Context.getjmp_bufType();
if (Type.isNull()) {
Error = ASTContext::GE_Missing_jmp_buf;
return QualType();
}
}
<b>break;</b>
</pre>
</div>
<p>Or better yet (in this case) as:</p>
<div class="doc_code">
<pre>
case 'J':
if (Signed)
Type = Context.getsigjmp_bufType();
else
Type = Context.getjmp_bufType();
if (Type.isNull()) {
Error = Signed ? ASTContext::GE_Missing_sigjmp_buf :
ASTContext::GE_Missing_jmp_buf;
return QualType();
}
<b>break;</b>
</pre>
</div>
<p>The idea is to reduce indentation and the amount of code you have to keep
track of when reading the code.</p>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="hl_predicateloops">Turn Predicate Loops into Predicate Functions</a>
</h4>
<div>
<p>It is very common to write small loops that just compute a boolean value.
There are a number of ways that people commonly write these, but an example of
this sort of thing is:</p>
<div class="doc_code">
<pre>
<b>bool FoundFoo = false;</b>
for (unsigned i = 0, e = BarList.size(); i != e; ++i)
if (BarList[i]->isFoo()) {
<b>FoundFoo = true;</b>
break;
}
<b>if (FoundFoo) {</b>
...
}
</pre>
</div>
<p>This sort of code is awkward to write, and is almost always a bad sign.
Instead of this sort of loop, we strongly prefer to use a predicate function
(which may be <a href="#micro_anonns">static</a>) that uses
<a href="#hl_earlyexit">early exits</a> to compute the predicate. We prefer
the code to be structured like this:</p>
<div class="doc_code">
<pre>
/// ListContainsFoo - Return true if the specified list has an element that is
/// a foo.
static bool ListContainsFoo(const std::vector<Bar*> &List) {
for (unsigned i = 0, e = List.size(); i != e; ++i)
if (List[i]->isFoo())
return true;
return false;
}
...
<b>if (ListContainsFoo(BarList)) {</b>
...
}
</pre>
</div>
<p>There are many reasons for doing this: it reduces indentation and factors out
code which can often be shared by other code that checks for the same predicate.
More importantly, it <em>forces you to pick a name</em> for the function, and
forces you to write a comment for it. In this silly example, this doesn't add
much value. However, if the condition is complex, this can make it a lot easier
for the reader to understand the code that queries for this predicate. Instead
of being faced with the in-line details of how we check to see if the BarList
contains a foo, we can trust the function name and continue reading with better
locality.</p>
</div>
</div>
<!-- ======================================================================= -->
<h3>
<a name="micro">The Low-Level Issues</a>
</h3>
<!-- ======================================================================= -->
<div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ll_naming">
Name Types, Functions, Variables, and Enumerators Properly
</a>
</h4>
<div>
<p>Poorly-chosen names can mislead the reader and cause bugs. We cannot stress
enough how important it is to use <em>descriptive</em> names. Pick names that
match the semantics and role of the underlying entities, within reason. Avoid
abbreviations unless they are well known. After picking a good name, make sure
to use consistent capitalization for the name, as inconsistency requires clients
to either memorize the APIs or to look it up to find the exact spelling.</p>
<p>In general, names should be in camel case (e.g. <tt>TextFileReader</tt>
and <tt>isLValue()</tt>). Different kinds of declarations have different
rules:</p>
<ul>
<li><p><b>Type names</b> (including classes, structs, enums, typedefs, etc)
should be nouns and start with an upper-case letter (e.g.
<tt>TextFileReader</tt>).</p></li>
<li><p><b>Variable names</b> should be nouns (as they represent state). The
name should be camel case, and start with an upper case letter (e.g.
<tt>Leader</tt> or <tt>Boats</tt>).</p></li>
<li><p><b>Function names</b> should be verb phrases (as they represent
actions), and command-like function should be imperative. The name should
be camel case, and start with a lower case letter (e.g. <tt>openFile()</tt>
or <tt>isFoo()</tt>).</p></li>
<li><p><b>Enum declarations</b> (e.g. <tt>enum Foo {...}</tt>) are types, so
they should follow the naming conventions for types. A common use for enums
is as a discriminator for a union, or an indicator of a subclass. When an
enum is used for something like this, it should have a <tt>Kind</tt> suffix
(e.g. <tt>ValueKind</tt>).</p></li>
<li><p><b>Enumerators</b> (e.g. <tt>enum { Foo, Bar }</tt>) and <b>public member
variables</b> should start with an upper-case letter, just like types.
Unless the enumerators are defined in their own small namespace or inside a
class, enumerators should have a prefix corresponding to the enum
declaration name. For example, <tt>enum ValueKind { ... };</tt> may contain
enumerators like <tt>VK_Argument</tt>, <tt>VK_BasicBlock</tt>, etc.
Enumerators that are just convenience constants are exempt from the
requirement for a prefix. For instance:</p>
<div class="doc_code">
<pre>
enum {
MaxSize = 42,
Density = 12
};
</pre>
</div>
</li>
</ul>
<p>As an exception, classes that mimic STL classes can have member names in
STL's style of lower-case words separated by underscores (e.g. <tt>begin()</tt>,
<tt>push_back()</tt>, and <tt>empty()</tt>).</p>
<p>Here are some examples of good and bad names:</p>
<div class="doc_code">
<pre>
class VehicleMaker {
...
Factory<Tire> F; // Bad -- abbreviation and non-descriptive.
Factory<Tire> Factory; // Better.
Factory<Tire> TireFactory; // Even better -- if VehicleMaker has more than one
// kind of factories.
};
Vehicle MakeVehicle(VehicleType Type) {
VehicleMaker M; // Might be OK if having a short life-span.
Tire tmp1 = M.makeTire(); // Bad -- 'tmp1' provides no information.
Light headlight = M.makeLight("head"); // Good -- descriptive.
...
}
</pre>
</div>
</div>
<!-- _______________________________________________________________________ -->
<h4>
<a name="ll_assert">Assert Liberally</a>
</h4>
<div>
<p>Use the "<tt>assert</tt>" macro to its fullest. Check all of your
preconditions and assumptions, you never know when a bug (not necessarily even
yours) might be caught early by an assertion, which reduces debugging time
dramatically. The "<tt><cassert></tt>" header file is probably already
included by the header files you are using, so it doesn't cost anything to use
it.</p>
<p>To further assist with debugging, make sure to put some kind of error message
in the assertion statement, which is printed if the assertion is tripped. This
helps the poor debugger make sense of why an assertion is being made and
enforced, and hopefully what to do about it. Here is one complete example:</p>
<div class="doc_code">
<pre>
inline Value *getOperand(unsigned i) {
assert(i < Operands.size() && "getOperand() out of range!");
return Operands[i];
}
</pre>
</div>
<p>Here are more examples:</p>
<div class="doc_code">
<pre>
assert(Ty->isPointerType() && "Can't allocate a non pointer type!");
assert((Opcode == Shl || Opcode == Shr) && "ShiftInst Opcode invalid!");
assert(idx < getNumSuccessors() && "Successor # out of range!");
assert(V1.getType() == V2.getType() && "Constant types must be identical!");
assert(isa<PHINode>(Succ->front()) && "Only works on PHId BBs!");
</pre>
</div>
<p>You get the idea.</p>
<p>Please be aware that, when adding assert statements, not all compilers are aware of
the semantics of the assert. In some places, asserts are used to indicate a piece of
code that should not be reached. These are typically of the form:</p>
<div class="doc_code">
<pre>
assert(0 && "Some helpful error message");
</pre>
</div>
<p>When used in a function that returns a value, they should be followed with a return
statement and a comment indicating that this line is never reached. This will prevent
a compiler which is unable to deduce that the assert statement never returns from
generating a warning.</p>
<div class="doc_code">
<pre>
assert(0 && "Some helpful error message");
// Not reached
return 0;
</pre>
</div>
<p>Another issue is that values used only by assertions will produce an "unused
value" warning when assertions are disabled. For example, this code will
warn:</p>
<div class="doc_code">
<pre>
unsigned Size = V.size();