asm-tests/i386-pc: Check that movl is 5 bytes.
authorAndrei Borzenkov <arvidjaar@gmail.com>
Wed, 28 Sep 2016 17:31:04 +0000 (20:31 +0300)
committerAndrei Borzenkov <arvidjaar@gmail.com>
Wed, 28 Sep 2016 17:31:04 +0000 (20:31 +0300)
LLVM 3.9 now emits short form of jump instructions, but it is still using
32 bit addresses for some movl instructions. Fortunately it was caught early:

clang ... boot/i386/pc/boot.S
clang -cc1as: fatal error: error in backend: invalid .org offset '440' (at offset '441')

Add additional check to catch it during configure run and force -no-integrated-as.

Closes: 49200

More details in
  https://lists.gnu.org/archive/html/grub-devel/2015-02/msg00099.html
  https://llvm.org/bugs/show_bug.cgi?id=22662

asm-tests/i386-pc.S

index f6f9a88..d037744 100644 (file)
@@ -1,12 +1,16 @@
 /* on x86 old clang doesn't support .code16
    newer clang supports it but creates 6-byte jumps instead of 3-byte ones
-   which makes us go over boot sector size.  */
+   which makes us go over boot sector size.
+   Starting with 3.9 clang emits 3-byte jumps but still creates 8-bytes movl
+   instead of 5-bytes, so code overflows into data.  */
 
        .code16
        jmp far
        .org 4
        jmp nearer
        .org 6
+       movl nearer, %ebx
+       .org 11
        .space 100
 nearer:
        .space 200