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