2010-10-15 9 views
7

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_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) 

%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?

+0

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

Trả lời

5

Bạn đang nhìn thấy tên bị cắt xén của C++. Hủy bỏ biểu tượng bằng cách sử dụng abi::__cxa_demangle hoặc tạo bảng biểu tượng bị xáo trộn. Các toán tử mới/delete có thể bị quá tải nên các ký hiệu không phải là hằng số. Demangling có thể là lựa chọn an toàn nhất.

Đây là chức năng cấp nước tập trung thông qua C++ filt, mà lần lượt sử dụng abi::__cxa_demangle:

 
define void @FuncTest()() { 
entry: 
    %a = alloca i32*, align 4 
    %b = alloca i32*, align 4 
    %call = call noalias i8* @operator new(unsigned int)(i32 4) 
    %0 = bitcast i8* %call to i32* 
    store i32* %0, i32** %a, align 4 
    %call1 = call noalias i8* @operator new[](unsigned int)(i32 8) 
    %1 = bitcast i8* %call1 to i32* 
    store i32* %1, i32** %b, align 4 
    ret void 
} 

declare noalias i8* @operator new(unsigned int)(i32) 
declare noalias i8* @operator new[](unsigned int)(i32)