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

the*_*han 7 llvm clang

我试图编译这段C++代码:

void FuncTest() {
    int* a = new int;
    int* b = new int[2];
}
Run Code Online (Sandbox Code Playgroud)

使用:

clang test.cpp -S -emit-llvm -o - > test.llvm
Run Code Online (Sandbox Code Playgroud)

得到了这个:

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)
Run Code Online (Sandbox Code Playgroud)

我现在想知道的是:_Znwj_Znaj符号来自哪里?它们只是随机分配还是有系统?我想能够分辨出这些线条:

%call = call noalias i8* @_Znwj(i32 4)
Run Code Online (Sandbox Code Playgroud)

%call1 = call noalias i8* @_Znaj(i32 8)
Run Code Online (Sandbox Code Playgroud)

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

有些llvm专家在这里有什么想法?

Nat*_*ell 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)