On 20.02.2015 15:58, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > When experimenting with compiling GRUB2 with clang using integrated as, > I found out that it generates a 16-bit code bigger than gas counterpart > and result gets too big for size constraints of bootsector. This was > traced mainly to 2 problems. > 32-bit access to 16-bit addresses. > source: > movl LOCAL(kernel_sector), %ebx > movl %ebx, 8(%si) > clang: > 7cbc: 67 66 8b 1d 5c 7c 00 addr32 mov 0x7c5c,%ebx > 7cc3: 00 > 7cc4: 66 89 5c 08 mov %ebx,0x8(%si) > > gas: > 7cbc: 66 8b 1e 5c 7c mov 0x7c5c,%ebx > 7cc1: 66 89 5c 08 mov %ebx,0x8(%si) > 32-bit jump. > source: > jnb LOCAL(floppy_probe) > clang: > + 7cb5: 66 0f 83 07 01 00 00 jae 7dc3 <L_floppy_probe> > gas: > - 7cb5: 0f 83 0a 01 jae 7dc3 <L_floppy_probe> Minimal example would be: .code16 jmp 1f .space 256 1: nop clang: 0: 66 e9 00 01 00 00 jmpl 0x106 ... 106: 90 nop gcc: 0: e9 00 01 jmp 0x103 ... 103: 90 nop
> The last one is particularly problematic as it never makes sense to > issue 32-bit jump if %ip is only 16 bits and it eats 3 extra bytes per > jump. Is it possible to force clang to generate 16-bit jumps? > On bright side if I remove error strings the code is functional. >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel