Ось простий файл C із визначенням enum та main
функцією:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Він транслюється в наступний ІК 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
очевидно, це 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
скопіювали на стек, але загадкова нульова змінна все ще є на додаток до них.