2010-10-15 3 views
7

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?

+0

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

risposta

5

Stai vedendo il nome di operatore criptato C++. Demarcare il simbolo usando abi::__cxa_demangle o creare una tabella di simboli maciullati. Gli operatori new/delete possono essere sovraccaricati, quindi i simboli non sono costanti. Demangling potrebbe essere l'opzione più sicura.

Questa è la funzione che scende attraverso C++ filt, che a sua volta utilizza 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)