Aqui está um arquivo C simples com uma definição de enumeração e uma main
função:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Transpila para o seguinte LLVM IR:
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 a d
variável, que recebe 2 atribuídos a ela. A que %1
corresponde se zero é retornado diretamente?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). O link mostra como o assembly é mapeado para a fonte
main
, a variável extra misteriosa desaparecerá. Curiosamente, ele também desaparece se você omitir return
completamente a declaração (o que é legal main
em C e equivalente a return 0;
).
main
como int main(int argc, char **argv)
vê argc
e argv
copia na pilha, mas a variável zero misteriosa ainda está lá além delas.