如何在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专家有谁的想法?
答
您正在看到该运算符的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:我回答这个问题的标题,这是什么把我带到这里。
我可以补充说,如果有一种方法可以从叮当声/ llvm工具链中知道这个(内存分配),那么也可以,请告诉我怎么做。 – thehan 2010-10-15 11:18:28