[LLVMdev] Endianness

Chris Lattner sabre at nondot.org
Tue Feb 15 07:54:41 PST 2005


On Tue, 15 Feb 2005, Subrahmanyam Murthy wrote:
> I am new to LLVM and I am interested in using LLVM for
> an application that I plan to develop on Solaris. I
> want to execute the generaed code on different
> machines (both little endian and big endian).  In my
> application endianess is important.  How does LLVM
> deal with Endian issues?  Does LLVM take care of byte
> swapping?

If you compile a program from a type-safe language (like Java) to LLVM, 
the endianness won't matter: you can move the LLVM bytecode file around 
just like you can a JVM bytecode file without a problem.

For C/C++, matters are a little bit more difficult.  There, the endianness 
CAN make a difference (due to "unsafe" casting and such).  To handle this, 
LLVM allows the front-end to record the endianness of the host the program 
was compiled on, and the C/C++ front-end does so.

One problem, however, is that the code generators do not yet insert the 
byteswap instructions they need.  At one point we had this (which allowed 
us to run simple Sparc programs on X86), and it worked great.  The problem 
was that non-trivial programs use system header files, and the system 
header files are not compatible across systems.  As a simple example, on 
Solaris, stdin is #defined to "__iob[0]" or something: if you try to run a 
program that uses stdin/out/err on a linux box (even with byte swapping), 
you will get an "__iob symbol not defined" error.

The only way that I'm aware of to work around this is to build a 
target-independent C library, or (better yet) port another libc to work on 
solaris and with LLVM.  This would be an incredibly useful project.  Once 
this was done, adding back the byte swapping routines is really simple.

-Chris

-- 
http://nondot.org/sabre/
http://llvm.cs.uiuc.edu/




More information about the llvm-dev mailing list