<li><em>Create your blocks early.</em> While writing your compiler, you
will encounter several situations where you know apriori that you will
need several blocks. For example, if-then-else, switch, while, and for
- statements in C/C++ all need multiple blocks for expression in LVVM.
+ statements in C/C++ all need multiple blocks for expression in LLVM.
The rule is, create them early.</li>
<li><em>Terminate your blocks early.</em> This just reduces the chances
that you forget to terminate your blocks which is required (go
</ol>
<p>The foregoing is such an important principal, its worth making an idiom:</p>
<pre>
-BasicBlock* bb = new BasicBlock();
-bb->getInstList().push_back( new Branch( ... ) );
+BasicBlock* bb = BasicBlock::Create();
+bb->getInstList().push_back( BranchInst::Create( ... ) );
new Instruction(..., bb->getTerminator() );
</pre>
<p>To make this clear, consider the typical if-then-else statement
<pre>
using namespace llvm;
BasicBlock*
-MyCompiler::handle_if( BasicBlock* bb, SetCondInst* condition )
+MyCompiler::handle_if( BasicBlock* bb, ICmpInst* condition )
{
// Create the blocks to contain code in the structure of if/then/else
- BasicBlock* then_bb = new BasicBlock();
- BasicBlock* else_bb = new BasicBlock();
- BasicBlock* exit_bb = new BasicBlock();
+ BasicBlock* then_bb = BasicBlock::Create();
+ BasicBlock* else_bb = BasicBlock::Create();
+ BasicBlock* exit_bb = BasicBlock::Create();
// Insert the branch instruction for the "if"
- bb->getInstList().push_back( new BranchInst( then_bb, else_bb, condition ) );
+ bb->getInstList().push_back( BranchInst::Create( then_bb, else_bb, condition ) );
// Set up the terminating instructions
- then->getInstList().push_back( new BranchInst( exit_bb ) );
- else->getInstList().push_back( new BranchInst( exit_bb ) );
+ then->getInstList().push_back( BranchInst::Create( exit_bb ) );
+ else->getInstList().push_back( BranchInst::Create( exit_bb ) );
// Fill in the then part .. details excised for brevity
this->fill_in( then_bb );
std::vector<Value*> index_vector;
index_vector.push_back( ConstantInt::get( Type::LongTy, 0 );
// ... push other indices ...
-GetElementPtrInst* gep = new GetElementPtrInst( ptr, index_vector );
+GetElementPtrInst* gep = GetElementPtrInst::Create( ptr, index_vector );
</pre>
<p>For example, suppose we have a global variable whose type is [24 x int]. The
variable itself represents a <em>pointer</em> to that array. To subscript the
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"> <a name="directory">Directory Structure</a></div>
+
<div class="doc_text">
<p>The source code, test programs, and sample programs can all be found
-under the LLVM "projects" directory. You will need to obtain the LLVM sources
-to find it (either via anonymous CVS or a tarball. See the
-<a href="GettingStarted.html">Getting Started</a> document).</p>
-<p>Under the "projects" directory there is a directory named "Stacker". That
-directory contains everything, as follows:</p>
+in the LLVM repository named <tt>llvm-stacker</tt> This should be checked out to
+the <tt>projects</tt> directory so that it will auto-configure. To do that, make
+sure you have the llvm sources in <tt><i>llvm</i></tt>
+(see <a href="GettingStarted.html">Getting Started</a>) and then use these
+commands:</p>
+
+<div class="doc_code">
+<pre>
+% svn co http://llvm.org/svn/llvm-project/llvm-top/trunk llvm-top
+% cd llvm-top
+% make build MODULE=stacker
+</pre>
+</div>
+
+<p>Under the <tt>projects/llvm-stacker</tt> directory you will find the
+implementation of the Stacker compiler, as follows:</p>
+
<ul>
<li><em>lib</em> - contains most of the source code
<ul>
<li><em>sample</em> - contains the sample programs</li>
</ul>
</div>
+
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="lexer"></a>The Lexer</div>
+
<div class="doc_text">
-<p>See projects/Stacker/lib/compiler/Lexer.l</p>
+<p>See projects/llvm-stacker/lib/compiler/Lexer.l</p>
</div>
+
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="parser"></a>The Parser</div>
<div class="doc_text">
-<p>See projects/Stacker/lib/compiler/StackerParser.y</p>
+<p>See projects/llvm-stacker/lib/compiler/StackerParser.y</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="compiler"></a>The Compiler</div>
<div class="doc_text">
-<p>See projects/Stacker/lib/compiler/StackerCompiler.cpp</p>
+<p>See projects/llvm-stacker/lib/compiler/StackerCompiler.cpp</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="runtime"></a>The Runtime</div>
<div class="doc_text">
-<p>See projects/Stacker/lib/runtime/stacker_rt.c</p>
+<p>See projects/llvm-stacker/lib/runtime/stacker_rt.c</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="driver"></a>Compiler Driver</div>
<div class="doc_text">
-<p>See projects/Stacker/tools/stkrc/stkrc.cpp</p>
+<p>See projects/llvm-stacker/tools/stkrc/stkrc.cpp</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"><a name="tests"></a>Test Programs</div>
<div class="doc_text">
-<p>See projects/Stacker/test/*.st</p>
+<p>See projects/llvm-stacker/test/*.st</p>
</div>
<!-- ======================================================================= -->
<div class="doc_subsection"> <a name="exercise">Exercise</a></div>