Ecco un semplice file C con una definizione enum e una main
funzione:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Traspila al seguente IR LLVM:
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 2, i32* %2, align 4
ret i32 0
}
%2
è evidentemente la d
variabile, che gli viene assegnata 2. A cosa %1
corrisponde se viene restituito direttamente zero?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Il collegamento mostra come l'assemblaggio è mappato alla sorgente
main
, la misteriosa variabile aggiuntiva scompare. È interessante notare che scompare anche se si omette completamente la return
dichiarazione (che è legale per main
in C ed equivalente a return 0;
).
main
come int main(int argc, char **argv)
vedi argc
e argv
copi sullo stack, ma la misteriosa variabile zero è ancora lì oltre a loro.