Как мне найти все выделения памяти в файле кода llvm ir?

Я попытался скомпилировать этот фрагмент кода 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 есть идея?

7
задан Dan D. 17 February 2012 в 21:33
поделиться