Oto prosty plik C z definicją enum i main
funkcją:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Przenosi się na następujący 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
jest ewidentnie d
zmienną, która otrzymuje 2 przypisane do niej. Co %1
odpowiada, jeśli zero jest zwracane bezpośrednio?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Link pokazuje, w jaki sposób zespół jest mapowany na źródło
main
, tajemnicza dodatkowa zmienna zniknie. Co ciekawe, znika również, jeśli return
całkowicie pominiesz instrukcję (co jest legalne main
w C i równoważne z return 0;
).
main
jak int main(int argc, char **argv)
widzisz argc
i argv
kopiujesz na stos, ale tajemnicza zmienna zerowa nadal tam jest.