Tôi đã xem xét một số LLVM lắp ráp được sản xuất bởi llvm-gcc gần đây và tôi đã nhận thấy một tuyên bố định kỳ mà tôi không chắc chắn mục đích của nó.Mục đích của dòng% "alloca point" xuất hiện trong mã llvm là gì?
Ví dụ, chương trình C sau:
int main(void)
{
void (*f)(void) = (0x21332);
f();
}
Khi biên soạn với "llvm-gcc -emit-llvm -S" sẽ tạo ra đoạn mã sau (phần không liên quan bị loại bỏ):
define i32 @main() nounwind {
entry:
%retval = alloca i32 ; <i32*> [#uses=1]
%f = alloca void()* ; <void()**> [#uses=2]
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
store void()* inttoptr (i64 135986 to void()*), void()** %f, align 4
%0 = load void()** %f, align 4 ; <void()*> [#uses=1]
call void %0() nounwind
br label %return
Tôi quan tâm đến mục đích của dòng:
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
Dường như không làm bất cứ điều gì làm biến nó gán cho không bao giờ được sử dụng một lần nữa và bản thân bitcast là vô nghĩa. Tất cả những gì tôi có thể nghĩ là nó được chèn vào thực tế như là một nop cho các mục đích tạo/phân tích mã sau này, cho thấy các phần thú vị của mã.
Tôi cũng tò mò trong dòng này; Tôi chỉ chạy qua nó tối nay trong khi nhìn vào một số công cụ tạo mã. Nó dường như là ranh giới alloca, nhưng tôi không biết tại sao. – Albinofrenchy