Voici un simple fichier C avec une définition d'énumération et une main
fonction:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Il transpile vers le LLVM IR suivant:
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
est évidemment la d
variable, qui se voit attribuer 2. À quoi %1
correspond si zéro est retourné directement?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Le lien montre comment l'assembly est mappé à la source
main
, la mystérieuse variable supplémentaire disparaît. Fait intéressant, il disparaît également si vous omettez return
complètement la déclaration (ce qui est légal pour main
en C et équivalent à return 0;
).
main
comme int main(int argc, char **argv)
vous le voyez argc
et argv
copié sur la pile, mais la mystérieuse variable zéro est toujours là en plus d'eux.