我尝试编译这段C ++代码:
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 :(得分:5)
您正在看到运营商的C ++错位名称。使用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)
答案 1 :(得分:0)
您可以通过isAllocationFn检查函数是否正在分配内存。它似乎对我有用。
来源:http://llvm.org/docs/doxygen/html/namespacellvm.html#a455d82c49557ac1d6c8da8e8d86a94b5
PD:我正在回答关于标题的问题,这就是把我带到这里的原因。