[LLVMdev] GCC assembler rejects native code generated by LLVM

Vyacheslav Akhmechet coffeemug at gmail.com
Mon Mar 7 17:45:40 PST 2005


Reid,

This patch won't work for me. I compile llvm toolset with MSVC Express
(hence __MINGW32__ won't be defined for me at compile time). I only
try to feed the generated assembly into gcc (pretty much gnu
assembler, I suppose). I don't use mingw tools at the earlier stage.
However it's obvious for me how to modify the code now (just add MSVC
at that line), thanks! I'll try it as soon as I can.

Thanks,
- Vyacheslav.


On Mon, 07 Mar 2005 17:32:00 -0800, Reid Spencer <reid at x10sys.com> wrote:
> Vyacheslav,
> 
> I've tracked down the change and I have a fix for you to test. The
> attached patch should be applied to the CVS head (version 1.132) of
> X86AsmPrinter.cpp in llvm/lib/Target/X86. The patch just includes MINGW
> targets in the same set of choices that it makes for Cygwin. Could you
> please try the patch and let me know if it solves your problem? If it
> does, I'll commit the patch.
> 
> Thanks,
> 
> Reid.
> 
> 
> On Mon, 2005-03-07 at 16:39, Vyacheslav Akhmechet wrote:
> > Ok, I got home so I have more details. Here's the sample C program:
> > ----------------- C program ---------------
> >    #include <stdio.h>
> >    int main() {
> >      printf("hello world\n");
> >      return 0;
> >    }
> > ------------- end C program -------------
> >
> > This is compiled using llvm online demo into the following llvm code
> > (target removed):
> > ----------------- LLVM code --------------
> > deplibs = [ "stdc++", "c", "crtend" ]
> > %.str_1 = internal constant [13 x sbyte] c"hello world\0A\00"; <[13 x
> > sbyte]*> [#uses=1]
> >
> > implementation   ; Functions:
> >
> > declare int %printf(sbyte*, ...)
> >
> > int %main() {
> > entry:
> > call void %__main( )
> > %tmp.0 = call int (sbyte*, ...)* %printf( sbyte* getelementptr ([13 x
> > sbyte]* %.str_1, int 0, int 0) ); <int> [#uses=0]
> > ret int 0
> > }
> >
> > declare void %__main()
> > ------------- End LLVM code -----------
> >
> > which in turn produces the following assembly code:
> >
> > ------------- Assembly code -------------
> >       .text
> >       .align  16
> >       .globl  main
> >       .type   main, @function
> > main:
> >       subl $12, %esp
> >       fnstcw 10(%esp)
> >       movb $2, 11(%esp)
> >       fldcw 10(%esp)
> >       call __main
> >       movl $l1__2E_str_1, %eax
> >       movl %eax, (%esp)
> >       call printf
> >       movl $0, %eax
> >       #IMPLICIT_USE
> >       addl $12, %esp
> >       ret
> >
> >
> >       .data
> >       .align  1
> >       .type l1__2E_str_1, at object
> >       .size l1__2E_str_1,13
> > l1__2E_str_1:                         # [13 x sbyte]* %.str_1 =  c"hello world\0A\00"
> >       .ascii  "hello world\n\000"
> > ---------- End assembly code ----------
> >
> > When I try to assemble the above code using
> > gcc hello.c.s -o hello.exe
> > I get the following errors:
> >
> > hello.c.s: Assembler messages:
> > hello.c.s:6: Warning: .type pseudo-op used outside of .def/.endef ignored.
> > hello.c.s:6: Error: junk at end of line, first unrecognized character is `m'
> > hello.c.s:24: Warning: .type pseudo-op used outside of .def/.endef ignored.
> > hello.c.s:24: Error: junk at end of line, first unrecognized character is `l'
> > hello.c.s:25: Warning: .size pseudo-op used outside of .def/.endef ignored.
> > hello.c.s:25: Error: junk at end of line, first unrecognized character is `l'
> >
> > Sorry for the long email. I attach all relevant files for clarity.
> >
> > ______________________________________________________________________
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev
> 
> 
>




More information about the llvm-dev mailing list