From d9b8616c27e60719c297ce625f09d9b67a3c802c Mon Sep 17 00:00:00 2001
From: Chris Lattner
+ if (Value *RetVal = Body->Codegen()) { + // Finish off the function. + Builder.CreateRet(RetVal); + + // Validate the generated code, checking for consistency. + verifyFunction(*TheFunction); + return TheFunction; + } ++
Once the insertion point is set up, we call the CodeGen() 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 ret instruction. This completes the function, -which is then returned.
+href="../LangRef.html#i_ret">ret instruction, which completes the function. +Once the function is built, we call the verifyFunction 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.@@ -625,6 +638,7 @@ our makefile/command line about which options to use: #include "llvm/DerivedTypes.h" #include "llvm/Module.h" +#include "llvm/Analysis/Verifier.h" #include "llvm/Support/LLVMBuilder.h" #include <cstdio> #include <string> @@ -1071,6 +1085,9 @@ Function *FunctionAST::Codegen() { if (Value *RetVal = Body->Codegen()) { // Finish off the function. Builder.CreateRet(RetVal); + + // Validate the generated code, checking for consistency. + verifyFunction(*TheFunction); return TheFunction; }