#include <llvm/PassManager.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/Assembly/PrintModulePass.h>
-#include <llvm/Support/LLVMBuilder.h>
+#include <llvm/Support/IRBuilder.h>
using namespace llvm;
PassManager PM;
PM.add(new PrintModulePass(&llvm::cout));
PM.run(*Mod);
-
+
+ delete Mod;
return 0;
}
<div class="doc_code">
<pre>
- BasicBlock* entry = new BasicBlock("entry", gcd);
- BasicBlock* ret = new BasicBlock("return", gcd);
- BasicBlock* cond_false = new BasicBlock("cond_false", gcd);
- BasicBlock* cond_true = new BasicBlock("cond_true", gcd);
- BasicBlock* cond_false_2 = new BasicBlock("cond_false", gcd);
+ BasicBlock* entry = BasicBlock::Create("entry", gcd);
+ BasicBlock* ret = BasicBlock::Create("return", gcd);
+ BasicBlock* cond_false = BasicBlock::Create("cond_false", gcd);
+ BasicBlock* cond_true = BasicBlock::Create("cond_true", gcd);
+ BasicBlock* cond_false_2 = BasicBlock::Create("cond_false", gcd);
</pre>
</div>
<div class="doc_code">
<pre>
- LLVMBuilder builder(entry);
+ IRBuilder builder(entry);
Value* xEqualsY = builder.CreateICmpEQ(x, y, "tmp");
builder.CreateCondBr(xEqualsY, ret, cond_false);
</pre>
</div>
-<p>Our next block, <code>ret</code>, is pretty simple: it just returns the value of <code>x</code>. Recall that this block is only reached if <code>x == y</code>, so this is the correct behavior. Notice that instead of creating a new <code>LLVMBuilder</code> for each block, we can use <code>SetInsertPoint</code> to retarget our existing one. This saves on construction and memory allocation costs.</p>
+<p>Our next block, <code>ret</code>, is pretty simple: it just returns the value of <code>x</code>. Recall that this block is only reached if <code>x == y</code>, so this is the correct behavior. Notice that instead of creating a new <code>IRBuilder</code> for each block, we can use <code>SetInsertPoint</code> to retarget our existing one. This saves on construction and memory allocation costs.</p>
<div class="doc_code">
<pre>
</pre>
</div>
-<p><code>cond_false</code> is a more interesting block: we now know that <code>x != y</code>, so we must branch again to determine which of <code>x</code> and <code>y</code> is larger. This is achieved using the <code>ICmpULT</code> instruction, which stands for <em>integer comparison for unsigned less-than</em>. In LLVM, integer types do not carry sign; a 32-bit integer pseudo-register can interpreted as signed or unsigned without casting. Whether a signed or unsigned interpretation is desired is specified in the instruction. This is why several instructions in the LLVM IR, such as integer less-than, include a specifier for signed or unsigned.</p>
+<p><code>cond_false</code> is a more interesting block: we now know that <code>x
+!= y</code>, so we must branch again to determine which of <code>x</code>
+and <code>y</code> is larger. This is achieved using the <code>ICmpULT</code>
+instruction, which stands for <em>integer comparison for unsigned
+less-than</em>. In LLVM, integer types do not carry sign; a 32-bit integer
+pseudo-register can be interpreted as signed or unsigned without casting.
+Whether a signed or unsigned interpretation is desired is specified in the
+instruction. This is why several instructions in the LLVM IR, such as integer
+less-than, include a specifier for signed or unsigned.</p>
<p>Also note that we're again making use of LLVM's automatic name uniquing, this time at a register level. We've deliberately chosen to name every instruction "tmp" to illustrate that LLVM will give them all unique names without getting confused.</p>
<div class="doc_code">
<pre>
-# c++ -g tut2.cpp `llvm-config --cppflags --ldflags --libs core` -o tut2
+# c++ -g tut2.cpp `llvm-config --cxxflags --ldflags --libs core` -o tut2
# ./tut2
</pre>
</div>