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