Вот простой C-файл с определением перечисления и main
функцией:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Он переносится в следующий 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
это, очевидно, d
переменная, которой присвоено 2. Что %1
соответствует, если ноль возвращается напрямую?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Ссылка показывает, как сборка отображается на источник
main
, таинственная дополнительная переменная исчезнет. Интересно, что он также исчезает, если вы полностью опускаете return
утверждение (что допустимо для main
C и эквивалентно return 0;
).
main
как int main(int argc, char **argv)
видите, argc
и argv
копируете в стек, но загадочная нулевая переменная все еще существует в дополнение к ним.