diff mbox

QEMU build fails with Clang?

Message ID CAAu8pHsaz8F4Nz==akWixnF2atRmvUWJ=052XOY_Zc4Ci1Y4fA@mail.gmail.com
State New
Headers show

Commit Message

Blue Swirl Jan. 5, 2013, 4:51 p.m. UTC
On Sat, Jan 5, 2013 at 1:48 AM, Brad Smith <brad@comstyle.com> wrote:
> Supposedly QEMU is able to build with Clang and yet trying to do so
> I am seeing the build fail as follows..
>
> Comments?

Clang does not support this kind of assembly code yet. The attached
patch avoids this by using 'as' and 'cpp' for .S files, please try. It
could still fail if the 'as' does not come from binutils.

>
>
> gmake[1]: Entering directory `/home/brad/qemu/pc-bios/optionrom'
> clang -I. -I/home/brad/qemu -I/home/brad/qemu/include -I/home/brad/qemu/libcacard -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -MMD -MP -MT multiboot.o -MF ./multiboot.d -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -c -o multiboot.o multiboot.S
> multiboot.S:31:1: error: unexpected directive .code16
> .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
> ^
> multiboot.S:31:8: error: .code16 not supported yet
> .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
>        ^
> multiboot.S:71:135: error: unknown directive
>  read_fw 0x0a; mov %eax, %edi; read_fw 0x0b; mov %eax, %ecx; mov $0x12, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>                                                                                                                                       ^
> multiboot.S:102:2: error: unknown directive
>  .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
>  ^
> multiboot.S:130:17: error: unexpected token in argument list
>  data32 lgdt %gs:6
>                 ^
> multiboot.S:138:15: error: unknown token in expression
>  data32 ljmp *%gs:0
>               ^
> multiboot.S:152:135: error: unknown directive
>  read_fw 0x07; mov %eax, %edi; read_fw 0x08; mov %eax, %ecx; mov $0x11, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>                                                                                                                                       ^
> gmake[1]: *** [multiboot.o] Error 1
>
> --
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
>
>

Comments

Ashley Jan. 6, 2013, 3:19 a.m. UTC | #1
On 1/5/2013 8:51 AM, Blue Swirl wrote:
> On Sat, Jan 5, 2013 at 1:48 AM, Brad Smith <brad@comstyle.com> wrote:
>> Supposedly QEMU is able to build with Clang and yet trying to do so
>> I am seeing the build fail as follows..
>>
>> Comments?
>
> Clang does not support this kind of assembly code yet. The attached
> patch avoids this by using 'as' and 'cpp' for .S files, please try. It
> could still fail if the 'as' does not come from binutils.
>
>>
>>
>> gmake[1]: Entering directory `/home/brad/qemu/pc-bios/optionrom'
>> clang -I. -I/home/brad/qemu -I/home/brad/qemu/include -I/home/brad/qemu/libcacard -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -MMD -MP -MT multiboot.o -MF ./multiboot.d -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -c -o multiboot.o multiboot.S
>> multiboot.S:31:1: error: unexpected directive .code16
>> .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
>> ^
>> multiboot.S:31:8: error: .code16 not supported yet
>> .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
>>         ^
>> multiboot.S:71:135: error: unknown directive
>>   read_fw 0x0a; mov %eax, %edi; read_fw 0x0b; mov %eax, %ecx; mov $0x12, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>>                                                                                                                                        ^
>> multiboot.S:102:2: error: unknown directive
>>   .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
>>   ^
>> multiboot.S:130:17: error: unexpected token in argument list
>>   data32 lgdt %gs:6
>>                  ^
>> multiboot.S:138:15: error: unknown token in expression
>>   data32 ljmp *%gs:0
>>                ^
>> multiboot.S:152:135: error: unknown directive
>>   read_fw 0x07; mov %eax, %edi; read_fw 0x08; mov %eax, %ecx; mov $0x11, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>>                                                                                                                                        ^
>> gmake[1]: *** [multiboot.o] Error 1
>>
>> --
>> This message has been scanned for viruses and
>> dangerous content by MailScanner, and is
>> believed to be clean.
>>
>>

Have you committed this to the git? (or is the term push)

