Hier ist eine einfache C-Datei mit einer Aufzählungsdefinition und einer main
Funktion:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Es wird auf das folgende LLVM-IR übertragen:
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
ist offensichtlich die d
Variable, der 2 zugewiesen werden. Was %1
entspricht, wenn Null direkt zurückgegeben wird?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Der Link zeigt, wie die Assembly der Quelle zugeordnet wird
main
, verschwindet die mysteriöse zusätzliche Variable. Interessanterweise verschwindet es auch, wenn Sie die return
Aussage vollständig weglassen (was main
in C legal ist und gleichbedeutend mit return 0;
).
main
wie int main(int argc, char **argv)
Sie sehen, argc
und argv
auf den Stapel kopieren, aber die mysteriöse Nullvariable zusätzlich zu ihnen noch vorhanden ist.