2010-10-15 3 views
7

Я попытался скомпилировать этот фрагмент кода C++:Как найти все распределения памяти в файле llvm ir code?

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

Я мог бы добавить, что если есть способ узнать об этом (где выделены ресурсы памяти) из-за перекрестной привязки clang/llvm, это было бы хорошо, просто скажите, пожалуйста. – thehan

ответ

5

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

Это функция конвейера через 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)