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