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.

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to