I think that might be a good idea if you haven't (or some variation of 
this fix) because clang is going to be the "official" C/C++ compiler in 
FreeBSD 10 (as I've heard).
Brad Smith Jan. 6, 2013, 3:26 a.m. UTC | #2
On Sat, Jan 05, 2013 at 07:19:11PM -0800, Ashley wrote:
> On 1/5/2013 8:51 AM, Blue Swirl wrote:
> >On Sat, Jan 5, 2013 at 1:48 AM, Brad Smith <brad@comstyle.com> wrote:
> >>Supposedly QEMU is able to build with Clang and yet trying to do so
> >>I am seeing the build fail as follows..
> >>
> >>Comments?
> >
> >Clang does not support this kind of assembly code yet. The attached
> >patch avoids this by using 'as' and 'cpp' for .S files, please try. It
> >could still fail if the 'as' does not come from binutils.
> >
> >>
> >>
> >>gmake[1]: Entering directory `/home/brad/qemu/pc-bios/optionrom'
> >>clang -I. -I/home/brad/qemu -I/home/brad/qemu/include -I/home/brad/qemu/libcacard -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -MMD -MP -MT multiboot.o -MF ./multiboot.d -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -c -o multiboot.o multiboot.S
> >>multiboot.S:31:1: error: unexpected directive .code16
> >>.code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
> >>^
> >>multiboot.S:31:8: error: .code16 not supported yet
> >>.code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
> >>        ^
> >>multiboot.S:71:135: error: unknown directive
> >>  read_fw 0x0a; mov %eax, %edi; read_fw 0x0b; mov %eax, %ecx; mov $0x12, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
> >>                                                                                                                                       ^
> >>multiboot.S:102:2: error: unknown directive
> >>  .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
> >>  ^
> >>multiboot.S:130:17: error: unexpected token in argument list
> >>  data32 lgdt %gs:6
> >>                 ^
> >>multiboot.S:138:15: error: unknown token in expression
> >>  data32 ljmp *%gs:0
> >>               ^
> >>multiboot.S:152:135: error: unknown directive
> >>  read_fw 0x07; mov %eax, %edi; read_fw 0x08; mov %eax, %ecx; mov $0x11, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
> >>                                                                                                                                       ^
> >>gmake[1]: *** [multiboot.o] Error 1
> >>
> >>--
> >>This message has been scanned for viruses and
> >>dangerous content by MailScanner, and is
> >>believed to be clean.
> >>
> >>
> 
> Have you committed this to the git? (or is the term push)

Considering I'm still building and haven't replied yet.. no.

> I think that might be a good idea if you haven't (or some variation
> of this fix) because clang is going to be the "official" C/C++
> compiler in FreeBSD 10 (as I've heard).

It's known as the system compiler and that is already the case. Although
I'm not using FreeBSD and this is still important even if not using FreeBSD.
Brad Smith Jan. 6, 2013, 9:40 a.m. UTC | #3
On Sat, Jan 05, 2013 at 04:51:01PM +0000, Blue Swirl wrote:
> On Sat, Jan 5, 2013 at 1:48 AM, Brad Smith <brad@comstyle.com> wrote:
> > Supposedly QEMU is able to build with Clang and yet trying to do so
> > I am seeing the build fail as follows..
> >
> > Comments?
> 
> Clang does not support this kind of assembly code yet. The attached
> patch avoids this by using 'as' and 'cpp' for .S files, please try. It
> could still fail if the 'as' does not come from binutils.

Could this please use $CC -E instead unless overridden? It just
makes it easier if I only have to override CC and not CPP as well
if using LLVM/Clang or even say another copy of GCC and have it
use the appropriate C preprocessor.

BTW, there are some interesting warnings spit out while compiling
with Clang and most of them look to be legit issues with the code.

QEMU builds and works fine with Clang with this patch applied.

> >
> >
> > gmake[1]: Entering directory `/home/brad/qemu/pc-bios/optionrom'
> > clang -I. -I/home/brad/qemu -I/home/brad/qemu/include -I/home/brad/qemu/libcacard -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -MMD -MP -MT multiboot.o -MF ./multiboot.d -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -c -o multiboot.o multiboot.S
> > multiboot.S:31:1: error: unexpected directive .code16
> > .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
> > ^
> > multiboot.S:31:8: error: .code16 not supported yet
> > .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
> >        ^
> > multiboot.S:71:135: error: unknown directive
> >  read_fw 0x0a; mov %eax, %edi; read_fw 0x0b; mov %eax, %ecx; mov $0x12, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
> >                                                                                                                                       ^
> > multiboot.S:102:2: error: unknown directive
> >  .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
> >  ^
> > multiboot.S:130:17: error: unexpected token in argument list
> >  data32 lgdt %gs:6
> >                 ^
> > multiboot.S:138:15: error: unknown token in expression
> >  data32 ljmp *%gs:0
> >               ^
> > multiboot.S:152:135: error: unknown directive
> >  read_fw 0x07; mov %eax, %edi; read_fw 0x08; mov %eax, %ecx; mov $0x11, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
> >                                                                                                                                       ^
> > gmake[1]: *** [multiboot.o] Error 1
Blue Swirl Jan. 6, 2013, 10:26 a.m. UTC | #4
On Sun, Jan 6, 2013 at 9:40 AM, Brad Smith <brad@comstyle.com> wrote:
> On Sat, Jan 05, 2013 at 04:51:01PM +0000, Blue Swirl wrote:
>> On Sat, Jan 5, 2013 at 1:48 AM, Brad Smith <brad@comstyle.com> wrote:
>> > Supposedly QEMU is able to build with Clang and yet trying to do so
>> > I am seeing the build fail as follows..
>> >
>> > Comments?
>>
>> Clang does not support this kind of assembly code yet. The attached
>> patch avoids this by using 'as' and 'cpp' for .S files, please try. It
>> could still fail if the 'as' does not come from binutils.
>
> Could this please use $CC -E instead unless overridden? It just
> makes it easier if I only have to override CC and not CPP as well
> if using LLVM/Clang or even say another copy of GCC and have it
> use the appropriate C preprocessor.

I've just posted to the list an updated version using $cc -E.

>
> BTW, there are some interesting warnings spit out while compiling
> with Clang and most of them look to be legit issues with the code.

I'm using this to get a warning free build:
CFLAGS=-Wno-unused-value -Wno-initializer-overrides
-Wno-constant-conversion -Wno-unneeded-internal-declaration

Not all warnings are very interesting to fix, for example initializer
override warnings comes from somewhat useful shorthand in defining
tables and the only warning from -Wconstant-conversion in ARM code
looks like a bug in Clang.

But there could be additional Clang warning flags besides the defaults
that could be useful to enable, using -Weverything (or what was it)
produced some interesting warnings.

>
> QEMU builds and works fine with Clang with this patch applied.
>
>> >
>> >
>> > gmake[1]: Entering directory `/home/brad/qemu/pc-bios/optionrom'
>> > clang -I. -I/home/brad/qemu -I/home/brad/qemu/include -I/home/brad/qemu/libcacard -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -MMD -MP -MT multiboot.o -MF ./multiboot.d -Wall -Wstrict-prototypes -Werror -fomit-frame-pointer -fno-builtin -I/home/brad/qemu   -fno-stack-protector -c -o multiboot.o multiboot.S
>> > multiboot.S:31:1: error: unexpected directive .code16
>> > .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
>> > ^
>> > multiboot.S:31:8: error: .code16 not supported yet
>> > .code16; .text; .global _start; _start:; .short 0xaa55; .byte (_end - _start) / 512; lret; .org 0x18; .short 0; .short _pnph; _pnph: .ascii "$PnP"; .byte 0x01; .byte ( _pnph_len / 16 ); .short 0x0000; .byte 0x00; .byte 0x00; .long 0x00000000; .short _manufacturer; .short _product; .long 0x00000000; .short 0x0000; .short 0x0000; .short _bev; .short 0x0000; .short 0x0000; .equ _pnph_len, . - _pnph; _bev:; movw %cs, %ax; movw %ax, %ds;
>> >        ^
>> > multiboot.S:71:135: error: unknown directive
>> >  read_fw 0x0a; mov %eax, %edi; read_fw 0x0b; mov %eax, %ecx; mov $0x12, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>> >                                                                                                                                       ^
>> > multiboot.S:102:2: error: unknown directive
>> >  .dc.b 0x26,0x67,0x66,0x89,0x4f,0xfc
>> >  ^
>> > multiboot.S:130:17: error: unexpected token in argument list
>> >  data32 lgdt %gs:6
>> >                 ^
>> > multiboot.S:138:15: error: unknown token in expression
>> >  data32 ljmp *%gs:0
>> >               ^
>> > multiboot.S:152:135: error: unknown directive
>> >  read_fw 0x07; mov %eax, %edi; read_fw 0x08; mov %eax, %ecx; mov $0x11, %ax; mov $0x510, %edx; outw %ax, (%dx); mov $0x511, %dx; cld; .dc.b 0xf3,0x6c
>> >                                                                                                                                       ^
>> > gmake[1]: *** [multiboot.o] Error 1
>
> --
> This message has been scanned for viruses and
> dangerous content by MailScanner, and is
> believed to be clean.
>
diff mbox

Patch

From dcdd392a0341bf7ff65b114055dc221aa013fa93 Mon Sep 17 00:00:00 2001
Message-Id: <dcdd392a0341bf7ff65b114055dc221aa013fa93.1357402566.git.blauwirbel@gmail.com>
From: Blue Swirl <blauwirbel@gmail.com>
Date: Sat, 5 Jan 2013 10:10:27 +0000
Subject: [PATCH] optionrom: build with discrete CPP and AS steps

Build option ROM .S files with separate preprocessor and
assembler steps because the C compiler could be unsuitable.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
---
 configure |    6 ++++++
 rules.mak |    7 +++++--
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/configure b/configure
index 837a84a..b17b9a2 100755
--- a/configure
+++ b/configure
@@ -262,6 +262,8 @@  else
 fi
 
 ar="${AR-${cross_prefix}ar}"
+as="${AS-${cross_prefix}as}"
+cpp="${CPP-${cross_prefix}cpp}"
 objcopy="${OBJCOPY-${cross_prefix}objcopy}"
 ld="${LD-${cross_prefix}ld}"
 libtool="${LIBTOOL-${cross_prefix}libtool}"
@@ -3712,6 +3714,8 @@  echo "CC_I386=$cc_i386" >> $config_host_mak
 echo "HOST_CC=$host_cc" >> $config_host_mak
 echo "OBJCC=$objcc" >> $config_host_mak
 echo "AR=$ar" >> $config_host_mak
+echo "AS=$as" >> $config_host_mak
+echo "CPP=$cpp" >> $config_host_mak
 echo "OBJCOPY=$objcopy" >> $config_host_mak
 echo "LD=$ld" >> $config_host_mak
 echo "WINDRES=$windres" >> $config_host_mak
@@ -4264,6 +4268,8 @@  for rom in seabios vgabios ; do
     echo "CPP=${cross_prefix}cpp" >> $config_mak
     echo "OBJCOPY=objcopy" >> $config_mak
     echo "IASL=iasl" >> $config_mak
+    echo "AS=$as" >> $config_mak
+    echo "CPP=$cpp" >> $config_mak
     echo "LD=$ld" >> $config_mak
 done
 
diff --git a/rules.mak b/rules.mak
index 8448b94..3204f54 100644
--- a/rules.mak
+++ b/rules.mak
@@ -28,8 +28,11 @@  else
 	$(call quiet-command,$(LIBTOOL) --mode=compile --quiet --tag=CC $(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  lt CC $@")
 endif
 
-%.o: %.S
-	$(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  AS    $(TARGET_DIR)$@")
+%.asm: %.S
+	$(call quiet-command,$(CPP) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -o $@ $<,"  CPP    $(TARGET_DIR)$@")
+
+%.o: %.asm
+	$(call quiet-command,$(AS) $(ASFLAGS) -o $@ $<,"  AS    $(TARGET_DIR)$@")
 
 %.o: %.m
 	$(call quiet-command,$(OBJCC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  OBJC  $(TARGET_DIR)$@")
-- 
1.7.2.5