2010-10-15 15 views
7

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?

+0

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

Respuesta

5

Está viendo el nombre del operador en C++. Defina el símbolo usando abi::__cxa_demangle, o construya una tabla de símbolos destrozados. Los operadores nuevos/borrar pueden estar sobrecargados por lo que los símbolos no son constantes. Demangling puede ser la opción más segura.

Esta es la función de hilo a través de C++ filt, que a su vez utiliza 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) 
Cuestiones relacionadas