[LLVMdev] GCC assembler rejects native code generated by LLVM

Chris Lattner sabre at nondot.org
Mon Mar 7 17:29:27 PST 2005


On Mon, 7 Mar 2005, Reid Spencer wrote:
> Vyacheslav,
> This is the same problem that I had with Cygwin .. nearly identical.
> The issue was documented in PR492 if you want some background. I'm
> currently trying to dig up what I did to fix this in December for Cygwin
> and see if I can apply the same change for mingw.

You could extend the X86 backend's "getModuleMatchQuality" to match for 
both mingw and cygwin, instead of just cygwin...

-Chris

> 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
>

-Chris

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




More information about the llvm-dev mailing list