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