aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-10-25 04:30:35 +0000
committerChris Lattner <sabre@nondot.org>2007-10-25 04:30:35 +0000
commitd9b8616c27e60719c297ce625f09d9b67a3c802c (patch)
tree323f84fc09896f9d408b83336b08b7f9cec7103c
parentf92ff03f7124bdd1da31863a47a0c9af84ef6f23 (diff)
downloadexternal_llvm-d9b8616c27e60719c297ce625f09d9b67a3c802c.zip
external_llvm-d9b8616c27e60719c297ce625f09d9b67a3c802c.tar.gz
external_llvm-d9b8616c27e60719c297ce625f09d9b67a3c802c.tar.bz2
Run the verifier on generated code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43327 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--docs/tutorial/LangImpl3.html29
1 files changed, 23 insertions, 6 deletions
diff --git a/docs/tutorial/LangImpl3.html b/docs/tutorial/LangImpl3.html
index 7e3ed03..49e55d3 100644
--- a/docs/tutorial/LangImpl3.html
+++ b/docs/tutorial/LangImpl3.html
@@ -400,10 +400,6 @@ last function we compiled.</p>
Builder.SetInsertPoint(BB);
if (Value *RetVal = Body-&gt;Codegen()) {
- // Finish off the function.
- Builder.CreateRet(RetVal);
- return TheFunction;
- }
</pre>
</div>
@@ -417,12 +413,29 @@ href="http://en.wikipedia.org/wiki/Control_flow_graph">Control Flow Graph</a>.
Since we don't have any control flow, our functions will only contain one
block so far. We'll fix this in a future installment :).</p>
+<div class="doc_code">
+<pre>
+ if (Value *RetVal = Body-&gt;Codegen()) {
+ // Finish off the function.
+ Builder.CreateRet(RetVal);
+
+ // Validate the generated code, checking for consistency.
+ verifyFunction(*TheFunction);
+ return TheFunction;
+ }
+</pre>
+</div>
+
<p>Once the insertion point is set up, we call the <tt>CodeGen()</tt> method for
the root expression of the function. If no error happens, this emits code to
compute the expression into the entry block and returns the value that was
computed. Assuming no error, we then create an LLVM <a
-href="../LangRef.html#i_ret">ret instruction</a>. This completes the function,
-which is then returned.</p>
+href="../LangRef.html#i_ret">ret instruction</a>, which completes the function.
+Once the function is built, we call the <tt>verifyFunction</tt> function, which
+is provided by LLVM. This function does a variety of consistency checks on the
+generated code, to determine if our compiler is doing everything right. Using
+this is important: it can catch a lot of bugs. Once the function is finished
+and validated, we return it.</p>
<div class="doc_code">
<pre>
@@ -625,6 +638,7 @@ our makefile/command line about which options to use:</p>
#include "llvm/DerivedTypes.h"
#include "llvm/Module.h"
+#include "llvm/Analysis/Verifier.h"
#include "llvm/Support/LLVMBuilder.h"
#include &lt;cstdio&gt;
#include &lt;string&gt;
@@ -1071,6 +1085,9 @@ Function *FunctionAST::Codegen() {
if (Value *RetVal = Body-&gt;Codegen()) {
// Finish off the function.
Builder.CreateRet(RetVal);
+
+ // Validate the generated code, checking for consistency.
+ verifyFunction(*TheFunction);
return TheFunction;
}