7

我试图编译这段 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专家有想法吗?

4

2 回答 2

5

您会看到操作员的 C++ 错位名称。使用abi::__cxa_demangle对符号进行解构,或建立一个错位符号表。new/delete 操作符可能被重载,因此符号不是常量。拆线可能是最安全的选择。

这是通过 c++filt 传递的函数,它又使用abi::__cxa_demangle

定义 void @FuncTest()() {
入口:
  %a = alloca i32*,对齐 4
  %b = alloca i32*,对齐 4
  %call = 调用 noalias i8* @operator new(unsigned int)(i32 4)
  %0 = 比特广播 i8* %调用 i32*
  存储 i32* %0,i32** %a,对齐 4
  %call1 = 调用 noalias i8* @operator new[](unsigned int)(i32 8)
  %1 = 比特广播 i8* %call1 到 i32*
  存储 i32* %1,i32** %b,对齐 4
  无效
}

声明 noalias i8* @operator new(unsigned int)(i32)
声明 noalias i8* @operator new[](unsigned int)(i32)
于 2010-10-22T05:56:23.087 回答
0

您可以通过 isAllocationFn 检查函数是否正在分配内存。它似乎对我有用。

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

PD:我正在回答标题上的问题,这就是让我来到这里的原因。

于 2014-04-17T17:46:46.900 回答