he intentado compilar este fragmento de código en C++:¿Cómo encuentro todas las asignaciones de memoria en un archivo de código llvm ir?
void FuncTest() {
int* a = new int;
int* b = new int[2];
}
Usando:
clang test.cpp -S -emit-llvm -o - > test.llvm
y obtuvo la siguiente:
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)
Lo que me pregunto ahora es: ¿de dónde la _Znwj
y vienen los símbolos _Znaj
? ¿Están asignados aleatoriamente o hay un sistema para ello? Me gustaría ser capaz de decir que las líneas:
%call = call noalias i8* @_Znwj(i32 4)
y
%call1 = call noalias i8* @_Znaj(i32 8)
realizan las asignaciones de memoria. Pero no se ve tan prometedor.
¿Algún experto en llvm que tiene una idea?
Podría agregar que si hay una manera de saber esto (donde están las asignaciones de memoria) desde dentro de un paso de toolg de clang/llvm estaría bien también, solo por favor díganme cómo. – thehan