如何在llvm ir代码文件中查找所有内存分配?

问题描述:

我试图编译这段代码的C++代码:如何在llvm ir代码文件中查找所有内存分配?

void FuncTest() { 
    int* a = new int; 
    int* b = new int[2]; 
} 

使用:

clang test.cpp -S -emit-llvm -o - > test.llvm 

并获得这样的:

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) 

我现在想知道的是:你在哪里的_Znwj_Znaj符号来自?他们是随机分配的还是有系统的呢?我希望能够告诉大家,行:

%call = call noalias i8* @_Znwj(i32 4) 

%call1 = call noalias i8* @_Znaj(i32 8) 

进行内存分配。但它看起来并不那么有希望。

有些llvm专家有谁的想法?

+0

我可以补充说,如果有一种方法可以从叮当声/ llvm工具链中知道这个(内存分配),那么也可以,请告诉我怎么做。 – thehan 2010-10-15 11:18:28

您正在看到该运算符的C++ mangled名称。使用abi::__cxa_demangle对符号进行缩小,或者建立一个损坏符号表。新的/删除操作符可能被重载,所以符号不是恒定的。 Demangling可能是最安全的选择。

这是通过C++ FILT,它反过来使用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) 

可以检查一个功能是通过isAllocationFn分配存储器。它似乎为我工作。

来源:http://llvm.org/docs/doxygen/html/namespacellvm.html#a455d82c49557ac1d6c8da8e8d86a94b5

PD:我回答这个问题的标题,这是什么把我带到这里。