<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>