clang
Miroslav Mraz
mrazik na volny.cz
Neděle Srpen 28 17:29:22 CEST 2022
Volně navážu. Teď jsem zkoušel poněkud větší projekt pro STM32F051. Měl
jsem trochu obavy, že bude problém s unaligend access, ale není tomu
tak. Jediná podivná chyba byla v tom, že není možné použít __aeabi*
funkce překladače, ale zase jich tam moc není, tak jsem vzal z internetu
zdrojáky. Ale i tady musí člověk přesně vědět, co dělá. Kód
void * memset (void * dest, int val, size_t len) {
unsigned char * ptr = dest;
for (unsigned n=0; n<len; n++) ptr [n] = val;
return dest;
}
void __aeabi_memclr (void * dst, size_t len) {
memset (dst, 0, len);
}
Produkuje (chybně):
08000bc8 __aeabi_memclr:
8000bc8: 80 b5 push {r7, lr}
8000bca: 00 af add r7, sp, #0
8000bcc: ff f7 fc ff bl #-8
8000bd0: 80 bd pop {r7, pc}
ale pokud přidáme klíčové slovo static, pak kód
static void * memset (void * dest, int val, size_t len) {
unsigned char * ptr = dest;
for (unsigned n=0; n<len; n++) ptr [n] = val;
return dest;
}
void __aeabi_memclr (void * dst, size_t len) {
memset (dst, 0, len);
}
Produkuje (už správně):
08000bc8 __aeabi_memclr:
8000bc8: 00 29 cmp r1, #0
8000bca: 04 d0 beq #8 <__aeabi_memclr+0xe>
8000bcc: 00 22 movs r2, #0
8000bce: 02 70 strb r2, [r0]
8000bd0: 49 1e subs r1, r1, #1
8000bd2: 40 1c adds r0, r0, #1
8000bd4: f8 e7 b #-16 <__aeabi_memclr>
8000bd6: 70 47 bx lr
Najít tuhle pitomost mi trvalo celé dopoledne, protože je to voláno ve
statických konstruktorech, takže je blbě vidět, kde to vlastně spadlo.
Zřejmě tam koliduje vestavěná funkce memset(), nedokážu to izolovat.
Pokud si říkáte, že to za tu práci nestojí, není tomu tak. Například v
tomto projektu gcc vyprodukuje (-Os) cca 12KiB kódu ve flash, clang
(-Oz) pak pouhé 4KiB, což je zhruba 1/3, takže se to vyplatí.
Je to samozřejmě napsáno tak, aby to clang dokázal optimalizovat, tedy
spousta výpočtů v double, které jsou udělat už v době překladu.
Mrazík
On 30. 07. 22 21:24, Miroslav Mraz wrote:
> Zdravím,
> dnešní deštivý den jsem zkusil zasvětit testování překladače clang. A
> vypadá to, že v některých ohledech začíná být lepší než gcc.
> ...
Další informace o konferenci Hw-list