[LLVMdev] win32 assemblers and linkers for llvm

Razvan Aciu admin at kam.ro
Mon May 12 18:57:01 PDT 2008


I made some researches how llvm, possibly with other tools, can be a full 
backend for compiler writers (with the final result being an executable file 
or dynamic linked library). Here are the results:

A. Assemblers

When I saw that the I86 target for llvm with the Intel syntax targets MASM 
(I tested with the MASM version from http://www.masm32.com/ ), it was a bad 
surprise for me. This is especially because the MASM license forbids MASM 
redistribution both for free or commercial projects so practically this 
target is useless for a compiler writer who want to distribute his compiler. 
I think the only excuse for this choice is if the developer didn't know 
other assemblers syntax or existence.
There were some discussions here that in this situation the JIT interpreter 
can be used. It can be done, but only with a temporary status. I don't think 
that someone who makes for example an installer or animated e-greetings in 
which he uses LLVM for scripting and wants to distribute his work, wants his 
products to have over 3-4 MB (VM+JIT+Runtime). Especially after the clang 
will be production ready, I don't think it will be used only as a C compiler 
for a JIT interpreted code.
Fortunately there are other better options for an I86 target assembler:

1. NASM ( http://sourceforge.net/projects/nasm ) - it can be used both in 
Windows and in Linux (and MacOS), without any syntax change. The only 
drawback for it is the LGPL license, which allows some developers to link to 
it only using NASM like an external tool or a dynamic library, not as a 
static library.

2. YASM ( http://www.tortall.net/projects/yasm/ ) - it is NASM compatible 
and has a BSD license, much as llvm has. A strong point for YASM is that it 
is from start built like a library (the same as llvm), so it can be simply 
integrated in a developer tool. YASM is my personal favorite for llvm 
integration.

3. FASM ( http://flatassembler.net/ ) - it is an assembler written in 
assembler, which works on Windows and Linux. It has a liberal license and as 
a strong point it can produce directly executables or dynamic libraries, 
without a linker. The major problem with it is that it can only be 
interfaced hardly with code written in C/C++, because it is written in 
assembler, so I think FASM can be used mainly as a command line utility and 
not as a library.

Like a patch, I suggest to rename the intel syntax for the I86 target in 
masm-intel (or leave it intel even if I don't know if peoples are using it 
now in their projects), and create another target, like nasm-intel. It 
should be a simple problem of tweaking some templates (but don't put me to 
do it :) ).

B. Linkers ( COFF format )

I think most of the linking phase should be done inside the llvm linker, 
using the native llvm format, because it is a very good optimizing linker. 
Especially after clang will be able to compile the standard C library (and 
other libraries), there is no reason to use native object libraries for 
other reasons than linking functions located in dynamic libraries, or for 
some special cases where the functions are written in other languages, like 
the native assembler, etc.
I checked many linkers, but most of them seems not maintained anymore or 
they are producing bad files (like ALINK, http://alink.sourceforge.net/ ).

I saw only one linker that I liked: uldar ( 
http://sourceforge.net/project/showfiles.php?group_id=93970 ), made by the 
guys from http://www.ultimatepp.org/ . It is a package of a linker and a 
librarian, so it can also create libraries. The source code is provided 
inside the U++ package under a very liberal license.

Razvan

PS: Chris, I'm working on the MSVC patch.




More information about the llvm-dev mailing list