Fix srcdir <> objdir builds with ocaml 2.10. Downrev versions don't care whether
[oota-llvm.git] / docs / CodingStandards.html
index 84b9adb66a1b7abc3f099318968d92a0e2a09cef..6cfe5428356e59d6f2950e8dcaad4aac8f29b363 100644 (file)
           <li><a href="#hl_dontinclude">#include as Little as Possible</a></li>
           <li><a href="#hl_privateheaders">Keep "internal" Headers
               Private</a></li>
+          <li><a href="#ll_iostream"><tt>#include &lt;iostream&gt;</tt> is
+              <em>forbidden</em></a></li>
         </ol></li>
       <li><a href="#micro">The Low Level Issues</a>
         <ol>
-          <li><a href="#hl_assert">Assert Liberally</a></li>
-          <li><a href="#hl_ns_std">Do not use 'using namespace std'</a></li>
-          <li><a href="#hl_preincrement">Prefer Preincrement</a></li>
-          <li><a href="#hl_avoidendl">Avoid <tt>std::endl</tt></a></li>
+          <li><a href="#ll_assert">Assert Liberally</a></li>
+          <li><a href="#ll_ns_std">Do not use 'using namespace std'</a></li>
+          <li><a href="#ll_virtual_anch">Provide a virtual method anchor for
+              classes in headers</a></li>
+          <li><a href="#ll_preincrement">Prefer Preincrement</a></li>
+          <li><a href="#ll_avoidendl">Avoid <tt>std::endl</tt></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:sabre@nondot.org">Chris Lattner</a></p>
+  <p>Written by <a href="mailto:sabre@nondot.org">Chris Lattner</a> and
+     <a href="mailto:void@nondot.org">Bill Wendling</a></p>
 </div>
 
 
@@ -117,9 +122,9 @@ documentation is very useful:</p>
 
 <b>File Headers</b>
 
-<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 CVS.  Most source trees will probably have a standard
+<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>
 
@@ -129,7 +134,7 @@ this:</p>
 // 
 //                     The LLVM Compiler Infrastructure
 //
-// This file was developed by the LLVM research group and is distributed under
+// This file was developed by &lt;whoever started the file&gt; and is distributed under
 // the University of Illinois Open Source License. See LICENSE.TXT for details.
 // 
 //===----------------------------------------------------------------------===//
@@ -141,7 +146,9 @@ this:</p>
 </pre>
 </div>
 
-<p>A few things to note about this particular format:  The "<tt>-*- C++
+<p>A few things to note about this particular format:  The 'developed by' line
+should be the name of the person or organization who initially contributed the 
+file.  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 .h files are C files by default).
 Note that this tag is not necessary in .cpp files.  The name of the file is also
@@ -160,7 +167,7 @@ included, as well as any notes or "gotchas" in the code to watch out for.</p>
 
 <b>Class overviews</b>
 
-<p>Classes are one fundemental part of a good object oriented design.  As such,
+<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
@@ -451,7 +458,8 @@ 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, either directly
+<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
 accidently 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
@@ -481,6 +489,90 @@ class itself... just make them private (or protected), and all is well.</p>
 
 </div>
 
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="ll_iostream"><tt>#include &lt;iostream&gt;</tt> is forbidden</a>
+</div>
+
+<div class="doc_text">
+
+<p>The use of <tt>#include &lt;iostream&gt;</tt> in library files is
+hereby <b><em>forbidden</em></b>. The primary reason for doing this is to
+support clients using LLVM libraries as part of larger systems. In particular,
+we statically link LLVM into some dynamic libraries. Even if LLVM isn't used,
+the static c'tors are run whenever an application start up that uses the dynamic
+library. There are two problems with this:</p>
+
+<ol>
+  <li>The time to run the static c'tors impacts startup time of
+      applications&mdash;a critical time for gui apps.</li>
+  <li>The static c'tors cause the app to pull many extra pages of memory off the
+      disk: both the code for the static c'tors in each .o file and the small
+      amount of data that gets touched.  In addition, touched/dirty pages put
+      more pressure on the VM system on low-memory machines.</li>
+</ol>
+
+<div style="align: center">
+<table>
+  <tbody>
+    <tr>
+      <th>Old Way</th>
+      <th>New Way</th>
+    </tr>
+    <tr>
+      <td align="left"><pre>#include &lt;iostream&gt;</pre></td>
+      <td align="left"><pre>#include "llvm/Support/Streams.h"</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>DEBUG(std::cerr &lt;&lt; ...);
+DEBUG(dump(std::cerr));</pre></td>
+      <td align="left"><pre>DOUT &lt;&lt; ...;
+dump(DOUT);</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::cerr &lt;&lt; "Hello world\n";</pre></td>
+      <td align="left"><pre>llvm::cerr &lt;&lt; "Hello world\n";</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::cout &lt;&lt; "Hello world\n";</pre></td>
+      <td align="left"><pre>llvm::cout &lt;&lt; "Hello world\n";</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::cin &gt;&gt; Var;</pre></td>
+      <td align="left"><pre>llvm::cin &gt;&gt; Var;</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::ostream</pre></td>
+      <td align="left"><pre>llvm::OStream</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::istream</pre></td>
+      <td align="left"><pre>llvm::IStream</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>std::stringstream</pre></td>
+      <td align="left"><pre>llvm::StringStream</pre></td>
+    </tr>
+    <tr>
+      <td align="left"><pre>void print(std::ostream &amp;Out);
+// ...
+print(std::cerr);</pre></td>
+      <td align="left"><pre>void print(std::ostream &amp;Out);
+void print(std::ostream *Out) { if (Out) print(*Out) }
+// ...
+print(llvm::cerr);</pre>
+
+<div class="doc_text">
+<i>N.B.</i> The second <tt>print</tt> method is called by the <tt>print</tt>
+expression. It prevents the execution of the first <tt>print</tt> method if the
+stream is <tt>cnull</tt>.</div></td>
+   </tbody>
+</table>
+</div>
+
+</div>
+
+
 <!-- ======================================================================= -->
 <div class="doc_subsection">
   <a name="micro">The Low Level Issues</a>
