Вот простой 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утверждение (что допустимо для mainC и эквивалентно return 0;).
mainкак int main(int argc, char **argv)видите, argcи argvкопируете в стек, но загадочная нулевая переменная все еще существует в дополнение к ним.