<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">I have a frontend that generates some LLVM bitcode that needs to be linked with other bitcode (its runtime library), which I generate from C++ source using Clang.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If I write the output of my program to disk, link it with llvm-link, and then run it with lli, everything works perfectly.  But if I try to perform the linking and running steps in my main program, I get this error during llvm::ExecutionEngine::getPointerToFunction:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-family:Consolas">Stack dump:<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-family:Consolas">0.      Running pass 'X86 Machine Code Emitter' on function '@.step.myappend'<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-family:Consolas">1.      Running pass 'X86 Machine Code Emitter' on function '@.step.myappend'<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in"><span style="font-family:Consolas">Segmentation fault (core dumped)<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">There are no other messages.  Any idea what I’m doing wrong?  I’ll copy the source of my main C++ file and the bitcode for .step.myappend below.  I can send the full bitcode file, too, if someone asks for it, but it is around 800 lines.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####################<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#include <fstream><o:p></o:p></p>
<p class="MsoNormal">#include <iostream><o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Bitcode/ReaderWriter.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/ExecutionEngine/JIT.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/IR/DataLayout.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Linker.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/PassManager.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Support/MemoryBuffer.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Support/raw_ostream.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Support/system_error.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Support/TargetSelect.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Transforms/IPO.h"<o:p></o:p></p>
<p class="MsoNormal">#include "llvm/Transforms/Scalar.h"<o:p></o:p></p>
<p class="MsoNormal">#include "sprite/compiler.hpp"<o:p></o:p></p>
<p class="MsoNormal">#include "sprite/config.hpp"<o:p></o:p></p>
<p class="MsoNormal">#include "sprite/curryinput.hpp"<o:p></o:p></p>
<p class="MsoNormal">#include "sprite/icurry_parser.hpp"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">namespace<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">  std::string dirname(std::string const & path)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    size_t const pos = path.find_last_of("/");<o:p></o:p></p>
<p class="MsoNormal">    return path.substr(0, pos == std::string::npos ? 0 : pos);<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  std::string basename(std::string const & path)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    size_t const pos = path.find_last_of("/");<o:p></o:p></p>
<p class="MsoNormal">    return path.substr(pos == std::string::npos ? 0 : pos + 1);<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  std::string remove_extension(std::string const & path)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    size_t const pos = path.find_last_of(".");<o:p></o:p></p>
<p class="MsoNormal">    return pos == std::string::npos ? path : path.substr(0, pos);<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  std::string joinpath(std::string const & dirname, std::string const & path)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    if(!path.empty() && path.front() == '/')<o:p></o:p></p>
<p class="MsoNormal">      return path;<o:p></o:p></p>
<p class="MsoNormal">    if(dirname.empty())<o:p></o:p></p>
<p class="MsoNormal">      return path;<o:p></o:p></p>
<p class="MsoNormal">    return dirname.back() == '/' ? dirname + path : dirname + "/" + path;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main(int argc, char const *argv[])<o:p></o:p></p>
<p class="MsoNormal">{<o:p></o:p></p>
<p class="MsoNormal">  if(argc != 2)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">   std::cerr << "Usage: " << argv[0] << " <file.curry>" << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return 1;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  std::string const curry2read =<o:p></o:p></p>
<p class="MsoNormal">      std::string(SPRITE_LIBINSTALL) + "/cmc/translator/bin/curry2read";<o:p></o:p></p>
<p class="MsoNormal">  std::string const curryfile(argv[1]);<o:p></o:p></p>
<p class="MsoNormal">  std::string const readablefile = joinpath(<o:p></o:p></p>
<p class="MsoNormal">      dirname(curryfile)<o:p></o:p></p>
<p class="MsoNormal">    , ".curry/" + remove_extension(basename(curryfile)) + ".read"<o:p></o:p></p>
<p class="MsoNormal">    );<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Generate the readable Curry file.<o:p></o:p></p>
<p class="MsoNormal">  int ok = std::system((curry2read + " -q " + curryfile).c_str());<o:p></o:p></p>
<p class="MsoNormal">  if(ok != 0) return 1;<o:p></o:p></p>
<p class="MsoNormal">  std::ifstream input(readablefile);<o:p></o:p></p>
<p class="MsoNormal">  if(!input)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::cerr << "Could not open \"" << readablefile << "\"" << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return 1;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Parse the input program.<o:p></o:p></p>
<p class="MsoNormal">  sprite::curry::Library lib;<o:p></o:p></p>
<p class="MsoNormal">  input >> lib;<o:p></o:p></p>
<p class="MsoNormal">  std::string topmodule = lib.modules.front().name;<o:p></o:p></p>
<p class="MsoNormal">  // sprite::compiler::prettyprint(lib);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Compile the program.<o:p></o:p></p>
<p class="MsoNormal">  sprite::compiler::LibrarySTab stab;<o:p></o:p></p>
<p class="MsoNormal">  sprite::compiler::compile(lib, stab);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Declare the main function.<o:p></o:p></p>
<p class="MsoNormal">  namespace tgt = sprite::backend;<o:p></o:p></p>
<p class="MsoNormal">  auto & module_stab = stab.modules.at(topmodule);<o:p></o:p></p>
<p class="MsoNormal">  auto & compiler = *module_stab.compiler;<o:p></o:p></p>
<p class="MsoNormal">  tgt::scope _ = module_stab.module_ir;<o:p></o:p></p>
<p class="MsoNormal">  tgt::extern_(<o:p></o:p></p>
<p class="MsoNormal">      tgt::types::int_(32)(), "main", {}<o:p></o:p></p>
<p class="MsoNormal">    , [&]{<o:p></o:p></p>
<p class="MsoNormal">        // Construct the root expression (just the "main" symbol).<o:p></o:p></p>
<p class="MsoNormal">        tgt::value root_p = compiler.node_alloc();<o:p></o:p></p>
<p class="MsoNormal">        sprite::curry::Qname const main_{topmodule, "main"};<o:p></o:p></p>
<p class="MsoNormal">        root_p = construct(compiler, root_p, {main_, {}});<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        // Evaluate and then print the root expression.<o:p></o:p></p>
<p class="MsoNormal">        compiler.rt.normalize(root_p);<o:p></o:p></p>
<p class="MsoNormal">        compiler.rt.printexpr(root_p, "\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">        tgt::return_(0);<o:p></o:p></p>
<p class="MsoNormal">      }<o:p></o:p></p>
<p class="MsoNormal">    );<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // module_stab.module_ir->dump();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Load the runtime library.<o:p></o:p></p>
<p class="MsoNormal">  llvm::OwningPtr<llvm::MemoryBuffer> buffer;<o:p></o:p></p>
<p class="MsoNormal">  llvm::error_code err = llvm::MemoryBuffer::getFile(<o:p></o:p></p>
<p class="MsoNormal">      SPRITE_LIBINSTALL "/sprite-rt.bc", buffer<o:p></o:p></p>
<p class="MsoNormal">    );<o:p></o:p></p>
<p class="MsoNormal">  if(err)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::cerr << err.message() << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return EXIT_FAILURE;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Make the runtime library into a module.<o:p></o:p></p>
<p class="MsoNormal">  std::string errmsg;<o:p></o:p></p>
<p class="MsoNormal">  llvm::Module *rtlib = llvm::ParseBitcodeFile(<o:p></o:p></p>
<p class="MsoNormal">      buffer.get(), module_stab.module_ir.context(), &errmsg<o:p></o:p></p>
<p class="MsoNormal">    );<o:p></o:p></p>
<p class="MsoNormal">  if(!rtlib)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::cerr << errmsg << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return EXIT_FAILURE;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Link the compiled program code into the runtime module.<o:p></o:p></p>
<p class="MsoNormal">  bool failed = llvm::Linker::LinkModules(<o:p></o:p></p>
<p class="MsoNormal">      rtlib, module_stab.module_ir.ptr(), llvm::Linker::PreserveSource, &errmsg<o:p></o:p></p>
<p class="MsoNormal">    );<o:p></o:p></p>
<p class="MsoNormal">  if(failed)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::cerr << errmsg << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return EXIT_FAILURE;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  std::cout << "Linking done..." << std::endl;<o:p></o:p></p>
<p class="MsoNormal">  rtlib->dump();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Run optimization passes.<o:p></o:p></p>
<p class="MsoNormal">  // std::vector<const char *> exportList;<o:p></o:p></p>
<p class="MsoNormal">  // llvm::PassManager Passes;<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(new llvm::DataLayout(rtlib));<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createDemoteRegisterToMemoryPass());<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createInternalizePass(exportList));<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createScalarReplAggregatesPass());<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createInstructionCombiningPass());<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createGlobalOptimizerPass());<o:p></o:p></p>
<p class="MsoNormal">  // Passes.add(llvm::createFunctionInliningPass());<o:p></o:p></p>
<p class="MsoNormal">  // Passes.run(*rtlib);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Create the JIT<o:p></o:p></p>
<p class="MsoNormal">  llvm::InitializeNativeTarget();<o:p></o:p></p>
<p class="MsoNormal">  llvm::ExecutionEngine * jit = llvm::EngineBuilder(rtlib)<o:p></o:p></p>
<p class="MsoNormal">      .setErrorStr(&errmsg)<o:p></o:p></p>
<p class="MsoNormal">      .setEngineKind(llvm::EngineKind::JIT)<o:p></o:p></p>
<p class="MsoNormal">      .create();<o:p></o:p></p>
<p class="MsoNormal">  if(!jit)<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::cerr << "Failed to create JIT compiler: " << errmsg << std::endl;<o:p></o:p></p>
<p class="MsoNormal">    return EXIT_FAILURE;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  // Execute the program.<o:p></o:p></p>
<p class="MsoNormal">  std::cout << "Begin Execution..." << std::endl;<o:p></o:p></p>
<p class="MsoNormal">  // rtlib->dump();<o:p></o:p></p>
<p class="MsoNormal">  void * main_fp = jit->getPointerToFunction(rtlib->getFunction("main"));<o:p></o:p></p>
<p class="MsoNormal">  int32_t (*target_program)() = (int32_t(*)())(intptr_t)(main_fp);<o:p></o:p></p>
<p class="MsoNormal">  std::cout << "Ready..." << std::endl;<o:p></o:p></p>
<p class="MsoNormal">  return target_program();<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">  #if 0<o:p></o:p></p>
<p class="MsoNormal">  // Write a bitcode file and interpret it.<o:p></o:p></p>
<p class="MsoNormal">  {<o:p></o:p></p>
<p class="MsoNormal">    std::string err;<o:p></o:p></p>
<p class="MsoNormal">    llvm::raw_fd_ostream fout("sprite-out.bc", err, llvm::raw_fd_ostream::F_Binary);<o:p></o:p></p>
<p class="MsoNormal">    llvm::WriteBitcodeToFile(module_stab.module_ir.ptr(), fout);<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal">  std::system("llvm-link-3.3 sprite-out.bc " SPRITE_LIBINSTALL "/sprite-rt.bc > tmp.bc");<o:p></o:p></p>
<p class="MsoNormal">  std::system("mv tmp.bc sprite-out.bc");<o:p></o:p></p>
<p class="MsoNormal">  int const status = std::system("lli-3.3 sprite-out.bc");<o:p></o:p></p>
<p class="MsoNormal">  return WEXITSTATUS(status);<o:p></o:p></p>
<p class="MsoNormal">  #endif<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">####################<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">define linkonce void @.step.myappend(%"struct.sprite::compiler::node"* %root_p) {<o:p></o:p></p>
<p class="MsoNormal">.entry:<o:p></o:p></p>
<p class="MsoNormal">  %0 = alloca %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  %1 = alloca %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %root_p, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %2 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %3 = getelementptr %"struct.sprite::compiler::node"* %2, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %4 = load i8** %3<o:p></o:p></p>
<p class="MsoNormal">  %5 = bitcast i8* %4 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %5, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %11<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:6                                       ; preds = %11<o:p></o:p></p>
<p class="MsoNormal">  %7 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %8 = getelementptr %"struct.sprite::compiler::node"* %7, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %9 = load i8** %8<o:p></o:p></p>
<p class="MsoNormal">  %10 = bitcast i8* %9 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %10, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %11, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:11                                      ; preds = %6, %.entry<o:p></o:p></p>
<p class="MsoNormal">  %12 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %13 = getelementptr %"struct.sprite::compiler::node"* %12, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %14 = load i64* %13<o:p></o:p></p>
<p class="MsoNormal">  %15 = load i64* %13<o:p></o:p></p>
<p class="MsoNormal">  %16 = icmp eq i64 %15, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %16, label %6, label %17<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:17                                      ; preds = %11<o:p></o:p></p>
<p class="MsoNormal">  %18 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %18, %"struct.sprite::compiler::node"** %1<o:p></o:p></p>
<p class="MsoNormal">  %19 = getelementptr %"struct.sprite::compiler::node"* %18, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %20 = load i64* %19<o:p></o:p></p>
<p class="MsoNormal">  %21 = add i64 %20, 4<o:p></o:p></p>
<p class="MsoNormal">  %22 = getelementptr [6 x i8*]* @.jtable, i32 0, i64 %21<o:p></o:p></p>
<p class="MsoNormal">  %23 = load i8** %22<o:p></o:p></p>
<p class="MsoNormal">  indirectbr i8* %23, [label %24, label %26, label %36, label %38, label %44, label %66]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:24                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  %25 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([16 x i8]* @.str21, i32 0, i32 0))<o:p></o:p></p>
<p class="MsoNormal">  ret void, !case...FAIL !1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:26                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  %27 = load %"struct.sprite::compiler::node"** %1<o:p></o:p></p>
<p class="MsoNormal">  %28 = getelementptr %"struct.sprite::compiler::node"* %27, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %29 = load i8** %28<o:p></o:p></p>
<p class="MsoNormal">  %30 = bitcast i8* %29 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %30, %"struct.sprite::compiler::node"** %1<o:p></o:p></p>
<p class="MsoNormal">  %31 = getelementptr %"struct.sprite::compiler::node"* %30, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %32 = load i64* %31<o:p></o:p></p>
<p class="MsoNormal">  %33 = add i64 %32, 4<o:p></o:p></p>
<p class="MsoNormal">  %34 = getelementptr [6 x i8*]* @.jtable, i32 0, i64 %33<o:p></o:p></p>
<p class="MsoNormal">  %35 = load i8** %34<o:p></o:p></p>
<p class="MsoNormal">  indirectbr i8* %35, [label %24, label %26, label %36, label %38, label %44, label %66]<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:36                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  %37 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([18 x i8]* @.str22, i32 0, i32 0))<o:p></o:p></p>
<p class="MsoNormal">  ret void, !case...CHOICE !1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:38                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  %39 = load %"struct.sprite::compiler::node"** %1<o:p></o:p></p>
<p class="MsoNormal">  %40 = getelementptr %"struct.sprite::compiler::node"* %39, i32 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  %41 = load %"struct.sprite::compiler::vtable"** %40<o:p></o:p></p>
<p class="MsoNormal">  %42 = getelementptr %"struct.sprite::compiler::vtable"* %41, i32 0, i32 4<o:p></o:p></p>
<p class="MsoNormal">  %43 = load void (%"struct.sprite::compiler::node"*)** %42<o:p></o:p></p>
<p class="MsoNormal">  tail call void %43(%"struct.sprite::compiler::node"* %39)<o:p></o:p></p>
<p class="MsoNormal">  ret void<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:44                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %root_p, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %45 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %46 = getelementptr %"struct.sprite::compiler::node"* %45, i32 0, i32 3<o:p></o:p></p>
<p class="MsoNormal">  %47 = load i8** %46<o:p></o:p></p>
<p class="MsoNormal">  %48 = bitcast i8* %47 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %48, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %54<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:49                                      ; preds = %54<o:p></o:p></p>
<p class="MsoNormal">  %50 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %51 = getelementptr %"struct.sprite::compiler::node"* %50, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %52 = load i8** %51<o:p></o:p></p>
<p class="MsoNormal">  %53 = bitcast i8* %52 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %53, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %54, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:54                                      ; preds = %49, %44<o:p></o:p></p>
<p class="MsoNormal">  %55 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %56 = getelementptr %"struct.sprite::compiler::node"* %55, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %57 = load i64* %56<o:p></o:p></p>
<p class="MsoNormal">  %58 = load i64* %56<o:p></o:p></p>
<p class="MsoNormal">  %59 = icmp eq i64 %58, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %59, label %49, label %60<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:60                                      ; preds = %54<o:p></o:p></p>
<p class="MsoNormal">  %61 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %62 = bitcast %"struct.sprite::compiler::node"* %61 to i8*<o:p></o:p></p>
<p class="MsoNormal">  %63 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::vtable"* @.fwd.vt, %"struct.sprite::compiler::vtable"** %63<o:p></o:p></p>
<p class="MsoNormal">  %64 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  store i64 -3, i64* %64<o:p></o:p></p>
<p class="MsoNormal">  %65 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  store i8* %62, i8** %65<o:p></o:p></p>
<p class="MsoNormal">  ret void<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:66                                      ; preds = %26, %17<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %root_p, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %67 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %68 = getelementptr %"struct.sprite::compiler::node"* %67, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %69 = load i8** %68<o:p></o:p></p>
<p class="MsoNormal">  %70 = bitcast i8* %69 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %70, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %76<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:71                                      ; preds = %76<o:p></o:p></p>
<p class="MsoNormal">  %72 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %73 = getelementptr %"struct.sprite::compiler::node"* %72, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %74 = load i8** %73<o:p></o:p></p>
<p class="MsoNormal">  %75 = bitcast i8* %74 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %75, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %76, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:76                                      ; preds = %71, %66<o:p></o:p></p>
<p class="MsoNormal">  %77 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %78 = getelementptr %"struct.sprite::compiler::node"* %77, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %79 = load i64* %78<o:p></o:p></p>
<p class="MsoNormal">  %80 = load i64* %78<o:p></o:p></p>
<p class="MsoNormal">  %81 = icmp eq i64 %80, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %81, label %71, label %82<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:82                                      ; preds = %76<o:p></o:p></p>
<p class="MsoNormal">  %83 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %84 = getelementptr %"struct.sprite::compiler::node"* %83, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %85 = load i8** %84<o:p></o:p></p>
<p class="MsoNormal">  %86 = bitcast i8* %85 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %86, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %92<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:87                                      ; preds = %92<o:p></o:p></p>
<p class="MsoNormal">  %88 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %89 = getelementptr %"struct.sprite::compiler::node"* %88, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %90 = load i8** %89<o:p></o:p></p>
<p class="MsoNormal">  %91 = bitcast i8* %90 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %91, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %92, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:92                                      ; preds = %87, %82<o:p></o:p></p>
<p class="MsoNormal">  %93 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %94 = getelementptr %"struct.sprite::compiler::node"* %93, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %95 = load i64* %94<o:p></o:p></p>
<p class="MsoNormal">  %96 = load i64* %94<o:p></o:p></p>
<p class="MsoNormal">  %97 = icmp eq i64 %96, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %97, label %87, label %98<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:98                                      ; preds = %92<o:p></o:p></p>
<p class="MsoNormal">  %99 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %100 = bitcast %"struct.sprite::compiler::node"* %99 to i8*<o:p></o:p></p>
<p class="MsoNormal">  %101 = call i8* @malloc(i64 32)<o:p></o:p></p>
<p class="MsoNormal">  %102 = bitcast i8* %101 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %root_p, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %103 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %104 = getelementptr %"struct.sprite::compiler::node"* %103, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %105 = load i8** %104<o:p></o:p></p>
<p class="MsoNormal">  %106 = bitcast i8* %105 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %106, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %112<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:107                                     ; preds = %112<o:p></o:p></p>
<p class="MsoNormal">  %108 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %109 = getelementptr %"struct.sprite::compiler::node"* %108, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %110 = load i8** %109<o:p></o:p></p>
<p class="MsoNormal">  %111 = bitcast i8* %110 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %111, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %112, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:112                                     ; preds = %107, %98<o:p></o:p></p>
<p class="MsoNormal">  %113 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %114 = getelementptr %"struct.sprite::compiler::node"* %113, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %115 = load i64* %114<o:p></o:p></p>
<p class="MsoNormal">  %116 = load i64* %114<o:p></o:p></p>
<p class="MsoNormal">  %117 = icmp eq i64 %116, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %117, label %107, label %118<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:118                                     ; preds = %112<o:p></o:p></p>
<p class="MsoNormal">  %119 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %120 = getelementptr %"struct.sprite::compiler::node"* %119, i32 0, i32 3<o:p></o:p></p>
<p class="MsoNormal">  %121 = load i8** %120<o:p></o:p></p>
<p class="MsoNormal">  %122 = bitcast i8* %121 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %122, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %128<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:123                                     ; preds = %128<o:p></o:p></p>
<p class="MsoNormal">  %124 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %125 = getelementptr %"struct.sprite::compiler::node"* %124, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %126 = load i8** %125<o:p></o:p></p>
<p class="MsoNormal">  %127 = bitcast i8* %126 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %127, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %128, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:128                                     ; preds = %123, %118<o:p></o:p></p>
<p class="MsoNormal">  %129 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %130 = getelementptr %"struct.sprite::compiler::node"* %129, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %131 = load i64* %130<o:p></o:p></p>
<p class="MsoNormal">  %132 = load i64* %130<o:p></o:p></p>
<p class="MsoNormal">  %133 = icmp eq i64 %132, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %133, label %123, label %134<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:134                                     ; preds = %128<o:p></o:p></p>
<p class="MsoNormal">  %135 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %136 = bitcast %"struct.sprite::compiler::node"* %135 to i8*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %root_p, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %137 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %138 = getelementptr %"struct.sprite::compiler::node"* %137, i32 0, i32 3<o:p></o:p></p>
<p class="MsoNormal">  %139 = load i8** %138<o:p></o:p></p>
<p class="MsoNormal">  %140 = bitcast i8* %139 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %140, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %146<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:141                                     ; preds = %146<o:p></o:p></p>
<p class="MsoNormal">  %142 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %143 = getelementptr %"struct.sprite::compiler::node"* %142, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  %144 = load i8** %143<o:p></o:p></p>
<p class="MsoNormal">  %145 = bitcast i8* %144 to %"struct.sprite::compiler::node"*<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::node"* %145, %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  br label %146, !sprite.implied !0<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:146                                     ; preds = %141, %134<o:p></o:p></p>
<p class="MsoNormal">  %147 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %148 = getelementptr %"struct.sprite::compiler::node"* %147, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  %149 = load i64* %148<o:p></o:p></p>
<p class="MsoNormal">  %150 = load i64* %148<o:p></o:p></p>
<p class="MsoNormal">  %151 = icmp eq i64 %150, -3<o:p></o:p></p>
<p class="MsoNormal">  br i1 %151, label %141, label %152<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">; <label>:152                                     ; preds = %146<o:p></o:p></p>
<p class="MsoNormal">  %153 = load %"struct.sprite::compiler::node"** %0<o:p></o:p></p>
<p class="MsoNormal">  %154 = bitcast %"struct.sprite::compiler::node"* %153 to i8*<o:p></o:p></p>
<p class="MsoNormal">  %155 = getelementptr %"struct.sprite::compiler::node"* %102, i32 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::vtable"* @.vtable.for.myappend, %"struct.sprite::compiler::vtable"** %155<o:p></o:p></p>
<p class="MsoNormal">  %156 = getelementptr %"struct.sprite::compiler::node"* %102, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  store i64 -1, i64* %156<o:p></o:p></p>
<p class="MsoNormal">  %157 = getelementptr %"struct.sprite::compiler::node"* %102, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  store i8* %136, i8** %157<o:p></o:p></p>
<p class="MsoNormal">  %158 = getelementptr %"struct.sprite::compiler::node"* %102, i32 0, i32 3<o:p></o:p></p>
<p class="MsoNormal">  store i8* %154, i8** %158<o:p></o:p></p>
<p class="MsoNormal">  %159 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 0<o:p></o:p></p>
<p class="MsoNormal">  store %"struct.sprite::compiler::vtable"* @.vt.CTOR.MyCons, %"struct.sprite::compiler::vtable"** %159<o:p></o:p></p>
<p class="MsoNormal">  %160 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 1<o:p></o:p></p>
<p class="MsoNormal">  store i64 1, i64* %160<o:p></o:p></p>
<p class="MsoNormal">  %161 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 2<o:p></o:p></p>
<p class="MsoNormal">  store i8* %100, i8** %161<o:p></o:p></p>
<p class="MsoNormal">  %162 = getelementptr %"struct.sprite::compiler::node"* %root_p, i32 0, i32 3<o:p></o:p></p>
<p class="MsoNormal">  store i8* %101, i8** %162<o:p></o:p></p>
<p class="MsoNormal">  ret void<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>