tôi đã cố gắng để biên dịch đoạn này của C++:Làm cách nào để tìm tất cả phân bổ bộ nhớ trong tệp mã llvm ir?
void FuncTest() {
int* a = new int;
int* b = new int[2];
}
Sử dụng:
clang test.cpp -S -emit-llvm -o - > test.llvm
Và thu được này:
define void @_Z8FuncTestv() {
entry:
%a = alloca i32*, align 4
%b = alloca i32*, align 4
%call = call noalias i8* @_Znwj(i32 4)
%0 = bitcast i8* %call to i32*
store i32* %0, i32** %a, align 4
%call1 = call noalias i8* @_Znaj(i32 8)
%1 = bitcast i8* %call1 to i32*
store i32* %1, i32** %b, align 4
ret void
}
declare noalias i8* @_Znwj(i32)
declare noalias i8* @_Znaj(i32)
Những gì tôi đang tự hỏi bây giờ là: nơi làm _Znwj
và _Znaj
biểu tượng đến từ đâu? Chúng chỉ được phân ngẫu nhiên hay có hệ thống cho nó? Tôi muốn để có thể nói rằng các dòng:
%call = call noalias i8* @_Znwj(i32 4)
và
%call1 = call noalias i8* @_Znaj(i32 8)
thực hiện cấp phát bộ nhớ. Nhưng nó không có vẻ đầy hứa hẹn.
Một số chuyên gia về llvm ở đây có ý tưởng?
Tôi có thể thêm rằng nếu có một cách để biết điều này (nơi phân bổ bộ nhớ) từ bên trong một clang/llvm toolchain vượt qua nó sẽ là tốt là tốt, chỉ cần cho tôi biết làm thế nào. – thehan