Как найти все выделения памяти в кодовом файле llvm ir? - PullRequest
7 голосов
/ 15 октября 2010

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

Ответы [ 2 ]

5 голосов
/ 22 октября 2010

Вы видите искаженное имя оператора C ++. Разберите символ с помощью abi :: __ cxa_demangle или создайте таблицу искаженных символов. Операторы new / delete могут быть перегружены, поэтому символы не являются постоянными. Demangling может быть самым безопасным вариантом.

Это функция, передаваемая через c ++ фильтром, которая, в свою очередь, использует 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)
0 голосов
/ 17 апреля 2014

Вы можете проверить, выделяет ли функция память через isAllocationFn. Кажется, это работает для меня.

Источник: http://llvm.org/docs/doxygen/html/namespacellvm.html#a455d82c49557ac1d6c8da8e8d86a94b5

П.Д .: Я отвечаю на вопрос о названии, что привело меня сюда.

...