<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Feb 20, 2012, at 8:43 AM, Guillermo Perez <<a href="mailto:gaperez64@gmail.com">gaperez64@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hello,<div><br></div><div>So the current JIT will be superseded by the MCJIT completely and no further development should be expected for the current JIT?</div></blockquote><div><br></div><div>Yes.</div><div><br></div><br><blockquote type="cite"><div> In any case, I am definitely interested in submitting a patch if you could help me by sending me in the right direction, since I really want this working.</div>

<div><br></div><div>I managed to reproduce this behavior in LLVM 3.0 by modifying llc to read my .bc file and try to JIT the code for the mentioned Triple.</div><div><br></div><div>The error:</div><div><br></div><div><div>

<font color="#cc0000">ARMCodeEmitter::emitPseudoInstruction</font></div><div><font color="#cc0000">UNREACHABLE executed at /home/guillermo/llvm-3.0.src/lib/Target/ARM/ARMCodeEmitter.cpp:838!</font></div><div><font color="#cc0000">Stack dump:</font></div>

<div><font color="#cc0000">0.<span class="Apple-tab-span" style="white-space:pre">      </span>Program arguments: ./bin/llc -mtriple armv7a-unknown-linux-gnueabi -O3 /home/guillermo/Code/SieveAtom_execute.bc </font></div><div>

<font color="#cc0000">1.<span class="Apple-tab-span" style="white-space:pre"> </span>Running pass 'ARM Machine Code Emitter' on function '@execute'</font></div><div><font color="#cc0000">Aborted (core dumped)</font></div>

</div><div><br></div><div>The code I modified for llc was:</div><div><br></div><div><div><font color="#006600">//===-- llc.cpp - Implement the LLVM Native Code Generator ----------------===//</font></div><div><font color="#006600">//</font></div>

<div><font color="#006600">//                     The LLVM Compiler Infrastructure</font></div><div><font color="#006600">//</font></div><div><font color="#006600">// This file is distributed under the University of Illinois Open Source</font></div>

<div><font color="#006600">// License. See LICENSE.TXT for details.</font></div><div><font color="#006600">//</font></div><div><font color="#006600">//===----------------------------------------------------------------------===//</font></div>

<div><font color="#006600">//</font></div><div><font color="#006600">// This is the llc code generator driver. It provides a convenient</font></div><div><font color="#006600">// command-line interface for generating native assembly-language code</font></div>

<div><font color="#006600">// or C code, given LLVM bitcode.</font></div><div><font color="#006600">//</font></div><div><font color="#006600">//===----------------------------------------------------------------------===//</font></div>

<div><font color="#006600">#include <iostream></font></div><div><font color="#006600">#include "llvm/LLVMContext.h"</font></div><div><font color="#006600">#include "llvm/Module.h"</font></div><div>

<font color="#006600">#include "llvm/PassManager.h"</font></div><div><font color="#006600">#include "llvm/Pass.h"</font></div><div><font color="#006600">#include "llvm/ADT/Triple.h"</font></div>

<div><font color="#006600">#include "llvm/Support/IRReader.h"</font></div><div><font color="#006600">#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"</font></div><div><font color="#006600">#include "llvm/CodeGen/LinkAllCodegenComponents.h"</font></div>

<div><font color="#006600">#include "llvm/Config/config.h"</font></div><div><font color="#006600">#include "llvm/MC/SubtargetFeature.h"</font></div><div><font color="#006600">#include "llvm/Support/CommandLine.h"</font></div>

<div><font color="#006600">#include "llvm/Support/Debug.h"</font></div><div><font color="#006600">#include "llvm/Support/FormattedStream.h"</font></div><div><font color="#006600">#include "llvm/Support/ManagedStatic.h"</font></div>

<div><font color="#006600">#include "llvm/Support/PluginLoader.h"</font></div><div><font color="#006600">#include "llvm/Support/PrettyStackTrace.h"</font></div><div><font color="#006600">#include "llvm/Support/ToolOutputFile.h"</font></div>

<div><font color="#006600">#include "llvm/Support/Host.h"</font></div><div><font color="#006600">#include "llvm/Support/Signals.h"</font></div><div><font color="#006600">#include "llvm/Support/TargetRegistry.h"</font></div>

<div><font color="#006600">#include "llvm/Support/TargetSelect.h"</font></div><div><font color="#006600">#include "llvm/Target/TargetData.h"</font></div><div><font color="#006600">#include "llvm/Target/TargetMachine.h"</font></div>

<div><font color="#006600">#include "llvm/ExecutionEngine/ExecutionEngine.h"</font></div><div><font color="#006600">#include "llvm/ExecutionEngine/JIT.h"</font></div><div><font color="#006600">#include "llvm/Analysis/Passes.h"</font></div>

<div><font color="#006600">#include "llvm/Transforms/Scalar.h"</font></div><div><font color="#006600">#include <memory></font></div><div><font color="#006600">using namespace llvm;</font></div></div><div>
...</div>
<div>...</div><div>...</div><div><div><font color="#006600">  // Build up all of the passes that we want to do to the module.</font></div><div><font color="#006600">  // PassManager PM;</font></div><div><font color="#006600"><br>

</font></div><div><font color="#006600">  // Add the target data from the target machine, if it exists, or the module.</font></div><div><font color="#006600">  //if (const TargetData *TD = Target.getTargetData())</font></div>

<div><font color="#006600">  //  PM.add(new TargetData(*TD));</font></div><div><font color="#006600">  //else</font></div><div><font color="#006600">  //  PM.add(new TargetData(&mod));</font></div><div><font color="#006600"><br>