@@ -489,7 +581,7 @@ class itself... just make them private (or protected), and all is well.</p>
 
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
-  <a name="hl_assert">Assert Liberally</a>
+  <a name="ll_assert">Assert Liberally</a>
 </div>
 
 <div class="doc_text">
@@ -537,42 +629,60 @@ assert(isa&lt;PHINode&gt;(Succ-&gt;front()) &amp;&amp; "Only works on PHId BBs!"
 
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
-  <a name="hl_ns_std">Do not use 'using namespace std'</a>
+  <a name="ll_ns_std">Do not use '<tt>using namespace std</tt>'</a>
 </div>
 
 <div class="doc_text">
 <p>In LLVM, we prefer to explicitly prefix all identifiers from the standard
-namespace with an "std::" prefix, rather than rely on "using namespace std;".
-</p>
+namespace with an "<tt>std::</tt>" prefix, rather than rely on
+"<tt>using namespace std;</tt>".</p>
+
+<p> In header files, adding a '<tt>using namespace XXX</tt>' directive pollutes
+the namespace of any source file that includes the header.  This is clearly a
+bad thing.</p>
+
+<p>In implementation files (e.g. .cpp files), the rule is more of a stylistic
+rule, but is still important.  Basically, using explicit namespace prefixes
+makes the code <b>clearer</b>, because it is immediately obvious what facilities
+are being used and where they are coming from, and <b>more portable</b>, because
+namespace clashes cannot occur between LLVM code and other namespaces.  The
+portability rule is important because different standard library implementations
+expose different symbols (potentially ones they shouldn't), and future revisions
+to the C++ standard will add more symbols to the <tt>std</tt> namespace.  As
+such, we never use '<tt>using namespace std;</tt>' in LLVM.</p>
+
+<p>The exception to the general rule (i.e. it's not an exception for
+the <tt>std</tt> namespace) is for implementation files.  For example, all of
+the code in the LLVM project implements code that lives in the 'llvm' namespace.
+As such, it is ok, and actually clearer, for the .cpp files to have a '<tt>using
+namespace llvm</tt>' directive at their top, after the <tt>#include</tt>s.  The
+general form of this rule is that any .cpp file that implements code in any
+namespace may use that namespace (and its parents'), but should not use any
+others.</p>
 
-<p> In header files, adding a 'using namespace XXX' directive pollutes the 
-namespace of any source file that includes the header.  This is clearly a bad
-thing.</p>
+</div>
 
-<p>In implementation files (e.g. .cpp files) the rule is more of a stylistic
-rule, but is still important.  Basically, using explicit namespace prefixes 
-makes
-the code <b>more clear</b> - because it is immediately obvious what facilities
-are being used and where they are coming from - and <b>more portable</b> -
-because namespace clashes cannot occur between LLVM code and other namespaces.
-The portability rule is important because different standard library 
-implementations expose different symbols (potentially ones they shouldn't) and 
-future revisions to the C++ standard will add more symbols to the std 
-namespace.  As such, we never 'using namespace std;' in LLVM.</p>
+<!-- _______________________________________________________________________ -->
+<div class="doc_subsubsection">
+  <a name="ll_virtual_anch">Provide a virtual method anchor for classes
+  in headers</a>
+</div>
+
+<div class="doc_text">
 
-<p>The exception to the general rule (i.e. it's not an exception for the std 
-namespace) is for implementation files.  For example, all of the code in the
-LLVM project implements code that lives in the 'llvm' namespace.  As such, it
-is ok, and actually more clear, for the .cpp files to have a 'using namespace 
-llvm' directive at their top, after the #includes.  The general form of this
-rule is that any .cpp file that implements code in any namespace may use that
-namespace (and its parents), but should not use any others.</p>
+<p>If a class is defined in a header file and has a v-table (either it has 
+virtual methods or it derives from classes with virtual methods), it must 
+always have at least one out-of-line virtual method in the class.  Without 
+this, the compiler will copy the vtable and RTTI into every .o file that
+#includes the header, bloating .o file sizes and increasing link times.
+</p>
 
 </div>
 
+
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
-  <a name="hl_preincrement">Prefer Preincrement</a>
+  <a name="ll_preincrement">Prefer Preincrement</a>
 </div>
 
 <div class="doc_text">
@@ -592,7 +702,7 @@ get in the habit of always using preincrement, and you won't have a problem.</p>
 
 <!-- _______________________________________________________________________ -->
 <div class="doc_subsubsection">
-  <a name="hl_avoidendl">Avoid <tt>std::endl</tt></a>
+  <a name="ll_avoidendl">Avoid <tt>std::endl</tt></a>
 </div>
 
 <div class="doc_text">
@@ -613,6 +723,7 @@ it's better to use a literal <tt>'\n'</tt>.</p>
 
 </div>
 
+
 <!-- *********************************************************************** -->
 <div class="doc_section">
   <a name="seealso">See Also</a>
@@ -653,7 +764,7 @@ something.</p>
   src="http://www.w3.org/Icons/valid-html401" alt="Valid HTML 4.01!"></a>
 
   <a href="mailto:sabre@nondot.org">Chris Lattner</a><br>
-  <a href="http://llvm.cs.uiuc.edu">LLVM Compiler Infrastructure</a><br>
+  <a href="http://llvm.org">LLVM Compiler Infrastructure</a><br>
   Last modified: $Date$
 </address>