[LLVMdev] ARM opcode format
Guillermo Perez
gaperez64 at gmail.com
Mon Feb 20 08:43:26 PST 2012
Hello,
So the current JIT will be superseded by the MCJIT completely and no
further development should be expected for the current JIT? 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.
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.
The error:
ARMCodeEmitter::emitPseudoInstruction
UNREACHABLE executed at
/home/guillermo/llvm-3.0.src/lib/Target/ARM/ARMCodeEmitter.cpp:838!
Stack dump:
0. Program arguments: ./bin/llc -mtriple armv7a-unknown-linux-gnueabi -O3
/home/guillermo/Code/SieveAtom_execute.bc
1. Running pass 'ARM Machine Code Emitter' on function '@execute'
Aborted (core dumped)
The code I modified for llc was:
//===-- llc.cpp - Implement the LLVM Native Code Generator
----------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This is the llc code generator driver. It provides a convenient
// command-line interface for generating native assembly-language code
// or C code, given LLVM bitcode.
//
//===----------------------------------------------------------------------===//
#include <iostream>
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/PassManager.h"
#include "llvm/Pass.h"
#include "llvm/ADT/Triple.h"
#include "llvm/Support/IRReader.h"
#include "llvm/CodeGen/LinkAllAsmWriterComponents.h"
#include "llvm/CodeGen/LinkAllCodegenComponents.h"
#include "llvm/Config/config.h"
#include "llvm/MC/SubtargetFeature.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FormattedStream.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/PluginLoader.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/Host.h"
#include "llvm/Support/Signals.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Target/TargetData.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ExecutionEngine/ExecutionEngine.h"
#include "llvm/ExecutionEngine/JIT.h"
#include "llvm/Analysis/Passes.h"
#include "llvm/Transforms/Scalar.h"
#include <memory>
using namespace llvm;
...
...
...
// Build up all of the passes that we want to do to the module.
// PassManager PM;
// Add the target data from the target machine, if it exists, or the
module.
//if (const TargetData *TD = Target.getTargetData())
// PM.add(new TargetData(*TD));
//else
// PM.add(new TargetData(&mod));
// Override default to generate verbose assembly.
//Target.setAsmVerbosityDefault(true);
//if (RelaxAll) {
// if (FileType != TargetMachine::CGFT_ObjectFile)
// errs() << argv[0]
// << ": warning: ignoring -mc-relax-all because filetype !=
obj";
// else
// Target.setMCRelaxAll(true);
//}
//{
// formatted_raw_ostream FOS(Out->os());
// Ask the target to add backend passes as necessary.
// if (Target.addPassesToEmitFile(PM, FOS, FileType, OLvl, NoVerify)) {
// errs() << argv[0] << ": target does not support generation of this"
// << " file type!\n";
// return 1;
// }
// Before executing passes, print the final values of the LLVM options.
// cl::PrintOptionValues();
// PM.run(mod);
//}
// Declare success.
//Out->keep();
// mods for cryo
// create an execution engine to export code later
EngineBuilder eBuilder(&mod);
std::string error;
eBuilder.setErrorStr(&error);
ExecutionEngine *TheExecutionEngine = eBuilder.create();
if(!TheExecutionEngine) {
std::cout<<error.c_str()<<std::endl;
return 1;
}
// compile and return function pointer
FunctionPassManager OurFPM(&mod);
// Start with registering info about how the
// target lays out data structures.
OurFPM.add(new TargetData(*TheExecutionEngine->getTargetData()));
// Provide basic AliasAnalysis support for GVN.
OurFPM.add(createBasicAliasAnalysisPass());
// Do simple "peephole" optimizations and bit-twiddling optzns.
OurFPM.add(createInstructionCombiningPass());
// Reassociate expressions.
OurFPM.add(createReassociatePass());
// Eliminate Common SubExpressions.
OurFPM.add(createGVNPass());
// Simplify the control flow graph (deleting unreachable blocks, etc).
OurFPM.add(createCFGSimplificationPass());
// we run optimizations and return the pointer to the function
OurFPM.doInitialization();
Function* currentF = mod.getFunction("execute");
OurFPM.run(*currentF);
TheExecutionEngine->getPointerToFunction(currentF);
return 0;
}
Thanks again for your help,
On Mon, Feb 20, 2012 at 11:06 PM, Anton Korobeynikov <
anton at korobeynikov.info> wrote:
> Guillermo,
>
> > I'm sorry I forgot to mention I am compiling the bitcode using the JIT.
> The
> > actual error, I get when I'm trying to get the function to the pointer.
> I'm
> > using a custom front end that translates Android's Dalvik bytecode into
> LLVM
> > bitcode based on Android ICS's modified LLVM version.
> ARM JIT is broken in many ways. So, what you're seeing is perfectly
> expected. You might want to wait until MCJIT will be usable and/or
> provide patches to make this happen sooner :)
>
> --
> With best regards, Anton Korobeynikov
> Faculty of Mathematics and Mechanics, Saint Petersburg State University
>
--
Guillermo A. Pérez (吉耶莫)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120221/c88f1cbb/attachment.html>
More information about the llvm-dev
mailing list