[llvm-dev] A "Java Backend"
Sanjoy Das via llvm-dev
llvm-dev at lists.llvm.org
Tue Jul 19 07:52:36 PDT 2016
David Chisnall via llvm-dev wrote:
> On 19 Jul 2016, at 04:06, Lorenzo Laneve via
llvm-dev<llvm-dev at lists.llvm.org> wrote:
>> My idea was to create a complete backend treating Java as a normal
platform, to enable LLVM to compile programs to Java Bytecode (.class)
and Java Archive files (.jar). This could be useful in situations where
we need to compile a program for a platform still not natively supported
>> I don't know if it exists already, I've heard about this "LLJVM" but
I don't think it does the same thing as my idea.
>> What do you think?
> I think that it will be difficult. Java bytecode is intrinsically
designed to be memory safe, whereas LLVM IR is not. There is no
equivalent of inttoptr or ptrtoint in Java bytecode and the closest
equivalent of a GEP is to retrieve a field from an object (though that’s
only really for GEP + load/store).
> You could potentially do something a bit ugly and treat all of LLVM
memory as one big ByteBuffer object, and make pointers indexes into
this, but then you’d make it very hard for your LLVM-originating code to
interoperate with Java-originating code and so you’d have to write a lot
of code to take the place of the system call layer.
The caveat here is that Java has this "private"
but-not-really-in-practice API called sun.misc.Unsafe that can be used
to access native memory. So you can have (I'm paraphrasing, the
method names may not match):
long addr = unsafe.allocateMemory()
unsafe.putInt(addr + 48, 9001);
int val = unsafe.getInt(addr + 48);
etc. You may even get decent performance out of this since JIT
compilers tend to have to optimize these well (they're commonly uses
in the implementation of some popular JDK classes).
But you're right that it will still be difficult to naively
inter-operate between Java and C++ objects. Which is why it will be
an interesting research project. :)
> Oh, and I doubt that you’ll find many more platforms that have a
fully functional JVM than are LLVM targets. Even big-endian MIPS64 is
not well-supported by Java (JamVM - a pure interpreter - is the only
thing that we’ve managed to find that works).
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
More information about the llvm-dev