</font></div><div><font color="#006600">  // Override default to generate verbose assembly.</font></div><div><font color="#006600">  //Target.setAsmVerbosityDefault(true);</font></div><div><font color="#006600"><br></font></div>

<div><font color="#006600">  //if (RelaxAll) {</font></div><div><font color="#006600">  //  if (FileType != TargetMachine::CGFT_ObjectFile)</font></div><div><font color="#006600">  //    errs() << argv[0]</font></div>

<div><font color="#006600">  //           << ": warning: ignoring -mc-relax-all because filetype != obj";</font></div><div><font color="#006600">  //  else</font></div><div><font color="#006600">  //    Target.setMCRelaxAll(true);</font></div>

<div><font color="#006600">  //}</font></div><div><font color="#006600"><br></font></div><div><font color="#006600">  //{</font></div><div><font color="#006600">  //  formatted_raw_ostream FOS(Out->os());</font></div>
<div>
<font color="#006600"><br></font></div><div><font color="#006600">    // Ask the target to add backend passes as necessary.</font></div><div><font color="#006600">  //  if (Target.addPassesToEmitFile(PM, FOS, FileType, OLvl, NoVerify)) {</font></div>

<div><font color="#006600">  //    errs() << argv[0] << ": target does not support generation of this"</font></div><div><font color="#006600">  //           << " file type!\n";</font></div>

<div><font color="#006600">  //    return 1;</font></div><div><font color="#006600">  //  }</font></div><div><font color="#006600"><br></font></div><div><font color="#006600">    // Before executing passes, print the final values of the LLVM options.</font></div>

<div><font color="#006600">  //  cl::PrintOptionValues();</font></div><div><font color="#006600"><br></font></div><div><font color="#006600">  //  PM.run(mod);</font></div><div><font color="#006600">  //}</font></div><div>

<font color="#006600"><br></font></div><div><font color="#006600">  // Declare success.</font></div><div><font color="#006600">  //Out->keep();</font></div><div><font color="#006600"><br></font></div><div><font color="#006600">  // mods for cryo</font></div>

<div><font color="#006600">    // create an execution engine to export code later</font></div><div><font color="#006600">    EngineBuilder eBuilder(&mod);</font></div><div><font color="#006600">    std::string error;</font></div>

<div><font color="#006600">    eBuilder.setErrorStr(&error);</font></div><div><font color="#006600">    ExecutionEngine *TheExecutionEngine = eBuilder.create();</font></div><div><font color="#006600">    if(!TheExecutionEngine) {</font></div>

<div><font color="#006600">        std::cout<<error.c_str()<<std::endl;</font></div><div><font color="#006600">        return 1;</font></div><div><font color="#006600">    }</font></div><div><font color="#006600"><br>

</font></div><div><font color="#006600">    // compile and return function pointer</font></div><div><font color="#006600">    FunctionPassManager OurFPM(&mod);</font></div><div><font color="#006600">    // Start with registering info about how the</font></div>

<div><font color="#006600">    // target lays out data structures.</font></div><div><font color="#006600">    OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));</font></div><div><font color="#006600">    // Provide basic AliasAnalysis support for GVN.</font></div>

<div><font color="#006600">    OurFPM.add(createBasicAliasAnalysisPass());</font></div><div><font color="#006600">    // Do simple "peephole" optimizations and bit-twiddling optzns.</font></div><div><font color="#006600">    OurFPM.add(createInstructionCombiningPass());</font></div>

<div><font color="#006600">    // Reassociate expressions.</font></div><div><font color="#006600">    OurFPM.add(createReassociatePass());</font></div><div><font color="#006600">    // Eliminate Common SubExpressions.</font></div>

<div><font color="#006600">    OurFPM.add(createGVNPass());</font></div><div><font color="#006600">    // Simplify the control flow graph (deleting unreachable blocks, etc).</font></div><div><font color="#006600">    OurFPM.add(createCFGSimplificationPass());</font></div>

<div><font color="#006600"><br></font></div><div><font color="#006600">    // we run optimizations and return the pointer to the function</font></div><div><font color="#006600">    OurFPM.doInitialization();</font></div>
<div>
<font color="#006600">    Function* currentF = mod.getFunction("execute");</font></div><div><font color="#006600">    OurFPM.run(*currentF);</font></div><div><font color="#006600"><br></font></div><div><font color="#006600">    TheExecutionEngine->getPointerToFunction(currentF);</font></div>

<div><font color="#006600"><br></font></div><div><font color="#006600">  return 0;</font></div><div><font color="#006600">}</font></div><div><font color="#006600"><br></font></div><div>Thanks again for your help,</div><br>

<div class="gmail_quote">On Mon, Feb 20, 2012 at 11:06 PM, Anton Korobeynikov <span dir="ltr"><<a href="mailto:anton@korobeynikov.info">anton@korobeynikov.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Guillermo,<br>
<div class="im"><br>
> I'm sorry I forgot to mention I am compiling the bitcode using the JIT. The<br>
> actual error, I get when I'm trying to get the function to the pointer. I'm<br>
> using a custom front end that translates Android's Dalvik bytecode into LLVM<br>
> bitcode based on Android ICS's modified LLVM version.<br>
</div>ARM JIT is broken in many ways. So, what you're seeing is perfectly<br>
expected. You might want to wait until MCJIT will be usable and/or<br>
provide patches to make this happen sooner :)<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
With best regards, Anton Korobeynikov<br>
Faculty of Mathematics and Mechanics, Saint Petersburg State University<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Guillermo A. Pérez (吉耶莫)<br>
</div>
_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></blockquote></div><br></body></html>