ho provato a compilare questo frammento di codice C++:Come trovo tutte le allocazioni di memoria in un file di codice ir llm?
void FuncTest() {
int* a = new int;
int* b = new int[2];
}
Usando:
clang test.cpp -S -emit-llvm -o - > test.llvm
ed ottenuto questo:
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)
Quello che mi chiedo ora è: dove fare il _Znwj
e i simboli _Znaj
vengono? Sono assegnati in modo casuale o esiste un sistema? Mi piacerebbe essere in grado di dire che le linee:
%call = call noalias i8* @_Znwj(i32 4)
e
%call1 = call noalias i8* @_Znaj(i32 8)
eseguire allocazioni di memoria. Ma non sembra così promettente.
Alcuni esperti qui che hanno un'idea?
Potrei aggiungere che se c'è un modo per sapere questo (dove le allocazioni di memoria sono) all'interno di un clang/llvm, il passataglio della toolchain andrebbe bene, per favore dimmi come. – thehan