$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r73573 - trunk/libs/spirit/example/qi/compiler_tutorial/conjure3
From: joel_at_[hidden]
Date: 2011-08-06 10:55:22
Author: djowel
Date: 2011-08-06 10:55:21 EDT (Sat, 06 Aug 2011)
New Revision: 73573
URL: http://svn.boost.org/trac/boost/changeset/73573
Log:
refactoring the compiler
Text files modified: 
   trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp |    13 +++++--------                           
   trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.hpp |     6 +++++-                                  
   2 files changed, 10 insertions(+), 9 deletions(-)
Modified: trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp
==============================================================================
--- trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp	(original)
+++ trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.cpp	2011-08-06 10:55:21 EDT (Sat, 06 Aug 2011)
@@ -578,7 +578,7 @@
             value return_val = (*this)(*x.expr);
             if (!return_val)
                 return false;
-            builder.CreateStore(return_val, return_alloca);
+            return_alloca.assign(return_val);
         }
 
         builder.CreateBr(return_block);
@@ -651,12 +651,10 @@
         BOOST_FOREACH(ast::identifier const& arg, x.args)
         {
             // Create an alloca for this variable.
-            llvm::AllocaInst* alloca =
-                create_entry_block_alloca(
-                    function, arg.name.c_str(), context());
+            lvalue alloca(builder, arg.name.c_str());
 
             // Store the initial value into the alloca.
-            builder.CreateStore(iter, alloca);
+            alloca.assign(value(iter));
 
             // Add arguments to variable symbol table.
             named_values[arg.name] = alloca;
@@ -666,8 +664,7 @@
         if (!void_return)
         {
             // Create an alloca for the return value
-            return_alloca =
-                create_entry_block_alloca(function, "return.val", context());
+            return_alloca = lvalue(builder, "return.val");
         }
     }
 
@@ -714,7 +711,7 @@
             if (void_return)
                 builder.CreateRetVoid();
             else
-                builder.CreateRet(builder.CreateLoad(return_alloca, "return.val"));
+                builder.CreateRet(return_alloca);
 
             //~ vm.module()->dump();
 
Modified: trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.hpp
==============================================================================
--- trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.hpp	(original)
+++ trunk/libs/spirit/example/qi/compiler_tutorial/conjure3/compiler.hpp	2011-08-06 10:55:21 EDT (Sat, 06 Aug 2011)
@@ -68,6 +68,10 @@
 
     struct lvalue : value
     {
+        lvalue()
+          : value(0, true, 0)
+        {}
+
         lvalue(
             llvm::AllocaInst* var,
             llvm::IRBuilder<>& builder)
@@ -150,7 +154,7 @@
         std::string current_function_name;
         std::map<std::string, llvm::AllocaInst*> named_values;
         llvm::BasicBlock* return_block;
-        llvm::AllocaInst* return_alloca;
+        lvalue return_alloca;
 
         vmachine& vm;
         llvm::FunctionPassManager fpm;