mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-13 05:20:27 +00:00
Run the verifier on generated code.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43327 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f92ff03f71
commit
d9b8616c27
@ -400,10 +400,6 @@ last function we compiled.</p>
|
|||||||
Builder.SetInsertPoint(BB);
|
Builder.SetInsertPoint(BB);
|
||||||
|
|
||||||
if (Value *RetVal = Body->Codegen()) {
|
if (Value *RetVal = Body->Codegen()) {
|
||||||
// Finish off the function.
|
|
||||||
Builder.CreateRet(RetVal);
|
|
||||||
return TheFunction;
|
|
||||||
}
|
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
</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
|
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>
|
block so far. We'll fix this in a future installment :).</p>
|
||||||
|
|
||||||
|
<div class="doc_code">
|
||||||
|
<pre>
|
||||||
|
if (Value *RetVal = Body->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
|
<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
|
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
|
compute the expression into the entry block and returns the value that was
|
||||||
computed. Assuming no error, we then create an LLVM <a
|
computed. Assuming no error, we then create an LLVM <a
|
||||||
href="../LangRef.html#i_ret">ret instruction</a>. This completes the function,
|
href="../LangRef.html#i_ret">ret instruction</a>, which completes the function.
|
||||||
which is then returned.</p>
|
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">
|
<div class="doc_code">
|
||||||
<pre>
|
<pre>
|
||||||
@ -625,6 +638,7 @@ our makefile/command line about which options to use:</p>
|
|||||||
|
|
||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
|
#include "llvm/Analysis/Verifier.h"
|
||||||
#include "llvm/Support/LLVMBuilder.h"
|
#include "llvm/Support/LLVMBuilder.h"
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -1071,6 +1085,9 @@ Function *FunctionAST::Codegen() {
|
|||||||
if (Value *RetVal = Body->Codegen()) {
|
if (Value *RetVal = Body->Codegen()) {
|
||||||
// Finish off the function.
|
// Finish off the function.
|
||||||
Builder.CreateRet(RetVal);
|
Builder.CreateRet(RetVal);
|
||||||
|
|
||||||
|
// Validate the generated code, checking for consistency.
|
||||||
|
verifyFunction(*TheFunction);
|
||||||
return TheFunction;
|
return TheFunction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user