how to compile asm output for x86 with Micorsoft's ML

I was recently trying to compile some bitcode generated like so:

llc --x86-asm-syntax=intel test.out

it generates a test.out.s file, and while I'm not much of an assembly
person, it looks OK. When I feed this to ML

ml test.out.s

I get tons of errors, most of which appear to be syntax errors. Stuff like:

test.out.s(2) : error A2008:syntax error : .
error A2008:syntax error : objc_class_name_Fraction

etc. Is it possible to generate X86 code that Microsoft's assembler
will accept? Is there another option that I missed? I looked around a
bit but couldn't find anything. The example on the llvm site mentions
being able to compile to C code, but when I try
llc -march=c test.out

it errors out with:
error: invalid target 'c'.

Checking the code (I built LLVM 2.7svn) it looks like the C target
isn't registered, and llc -version gives me:
llc -version
Low Level Virtual Machine (http://llvm.org/):
  llvm version 2.7svn
  DEBUG build with assertions.
  Built Jan 20 2010 (14:58:43).
  Host: i686-pc-win32
  Host CPU: core2

  Registered Targets:
    x86 - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

Cheers

Jim

Jim Crafton <jim.crafton@gmail.com> writes:

[snip]

I looked around a bit but couldn't find anything. The example on the
llvm site mentions being able to compile to C code, but when I try llc
-march=c test.out

it errors out with:
error: invalid target 'c'.

[snip]

  Registered Targets:
    x86 - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64

By default, the cmake build generates Visual Studio project files for
the X86 target only. Take a look at

http://www.llvm.org/docs/CMake.html#llvmvars

for learning how to build other targets.

IIRC, the C target is named CBackend.

By default, the cmake build generates Visual Studio project files for
the X86 target only. Take a look at

http://www.llvm.org/docs/CMake.html#llvmvars

for learning how to build other targets.

OK thanks, I'll look at that.

In the meantime, is it possible to get the assembly generated by llc
to work wiht ML? That would probably be the ideal solution.

Cheers

Jim

Nope, llvm's .s output is only compatible with GAS and other at&t syntax assemblers. It turns out that MASM syntax is highly ambiguous and MASM is not production quality for use by a compiler. This is why visual studio doesn't go through it. Long term, we'd like LLVM to be able to write out .o files directly, if you're interested in adding PECOFF support, that would be very nice :slight_smile:

-Chris

Nope, llvm's .s output is only compatible with GAS and other at&t syntax
assemblers. It turns out that MASM syntax is highly ambiguous and MASM is
not production quality for use by a compiler. This is why visual studio
doesn't go through it. Long term, we'd like LLVM to be able to write out .o
files directly, if you're interested in adding PECOFF support, that would be
very nice :slight_smile:

Crapola. I was afraid that was going to be the case. This was
originally something to do to have fun playing with Objective C, I'm
not sure PECOFF support would fall under that :slight_smile: Any idea how nasty
that would be?
Oh well, I guess the idea of doing this on windows isn't going to
happen anytime soon.

Cheers

Jim

Why not just install the cygwin assembler?

-Chris

Did pecoff support means we can linkage llvm generated obj files to
msvc's obj files?

It would be nice to be able to use clang/llvm without GNU toolchain
dependencies. Just out of curioisty what does the
--x86-asm-syntax=intel actually mean then? Does this not get used? Is
this a different syntax than the AT&T variety (forgive me if this is
an obvious question)?

I tried downloading FASM last night and it seemed handle some of the
output, the one thing it didn't like was the string variable. It
complained about

  mov DWORD PTR [ESP], ($_.str)

something about "$_.str" wasn't kosher.

Nope, llvm's .s output is only compatible with GAS and other at&t syntax
assemblers. It turns out that MASM syntax is highly ambiguous and MASM
is
not production quality for use by a compiler. This is why visual studio
doesn't go through it. Long term, we'd like LLVM to be able to write out
.o
files directly, if you're interested in adding PECOFF support, that would
be
very nice :slight_smile:

Regarding the pecoff support - FASM comes with complete source and
what appears to be a BSD license. It outputs to pecoff. Assuming the
FASM code is readable and reasonably understandable, could this code
be used as a starting point for adding pecoff support? Isn't it the
case that when llvm gets to this phase, all the optimizations have
been done, everything else is complete, the only thing left is just
outputting to assembly or some other format right? Perhaps I'm being
hopelessly optimistic, but if that were the case that doesn't sound
like it would be that hard. Of course what do I know? :slight_smile:

Cheers

Jim

Did pecoff support means we can linkage llvm generated obj files to
msvc's obj files?

You can do this right now. Object file format is fully compatible.

Regarding the pecoff support - FASM comes with complete source and
what appears to be a BSD license. It outputs to pecoff. Assuming the
FASM code is readable and reasonably understandable, could this code

Scratch all that, my mistake, it's all assembly.

Cheers

Jim

if you dont want GNU deps then perhaps try using yasm, it supposedly supports GAS syntax and should run pretty standalone.
http://www.tortall.net/projects/yasm/wiki/Download