Đây là một tệp C đơn giản với định nghĩa enum và main
hàm:
enum days {MON, TUE, WED, THU};
int main() {
enum days d;
d = WED;
return 0;
}
Nó chuyển mã sang LLVM IR sau:
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
hiển nhiên là d
biến, được 2 gán cho nó. Điều gì không %1
tương ứng với nếu không được trả lại trực tiếp?
clang-9 -S -emit-llvm simple.c
main
( godbolt.org/z/kEtS-s ). Liên kết cho thấy cách lắp ráp được ánh xạ tới nguồn
main
, biến phụ bí ẩn sẽ biến mất. Thật thú vị, nó cũng biến mất nếu bạn bỏ qua return
câu lệnh hoàn toàn (đó là hợp pháp cho main
C và tương đương return 0;
).
main
như int main(int argc, char **argv)
bạn thấy argc
và argv
sao chép vào ngăn xếp, nhưng biến zero bí ẩn vẫn còn đó ngoài chúng.