[OSy] include stdarg.h pri -nostdinc

Martin Decky decky at d3s.mff.cuni.cz
Tue Oct 29 07:01:15 CET 2013


Hezky den,

> Druhe reseni, ktere se nabizi, je pridat prislusne definice primo do
> kodu:
>
> typedef __builtin_va_list __gnuc_va_list;
> typedef __gnuc_va_list va_list;
> #define va_start(v,l)   __builtin_va_start(v,l)
> #define va_end(v)       __builtin_va_end(v)
> #define va_arg(v,l)     __builtin_va_arg(v,l)
> #define va_copy(d,s)    __builtin_va_copy(d,s)

Toto reseni mi prijde v souladu se zadanim a navic je dostatecne 
elegantni (v kodu se pouziji genericke prenositelne identifikatory, 
pouziti konkretnich __builtin funkci specifickych pro dany prekladac tak 
bude odabstrahovano).

> Problem tohoto druheho reseni je zrejma ne-zcela prenositelnost mezi
> kompilatory

Zkusenost rika, ze pri implementaci kernelu nebo zakladnich run-time 
knihoven (libc apod.) neni vzdy mozne zajistit 100% prenositelnost mezi 
prekladaci.

Souvisi to s tim, ze norma jazyka C mnohe veci zamerne vubec nedefinuje 
(nebo je definuje jako implementation-specific), ovsem v techto 
konkretnich pripadech je nutne respektovat dane ABI a vygenerovat kod, 
ktery presne odpovida konkretnim pozadavkum. K tomu je casto nutne 
pouzit nestandardni konstrukce specificke pro dany prekladac (builtin 
funkce, atributy, inline assembler atd.).

I tak je pochopitelne mozne spat kod rozumne prenositelny, tj. maskovat 
rozdily mezi prekladaci pomoci abstrakci v kodu, podminenym prekladem 
apod. Jen takovy kod nebude nutne automaticky prenositelny na nove a 
dosud nezname prekladace.

Cilem je, aby byl maximalne prenositelny mezi prekladaci koncovy 
uzivatelsky kod (aplikaci), ktery uz pochopitelne nema potrebu zabyvat 
se low-level vecmi jako v kernelu nebo v run-time knihovnach.


M.D.




More information about the NSWI004 mailing list