[llvm-commits] CVS: llvm/www/docs/ProgrammersManual.html

Chris Lattner lattner at cs.uiuc.edu
Tue Sep 10 10:21:01 PDT 2002

Changes in directory llvm/www/docs:

ProgrammersManual.html updated: 1.18 -> 1.19

Log message:

Finish up the isa/cast/dyn_cast section

Diffs of the changes:

Index: llvm/www/docs/ProgrammersManual.html
diff -u llvm/www/docs/ProgrammersManual.html:1.18 llvm/www/docs/ProgrammersManual.html:1.19
--- llvm/www/docs/ProgrammersManual.html:1.18	Mon Sep  9 19:39:05 2002
+++ llvm/www/docs/ProgrammersManual.html	Tue Sep 10 10:20:46 2002
@@ -97,8 +97,8 @@
     <li>Important iterator invalidation semantics to be aware of
-  <p><b>Written by <a href="mailto:dhurjati at cs.uiuc.edu">Dinakar Dhurjati</a>
-      <a href="mailto:sabre at nondot.org">Chris Lattner</a>, and
+  <p><b>Written by <a href="mailto:sabre at nondot.org">Chris Lattner</a>,
+        <a href="mailto:dhurjati at cs.uiuc.edu">Dinakar Dhurjati</a>, and
       <a href="mailto:jstanley at cs.uiuc.edu">Joel Stanley</a></b><p>
@@ -235,7 +235,20 @@
 pointer to it (this operator does not work with references).  If the operand is
 not of the correct type, a null pointer is returned.  Thus, this works very much
 like the <tt>dynamic_cast</tt> operator in C++, and should be used in the same
-circumstances.  An example is:<p>
+circumstances.  Typically, the <tt>dyn_cast<></tt> operator is used in an
+<tt>if</tt> statement or some other flow control statement like this:<p>
+  if (<a href="#AllocationInst">AllocationInst</a> *AI = dyn_cast<<a href="#AllocationInst">AllocationInst</a>>(Val)) {
+    ...
+  }
+This form of the <tt>if</tt> statement effectively combines together a call to
+<tt>isa<></tt> and a call to <tt>cast<></tt> into one statement,
+which is very convenient.<p>
+Another common example is:<p>
   <i>// Loop over all of the phi nodes in a basic block</i>
@@ -244,12 +257,36 @@
     cerr << *PN;
-Note that you should not use the <tt>dyn_cast<></tt> operator in a series
-of chained if statements, use an visitor instead... FIXME: continue.<p>
+Note that the <tt>dyn_cast<></tt> operator, like C++'s
+<tt>dynamic_cast</tt> or Java's <tt>instanceof</tt> operator, can be abused.  In
+particular you should not use big chained <tt>if/then/else</tt> blocks to check
+for lots of different variants of classes.  If you find yourself wanting to do
+this, it is much cleaner and more efficient to use the InstVisitor class to
+dispatch over the instruction type directly.<p>
+<dd>The <tt>cast_or_null<></tt> operator works just like the
+<tt>cast<></tt> operator, except that it allows for a null pointer as an
+argument (which it then propogates).  This can sometimes be useful, allowing you
+to combine several null checks into one.<p>
+<dd>The <tt>dyn_cast_or_null<></tt> operator works just like the
+<tt>dyn_cast<></tt> operator, except that it allows for a null pointer as
+an argument (which it then propogates).  This can sometimes be useful, allowing
+you to combine several null checks into one.<p>
+These five templates can be used with any classes, whether they have a v-table
+or not.  To add support for these templates, you simply need to add
+<tt>classof</tt> static methods to the class you are interested casting to.
+Describing this is currently outside the scope of this document, but there are
+lots of examples in the LLVM sourcebase.<p>
@@ -1352,6 +1389,6 @@
 <a href="mailto:sabre at nondot.org">Chris Lattner</a></address>
 <!-- Created: Tue Aug  6 15:00:33 CDT 2002 -->
 <!-- hhmts start -->
-Last modified: Mon Sep  9 19:38:23 CDT 2002
+Last modified: Tue Sep 10 10:19:56 CDT 2002
 <!-- hhmts end -->

More information about the llvm-commits mailing list